[comp.os.os9] Browse

mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)

>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan  8 10:11:07 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
	id AA01218; Mon, 8 Jan 90 16:11:18 +0100
Received: from gmdzi.UUCP (gmdzi) (1254)
	by unido.informatik.uni-dortmund.de
	for cosmo
	id AL21947; Mon, 8 Jan 90 11:00:10 +0100
Received: by gmdzi.UUCP id AA07368; Mon, 8 Jan 90 11:03:13 -0100
Date: 6  Jan 90 12:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <143:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 1 of 3)
Status: RO

Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]

A very helpful utility appeared once in comp.sources.misc which I have
ported to OS-9. This utility displays an ls-like directory listing on screen
and allows to walk around in the directory tree and to inspect, dump, rename,,
copy, edit, execute etc. files and directories. It was written by Peter da 
Silva who proposed to post it to comp.os.os9. To compile this *NIX program
TOP's os9lib is required. Since not all OS-9 users may have this library
available, I have uuencoded the ready-to-use object module and posted as
well.

Requests and proposals:
----------------------
'browse' in general:            Peter da Silva (peter@ficc.uu.net)
'browse' OS-9 implementation:   Carsten Emde (emde@zedat.fu-berlin.dbp.de)


---- Cut Here and unpack ----
#!/bin/sh
#	OS-9/xshar:	Shell Archiver  (v1.22)
#	Packed January 6, 1990 Saturday 11:49:38 am by carsten
#	from directory /h0/SYSSRC/BROWSE
#
#	Run the following text with /bin/sh to create:
#	  /h0/SYS/browse.hlp
#	  makefile
#
sed 's/^X//' << 'SHAR_EOF' > /h0/SYS/browse.hlp &&
XBrowse is a screen-oriented directory browser, based on the metaphor of using
X'VI' to edit an 'ls -l' listing.
X
XCommands:
X	SPACE	Change directory (if cursor points to a directory).
X	SPACE	Page file through 'more' (if cursor points to a file).
X	x		Hex dump of current file or directory.
X	&		Run a program that won't clobber the screen.
X	$		Run a program.
X	=		Enter a directory name.
X	?		Page this help file through 'more'.
X	[		Define a macro.
X	H		Go to the top of the page.
X	J		Go to the bottom of the directory.
X	K		Go to the top of the directory.
X	L		Go to the bottom of the page.
X	^L		Repaint screen.
X	M		Display macros.
X	S		Save macros.
X	I		Install macros from current file.
X	.		Go down 20 lines.
X	o		Go up 20 lines.
X	R		Rename a file.
X	dd		Delete file(s). (ask for verification)
X	DD		Delete file(s).
X	h		Place cursor at beginning of line.
X	l		Move cursor to end of line.
X	<		Display file names only.
X	>		Display long directory listing.
X	,		Go down a line.
X	k,^K	Go up a line.
X	n,^D	Go down 11 lines.
X	p,^U	Go up 11 lines.
X
X	qq,QQ,ZZ	Exit.
X
X	r		Re-read directory.
X
X	t		Toggle tag on current file or directory.
X	T		Tag all files.
X	U		Untag all files or directories.
X
XMacros:
X	[xtext]	Define x as text.
X
XWithin text:
X	%		Current filename(s).
X	#		Current directory.
X	!		Previous command.
X	$x		Macro for key x
X	$$		Current process ID
X	~		Home directory.
X	^K		One character from previous command.
X	@x		Execute macro for key x
X	\x		Enter special character x
X	\nnn	nnn, octal
X	\^x		Control-x
X
XDefault macros:
X	b		=..<CR>
X	~		=~<CR>
X	%		$%<CR>
X	SPACE	$more %<CR>
X	c		$copy % 
X	s		$scred %<CR>
X	
XWhen a command is executed (using '$<prog>'), the environment in the form
Xpresent at start of 'browse' will automatically be passed to <prog>. In
Xaddition, the environment variable FILE will be set to the current file name.
SHAR_EOF
chmod 0003 /h0/SYS/browse.hlp || echo "restore of /h0/SYS/browse.hlp fails"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
XTARGET=browse
XDEBUG=
X
XHOME=/h0/
XCFILES=$(TARGET).c
XOFILES=$(TARGET).r
XHELP=$(HOME)SYS/$(TARGET).hlp
XCFLAGS=-ixt=/dd/TMP $(DEBUG)
XLFLAGS=-ixe=10
XLIBS=-l=/dd/LIB/os9lib.l -l=/dd/LIB/termlib.l
XEXEC=$(HOME)CMDS/
X
X$(TARGET): $(OFILES)
X	cc $(LFLAGS) $(OFILES) $(LIBS) $(DEBUG) -f=$(EXEC)$(TARGET)
X	attr $(EXEC)$(TARGET) -pe
X	uuencode $(EXEC)$(TARGET) >-$(TARGET).uu
X	xshar -c -D $(HELP) makefile >$(TARGET)01
X	xshar -c -D $(CFILES) >$(TARGET)02
X	xshar -c -D $(TARGET).uu >$(TARGET)03
X
X$(OFILES): $(CFILES)
SHAR_EOF
chmod 0003 makefile || echo "restore of makefile fails"
exit 0
 
 

mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)

>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan  8 10:11:23 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
	id AA01227; Mon, 8 Jan 90 16:11:31 +0100
Received: from gmdzi.UUCP (gmdzi) (1261)
	by unido.informatik.uni-dortmund.de
	for cosmo
	id AL22685; Mon, 8 Jan 90 11:05:01 +0100
Received: by gmdzi.UUCP id AA07489; Mon, 8 Jan 90 11:06:19 -0100
Date: 6  Jan 90 14:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <144:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part2 of 3)
Status: O

Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]

---- Cut Here and unpack ----
#!/bin/sh
#	OS-9/xshar:	Shell Archiver  (v1.22)
#	Packed January 6, 1990 Saturday 11:49:46 am by carsten
#	from directory /h0/SYSSRC/BROWSE
#
#	Run the following text with /bin/sh to create:
#	  browse.c
#
sed 's/^X//' << 'SHAR_EOF' > browse.c &&
X/*             -- Just what the hell am I ??? ---                            */
X
X#include <stdio.h>
X
Xchar help[]=
X"Browse through a directory, written by Peter da Silva\n\
XAdapted for OS-9 using TOP's os9lib\n\
XSyntax: browse [<dir>]\n\
XFunction: show an ls-like directory listing which can be 'edited', i.e.\n\
X          files may be tagged and inspected, dumped, executed, deleted,\n\
X          renamed, copied, edited etc.\n\
XOptions:\n\
X     none\n";
X
X#ifdef mc68000
X#define sr sr_
X#define PC PC_
X#endif
X
X#ifdef OSK
X#include <termcap.h>
X#define GETCWD
X#define getcwd getwd
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#define SHELLSYM '$'
X#define ASSISTCOM "more /dd/sys/browse.hlp"
X#define SAVEMACROS "/h0/sys/browse.macros"
X#else
X#define remote
X#define SHELLSYM '!'
X#define ASSISTCOM "more /usr/hlp/browse.doc"
X#define SAVEMACROS "/usr/tmp/macros"
X#endif
X
X#ifdef M_XENIX
X#define USG
X#define rindex strrchr
X#define GETCWD
X#else
X#ifdef L_ctermid
X#define USG
X#define rindex strrchr
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#else
X#ifndef OSK
X#include <whoami.h>
X#endif
X#endif
X#endif
X
X/* 		-- Miscellaneous include files --		             */
X
X#ifdef OSK
X#include <modes.h>
X#include <direct.h>
X#include <sgstat.h>
X#include <strings.h>
X#endif
X#include <sys/param.h>							/* NCARGS, and others */
X#ifndef M_XENIX
X#include <sys/types.h> 				   /* data types for various files */
X#endif
X#include <sys/stat.h> 	/* stat data structure for getdir(), statout() */
X#include <sys/dir.h>                /* dir data structure for getdir() */
X#include <pwd.h>                 /* passwd data structure for u_name() */
X#include <grp.h>                  /* group data structure for g_name() */
X
X#ifdef BSD
X#include <sys/time.h>            /* time data structure for printime() */
X#else
X#ifndef OSK
X#include <time.h>    	         /* time data structure for printime() */
X#endif
X#endif
X#ifdef USG
X#ifdef M_XENIX
X#include <sys/ioctl.h>
X#endif
X#include <termio.h>
X#else
X#ifndef OSK
X#include <sgtty.h>               /* terminal modes for tinit(), tend() */
X#endif
X#endif
X
X#include <signal.h>
X
X/*		-- make information --
XBUILD
Xbrowse: browse.c
X	cc browse.c -O -o browse -ltermlib
XEND
X*/
X
X/*		-- Miscellaneous defines --				     */
X#define FALSE 0
X#define TRUE 1
X
X#define MAXID 64
X#define MAXLINE 256
X#ifdef OSK
X#define MAXENTS 512
X#define NCOL 54
X#define MAXNAME 24
X#else
X#define MAXENTS 320
X#define NCOL 64
X#define MAXNAME 14
X#endif
X#define FILENAME 256
X#define MAXARGC (NCARGS/16)	/* Estimate max ARGC */
X#define CHARSET 256		/* Number of macros == size of byte */
X#define NOMAC (0)		/* Null macro (last) */
X#define TERMBUF 1024		/* Size of term buf for termcap */
X#define SMALLBUF 256
X#define NAME 1
X#define SEC 2
X
X/*		-- Extended directory entry format --			     */
Xstruct entry {
X	char *e_name;
X	int e_flags;
X#define FTAGGED (1<<0)
X#define FPERMANENT (1<<1)
X	struct stat e_stat;                           /* file status field */
X	char e_uname[9];                                      /* user name */
X	char e_gname[9];                              /* user's group name */
X#ifdef OSK
X	unsigned long e_secno;
X#endif
X} 
X*xentries[MAXENTS], **entries=xentries;
Xint nentries;
X
X/*		-- Look-up cache for user names --			     */
Xstruct idtab {
X	int  id_id;                                    /* user (or group) id */
X	char id_name[9];                                 /* name[8] + filler */
X} 
Xu_list[MAXID],                                       /* Matched user id's. */
Xg_list[MAXID];                                              /* ditto group */
Xint u_ptr=0, g_ptr=0;                                   /* current entries */
X
X/*		-- Global variables --					     */
XFILE *efp;                                            /* Environment file */
Xchar efname[MAXLINE];                                           /* " name */
Xchar *tent;                                            /* Pointer to tbuf */
Xchar PC;                                                 /* Pad character */
Xchar *UP, *BC;                             /* Upline, backsapce character */
Xshort ospeed;                                    /* Terminal output speed */
Xchar termbuf[TERMBUF];				   /* Place to put term info */
X
Xchar *macbuf[CHARSET], ungetbuf[SMALLBUF]; 
X										/* Buffers for pushback and macros */
Xchar c_macro=NOMAC;         		                      /* current macro */
Xchar *macptr = "";                 /* Pointer to currently executing macro */
Xchar *ungetptr = ungetbuf;            /* Pointer to pushed-back characters */
X
Xchar *errname;                              /* Name of file error found in */
Xextern int errno;                                   /* system error number */
Xint xerrno;                                       /* extended error number */
Xint ccol=NCOL;			          /* Width of used display, current column */
Xint quickmode;							/* short display mode (files only) */
X
X#ifdef USG
Xstruct termio rawbuf;
Xstruct termio cookedbuf;
X#else
X#ifdef OSK
Xstruct sgbuf cookopts,rawopts;
Xint signhndl();
X#else
Xstruct sgttyb sgbuf;                     /* buffer for terminal mode info */
Xint rawflags, cookflags;		  	/* flags for raw & cooked tty mode */
X#endif
X#endif
X
Xchar *cm,                                             /* Cursor motion */
X     *cs,                                   /* Change scrolling region */
X     *sf,                                   /*  - scroll forward       */
X     *sr,                                   /*  - scroll backwards     */
X     *ce,                                      /* Clear to end of line */
X     *cl,                                              /* Clear screen */
X     *al,                                               /* Insert line */
X     *dl,                                              /* delete ditto */
X     *so,                                                  /* standout */
X     *se,                                              /* standout end */
X     *us,                                                 /* underline */
X     *ue,                                             /* underline end */
X     *ti,									 		  /* Init terminal */
X     *te;										 	 /* Reset terminal */
Xint  li,                                            /* lines on screen */
X     co;                                              /* columns ditto */
Xchar xn;										/* Magic cookie kludge */
X
X/*		-- Global error messages --				     */
Xchar *emesg[4]={
X	"??",
X#define TOO_MANY 1
X	"Too many directory entries",
X#define NOMATCH 2
X	"No match",
X	0
X};
X
Xint	top, curr;               /* Positions of screen in directory */
X#define bottom ((top+nlines>nentries)?nentries:(top+nlines))
Xchar	*dot;                              /* name of current directory */
Xint	nlines;                        /* number of lines displayed on page */
Xchar	display_up;                          /* Does the display exist? */
Xint	todump=1;				 /* Do we want to dump data? */
Xint	ended;                                   /* Have we quite finished? */
Xint	intrup;					/* Have we been interrupted? */
Xchar	*HOME;					  /* Where did I start from? */
Xchar	*SHELL;					   /* How do I run programs? */
X
X/*		-- types of functions !!!				     */
Xchar *getenv(), *tgetstr();
Xchar *malloc();
X
X#define NEW(t) (t *)malloc(sizeof (t))
X#define NIL(t) ((t) 0)
X
X/*		-- Code starts here: dummy main --   			     */
Xmain(ac, av, ep)
Xint ac;
Xchar **av;
Xchar **ep;
X{
X	int i;
X	
X	if(ac>1)
X		{
X		for(i=1; i<ac; i++)
X			{
X			if(!strcmp(av[i],"-?"))
X				{
X				printf(help); exit(0);
X				}
X			}
X		if(ac>2)
X			{
X			perror("only one argument may be specified.");
X			exit(0);
X			}
X		if(chdir(av[1])==-1)
X			{
X			perror("can't access directory specified",av[1]);
X			exit(0);
X			}
X		}
X
X	sprintf(efname, "/tmp/br.env.%d", getpid());
X	HOME=getenv("HOME");
X	SHELL=getenv("SHELL");
X	
X#ifndef OSK
X	dumpenv(ep);
X#endif
X
X	intrup=0;
X	tinit(getenv("TERM"));
X	clear_all();
X
X#ifdef OSK
X	stdin->_flag|=_RBF;	stdin->_flag|=_UNBUF;
X#endif
X
X	browse();
X	tend();
X#ifndef OSK
X	unlink(efname);
X#endif
X}
X
Xclear_all()
X{
X	int i;
X
X	for(i = 0; i < MAXENTS; i++)
X		entries[i] = 0;
X}
X
Xchar *clone(name)
Xchar *name;
X{
X	char *hold;
X	
X	hold = (char *)malloc(strlen(name)+1);
X
X	if(hold==0)
X		return 0;
X	strcpy(hold, name);
X	return hold;
X}
X
Xnewname(e, name)
Xstruct entry *e;
Xchar *name;
X{
X	if(e->e_name)
X		free(e->e_name);
X	e->e_name = clone(name);
X}
X
X#if (BSD || OSK)
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X	struct direct *ptr;
X
X	ptr = readdir(dp);
X	if(!ptr) return 0;
X
X	*db = *ptr;	/* V7 'C' and above... safe, since UCB=V7+ */
X	free(ptr);
X	return 1;
X}
X#else
X#define opendir(n) fopen(n, "r")
X#define DIR FILE
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X	if(fread(db, sizeof(struct direct), 1, dp))
X		return 1;
X	/* else */
X		return 0;
X}
X#define closedir fclose
X#endif
X
Xgetdir()
X{
X
X#ifdef OSK
X	struct fildes f;
X	struct tm t;
X	int physdisk, oldid;
X	char pdot[32], *slash;
X#endif
X
X	char *u_name(), *g_name();
X	DIR *dp;
X	int  valid;
X	struct direct *hold = NEW(struct direct);
X	int i, p;
X
X	if(!(dp = opendir("."))) {
X		errname=".";
X		return FALSE;
X	}
X
X	p = 0;
X	for(i = 0; i < nentries; i++) {
X		if(entries[i]->e_flags & FPERMANENT) {
X			if(p != i) {
X				struct entry *hold;
X				hold = entries[p];
X				entries[p] = entries[i];
X				entries[i] = hold;
X			}
X			p++;
X		}
X	}
X
X	for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) {
X
X		if(!entries[nentries]) {
X			entries[nentries] = NEW(struct entry);
X			if(!entries[nentries])
X				break;
X			entries[nentries]->e_name = NIL(char *);
X		}
X
X		if(!readent(dp, hold)) {
X			p=nentries;	break;
X		}
X
X#ifndef OSK
X		valid = (hold->d_ino != 0);
X#else
X		valid = TRUE;
X		entries[nentries]->e_secno=hold->d_addr;
X#endif
X
X		if(valid) {
X#ifndef OSK
X			if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) {
X				closedir(dp);
X				errname=hold->d_name;
X				free(hold);
X				return FALSE;
X			}
X#endif
X
X			newname(entries[nentries], hold->d_name);
X
X#ifndef BSD /* truncate name to 14 characters in non-BSD systems */
X#ifndef OSK
X			if(strlen(entries[nentries]->e_name)>14)
X				entries[nentries]->e_name[14] = 0;
X#endif
X#endif
X
X			entries[nentries]->e_flags = 0;
X			
X#ifndef OSK
X			strcpy(entries[nentries]->e_uname,
X				u_name(entries[nentries]->e_stat.st_uid));
X
X			strcpy(entries[nentries]->e_gname,
X				g_name(entries[nentries]->e_stat.st_gid));
X#endif
X		}
X	}
X	
X	closedir(dp);
X	
X	free(hold);
X
X#ifdef OSK
X	sortdir(SEC); /* optimize head movements */
X	oldid=getuid(); super();
X	strcpy(pdot,dot); 
X	if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@");
X	if((physdisk=open(pdot,S_IREAD))==-1) return FALSE;
X	for(nentries = 0; !intrup && nentries < p; nentries ++) {
X		lseek(physdisk,(entries[nentries]->e_secno)<<8,0);
X		read(physdisk,&f,sizeof(f));
X		
X		t.tm_year  = (int) f.fd_date[0];
X		t.tm_mon   = (int) f.fd_date[1] - 1;
X		t.tm_mday  = (int) f.fd_date[2]; 
X		t.tm_hour  = (int) f.fd_date[3];
X		t.tm_min   = (int) f.fd_date[4];
X		t.tm_sec   = 0;
X		t.tm_isdst = -1;
X
X		entries[nentries]->e_stat.st_atime =
X		entries[nentries]->e_stat.st_mtime = mktime(&t);
X
X		t.tm_year  = (int) f.fd_dcr[0];
X		t.tm_mon   = (int) f.fd_dcr[1] - 1;
X		t.tm_mday  = (int) f.fd_dcr[2]; 
X		t.tm_hour  = t.tm_min = t.tm_sec = 0;
X		t.tm_isdst = -1;
X  
X		entries[nentries]->e_stat.st_ctime = mktime(&t);
X		memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize,
X			sizeof(long));
X		entries[nentries]->e_stat.st_uid   = f.fd_own[1];
X		entries[nentries]->e_stat.st_gid   = f.fd_own[0];
X		entries[nentries]->e_stat.st_mode  = f.fd_att;
X		entries[nentries]->e_stat.st_nlink = f.fd_link;
X
X		strcpy(entries[nentries]->e_uname,
X			u_name(entries[nentries]->e_stat.st_uid));
X
X		strcpy(entries[nentries]->e_gname,
X			g_name(entries[nentries]->e_stat.st_gid));
X	}
X	close(physdisk);
X	setuid(oldid);
X#endif
X
X	if(intrup)
X		return FALSE;
X
X	if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) {
X		errno=0;
X		xerrno=TOO_MANY;
X		errname=".";
X		return FALSE;
X	}
X
X	sortdir(NAME);
X
X	if(intrup)
X		return FALSE;
X	return TRUE;
X}
X
Xat_current()
X{
X	at_file(curr);
X}
X
Xat_file(file)
Xint file;
X{
X	if(display_up) {
X		if(file < top || file >= top+nlines)
X			return 0;
X		at(0, curr-top+2);
X	} else {
X		if(file != curr)
X			return 0;
X		cmdline();
X	}
X	return 1;
X}
X
Xdisplay_flags(flags)
X{
X	outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' '));
X}
X
Xrepaint_flags()
X{
X	if(!display_up) return;
X	at(quickmode?0:NCOL-1, curr-top+2);
X	display_flags(entries[curr]->e_flags);
X}
X
X/*
Xrepaint_current()
X{
X	if(!display_up) return;
X	at_current();
X	dump(curr, curr+1);
X}
X*/
X
Xtag()
X{
X	entries[curr]->e_flags ^= FTAGGED;
X	repaint_flags();
X}
X
Xtag_all(flag)
Xint flag;
X{
X	int i;
X
X	for(i = 0; i < nentries; i++)
X		if(flag)
X			{
X			if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED;
X			}
X		else
X			entries[i]->e_flags &= ~FTAGGED;
X	if(display_up)
X		todump = TRUE;
X}
X
Xdelete_from_display(file)
Xint file;
X{
X	if(!display_up) return;
X
X	if(file>=top+nlines) return;
X
X	if(file < top) file = top;
X
X	scroll(2+file-top, 2+nlines, 1);
X	at(0, 2+nlines-1);
X	if(top+nlines >= nentries)
X		outc('~');
X	else
X		dump(bottom, bottom+1);
X}
X		
Xdelete_file_entry(file)
Xint file;
X{
X	struct entry *hold;
X	int	i;
X
X	delete_from_display(file);
X
X	hold = entries[file];
X	for(i=file; i<nentries-1; i++)
X		entries[i]=entries[i+1];
X	entries[nentries-1]=hold;
X	nentries--;
X
X	if(file < curr || curr >= nentries) {
X		curr--;
X		if(top >= nentries) {
X			top--;
X			display_up = 0;
X			todump = 1;
X		}
X	}
X} 
X
Xremove_one(file, doit)
Xint file;
Xint doit;
X{
X	if(!doit) {
X		cmdline();
X		outs("Delete ");
X		ctlouts(entries[file]->e_name);
X		outs(" [n]?");
X		fflush(stdout);
X		doit = getch() == 'y';
X		outs(doit?"Yes.":"No.");
X		fflush(stdout);
X	}
X	if(doit) {
X		if(unlink(entries[file]->e_name) == 0) {
X			cmdline();
X			outs("Deleted ");
X			ctlouts(entries[file]->e_name);
X			outs(".");
X			delete_file_entry(file);
X			return 1;
X		} else {
X			wperror(entries[file]->e_name);
X			return 0;
X		}
X	}
X	return 0;
X} 
X
Xremove(doit)
Xint doit;
X{
X	int i;
X	int found_tags;
X
X	found_tags = 0;
X	i = 0;
X	while(i < nentries) {
X		if(entries[i]->e_flags & FTAGGED) {
X			found_tags = 1;
X			if(!remove_one(i, doit)) /* decrements nentries */
X				break;
X		} else
X			i++;
X	}
X	if(!found_tags)
X		remove_one(curr, doit);
X}
X
Xinsert_entry_at(ent, i)
Xstruct entry *ent;
Xint i;
X{
X	struct entry *hold;
X	int j;
X
X	/* Allocate slot at end */
X	if(!entries[nentries]) {
X		entries[nentries] = NEW(struct entry);
X		if(!entries[nentries])
X			return 0;
X		entries[nentries]->e_name = NIL(char *);
X	} else if(entries[nentries]->e_name) {
X		free(entries[nentries]->e_name);
X		entries[nentries]->e_name = NIL(char *);
X	}
X
X	/* Copy data into slot */
X	*entries[nentries] = *ent;
X	entries[nentries]->e_name = clone(ent->e_name);
X	if(!entries[nentries]->e_name)
X		return 0;
X
X	if(i != nentries) {
X		/* Rotate slot to middle */
X		hold = entries[nentries];
X		for(j = nentries; j > i; j--)
X			entries[j] = entries[j-1];
X		entries[i] = hold;
X	}
X	nentries++;
X
X	if(display_up) {
X		if(i < top)
X			i = top;
X		if(i >= bottom)
X			return;
X		scroll(2+i-top, 2+nlines, -1);
X		at(0, 2+i-top);
X		dump(i, i+1);
X	}
X}
X
Xinsert_entry(ent)
Xstruct entry *ent;
X{
X	int i;
X
X	if(nentries >= MAXENTS)
X		return 0;
X
X	for(i = 0; i < nentries; i++)
X		if(entcmpnam(&ent, &entries[i]) < 0)
X			break;
X
X	return insert_entry_at(ent, i);
X}
X
Xassist()
X{
X	char cmdbuf[MAXLINE];
X	
X	sprintf(cmdbuf, ASSISTCOM);
X	if(sys(cmdbuf, 1))
X		perror(cmdbuf);
X}
X
Xhexdump()
X{
X	char cmdbuf[MAXLINE];
X	
X	sprintf(cmdbuf, "dump %s", entries[curr]->e_name);
X	if(sys(cmdbuf, 1))
X		perror(cmdbuf);
X}
X	  
Xmove()
X{
X	char scratch[FILENAME];
X	struct entry hold;
X	char inps();
X
X	hold = *entries[curr];
X
X	cmdline();
X	outs("Rename ");
X	ctlouts(entries[curr]->e_name);
X	outc(' ');
X	if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X		killcmd();
X		return;
X	}
X	if(link(entries[curr]->e_name, scratch)!=0) {
X		char tmbuf[42];
X		sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch);
X		wperror(tmbuf);
X		return;
X	}
X	if(unlink(entries[curr]->e_name)!=0) {
X		wperror(entries[curr]->e_name);
X		return;
X	}
X
X	hold.e_name = scratch;
X	hold.e_flags &= ~FTAGGED;
X
X	delete_file_entry(curr);
X	insert_entry(&hold);
X}
X
Xpname(name, mode)
Xchar *name;
Xint mode;
X{
X	int i;
X	char *slash, *rindex();
X	int max=quickmode?MAXLINE:(MAXNAME+1);
X
X#ifdef OSK
X	if(mode&S_IFDIR)
X#else
X	if((mode&S_IFMT)==S_IFDIR)
X#endif
X		max--;
X		
X#ifndef OSK
X	else if((mode&S_IFMT)==S_IFREG && (mode&0111))
X		max--;
X	else if((mode&S_IFMT)!=S_IFREG)
X		max--;
X#endif
X
X	if(!quickmode && (slash=rindex(name, '/'))) {
X		name=slash;
X		outc('<');
X		max--;
X	}
X	for(i=0; i<max && *name; name++)
X		i += ctlout(*name);
X	standend();
X	if(i==max && *name)
X		outs("\b>");
X		
X#ifdef OSK
X	if(mode&S_IFDIR) {
X#else
X	if((mode&S_IFMT)==S_IFDIR) {
X#endif
X		outc('/');
X	}
X	
X#ifndef OSK
X	else if((mode&S_IFMT)==S_IFREG && (mode&0111)) {
X		outc('*');
X	}
X	else if((mode&S_IFMT)!=S_IFREG) {
X		outc('?');
X	}
X#endif
X
X}
X
Xsortdir(ele)
Xint ele;
X{
X	int entcmpnam(),entcmpsec();
X	
X	if(ele==NAME)
X		qsort(entries, nentries, sizeof(struct entry *), entcmpnam);
X	if(ele==SEC)
X		qsort(entries, nentries, sizeof(struct entry *), entcmpsec);
X}
X
X#ifndef OSK
Xaddname(flag)
Xchar flag;
X{
X	char buf[FILENAME], *ptr, *tmp;
X	char scratch[FILENAME];
X	struct entry hold;
X	char inps();
X
X	cmdline();
X	outs("Add ");
X	if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X		killcmd();
X		return;
X	}
X	
X	if(stat(scratch, &hold.e_stat)==-1) {
X		wperror(scratch);
X		return;
X	}
X	if(flag!='+' && *scratch != '/') {
X		strcpy(buf, dot);
X		ptr = scratch;
X		for(;;) {	/* eat '../' and './' */
X			if(ptr[0]=='.' && ptr[1]=='.' &&
X			   (ptr[2]=='/' || !ptr[2])) {
X				tmp = rindex(buf, '/');
X				if(!tmp) break;
X				*tmp=0;
X				ptr += 2+(ptr[2]=='/');
X				continue;
X			}
X			if(ptr[0]=='.' && 
X			   (ptr[1]=='/' || !ptr[1])) {
X				ptr += 1+(ptr[1]=='/');
X				continue;
X			}
X			break;
X		}
X		if(*ptr) {
X			strcat(buf, "/");
X			strcat(buf, ptr);
X		}
X		hold.e_name = buf;
X	} else
X		hold.e_name = scratch;
X	strcpy(hold.e_uname,
X		u_name(hold.e_stat.st_uid));
X	strcpy(hold.e_gname,
X		g_name(hold.e_stat.st_gid));
X	hold.e_flags = 0;
X	if(flag!='+')
X		hold.e_flags |= FPERMANENT;
X	insert_entry(&hold);
X}
X
Xaddperm()
X{
X	char buf[FILENAME], *ptr, *tmp;
X	struct entry hold;
X	int   entcmpnam(), i;
X
X	if(entries[curr]->e_flags & FPERMANENT)
X		return;
X
X	if(entries[curr]->e_name[0]!='/') {
X		strcpy(buf, dot);
X		ptr = entries[curr]->e_name;
X		for(;;) {	/* eat '../' and './' */
X			if(ptr[0]=='.' && ptr[1]=='.' &&
X			   (ptr[2]=='/' || !ptr[2])) {
X				tmp = rindex(buf, '/');
X				if(!tmp) break;
X				*tmp=0;
X				ptr += 2+(ptr[2]=='/');
X				continue;
X			}
X			if(ptr[0]=='.' && 
X			   (ptr[1]=='/' || !ptr[1])) {
X				ptr += 1+(ptr[1]=='/');
X				continue;
X			}
X			break;
X		}
X		if(*ptr) {
X			strcat(buf, "/");
X			strcat(buf, ptr);
X		}
X		hold = *entries[curr];
X
X		hold.e_name = buf;
X		hold.e_flags &= ~FTAGGED;
X		hold.e_flags |= FPERMANENT;
X		insert_entry(&hold);
X	} else {
X		entries[curr]->e_flags |= FPERMANENT;
X		entries[curr]->e_flags &= ~FTAGGED;
X		repaint_flags();
X	}
X}
X
Xdelperm()
X{
X	entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED);
X	repaint_flags();
X}
X#endif
X
Xentcmpnam(e1, e2)
Xstruct entry **e1, **e2;
X{
X	if((*e1)->e_name[0] == '/') {
X		if((*e2)->e_name[0] != '/')
X			return 1;
X	} else if((*e2)->e_name[0] == '/')
X		return -1;
X
X	return strcmp((*e1)->e_name, (*e2)->e_name);
X}
X
Xentcmpsec(e1, e2)
Xstruct entry **e1, **e2;
X{
X	if((*e1)->e_secno < (*e2)->e_secno) return -1;
X	if((*e1)->e_secno > (*e2)->e_secno) return 1;
X	return 0;
X}
X
Xdump(start, end)
Xint start;
Xint end;
X{
X	int  i;
X	int  lo = (start<nentries)?start:nentries;
X	int  hi = (end<nentries)?end:nentries;
X
X	for(i=lo; i<hi; i++) {
X		statout(entries[i]->e_name,
X		&entries[i]->e_stat,
X		entries[i]->e_uname,
X		entries[i]->e_gname,
X		entries[i]->e_flags);
X		nl();
X	}
X	return TRUE;
X}
X
Xstatout(name, sbuf, user, group, flags)
Xchar *name;
Xstruct stat *sbuf;
Xchar *user, *group;
Xint flags;
X{
X	int mode = sbuf->st_mode;
X
X	if(!quickmode) {
X#ifndef OSK
X		printf("%5u ", sbuf->st_ino);
X#endif
X
X
X#ifdef OSK
X		if(mode&S_IFDIR) outc('d'); else outc('-');
X		if(mode&S_ISHARE) outc('s'); else outc('-');
X		if(mode&S_IOEXEC) outc('e'); else outc('-');
X		if(mode&S_IOWRITE) outc('w'); else outc('-');
X		if(mode&S_IOREAD) outc('r'); else outc('-');
X		if(mode&S_IEXEC) outc('e'); else outc('-');
X		if(mode&S_IWRITE) outc('w'); else outc('-');
X		if(mode&S_IREAD) outc('r'); else outc('-');
X#else
X		if((mode&S_IFMT)==S_IFCHR) outc('c');
X		else if((mode&S_IFMT)==S_IFBLK) outc('b');
X		else if((mode&S_IFMT)==S_IFDIR) outc('d');
X		else if((mode&S_IFMT)==S_IFREG) outc('-');
X		else outc('?');
X		triad((mode>>6)&7, mode&S_ISUID, 's');
X		triad((mode>>3)&7, mode&S_ISGID, 's');
X		triad(mode&7, mode&S_ISVTX, 't');
X#endif
X
X		outc(' ');
X
X		printf("%1u ", sbuf->st_nlink);
X		printf("%-8s ", user);
X		printf("%-8s ", group);
X
X#ifdef OSK
X		if(!(mode&S_IFDIR))
X#else
X		if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR))
X#endif
X			printf("%7ld ", sbuf->st_size);
X		else
X#ifdef OSK
X			printf("    --- ");
X#else
X
X			printf("%3d,%3d ",
X			major(sbuf->st_rdev),

mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)

>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan  8 10:11:41 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
	id AA01234; Mon, 8 Jan 90 16:11:52 +0100
Received: from gmdzi.UUCP (gmdzi) (1262)
	by unido.informatik.uni-dortmund.de
	for cosmo
	id AL23070; Mon, 8 Jan 90 11:07:18 +0100
Received: by gmdzi.UUCP id AA07593; Mon, 8 Jan 90 11:09:36 -0100
Date: 6  Jan 90 14:33 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <145:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 3 of 3)
Status: O

Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]

---- Cut Here and unpack ----
#!/bin/sh
#	OS-9/xshar:	Shell Archiver  (v1.22)
#	Packed January 6, 1990 Saturday 11:50:12 am by carsten
#	from directory /h0/SYSSRC/BROWSE
#
#	Run the following text with /bin/sh to create:
#	  browse.uu
#   Then run uudecode to create browse
#
sed 's/^X//' << 'SHAR_EOF' > browse.uu &&
X
Xbegin 644 /h0/CMDS/browse
XM2OP``0``D$X````#````2`55`0&``0`*````````````````````````````7
XM`*%8````4````:```#:\```,````@N0``(X&8G)O=W-E```M1H`0+4:`%#U#^
XM@!@(*P`%`!1G#BU,@!IF""UY`````(`:2H5G'@@%``!F%$'U6`!*:/_^9@I9[
XMB$GH__QP`6`@0C58_R!-U^L`#$*G+PMT`6$`>Z1@=D/H``0M2:NF=``B8"X)_
XM9PS3S4(I__\@B5*"8.Y3@&?@2H)F$$IH__YG"D(H__\D2%B(8`8@C21(4H)2<
XM@DJ49Q@H5$H<9ORUS&,>#!P`_&884HPF5-?-8!0,+0#\``)F""9M``37S6`$[
XMU^L`#"$++PA"*/__+P)A`'+<90`!"&$43-\``YO-+RZKIF$``3YP`$ZNLK`@N
XM?/__MKS1SBU(@`0M3X``+4^`""`\____!"\(0?<(`+'N@`AD"K'N@`1E""U(R
XM@`@@7TYU0?H`9&$*+SP```$!3JZRI#\!<F1P`DY``(PR'TYU("Z``)"N@`A.K
XM=2`N@`B0KH`$3G5(Y\#P,"\`'@1``(#D0`Q```]F#$'Z`&5R`$Y``"%D!DZN(
XMLJIE9"])`!1,WP<#3G5*^P!0*BHJ*B!3=&%C:R!/=F5R9FQO=R`J*BHJ#0`JO
XM*BHJ($-A;B=T(&EN<W1A;&P@=')A<"!H86YD;&5R("HJ*BH-`"`J*BHJ(`!MA
XM871H```````B/````$`O"$'Z_\!A`/],('S__Z@6T<Y!^O_682@@7U.)82)!G
XM^O_*4XEA&A-\``W__R!\__^H%M'.80#_'DY```9.0``&$MAF_$YU3E4``$CGR
XMP(`@//___[1A`/[468]P`;"O``1L``!^<`$N@&`L0?HXH"(((!?EB"!O``@@I
XM,`@`80!T)$J`9A!![JNJ(`AA`'(6<`!.KK*P4I<@%["O``1MS'`"L*\`!&P0A
XM0?HX9R`(80!,/'``80!_WB!O``@@*``$80!^>G+_LH!F&"!O``@B*``$0?HX.
XM82`(80!,$G``80!_M&$`?S@O`$'Z.&PB"$'NCR8@"&$`<;98CT'Z.&D@"&$`\
XM<D8M0)J>0?HX8"`(80!R."U`FJ)"KIJ:0?HX5"`(80!R)F$`%UIA(`!N`("H!
XM(G`$@6ZH(F$`&H1A`!HH6(],[0$`__Q.74YU3E4``$CG@(`@//___[QA`/W22
XM68]"EV`.(!?EB"!NK.9"L`@`4I<,EP```@!MZEB/3.T!`/_\3EU.=4Y5``!('
XMY\``(#S___^X80#]F%F/("\`!&$`<J!2@&$`<;PN@$J79@1P`&`,(B\`!"`7=
XM80!RIB`76(],[0`"__Q.74YU3E4``$CGP(`@//___[QA`/U4(%=*D&<((%<@K
XM$&$`<88@+P`$898@5R"`3.T!`/_\3EU.=4Y5``!(Y\#`(#S___^X80#](%F/U
XM("\`!&$`<18N@$J79@1P`&`8(%<B;P`(<`DBV%'(__PRV"`780!Q-G`!6(],@
XM[0,`__A.74YU3E4``$CGX,`@//___E1A`/S63^_^G'`J80!Q`"]```A!^C<-@
XM(`AA`'"Z+T``$&8,0?HV_RU(F39@``0,0I="KP`$8&`@+P`$Y8@@;JSF('`(.
XM`"`H``0(```!9T0@%["O``1G.EF/("\`!.6((&ZLYBZP"``@+P`(Y8@@;JSF-
XM(B\`!.6)(FZLYB.P"``8`"`O``CEB"!NK.8AEP@`6(]2EU*O``0@+P`$L*Z(*
XM'FV6+5>('F```+8@+H@>Y8@@;JSF2K`(`&8X("Z('N6((&ZLYB(`<$)A`'!$L
XM(8`8`"`NB![EB"!NK.9*L`@`9P``D"`NB![EB"!NK.8@<`@`0I`B+P`(("\`&
XM$&$`_JY*@&8&+JZ('F!H<`$O0``,("Z('N6((&ZLYB!P"``B;P`((5$`/DJOD
XM``QG+"`O``A0@"(`("Z('N6((&ZLYB`P"`!A`/XT("Z('N6((&ZLYB!P"`!"O
XMJ``$("\`#-&NB!Y*KIJ:9@P,K@```@"('FT`_SP@+P`080!O7"`O``AA`&^<B
XM<`)A``O@80!\4B]``#AA`#3.(BZ:C$'O`!@@"&$`<&YR+T'O`!D@"&$`<<0OS
XM0``49Q!!^C5S(@@@+P`480!P3F`00?HU92((0>\`&"`(80!P7'(!0>\`&"`()
XM80!NOB]``#QR_[*`9P`"4D*NB!Y@``'J0J<@+H@>Y8@@;JSF('`(`"`H`#[A@
XMB"(`("\`0&$`;JY8CTAX`0!![P!H(@@@+P!`80!NBEB/$"\`9TB`2,`O0`!4H
XM$"\`:$B`2,!3@"]``%`0+P!I2(!(P"]``$P0+P!J2(!(P"]``$@0+P!K2(!(F
XMP"]``$1"KP!`</\O0`!@0>\`0"`(80!NCB(NB![EB2!NK.8@<!@`(4``)"(N8
XMB![EB2!NK.8@<!@`(4``(!`O`'%(@$C`+T``5!`O`')(@$C`4X`O0`!0$"\`R
XM<TB`2,`O0`!,<``O0`!`+T``1"]``$AP_R]``&`@+H@>Y8@@;JSF('`(`$/O0
XM`$`@"6$`;A@A0``H2'@`!$'O`'$B""`NB![EB"!NK.8@,`@`=!S0@F$`<F18R
XMCR`NB![EB"!NK.8@<`@`$"\`9DB`,4``%"`NB![EB"!NK.8@<`@`$"\`94B`?
XM,4``%B`NB![EB"!NK.8@<`@`$"\`9$B`,4``$"`NB![EB"!NK.8@<`@`$"\`D
XM;$B`,4``$B`NB![EB"!NK.8@<`@`<``P*``480`,["(`("Z('N6((&ZLYB`PX
XM"`!T+-""80!N:"`NB![EB"!NK.8@<`@`<``P*``680`-XB(`("Z('N6((&ZLU
XMYB`P"`!T-=""80!N.%*NB!Y*KIJ:9@H@+H@>L)=M`/X*("\`/&$`;-H@+P`XK
XM80!Y^$JNFIIF.@RN```"`(@>;!`@+H@>Y8@@;JSF2K`(`&840JZ`#'`!+4"9L
XM.D'Z,P4M2)DV8`QP`6$`"3)*KIJ:9P1P`&`"<`%/[P%D3.T#!O_P3EU.=4Y5I
XM``!(YX``(#S___^\80#X?"`NFHAA!$Y=3G5.50``2.?``"`\____O&$`^&!*&
XM+IJ49R@@%["NFH1M*"`NFH30KIJ0L)=O'"`NFHB0KIJ$5(`B`'``80`/'F`0)
XM(!>PKIJ(9P1P`&`&80`8KG`!3.T``O_\3EU.=4Y5``!(YX``(#S___^\80#XT
XM!"`7"````&<$<"M@#B`7"````6<$<"%@`G`@80`.HDY=3G5.50``2.?`@"`\2
XM____O&$`]]!*+IJ49S(@+IJ(D*Z:A%2`(@!*KID^9P1P`&`"<#5A``Z8("Z:"
XMB.6((&ZLYB!P"``@*``$80#_A$SM`0+_^$Y=3G5.50``2.>`@"`\____O&$`&
XM]WP@+IJ(Y8@@;JSF('`(`'`!L:@`!&$`_X1,[0$`__Q.74YU3E4``$CG@(`@/
XM//___[AA`/=(68]"EV!"2J\`!&<H(!?EB"!NK.8@,`@`80`I7DJ`9B8@%^6(^
XM(&ZLYB!P"`!P`8&H``1@$B`7Y8@@;JSF('`(`'#^P:@`!%*7(!>PKH@>;;9*0
XM+IJ49P9P`2U`K1!8CTSM`0#__$Y=3G5.50``2.?``"`\____N&$`]LY*+IJ4<
XM9P``GB`NFH30KIJ0L)=O``"0(!>PKIJ$;`0NKIJ$2'@``2`NFI!4@"(`("\`Z
XM!%2`D*Z:A&$`#<I8CR`NFI!4@%.`(@!P`&$`#6H@+IJ$T*Z:D+"NB!YM"'!^7
XM80`-*&!`("Z:A-"NFI"PKH@>;P8@+H@>8`@@+IJ$T*Z:D%*`(@`@+IJ$T*Z:K
XMD+"NB!YO!B`NB!Y@""`NFH30KIJ080`'M$SM``+__$Y=3G5.50``2.?`P"`\G
XM____M&$`]@Y1CR`O``AA`/\F("\`".6((&ZLYB]P"```!"ZO``A@&B`74H#EO
XMB"!NK.8B%^6)(FZLYB.P"``8`%*7("Z('E.`L)=NW"`NB!Y3@.6((&ZLYB&O)
XM``0(`%.NB!X@+P`(L*Z:B&T*("Z:B+"NB!YM'%.NFH@@+IJ$L*Z('FT.4ZZ:G
XMA$(NFI1P`2U`K1!0CTSM`P+_]$Y=3G5.50``2.?`@"`\____O&$`]69*KP`$;
XM9FAA`!7H0?HOJR`(80`+WB`7Y8@@;JSF('`(`"`080`C.D'Z+Y<@"&$`"\)!5
XM[J@R(`AA`&C$80`HR')YLH!F!'`!8`)P`"]```1*KP`$9P9!^B]O8`1!^B]N*
XM(`AA``N.0>ZH,B`(80!HD$JO``1G7"`7Y8@@;JSF('`(`"`080!HJ$J`9C1AN
XM`!5D0?HO/B`(80`+6B`7Y8@@;JSF('`(`"`080`BMD'Z+RL@"&$`"SX@%V$`3
XM_HYP`6`4(!?EB"!NK.8@<`@`(!!A``TB<`!,[0$`__Q.74YU3E4``$CGP(`@2
XM//___[1A`/1X48]"ET*O``1@,B`O``3EB"!NK.8@<`@`("@`!`@```!G%G`!T
XM+H`B+P`(("\`!&$`_M!*@&8&8`Y2KP`$("\`!+"NB!YMQ$J79@PB+P`(("Z:.
XMB&$`_JQ0CTSM`0+_^$Y=3G5.50``2.?`P"`\____L&$`]`11CR`NB![EB"!N6
XMK.9*L`@`9BH@+H@>Y8@@;JSF(@!P0F$`:!0A@!@`("Z('N6((&ZLYDJP"`!FX
XM*F```(`@+H@>Y8@@;JSF('`(`$J09R0@+H@>Y8@@;JSF('`(`"`080!GXB`N)
XMB![EB"!NK.8@<`@`0I`@;P`(("Z('N6((FZLYB)Q"`!P#R+84<C__#+8("Z(_
XM'N6((&ZLYB!P"``B;P`((!%A`/6V((`@+H@>Y8@@;JSF('`(`$J09@9P`&``H
XM`,X@+P`,L*Z('F=(("Z('N6((&ZLYB]P"```!"ZNB!Y@&B`74X#EB"!NK.8B]
XM%^6)(FZLYB.P"``8`%.7(!>PKP`,;MX@+P`,Y8@@;JSF(:\`!`@`4JZ('DHN4
XMFI1G<"`O``RPKIJ$;`8O;IJ$``P@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30Z
XMKIJ0L*\`#&\^2'C__R`NFI!4@"(`("\`$%2`D*Z:A&$`"=18CR`O``Q4@)"N]
XMFH0B`'``80`)<B`O``Q2@"(`("\`#&$`!`)0CTSM`P#_^$Y=3G5.50``2.?`O
XM@"`\____N&$`\EI9CPRN```"`(@>;01P`&`P0I=@&B`7Y8C0KJSF(@!![P`$6
XM(`AA``,02H!M"E*7(!>PKH@>;=XB%R`O``1A`/X&6(],[0$"__A.74YU3E4`H
XM`$CGP(`@//___KQA`/'\3^__`$'Z+&DB"$'7(`AA`&5J<@%!UR`(80`8/$J`J
XM9PA!UR`(80`_E$_O`0!,[0$"__A.74YU3E4``$CGP(`@//___KAA`/&T3^__H
XM`"`NFHCEB"!NK.8@<`@`+Q!!^BPI(@A![P`$(`AA`&406(]R`4'7(`AA`!?@R
XM2H!G"$'7(`AA`#\X3^\!`$SM`0+_^$Y=3G5.50``2.?`P"`\___^2&$`\5A/<
XM[_Z^("Z:B.6((&ZLYB!P"`!#UW`/(MA1R/_\,MAA`!'"0?HKQR`(80`'N"`NH
XMFHCEB"!NK.8@<`@`(!!A`!\2<"!A``?.0J<@+IJ(Y8@@;JSF('`(`"(00>\`O
XM1B`(80`7Z%B/<ANR`&8(80`B!&```*)![P!"(@@@+IJ(Y8@@;JSF('`(`"`0,
XM80`J"DJ`9SA/[__62&\`;"`NFHCEB"!NK.8@<`@`+Q!!^BM)(@A![P`((`AAB
XM`&0@4(]!UR`(80`)(D_O`6Q@3B`NFHCEB"!NK.8@<`@`(!!A`&1$2H!G%B`NK
XMFHCEB"!NK.8@<`@`(!!A``CP8!Q![P!"+HAP_L&O``0@+IJ(80#Z,$'7(`AAR
XM`/W<3^\!0DSM`P+_]$Y=3G5.50``2.?`@"`\____L&$`\"9/[__T2JZ9/F<(Z
XM(#P```$`8`)P&2Z`("\`$`@```=G`E.72JZ9/F8><B\@+P`,80!FK"]```1G3
XM#B]O``0`#'`\80`&GE.70J\`"&`6(&\`#!`02(!(P&$`'OS1KP`(4J\`#"`OP
XM``BPEVP((&\`#$H09MIA`!Z.("\`"+"79A(@;P`,2A!G"D'Z*D@@"&$`!B(@_
XM+P`0"```!V<&<"]A``9"3^\`#$SM`0#__$Y=3G5.50``2.?``"`\____M&$`P
XM[V9P`;"79A9(>@`Z2'@`!"(NB!X@+JSF80!FJ%"/<`*PEV862'H`?$AX``0B&
XM+H@>("ZLYF$`9HQ0CTSM``+__$Y=3G5.50``2.?`@"`\____O&$`[Q(@5R!0Z
XM(%!P+[`09A(@;P`$(%`@4'`OL!!G%G`!8"0@;P`$(%`@4'`OL!!F!'#_8!(@(
XM;P`$(%`B$"!7(%`@$&$`9$A,[0$`__Q.74YU3E4``$CGP,`@//___\!A`.ZT*
XM(&\`!"!0(E<B42`I`#ZPJ``^9`1P_V`:(&\`!"!0(E<B42`I`#ZPJ``^8P1P`
XM`6`"<`!,[0,`__A.74YU3E4``$CGP(`@//___Z1A`.YF3^__]"`O``RPKH@>(
XM;`8@+P`,8`0@+H@>+T``!"`O`!"PKH@>;`8@+P`08`0@+H@>+H`O;P`$``A@<
XM9B`O``CEB"!NK.8@<`@`+R@`!"`O``SEB"!NK.8@<`@`2&@`-2`O`!#EB"!N\
XMK.8@<`@`2&@`+"`O`!3EB"!NK.8@,`@`4(`B`"`O`!3EB"!NK.8@<`@`(!!A9
XM)$_O``QA``3@4J\`""`O``BPEVV2<`%/[P`,3.T!`/_\3EU.=4Y5``!(Y\"`)
XM(#S___^X80#MG%F/(&\`"'``,"@`""Z`2JZ9/F8``/P@%P@```=G!'!D8`)P`
XM+6$`!#`@%P@```9G!'!S8`)P+6$`!!X@%P@```5G!'!E8`)P+6$`!`P@%P@`*
XM``1G!'!W8`)P+6$``_H@%P@```-G!'!R8`)P+6$``^@@%P@```)G!'!E8`)P@
XM+6$``]8@%P@```%G!'!W8`)P+6$``\0@%P@```!G!'!R8`)P+6$``[)P(&$`R
XM`ZP@;P`(<``P*``*(@!!^B>/(`AA`&!2(B\`&$'Z)X8@"&$`8$0B+P`<0?HGS
XM?B`(80!@-B`7"```!V8.(&\`""(H`!1!^B=J8`1!^B=J(`AA`&`6<"!A``-4/
XM("\`"'(<T(%A``)V("\`(&$`]'`@;P`(<``P*``((@`@+P`$80#\.EB/3.T!7
XM`/_\3EU.=4Y5``!(Y_#`(#S___^P80#L4E&/0J\`!&`L("\`!'(.80!F/$'NY
XMB"(@,`@`L*\`"&800>Z((B`()``@+P`$8```SE*O``0@+P`$L*ZLZFW*<$"PH
XMKJSJ;@1"KJSJ("ZLZG(.80!E^D'NB"(AKP`("``@+P`(80`U%"Z`9U9"KP`$Z
XM8"8@+JSJ<@YA`&740>Z((B(O``30@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@V
XM+P`$<B"R,`@`;<H@+JSJ<@YA`&6>0>Z((B(O``30@4(P"`1@+"\O``A!^B997
XM(@A![H@B(`@D`"8!("ZLZG(.80!E<-2`6((@`B(#80!>Z%B/0>Z((B`()``@8
XM+JSJ4JZLZG(.80!E3-2`6((@`E"/3.T##O_L3EU.=4Y5``!(Y_#`(#S___^P)
XM80#K+%&/0J\`!&`L("\`!'(.80!E%D'NBZ(@,`@`L*\`"&800>Z+HB`()``@A
XM+P`$8```SE*O``0@+P`$L*ZL[FW*<$"PKJSN;@1"KJSN("ZL[G(.80!DU$'N\
XMBZ(AKP`("``@+P`(80`OI"Z`9U9"KP`$8"8@+JSN<@YA`&2N0>Z+HB(O``30:
XM@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@+P`$<B"R,`@`;<H@+JSN<@YA`&1X_
XM0>Z+HB(O``30@4(P"`1@+"\O``A!^B4V(@A![HNB(`@D`"8!("ZL[G(.80!DN
XM2M2`6((@`B(#80!=PEB/0>Z+HB`()``@+JSN4JZL[G(.80!D)M2`6((@`E"/J
XM3.T##O_L3EU.=4Y5``!(Y\"`(#S___^H80#J!EF/("\`!&$`7B0N@"!7+R@`A
XM!"!O``0O*``((&\`""\H`!0@;P`,("@`$.6(0>ZM%"\P"``@;P`0(B@`#$'Z?
XM),L@"&$`73A/[P`06(],[0$"__A.74YU3E4``$CG@(`@//___[AA`.F>68]*@
XMKID^9P9!^B2M8`1!^B2R(`AA`%S^80``F%B/3.T!`/_\3EU.=4Y5``!(Y\``K
XM(#S___^X80#I9$J79Q!(>@`8<@`@+P`$80!:YEB/3.T``O_\3EU.=4Y5``!(-
XMY\"`(#S___^\80#I-$'NJ#(B"!`O``-(@$C`80!<LDSM`0+_^$Y=3G5.50``R
XM2.?``"`\____N&$`Z08O+P`$(B\`!"`NFD)A`%AV6(]A`/]\3EU.=4Y5``!(\
XMYX``(#S___^\80#HVB`NFE)A`/]><`UAB$Y=3G5.50``2.?``"`\____M&$`K
XMZ+A*KII&9P``=DJNFDIG;DJNFDYG:"`O``13@"\`(B\`!"`NFD9A`%@06(]A>
XM`/\62J\`$&P@8`@@+II.80#_!B`O`!!2KP`02H!F[&`4("Z:2F$`_O`@+P`0.
XM4Z\`$$J`9NP@+IIZ4X`O`'(`("Z:1F$`5\98CV$`_LQ@``#$2JZ:6F<``+Q*_
XMKII>9P``M$JO`!!L5EF/+J\`%"`O``C0KP`4+P!R`"`NFD)A`%>,6(]@!"`NW
XMFEYA`/Z,(!=2ETJ`9O`O+P`$<@`@+II"80!7:EB/8`0@+II:80#^:B`O`!12.
XMKP`42H!F[&!468\NKP`4+R\`!'(`("Z:0F$`5SQ8CV`$("Z:7F$`_CP@%U.7K
XM2H!F\"`O``B0KP`4+P!R`"`NFD)A`%<46(]@!"`NFEIA`/X4("\`%%.O`!1*D
XM@&;L6(].74YU3E4``$CG@(`@//___[QA`.=D80`'["`780`55$'Z(KP@"&$`Q
XM%4I*KH`,9Q`@+H`,Y8@@?/__LKS1SF`*("Z9.N6(0>ZM`"!P"``@"&$`%2!*\
XM+IJ49@1A`/XR3.T!`/_\3EU.=4Y5``!(Y\"`(#S___^T80#G`"\70?HB8R((1
XM0>ZH3B`(80!::EB/2JZ`#&<*("\`!&$`-)Y@)"`NF3KEB$'NK0`O,`@`+R\`'
XM"$'Z(C8B"$'NJ$X@"&$`6C90CTSM`0#__$Y=3G5.50``2.?`@"`\___[L&$`]
XMYIQ/[_OX0>Z0-B](!`0B+P0(0>\`!"`(80!0N$'O!`0B"$'Z(?`@"&$`5)8N8
XM@$J79P8@5QU0D"I![P0$(@A!^B'7(`AA`%1Z+4"0+$'O!`0B"$'Z(<8@"&$`.
XM5&8M0)`P0>\$!"((0?HAM2`(80!44BU`FD)![P0$(@A!^B&D(`AA`%0^+4":6
XM1D'O!`0B"$'Z(9,@"&$`5"HM0)I*0>\$!"((0?HA@B`(80!4%BU`FDY![P0$O
XM(@A!^B%Q(`AA`%0"+4":4D'O!`0B"$'Z(6`@"&$`4^XM0)I60>\$!"((0?HAR
XM3R`(80!3VBU`FEI![P0$(@A!^B$^(`AA`%/&+4":7D'O!`0B"$'Z(2T@"&$`=
XM4[(M0)IJ0>\$!"((0?HA'"`(80!3GBU`FFY![P0$(@A!^B$+(`AA`%.*+4":U
XM8D'O!`0B"$'Z(/H@"&$`4W8M0)IF0>\$!"((0?H@Z2`(80!38BU`FG)![P0$M
XM(@A!^B#8(`AA`%-.+4":=D'Z(,T@"&$`4YXM0)IZ0?H@PB`(80!3D"U`FGY!V
XM^B"W(`AA`%&P'4":@B`NFGI7@"U`FI!![IE"(@AP`6$`8%Q(>`"`0>Z90B((:
XM0>Z9PB`(80!=;EB/<``=0)G)'4"9QG``'4"9S1U`F<Y!^@"^(`AA`&7:86!/X
XM[P0(3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80#DD$JNK41F""`NFG)A`/L.S
XM<`$M0*U$3EU.=4Y5``!(YX``(#S___^\80#D9DJNK41G""`NFG9A`/KD0JZMA
XM1$Y=3G5.50``2.?`@"`\____O&$`Y#Y![IG"(@AP`6$`8$9ACDSM`0+_^$Y=5
XM3G5.50``2.?`@"`\____O&$`Y!1![IE"(@AP`6$`8!QACDSM`0+_^$Y=3G5.C
XM50``2.>``"`\____P&$`X^I@"'`!+4":FF`2(!<,@`````)G[@R``````V?FM
XM3EU.=4Y5``!(YX"`(#S___^\80#CN&$`!$!AC$'NJ#(@"&$`5T!,[0$`__Q./
XM74YU3E4``$CGP(`@//___[QA`..,(CP```$`0>ZM2"`(80`A!$SM`0+_^$Y=F
XM3G5.50``2.>`@"`\____M&$`XV!1CT'Z'PX@"&$`5W`N@&<$+5>L]&$`&61A:
XM``0,80`%($*NFI9*KIJ:9QA"KIJ:80`#ND'Z'N4@"&$`^;!A`!=^82YA``;<;
XM0>ZH,B`(80!6J&$`%JPO0``$("\`!&%`2JZ:EF?`4(],[0$`__Q.74YU3E4`.
XM`$CGP(`@//___[AA`.+>2'@``7(`0>ZH%B`(80!6)EB/3.T!`O_X3EU.=4Y5Q
XM``!(Y\"`(#S___^X80#BL%F/2JZ:FF<``AY@``,B("Z:B.6((&ZLYB`P"`!A)
XM`!3"2H!G,B`NFHCEB"!NK.8@<`@`(!!A`!/,2H!F``+R("Z:B.6((&ZLYB!PO
XM"``@$&$`^NI@``+:$"\`!TB`2,!A`!5\2H!F``&T80`(A&```L!P`&`"<`%A9
XM`!/:8``"LF$`$>1@``*J80`6YF```J)A`/`28``"FBUNFH2:B&```I!A``6"8
XM8``"B&$`!0I@``*`80`#W&```G@@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30[
XMKIJ04X`M0)J(8``"4F$`&$Y@``)*("Z:D&```+H@+IJ08```Q&$`\$Y@``(R"
XM80`8MF```BH@+IJ(Y8@@;JSF('`(`"`080`9<F```A(0+P`'2(!(P"(`80`5.
XM)+*`9@#_.$JNFIIF`/\P<$2P+P`'9@1P`6`"<`!A`.S<8``!X$*NK/Q@``'8V
XM<#8M0*S\8``!SG`!+4"9/F`$0JZ9/DHNFI1G``&Z<`$M0*T0<@%P`&$`^!9A@
XM`/=Z8``!I&$`!+9@``&<80`#^&```90@+IJ0;`)2@.*`80`$)F```8(@+IJ0?
XM;`)2@.*`80`$1&```7`0+P`'2(!(P"(`0>ZH%B`(80!42+*`9@#^D$JNFIIF>
XM`/Z(<`$M0)J68``!1&$``>Q@``$\80#I+&```31P5+`O``=F!'`!8`)P`&$`G
XMZ4I@``$>80#NUF``_CIA`!0R80#]SF```0H0+P`'2(!50`Q``'9B`/XBT$`P4
XM.P`&3OL``OZN_A;_7/X6_J;^%OX6_A;_3/]4_G#^%OX6_A;^%OX6_A;^%OX6'
XM_V[^%OX6_A;^%OX6_A;^%OX6_A;^%OW._A;^%OX6_C3^%OXP_A;^%OX6_A;^^
XM%O],_A;^IOX6_A;^%OX6_A;^%OX6_A;^%OX6_A;^%OX6_R+^/O\J_D[^%OX67
XM_A;^%O[>_A;^%OX6_E;^QOY@_FC^>/Z>_A;^%OX6_X#^MOZ^_[S_O/X6_A;^U
XM%OX6_X#^1OX6_A;^%OX6_A;^%OX6_A;^WOX6_A;^%O\0_U3^%OX6_QC^%O]<U
XM_J[_;O^`_ZS^%O^T_A;^%OX6_])8CTSM`0+_^$Y=3G5.50``2.?`@"`\____*
XMO&$`WV0@+IIZ4X`B`'``80#V0"`NFE)A`/7:0>ZH,B`(80!2W$SM`0+_^$Y=&
XM3G5.50``2.?`@"`\____O&$`WRA*+IJ49PAR`'``80#V!$'NJ#(@"&$`4JAA1
XM`/MP+4":C&$`XAY*@&8(("Z:C&$`]X1"KIJ(0JZ:A&$``(I*+IJ49P9P`2U`C
XMK1!,[0$"__A.74YU3E4``$CG@``@//___[QA`-[$80#AVB`NFH30KIJ0L*Z(>
XM'F\&("Z('F`(("Z:A-"NFI"PKIJ(;B`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N(
XMFH30KIJ04X!@!"`NFH@M0)J(2BZ:E&<(80IP`2U`K1!.74YU3E4``$CGP(`@W
XM//___[AA`-Y22BZ:E&<(<@!P`&$`]2XO+H@>(BZ:C$'Z&?T@"&$`4:I8CV$`3
XM]4),[0$"__A.74YU3E4``$CGP``@//___[QA`-X0("Z:5F$`])1"+IJ489YR$
XM`7``80#TY&$`]$AP`2U`K1`=?``!FI1,[0`"__Q.74YU3E4``$CGP``@//__Z
XM_[AA`-W.<@)P`&$`]+`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30KIJ0(@`@K
XM+IJ$80#O*B`NFH30KIJ0L*Z('F]F68\@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N2
XMFH30KIJ0D*Z:A%2`(@!P`&$`]%`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH302
XMKIJ0D*Z:A"Z`8`QP?F$`\_AA`/1.4I<@%["NFI!M[%B/3.T``O_\3EU.=4Y5:
XM``!(YX``(#S___^\80#=$$JNFHAO!E.NFHA@!&$``T!.74YU3E4``$CG@``@L
XM//___\!A`-SJ0JZ:B$Y=3G5.50``2.>``"`\____P&$`W-`@%]&NFH@@+IJ(@
XML*Z('FT*("Z('E.`+4":B$Y=3G5.50``2.>``"`\____P&$`W*`@%Y&NFHA*I
XMKIJ(;`1"KIJ(3EU.=4Y5``!(YX``(#S____`80#<>B`NB!Y3@"U`FHA.74YUF
XM3E4``$CG@``@//___[QA`-Q:("Z('E.`L*Z:B&\&4JZ:B&`$80`"A$Y=3G5.C
XM50``2.?`@"`\____K&$`W"Y9CR!NK/1*$&8``E9*KJT09P8=?``!FI1*+IJ4R
XM9@``K&$`_)8@+IJ(Y8@@;JSF('`(`"\H``0@+IJ(Y8@@;JSF('`(`$AH`#4@/
XM+IJ(Y8@@;JSF('`(`$AH`"P@+IJ(Y8@@;JSF(#`(`%"`(@`@+IJ(Y8@@;JSF5
XM('`(`"`080#N`D_O``P@+IIZ4X`B`$JNF3YG!'`!8`0@+JS\80#R>D'NJ#(@U
XM"&$`3QYA``\B+H!R#;*`9@QA`/U680#_-&```:(@%V$`#^Y@``&82JZM$&=@.
XM("Z:B)"NFH1O#B`NFHB0KIJ$L*Z:D&T>("Z:D&P"4H#B@"(NFHB2@"U!FH1*<
XMKIJ$;`1"KIJ$80#]1B`NFHB0KIJ$5(`B`$JNF3YG!'`!8`0@+JS\80#Q\$*NG
XMK1!@``$R68\@+IJ(D*Z:A"Z`2I=O#"`NFI!3@)&7;`)"EW`!D*Z:D+"7;S0MX
XM;IJ(FH1R`G``80#QM"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NFI`B`"`N%
XMFH1@``"T("Z:D%.`L)=L*B`NFHB0KIJ04H`M0)J$<@)P`&$`\6X@+IJ$T*Z:W
XMD+"NB!YOP"`NB!Y@PDJ79P``?B\7("Z:D%2`(@!P`F$`\9)8CR`7T:Z:A$J7%
XM;!!R`G``80#Q,"`NFH20EV"0("Z:D%2`D)<B`'``80#Q&"`NFH30KIJ0L*Z(.
XM'F\&("Z('F`(("Z:A-"NFI`B`"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NX
XMFI"0EV$`ZW@@+IJ(D*Z:A%2`(@!*KID^9P1P`6`$("ZL_&$`\+I8CUB/3.T!O
XM`O_X3EU.=4Y5``!(YX``(#S___^\80#9L'`'80#P9DY=3G5.50``2.?`@"`\"
XM___^<&$`V91/[_[`80#Z&$'NJ#(@"&$`31IA`/5:+R\!0"\NFJ(@+IJ(Y8@@'
XM;JSF('`(`"\00?H5-"((0>\`#"`(80!,UD_O``Q!UR`(80!-DBU`@`QG"$'7V
XM(`AA`";\0>ZH%B`(80!,GDJO`41G"F$`^P@=?``!FI1A`/303^\!0$SM`0#_#
XM_$Y=3G5.50``2.?`@"`\____F&$`V/Y/[__J0J\`$DJO`!IG!B!O`!I@!$'Z6
XM%,TNB&``!G)@``7F2J\`$F]`0?H4NR`(80!,1%.O`!)@-$JO`!IG!B!O`!I@(
XM!$'Z%*,NB$JO`!)O&&`.0?H4ER`(80!,&E.O`!)*KP`2;NQ@!&$`_M)@``8@5
XM(%=*$&<>(%=2EQ`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``:L8``%^$*O``I"7
XMKP`.8```HB`O``[EB"!NK.8@<`@`("@`!`@```!G``"$<`$O0``*("\`#N6(T
XM(&ZLYB!P"``@$&$`33C0KP`24H`,@````0!L``3Z("\`#N6((&ZLYB!P"``O9
XM4``$8"(@;P`$$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`!Q12KP`$(&\`!$H0+
XM9M9P("(O`!)2KP`2(&\`%A&`&`!(@$C`80`&[E*O``X@+P`.L*Z('FT`_U9*Q
XMKP`*9@`"IB`NFHCEB"!NK.8@<`@`(!!A`$RDT*\`$E*`#(````$`;``$9B`NQ
XMFHCEB"!NK.8@<`@`+U``!&`B(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!AT
XM``:`4J\`!"!O``1*$&;68``"0"]NFHP`!&`N#*\```$``!)L``00(&\`!!`0L
XM(B\`$E*O`!(@;P`6$8`8`$B`2,!A``8^4J\`!"!O``1*$&;*8``!_B]NFIX`/
XM!&`N#*\```$``!)L``/.(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``7\&
XM4J\`!"!O``1*$&;*8``!O!`O``E(@$C`80#M;$'NJ#(@"&$`2CYA``I"'T``W
XM"1`O``E(@$C`80`)P$J`9B`0+P`)2(!(P&$`"P@@+P`24J\`$B!O`!81O`!`-
XM"`!@"D'Z$ET@"&$`[/!@``/R$"\`"4B`2,!A`.T00>ZH,B`(80!)XF$`">8?X
XM0``)<"2P+P`)9@``>D_O__9A`%<@+P!!^A(A(@A![P`$(`AA`$F>6(]!^A(2A
XM(`AA`.R>0=<O2``.8#8,KP```0``'&T*<!M/[P`@8``#YB!O``X0$"(O`!Q2#
XMKP`<(&\`(!&`&`!(@$C`80`%"%*O``X@;P`.2A!FPF$`!*9/[P`*8``#4A`O6
XM``E(@$C`Y8A![I0V2K`(`&8B$"\`"4B`2,!A``HF("\`$E*O`!(@;P`6$;P`8
XM)`@`8``#'$'Z$80@"&$`[`P0+P`)2(!(P.6(0>Z4-B]P"```!&`N#*\```$`O
XM`!)L``)"(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``1P4J\`!"!O``1*`
XM$&;*8#`,KP```0``$FP``@H@5U*7$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`+
XM!#@@5TH09M!A``/<8``"C!`O``E(@$C`80#KJD'NJ#(@"&$`2'QA``B`'T``=
XM"7!^L"\`"6<``'9P);`O``EG``!L<".P+P`)9V)P7+`O``EG6G`AL"\`"6=2W
XM<`NP+P`)9TIP%;`O``EG0G`8L"\`"6<Z<`BP+P`)9S)P?[`O``EG*A`O``FP4
XM+P`M9R!P&[`O``EG&'`-L"\`"6<0<$"P+P`)9PAP)+`O``EF"G`(80#K%&``<
XM`3YP,+`O``EN``"&<#>P+P`);0``?%&/0I="KP`$8"X@%^>($B\`$4B!2,'0)
XM@02`````,"Z`<`AA`.K6(!=A``)680`'L!]``!%2KP`$<`.PKP`$;Q!P,+`O-
XM`!%N"'`WL"\`$6RZ$"\`$4B`2,!A``AJ$"\``R(O`!I2KP`:(&\`'A&`&``?T
XM0``14(]@``%8<%ZP+P`)9@``A'`(80#J<G!>80#J;$'NJ#(@"&$`1SYA``="$
XM'T``"7`_L"\`"6XB<%^P+P`);1IP"&$`ZD00+P`)2(!(P`2`````0')_P(%@"
XM8'!@L"\`"6X><'ZP+P`);19P"&$`ZAH0+P`)2(!(P`2`````8&`Z("\`$E*O2
XM`!(@;P`6$;P`7@@`8!(@+P`24J\`$B!O`!81O`!<"``,KP```0``$FT&<!M@2
XM``$$$"\`"2(O`!)2KP`2(&\`%A&`&`!(@$C`80`!/F```(H0+P`)2(`,0``DK
XM9P#\C&(^#```&&<`^BYB'@P```MG`/I*8@H,```(9P#Y\F"B#```%6<`^?Y@W
XMF`Q``"-G`/MZ8HX,```A9P#]J&``_X0,0`!<9P#]JF(8#```0&<`^]YB`/]NZ
XM#```)6<`^BA@`/]B#$``?V<`^:9B`/]6#$``?F<`^WA@`/]*2JZ:FF8V0>ZHO
XM,B`(80!%^&$`!?P?0``)<ANR`&<$<`%@`G``2H!G%'`-L"\`"6<,$"\`";`OS
XM`"UF`/E6(&\`%B`O`!)",`@`2JZ:FF<$<!M@"!`O``E(@$C`3^\`%DSM`0#_1
XM_$Y=3G5.50``2.>`@"`\____N&$`T?99CT*78!0@;P`$4J\`!!`02(!(P&$`3
XM`0[1ER!O``1*$&;D80``KM&7(!=8CTSM`0#__$Y=3G5.50``2.>``"`\____1
XMN&$`T:Y9CQ`O``=(@$C`80``T"Z`80``>-&7(!=8CTY=3G5.50``2.>``"`\P
XM____O&$`T7Y*KJY*9A@@+IIB80#G_'`!+4"N2DHNFH)G!'`!8`)P`$Y=3G5.Y
XM50``2.>``"`\____O&$`T4A*KJY.9A@@+IIJ80#GQG`!+4"N3DHNFH)G!'`!O
XM8`)P`$Y=3G5.50``2.>``"`\____N&$`T1)9CT*72JZN2F<4("Z:9F$`YXQ"W
XMKJY*2BZ:@F<"4I=*KJY.9Q0@+IIN80#G<D*NKDY*+IJ"9P)2ER`76(].74YUI
XM3E4``$CGP``@//___[AA`-#`68]"EQ`O``=(@$C`<H#`@6<880#_4M&7$"\`V
XM!TB`2,!R?\"!8<C1EV`\<""P+P`';@AP?[`O``=F&&$`_O31EQ`O``=(@$C`&
XM<D#0@7)_P(%@#F$`_TC1EQ`O``=(@$C`80#G&%*7(!=8CTSM``+__$Y=3G5.B
XM50``2.?`@"`\___^M&$`T#I/[_[\80#POD'Z##`@"&$`0Z!"IT'NKE(B"$'O7
XM``@@"&$`]PA8CW(;L@!G``!^2B\`!&<``'9![P`$(@A![JY2(`AA`$4F<@!!I
XM[P`$(`AA``$\2H!F6$'O``0@"&%>2H!F3'(O0>\`!"`(80!&A"Z`9RP@5U*7A
XM0A!R`4'O``0@"&$``0I*@&<6(!=A,$J`9AY"KH`,<`(M0)DZ(!=@!D'O``0@)
XM"&$`Z!Y@!&$``*9/[P$$3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^X80#/;%F/E
XM0I=@(B(O``0@%^6((&ZLYB!P"``@$&$D2H!G""U7FHAP`6`,4I<@%["NB!YM.
XMUG``6(],[0$"__A.74YU3E4``$CGP,`@//___\!A`,\<8`92EU*O``0@;P`$L
XM2A!G#"!O``0B5Q`1L!!GYB!O``1*$&8$<`%@`G``3.T#`/_X3EU.=4Y5``!(M
XMYX"`(#S___^\80#.UDJNFIIF&&$`[UA!^@K0(`AA`$(Z2BZ:E&8$80#ESDSM*
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`SIQ*KP`$9Q!A`.\>(A=!^@JC(`AAH
XM`$'^0>ZH,B`(80!"%"`780!.ADJ`9@AA`.\V<`%@`G``3.T!`/_\3EU.=4Y5:
XM``!(Y\"`(#S___ZX80#.3$_O_P!A`.[080#IRD'NJ#(B"$JO`0!G!'`D8`)PH
XM)F$`0;I"IT'NKU(B"$'O``0@"&$`]0I8CW(;L@!F%&$`Z6QA`._H'7P``9J47
XM80#_&&`>0=<B"$'NKU(@"&$`0R`B+P$`0=<@"&$`]#YA`.D^3^\!`$SM`0+_[
XM^$Y=3G5.50``2.>`@"`\____P&$`S;X@5W``,"@`$`*`````@$SM`0#__$Y=N
XM3G5.50``2.?`@"`\____K&$`S91/[__P0?H)J2((("\`$&$`0,HN@&8,("\`9
XM$&$`Y@)@``"20J\`!&$`[?9"KP`,8`P@+P`(80#\C-&O``P@%V$`0+XO0``(&
XM<$BPKP`,;PX@5S`H``Q(P`@```1GU&$`_!)*+IJ4<`UA`./F(%<P*``,2,`(Q
XM```$9@YA``"X+T``!'(_LH!GH"`780!`I$JO``1G('`@L*\`!&<8<'&PKP`$D
XM9Q!P/["O``1G""`O``1A``%H3^\`$$SM`0+_^$Y=3G5.50``2.>`@"`\____O
XMO&$`S,)*+P`#9S`0+P`#2(!(P.6(0>Z4-DJP"`!G'!`O``.P+JSR9A9A`.TFI
XM0?H(M2`(80!`"&$``.IP`&`<'6\``ZSR$"\``TB`2,#EB$'NE#8M<`@`K/1P:
XM`4SM`0#__$Y=3G5.50``2.?`@"`\____NF$`S%!5CT'NF#:Q[JSX9`Q3KJSX_
XM(&ZL^&```'8@;JST2A!G``!T(&ZL]'`'L!!F/E*NK/0@;JST<`>P$&9<0>ZH2
XM%B`(80`_>!]```%R#;(`9P93KJST8`12KJST<`VP+P`!9@1AC&`\$"\``6`D-
XM(&ZL]'!<L!!F$"!NK/1P![`H``%F!%*NK/0@;JST4JZL]!`02(!(P&`,819!:
XM[J@6(`AA`#\<5(],[0$"__A.74YU3E4``$CG@(`@//___\!A`,N20BZL\D'Z&
XM![HM2*ST3.T!`/_\3EU.=4Y5``!(YX"`(#S____`80#+:D'NF#8@+JSXD(@,-
XM@````0!N#"!NK/A2KJSX$*\``TSM`0#__$Y=3G5.50``2.?`@"`\___^M&$`U
XMRS!/[_[\80#KM$'NJ#(@"&$`/K9!^@=+(`AA`#Z,80#^L"]``0!*KIJ:9E`@:
XM+P$`80#Y0$'Z!S,@"&$`/FQ(>`!=("\!!.6(0>Z4-B(P"`!![P`$(`AA`/'*;
XM6(]R&[(`9@9A`/OF8!1!^@<%(`AA`#XX0=<B""`O`0!A#D_O`01,[0$"__A.3
XM74YU3E4``$CGP(`@//___[QA`,J6$"\``TB`2,#EB$'NE#9*L`@`9Q80+P`#!
XM2(!(P.6(0>Z4-B`P"`!A`#ZL(&\`!$H09A00+P`#2(!(P.6(0>Z4-D*P"`!@2
XM8!`O``-(@$C`Y8A![I0V(@`@+P`$80`_2E*`80`^9B&`&``0+P`#2(!(P.6(&
XM0>Z4-DJP"`!F$&$`ZJ)!^@93(`AA`#V$8!HB+P`$$"\``TB`2,#EB$'NE#8@C
XM,`@`80`_(DSM`0#__$Y=3G5.50``2.?`@"`\____O&$`R=1!^@89(@AP(&$`W
XM_R)!^@86(@AP)6$`_Q9!^@8.(@AP<V$`_PI!^@8,(@AP8F$`_OY!^@8%(@APY
XM8V$`_O)!^@8"(@AP?F$`_N9,[0$"__A.74YU3E4``$CG@(`@//___[AA`,EPR
XM68]A`.GV0I=@1"`7Y8A![I0V2K`(`&<T0?H%QB`(80`\QB`780#WBD'Z!;X@G
XM"&$`/+8@%^6(0>Z4-B`P"`!A`/<H0?H%JB`(80`\G%*7#)<```$`;;1![J@6V
XM(`AA`#Q\80#J[!U\``&:E%B/3.T!`/_\3EU.=4Y5``!(Y\"`(#S___ZL80#()
XMZ$_O_OAA`.EL0?H%7R`(80#?8DAX`!M![K!2(@A![P`((`AA`.^T6(]R&[(`[
XM9@AA`/G08```@$'O``0B"$'NL%(@"&$`/=1!^@4Q(@A![P`$(`AA`#O:+H!FB
XM#$'O``0@"&$`X1!@3G`!+T`!!&`V("\!!.6(0>Z4-DJP"`!G(B`O`03EB$'N8
XME#8O,`@`+R\!"$'Z!.DB""`O``AA`#O&4(]2KP$$#*\```$``01MP"`780`[)
XMT$_O`0A,[0$"__A.74YU3E4``$CGP(`@//___V!A`,@43^__I$'Z!*DB""`O"
XM`%QA`#M*+T``6&8,("\`7&$`X(!@``$@80#H>&```-YP6[`O``%G"B(O`%Q!Q
XM^@1W8%(@+P!880`[.A]``%=![P`&+T@``B`O`%AA`#LF(&\``E*O``(0@"!OE
XM``)P7;`H__]G#"!O``)P_[`H__]FUB!O``)P7;`H__]G'"(O`%Q!^@0Z(`AA0
XM`#KV0>ZH,B`(80`[#&```(0@;P`"0BC__V$`Y_!!^@0M(`AA`#K2$"\`5TB`]
XM2,!A`/600?H$'R`(80`ZO$'O``8@"&$`]31!^@01(`AA`#JH0>ZH,B`(80`ZZ
XMOD'O``8B"!`O`%=(@$C`80#\;B`O`%AA`#IX("\`6&$`.G`?0``!(&\`6#`H:
XM``Q(P`@```1G`/\(0>ZH%B`(80`Z4"`O`%AA`#IX80#HN!U\``&:E$_O`%Q,W
XM[0$"__A.74YU3E4``$CGP(`@//___V1A`,:R3^__L"\O`%0O+P!40?H#@"((V
XM0>\`""`(80`Z%E"/0=<@"&$`.M1/[P!03.T!`/_\3EU.=4Y5``!(YX``(#S_]
XM___`80#&;"U\`````(`,<@!.0``<9`0]08`,2JZ`#&<$<`!@`G`!3EU.=0`_S
XM/P!4;V\@;6%N>2!D:7)E8W1O<GD@96YT<FEE<P!.;R!M871C:``M/P!O;FQYM
XM(&]N92!A<F=U;65N="!M87D@8F4@<W!E8VEF:65D+@!C86XG="!A8V-E<W,@L
XM9&ER96-T;W)Y('-P96-I9FEE9``O=&UP+V)R+F5N=BXE9`!(3TU%`%-(14Q,S
XM`%1%4DT`+@`N`$``0``N`$1E;&5T92``(%MN73\`665S+@!.;RX`1&5L971E7
XM9"``+@!M;W)E("]D9"]S>7,O8G)O=W-E+FAL<`!D=6UP("5S`%)E;F%M92``C
XM*')E;F%M92`E<R`E<RD`"#X`)3%U(``E+3AS(``E+3AS(``E-VQD(``@("`@P
XM+2TM(``E9``E9`!*86X`1F5B`$UA<@!!<'(`36%Y`$IU;@!*=6P`075G`%-EV
XM<`!/8W0`3F]V`$1E8P`E,F0@)3-S("4P,F0@)3)D.B4P,F0`($9I;&4@3F%MB
XM90!!='1R("`@3&YK(%5S97(@("`@($=R;W5P("`@("`@(%-I>F4@("`@("!-Y
XM;V1I9GD@5&EM92!&:6QE(&YA;64`.B``)7,@+2T@`"5S.B`E<PT`<&,`=7``&
XM8F,`8VT`8W,`<V8`<W(`8V4`8VP`86P`9&P`=7,`=64`<V\`<V4`=&D`=&4`/
XM;&D`8V\`>&X`0E)/5U-%`$EN=&5R<G5P=``E<SH@)60@9FEL97,`<V5T96YVO
XM($9)3$4@)7,[)7,@)7,`(0`((`@`(0`((`@`""`(`"5D``@@"``((`@`9V]T(
XM;R``0V]M;6%N9"!K:6QL960`8V0@)7,`<@!296-U<G-I=F4@;6%C<F\N``!D0
XM969I;F4@`"!A<R!;`%T`3F\@<F]O;0`D;6]R92`E#0`D)0T`)'-C<F5D("4-3
XM`#TN+@T`)&-O<'D@)2``/7X-`&1E9FEN92``(&%S(%L`70T`4V%V92!M86-RH
XM;W,@87,@`'<`6R5C)7-=#0!R`&EL;&5G86P@<WEN=&%X(&EN("<E<R<`:6QLC
XM96=A;"!S>6YT87@@:6X@)R5S)P!D969I;F4@`"!A<R!;`%T-`&-O<'D@)7,@4
XM)7,``$Y5``!(Y\BX)$`F02`\____D&$`PP)/[__80A)!^@#,(@A!UR`(80`XW
XM("`+9PHB"T'7(`AA`#@R0?H`O"((0=<@"&$``O@H0$J`9Q1(5"(\````R"`*)
XM80`V)EB/2H!F!'``8"QR#2`*80`Y0"@`9P0@1$(02%1R)T'O``0@"&$`-?Y8=
XMCTJ`9NP@#&$``\8@"D_O`"A,[1T0_^Q.74YU3E4``$CGP``@//___[QA`,)H"
XM<@`@%V$`_TI,[0`"__Q.74YU3E4``$CGP(`@//___[QA`,)$0?H`(B(((!=AD
XM`/\B3.T!`O_X3EU.=2]H,"]#3413+W!D`'(`("UX`$Y5``!(Y\"`(#S___[@C
XM80#""D_O_R@M?````-:`#$'Z`]P@"&$`-A`O0`#49P``FDAX`,A![P`$(@A!Q
XM^@/&(`AA`"/<6(]*@&8.0?H#PR((0=<@"&$`-O9!UR](`-!@6B]O`-``S'(L9
XM("\`T&$`.$`O0`#09Q`@;P#04J\`T$(08`12KP#,(&\`S`P0`"!G\G(@("\`R
XMS&$`.!8O0`#(9P8@;P#(0A`B+P#,("\`U&$`-N)*@&8$<`%@$$JO`-!G""!O=
XM`-!*$&:8<`!/[P#83.T!`O_X3EU.=4Y5``!(Y\^X)$`F02`\____J&$`P2Y*.
XMKK'29PIA`/\*2H!G``$X*$I@`E*,#!0`(&?X(@Q![IQN(`AA`#8X<B!![IQNP
XM(`AA`#>.*$!*@&<"0AQ!^@+P(@A![INF(`AA`#840>Z<;B((0>Z<;B`(80`"(
XM^B(`0>Z;IB`(80`V&"`,9QQ!^@+$(@A![INF(`AA`#8$(@Q![INF(`AA`#7X$
XM0>Z;IBU(L=I@"'@`8!1X`6`0$!-(@`Q``')G\@Q``'=GZ'`!L(1F"D'NJ#(@_
XM"&$`-`P@!&$`-#XL`"`$80`T5G(#0?H":"`(80`T%D'Z`F0B"$'Z`FL@"&$`$
XM`G(M0+'62'@``T*G0J<O+JNF2&ZQUB(NL=9!^D#"(`AA`#0X3^\`%"X`(`1AV
XM`#/L*@`@!&$`-`0@!F$`,]X@!F$`,_A*AV\6(`7EB$'NL5(AAP@`(@L@!6$`-
XM,SQ@""`%80`SV'``3.T=\/_@3EU.=4Y5``!(Y\^P)$`F02`\____I&$`O\99#
XMCTJNL=)G"F$`_:!*@&<``.(B"D'NFJ8@"&$`--I!UR((0>Z:IB`(80`GH'+_P
XMLH!F#&```+YX`&`4>`%@$!`32(`,0`!R9_(,0`!W9^AP`;"$9A(,;@`!J$!F1
XM"D'NJ#(@"&$`,O@@!&$`,RHL`"`$80`S0G(#0?H!;2`(80`S`DAX``-"IT*G_
XM+RZKIB\O`!`@;P`4(A`@;P`4(!!A``%.(@!!^C^T(`AA`#,J3^\`%"X`(!=A"
XM`#-.(`1A`#+8*@`@!&$`,O`@!F$`,LH@!F$`,N1*AV\6(`7EB$'NL5(AAP@`+
XM(@L@!6$`,BA@""`%80`RQ'``6(],[0WP_^1.74YU3E4``$CGSJ`D0"`\____,
XMN&$`OK)9CS!J``XJ""`%Y8A![K%22K`(`&8$</]@;"`*80`R*B`*80`R*&`V8
XM(`7EB$'NL5*XL`@`9SA\`&`>(`;EB$'NL5*XL`@`9@X@!N6(0>ZQ4D*P"`!@5
XM"%*&<""PAF[<0=<@"&$`/HXH`'+_LH!FNG#_L(1F!'#_+H`@!>6(0>ZQ4D*PH
XM"``@%UB/3.T%<O_H3EU.=5-(14Q,`'9A;&ED+G-H96QL<P!S:&5L;"QS:"QC:
XM<V@`97@@`"``+W!I<&4`4UE35$5-+E-(14Q,`'-H96QL`"]P:7!E``!.50``X
XM2.?`N"1`(#S___^X80"]QG(O("\`!&$`-'0H0$J`9P@@#%*`+T``!$AX`0!!1
XM[ITV(@@@+P`(80`?H%B/2H!G!$7NG39R+R`*80`T0BA`2H!G!%*,8`(H2B(\3
XM```!`"`,80`](B9`<O^R@&8.(@I![ITV(`AA`#*08!(B#$'NG38@"&$`,H(@B
XM"V$`/3!![ITV(`A,[1T`__!.74YU3E4``$CGP(`@//___U!A`+TH3^__G$JN(
XML>)F)"\NL>9(>@/D0>\`""((0?H#W"`(80`F9E"/+4"QXF8,</]@"B`NL>)AW
XM`#!.<`!/[P!D3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80"\T$JNL>)G#"`N1
XML>)A`#!>0JZQXDY=3G5.50``2.>`("1`(#S____`80"\IF`"4HI*$F<&#!(`*
XM.F;T2A)G`D(:(`I,[00`__Q.74YU3E4``$CG@"`D0"`\____P&$`O')@`E**!
XM2A)G#`P2`"QG!@P2``UF[DH29PP,$@`-9P1"&F`"0A(@"DSM!`#__$Y=3G5.:
XM50``2.?`L"1`(#S___^T80"\+E&/(B\`#$'NH)P@"&$`,5!'[J"<)(L@"V$`.
XM_UHF0"5+``0@"V$`_TXF0"]+``0@"V$`_T(F0"`O``1A`#+,)4``"$*78!8@Q
XM%U*7Y8A![J`X(8L(`"`+80#_4"9`<!2PEV\$2A-FX"`7Y8A![J`X0K`(`$'N>
XMH#@E2``,8`)2BTH39P8,$P`-9O1"$R`*4(],[0T`__1.74YU3E4``$CGP(`@7
XM//___[AA`+N$2JZQXF8(80#^0DJ`;3XO+K'B(CP```(`0>Z>-B`(80`NREB/;
XM2H!G)`PN`".>-F?>#"X`*IXV9]9![IXV(@A![J",(`AA`/[\2H!F!'``8`9!6
XM[J",(`A,[0$"__A.74YU3E4``$CGP(`@//___[1A`+L268]"EV$`_=)*@&PX/
XM8&`,+@`CGC9G+@PN`"J>-F<F0>Z>-B((0>Z@C"`(80#^I$J`9Q(@+J"4L*\`B
XM!&8$<`%@`G``+H!*EV8:+RZQXB(\```"`$'NGC8@"&$`+AY8CTJ`9JQ*EV<([
XM0>Z@C"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"ZA%F/0I=A]
XM`/U$2H!L/F!F#"X`(YXV9S0,+@`JGC9G+$'NGC8B"$'NH(P@"&$`_A9*@&<8`
XM(B\`!"`NH(QA``/\2H!F!'`!8`)P`"Z`2I=F&B\NL>(B/````@!![IXV(`AA1
XM`"V*6(]*@&:F2I=G"$'NH(P@"&`"<`!8CTSM`0+_^$Y=3G5.50``2.?`@"`\/
XM____M&$`N?!9CT*7+R\`!"(\```"`$'NGC8@"&$`+4!8CTJ`9Q1![J",(@A!I
XM[IXV(`AA`/V"+H!@`D*72I=G$`PN`".>-F?$#"X`*IXV9[P@%UB/3.T!`O_X3
XM3EU.=4Y5``!(Y\#`(#S___^T80"YB%&/80#\2DJ`;`1P_V`Z0I=@)F$`_=XO#
XM0``$9@AA`/R((!=@)"!O``0@%^6((F\`#".H``@(`%*7(!>PKP`(;=)A`/QD(
XM("\`"%"/3.T#`/_X3EU.=7(`4UE3+V=R;W5P`$Y5``!(Y\"`(#S___]080"YY
XM%D_O_YQ*KK'L9B0O+K'P2'H&M$'O``@B"$'Z!JP@"&$`(E10CRU`L>QF#'#_@
XM8`H@+K'L80`L/'``3^\`9$SM`0+_^$Y=3G5.50``2.>``"`\____O&$`N+Y*9
XMKK'L9PP@+K'L80`L3$*NL>Q.74YU3E4``$CG@"`D0"`\____P&$`N)1@`E**7
XM2A)G#`P2`"QG!@P2``UF[DH29P)"&B`*3.T$`/_\3EU.=4Y5``!(Y\"P)$`@\
XM//___[!A`+A:68\B+P`(0>ZDT"`(80`M?$?NI-`DBR`+89@F0"5+``0@"V&.B
XM)D`NBV`"4I<@5TH09P@@5PP0`"YF\"!72A!G!B!74I="$"`+80`NZB5```PFL
XM5R`+80#_7"9`(!=A`"[6)4``""Z+(`MA`/]()D`@%V$`+L(E0``00>ZQZB5(3
XM`!A![K'J)4@`'$'NL>HE2``4)4L`)"`+80#_&B9`)4L`("`+80#_#B9`)4L`4
XM*"`+80#_`B9`)4L`+"`+80#^]B9`2'@`44AX`&-![J;1(@@@*@`L80`$!%"/?
XM0>ZFT25(`!A(>`!12'@`9T'NIR(B""`J`"QA``/D4(]![J<B)4@`'"`*6(],`
XM[0T`__1.74YU3E4``$CGP(`@//___[AA`+<Z2JZQ[&8(80#^"DJ`;3XO+K'LK
XM(CP```(`0>ZBGB`(80`J@%B/2H!G)`PN`".BGF?>#"X`*J*>9]9![J*>(@A!;
XM[J2@(`AA`/Z&2H!F!'``8`9![J2@(`A,[0$"__A.74YU3E4``$CGP(`@//__Q
XM_[1A`+;(68]"EV$`_9I*@&PX8&`,+@`CHIYG+@PN`"JBGF<F0>ZBGB((0>ZD(
XMH"`(80#^+DJ`9Q(@+J2HL*\`!&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'N:
XMHIX@"&$`*=18CTJ`9JQ*EV<(0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y
XMY\@P)$`F02`\____O&$`MC9X_V`B$!M(@$C`80`K"B(`$!I(@$C`80`J_K*`M
XM9@1P`6`"<``H`$J$9PA*$F<$2A-FTDJ$9Q`0$DB`$A-(@9)`2,$@`6`"</],D
XM[0P0__1.74YU3E4``$CGP(`@//___[1A`+7268]"EV$`_*1*@&P^8&8,+@`C*
XMHIYG-`PN`"JBGF<L0>ZBGB((0>ZDH"`(80#].$J`9Q@B+P`$("ZDH&$`_TI*`
XM@&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'NHIX@"&$`*-A8CTJ`9J9*EV<(;
XM0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"U/EF/0I<O8
XM+P`$(CP```(`0>ZBGB`(80`HCEB/2H!G%$'NI*`B"$'NHIX@"&$`_*0N@&`"R
XM0I=*EV<0#"X`(Z*>9\0,+@`JHIYGO"`76(],[0$"__A.74YU3E4``$CGP(`@Q
XM//___[AA`+3668\@+P`$80#]]"Z`9@1P_V`.(%<B$"`O``AA`"GJ<`!8CTSMB
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`M)A9CT*78#H@;P`$$!!(@$C`0>ZR]
XM(Q`P"`!(@`@```-G``"T(!=R"F$`+FH@;P`$4J\`!!(02(%(P="!<C"0@2Z`#
XM(&\`!$H09PH@;P`$#!``+F:T(&\`!%*O``1*$&8((&\`"""78&IP$"(7X:D@P
XM;P`(((%"EV`X(&\`!!`02(!(P$'NLB,0,`@`2(`(```#9T0@%W(*80`M_"!OB
XM``12KP`$$A!(@4C!T(%R,)"!+H`@;P`$2A!G"B!O``0,$``N9K8@%R!O``B!5
XMD"!O``1*$&<$<`!@`G#_6(],[0$`__Q.74YU3E4``$CG@"`D0"`\____P&$`#
XMLZ)@`E**2A)G!@P2`'QF]$H29P)2BB`*3.T$`/_\3EU.=4Y5``!(Y\RP)$`H;
XM+P`D*B\`*"`\____N&$`LV99CW#_+H!3A2!O``A"$&!"#!(`+68&N"H``6<*2
XM(`IA`/^0)$!@+"9O``@,*@`]``)F!'`#8`)P`M7`8`(6VDH29PH,$@!\9P139
XMA6[P0A-"EV`(2A)G!$J79K8@%UB/3.T-,/_L3EU.=4Y5``!(YX"@)$`@//__:
XM_\!A`++J8`)2BDH29P8,$@`Z9O1*$F<"0AI*$F8$D<A@`B!*(`A,[04`__A.L
XM74YU3E4``$CG@*`D0"`\____O&$`LJP@"F<$2A)F!'``8$1P`"U`IX`M0*=\-
XM+4"G>"U`IW0M2J=T("ZG=&$`_X8M0*=X9QH@+J=X80#_>"U`IWQG#"`NIWQA<
XM`/]J+4"G@$'NIW0@"$SM!0#_^$Y=3G5R`%-94R]P87-S=V]R9```3E4``$CGW
XMP(`@//___[1A`+(P+Q=A`"8^+P!!^A+"(@A![JA.(`AA`"644(\@+H`,L*ZQR
XM]&\H(#P```#_P*Z`#"\`("Z`#."`+P!!^A*:(@A![JA.(`AA`"5D4(]@+$'N:
XMJ$XB""`N@`SEB"!\__^RO-'.(#`(`&$`)51![JA.(@A!^A)P(`AA`"5$("Z`,
XM#$SM`0+_^$Y=3G5.50``2.?`@"`\____M&$`L9@@%["NL?1O+"`\````_\"7]
XM+P`@+P`$X(`O`$'Z$BXB"$'NIX0@"&$`).Y0CT'NIX0@"&`2("Z`#.6(('S_@
XM_[*\T<X@,`@`3.T!`O_X3EU.=0`P,#`Z,#`Q(&%B;W)T960@=VET:"!A;B!EQ
XM<G)O<@`P,#`Z,#`R(&ME>6)O87)D('%U:70`,#`P.C`P,R!K97EB;V%R9"!I,
XM;G1E<G)U<'0`,#`P.C`P-"``,#`P.C`P-2``,#`P.C`P-B``,#`P.C`P-R``"
XM,#`P.C`P."``,#`P.C`P.2``,#`P.C`Q,"``,#`P.C`Q,2``,#`P.C`Q,B``Y
XM,#`P.C`Q,R``,#`P.C`Q-"``,#`P.C`Q-2``,#`P.C`Q-B``,#`P.C`Q-R```
XM,#`P.C`Q."``,#`P.C`Q.2``,#`P.C`R,"``,#`P.C`R,2``,#`P.C`R,B``^
XM,#`P.C`R,R``,#`P.C`R-"``,#`P.C`R-2``,#`P.C`R-B``,#`P.C`R-R``%
XM,#`P.C`R."``,#`P.C`R.2``,#`P.C`S,"``,#`P.C`S,2``,#`P.C`S,B``#
XM,#`P.C`S,R``,#`P.C`S-"``,#`P.C`S-2``,#`P.C`S-B``,#`P.C`S-R``*
XM,#`P.C`S."``,#`P.C`S.2``,#`P.C`T,"``,#`P.C`T,2``,#`P.C`T,B``(
XM,#`P.C`T,R``,#`P.C`T-"``,#`P.C`T-2``,#`P.C`T-B``,#`P.C`T-R``/
XM,#`P.C`T."``,#`P.C`T.2``,#`P.C`U,"``,#`P.C`U,2``,#`P.C`U,B``-
XM,#`P.C`U,R``,#`P.C`U-"``,#`P.C`U-2``,#`P.C`U-B``,#`P.C`U-R``4
XM,#`P.C`U."``,#`P.C`U.2``,#`P.C`V,"``,#`P.C`V,2``,#`P.C`V,B``2
XM,#`P.C`V,R``,#`P.C`V-"!I;&QE9V%L(&9U;F-T:6]N(&-O9&4@*&UA=&@I]
XM`#`P,#HP-C4@87-C:6DM/FYU;65R:6,@9F]R;6%T(&-O;G9E<G-I;VX@97)RD
XM;W(@*&UA=&@I`#`P,#HP-C8@;F]T(&$@;G5M8F5R("AM871H*0`P,#`Z,#8W_
XM(&EL;&5G86P@87)G=6UE;G0@*'5S=6%L;'D@;6%T:"D`,#`P.C`V."``,#`P?
XM.C`V.2``,#`P.C`W,"``,#`P.C`W,2``,#`P.C`W,B``,#`P.C`W,R``,#`P3
XM.C`W-"``,#`P.C`W-2``,#`P.C`W-B``,#`P.C`W-R``,#`P.C`W."``,#`PC
XM.C`W.2``,#`P.C`X,"``,#`P.C`X,2``,#`P.C`X,B``,#`P.C`X,R``,#`P8
XM.C`X-"``,#`P.C`X-2``,#`P.C`X-B``,#`P.C`X-R``,#`P.C`X."``,#`PH
XM.C`X.2``,#`P.C`Y,"``,#`P.C`Y,2``,#`P.C`Y,B``,#`P.C`Y,R``,#`P=
XM.C`Y-"``,#`P.C`Y-2``,#`P.C`Y-B``,#`P.C`Y-R``,#`P.C`Y."``,#`PM
XM.C`Y.2``,#`P.C$P,"``,#`P.C$P,2``,#`P.C$P,B!B=7,@=')A<``P,#`Z;
XM,3`S(&%D9')E<W,@=')A<``P,#`Z,3`T(&EL;&5G86P@:6YS=')U8W1I;VX`L
XM,#`P.C$P-2!D:79I9&4@8GD@>F5R;P`P,#`Z,3`V(")C:&LB(&EN<W1R=6-TG
XM:6]N('1R87``,#`P.C$P-R`B=')A<'8B(&EN<W1R=6-T:6]N('1R87``,#`P9
XM.C$P."!P<FEV:6QE9V5D(&EN<W1R=6-T:6]N`#`P,#HQ,#D@=')A8V4@97ACS
XM97!T:6]N`#`P,#HQ,3`@:6QL96=A;"!I;G-T<G5C=&EO;B`H,3`Q,"D`,#`P*
XM.C$Q,2!I;&QE9V%L(&EN<W1R=6-T:6]N("@Q,3$Q*0`P,#`Z,3$R(&5X8V5PQ
XM=&EO;B`Q,@`P,#`Z,3$S(&-O<')O8V5S<V]R('!R;W1O8V]L('9I;VQA=&EO'
XM;@`P,#`Z,3$T('-Y<W1E;2!S=&%C:R!F<F%M92!F;W)M870@97)R;W(`,#`PW
XM.C$Q-2!U;FEN:71I86QI>F5D(&EN=&5R<G5P=``P,#`Z,3$V(&5X8V5P=&EO:
XM;B`Q-@`P,#`Z,3$W(&5X8V5P=&EO;B`Q-P`P,#`Z,3$X(&5X8V5P=&EO;B`QS
XM.``P,#`Z,3$Y(&5X8V5P=&EO;B`Q.0`P,#`Z,3(P(&5X8V5P=&EO;B`R,``P4
XM,#`Z,3(Q(&5X8V5P=&EO;B`R,0`P,#`Z,3(R(&5X8V5P=&EO;B`R,@`P,#`Z\
XM,3(S(&5X8V5P=&EO;B`R,P`P,#`Z,3(T('-P=7)I;W5S(&EN=&5R<G5P=``P2
XM,#`Z,3(U(``P,#`Z,3(V(``P,#`Z,3(W(``P,#`Z,3(X(``P,#`Z,3(Y(``P4
XM,#`Z,3,P(``P,#`Z,3,Q(``P,#`Z,3,R(``P,#`Z,3,S(&%N('5N:6YI=&EA>
XM;&EZ960@=7-E<B!44D%0("@Q+3$U*2!W87,@97AE8W5T960`,#`P.C$S-"``G
XM,#`P.C$S-2``,#`P.C$S-B``,#`P.C$S-R``,#`P.C$S."``,#`P.C$S.2``9
XM,#`P.C$T,"``,#`P.C$T,2``,#`P.C$T,B``,#`P.C$T,R``,#`P.C$T-"``%
XM,#`P.C$T-2``,#`P.C$T-B``,#`P.C$T-R``,#`P.C$T."!F<&-P('5N;W)D'
XM97)E9"!C;VYD:71I;VX`,#`P.C$T.2!F<&-P(&EN97AA8W0@<F5S=6QT`#`PC
XM,#HQ-3`@9G!C<"!D:79I9&4@8GD@>F5R;P`P,#`Z,34Q(&9P8W`@=6YD97)F'
XM;&]W`#`P,#HQ-3(@9G!C<"!O<&5R86YD(&5R<F]R`#`P,#HQ-3,@9G!C<"!O+
XM=F5R9FQO=P`P,#`Z,34T(&9P8W`@;F]T(&$@;G5M8F5R`#`P,#HQ-34@97AC2
XM97!T:6]N(#4U`#`P,#HQ-38@<&UM=2!C;VYF:6=U<F%T:6]N`#`P,#HQ-3<@]
XM<&UM=2!I;&QE9V%L(&]P97)A=&EO;@`P,#`Z,34X('!M;74@86-C97-S(&QET
XM=F5L('9I;VQA=&EO;@`P,#`Z,34Y(&5X8V5P=&EO;B`U.0`P,#`Z,38P(&5X`
XM8V5P=&EO;B`V,``P,#`Z,38Q(&5X8V5P=&EO;B`V,0`P,#`Z,38R(&5X8V5PH
XM=&EO;B`V,@`P,#`Z,38S(&5X8V5P=&EO;B`V,P`P,#`Z,38T(&YO('!E<FUI]
XM<W-I;VX`,#`P.C$V-2!A<F=U;65N=',@=&\@1B1#:&M.86T@9&ED;B=T(&UA/
XM=&-H`#`P,#HQ-C8@<WES=&5M('-T86-K(&]V97)F;&]W`#`P,#HQ-C<@:6YV*
XM86QI9"!E=F5N="!)1"!N=6UB97(`,#`P.C$V."!E=F5N="!N;W0@9F]U;F0`*
XM,#`P.C$V.2!T:&4@979E;G0@:7,@8G5S>0`P,#`Z,3<P(&EM<&]S<VEB;&4@%
XM979E;G0@<&%R86UE=&5R<P`P,#`Z,3<Q('-Y<W1E;2!D871A('-T<G5C='5R$
XM97,@:&%V92!B965N(&1A;6%G960`,#`P.C$W,B!M;V1U;&4@<F5V:7-I;VX@R
XM:7,@:6YC;VUP871A8FQE('=I=&@@;W!E<F%T:6YG('-Y<W1E;0`P,#`Z,3<S:
XM('!A=&@@8F5C86UE(&QO<W0@8F5C875S92!N971W;W)K(&YO9&4@=V%S(&1OR
XM=VX`,#`P.C$W-"!B860@9&ES:R!P87)T:71I;VXL(&]R(&YO(&%C=&EV92!PM
XM87)T:71I;VX`,#`P.C$W-2``,#`P.C$W-B``,#`P.C$W-R``,#`P.C$W."``,
XM,#`P.C$W.2``,#`P.C$X,"``,#`P.C$X,2``,#`P.C$X,B``,#`P.C$X,R``=
XM,#`P.C$X-"``,#`P.C$X-2``,#`P.C$X-B``,#`P.C$X-R``,#`P.C$X."``M
XM,#`P.C$X.2``,#`P.C$Y,"``,#`P.C$Y,2``,#`P.C$Y,B``,#`P.C$Y,R``B
XM,#`P.C$Y-"``,#`P.C$Y-2``,#`P.C$Y-B``,#`P.C$Y-R``,#`P.C$Y."``R
XM,#`P.C$X.2``,#`P.C(P,"!T:&4@<&%T:"!T86)L92!I<R!F=6QL`#`P,#HR)
XM,#$@8F%D('!A=&@@;G5M8F5R`#`P,#HR,#(@<WES=&5M($E242!T86)L92!I^
XM<R!F=6QL`#`P,#HR,#,@8F%D($DO3R!M;V1E`#`P,#HR,#0@<WES=&5M(&1EF
XM=FEC92!T86)L92!I<R!F=6QL`#`P,#HR,#4@8F%D(&UO9'5L92!H96%D97(`U
XM,#`P.C(P-B!S>7-T96T@;6]D=6QE(&1I<F5C=&]R>2!I<R!F=6QL`#`P,#HR-
XM,#<@;65M;W)Y(&9U;&P`,#`P.C(P."!U;FMN;W=N('-E<G9I8V4@8V]D92``S
XM,#`P.C(P.2!N;VXM<VAA<F%B;&4@;6]D=6QE(&ES(&)U<WD`,#`P.C(Q,"!BC
XM860@<&%G92!A9&1R97-S`#`P,#HR,3$@96YD(&]F(&9I;&4`,#`P.C(Q,B!)Z
XM4E$@=F5C=&]R(&ES(&)U<WD`,#`P.C(Q,R!N;VXM97AI<W1I;F<@<V5G;65NW
XM=``P,#`Z,C$T(&9I;&4@;F]T(&%C8V5S<VEB;&4`,#`P.C(Q-2!B860@<&%T"
XM:&QI<W0`,#`P.C(Q-B!F:6QE(&YO="!F;W5N9``P,#`Z,C$W(&9I;&4@<V5GW
XM;65N="!L:7-T(&ES(&9U;&P`,#`P.C(Q."!C<F5A=&EN9R!A;B!E>&ES=&EN$
XM9R!F:6QE`#`P,#HR,3D@:6QL96=A;"!M96UO<GD@8FQO8VL@861D<F5S<P`PA
XM,#`Z,C(P(&UO9&5M(&1A=&$@8V%R<FEE<B!L;W-T`#`P,#HR,C$@;6]D=6QE)
XM(&YO="!F;W5N9``P,#`Z,C(R('-Y<W1E;2!C;&]C:R!N;W0@<G5N;FEN9P`P`
XM,#`Z,C(S(&1E;&5T:6YG('-T86-K(&UE;6]R>0`P,#`Z,C(T(&EL;&5G86P@(
XM<')O8V5S<R!)1``P,#`Z,C(U(&)A9"!)4E$@<&%R86UE=&5R`#`P,#HR,C8@'
XM;F\@8VAI;&1R96X`,#`P.C(R-R!I;G9A;&ED('1R87`@;G5M8F5R`#`P,#HRN
XM,C@@<')O8V5S<R!H87,@86)O<G1E9``P,#`Z,C(Y('-Y<W1E;2!P<F]C97-SQ
XM('1A8FQE(&ES(&9U;&P`,#`P.C(S,"!I;&QE9V%L(&9O<FL@<&%R86UE=&5R#
XM`#`P,#HR,S$@:VYO=VX@;6]D=6QE`#`P,#HR,S(@8F%D(&UO9'5L92!#4D,`9
XM,#`P.C(S,R!U;G!R;V-E<W-E9"!S:6=N86P@<&5N9&EN9P`P,#`Z,C,T(&YOP
XM;B!E>&5C=71A8FQE(&UO9'5L90`P,#`Z,C,U(&)A9"!N86UE`#`P,#HR,S8@'
XM8F%D(&UO9'5L92!H96%D97(@<&%R:71Y`#`P,#HR,S<@;F\@4D%-(&%V86EL?
XM86)L90`P,#`Z,C,X(&1I<F5C=&]R>2!I<R!N;W0@96UP='D`,#`P.C(S.2!NB
XM;R!A=F%I;&%B;&4@=&%S:R!N=6UB97(`,#`P.C(T,"!I;&QE9V%L('5N:70@&
XM*&1R:79E*2!N=6UB97(`,#`P.C(T,2!B860@<V5C=&]R(&YU;6)E<@`P,#`Z?
XM,C0R(&UE9&EA(&ES('=R:71E('!R;W1E8W1E9``P,#`Z,C0S($DO3R!E<G)O+
XM<B`M(&)A9"!C:&5C:R!S=6T`,#`P.C(T-"!R96%D(&5R<F]R`#`P,#HR-#4@(
XM=W)I=&4@97)R;W(`,#`P.C(T-B!D979I8V4@;F]T(')E861Y`#`P,#HR-#<@8
XM<V5E:R!E<G)O<@`P,#`Z,C0X(&UE9&EA(&9U;&P`,#`P.C(T.2!I;F-O;7!A]
XM=&%B;&4@;65D:6$`,#`P.C(U,"!D979I8V4@8G5S>0`P,#`Z,C4Q(&1I<VL@)
XM;65D:6$@:&%S(&-H86YG960`,#`P.C(U,B!R96-O<F0@:7,@8G5S>0`P,#`ZQ
XM,C4S(&YO;BUS:&%R86)L92!F:6QE+V1E=FEC92!I<R!B=7-Y`#`P,#HR-30@W
XM22]/(&1E861L;V-K(&5R<F]R`#`P,#HR-34@9&5V:6-E(&ES(&9O<FUA="!P3
XM<F]T96-T960`)7,Z("5S#0`E,#-D+B4P,V0@#0`-`"4P,V0N)3`S9"`-`$Y5'
XM``!(Y\"@(#S___^\80"?,"(\```$`$'Z!O0@"&$`'M`D0'+_LH!F!'``8`8@)
XM*@`PT(I,[04"__1.74YU3E4``$CGP(`@//___[QA`)[R(CP```0`0?H&OB`(V
XM80`>WDSM`0+_^$Y=3G5.50``2.?,,"1`*`$@//___[QA`)["80#_?B9`2H!GD
XM2G`!L*L`"&<$8:I@/GH`8"HB"B`%ZX@@,PA880`4$DJ`9A8@!>N(N+,(8&8,7
XM<%C0BR(%ZXG0@6`44H6ZDVW280#_="U\````V(`,<`!,[0PP__!.74YU3E4`L
XM`$CGS"`@//___[QA`)Y080#_#"1`2H!F!'``8#IX`&`D(A<@!.N((#((6&$`L
XM$ZA*@&80(`3KB"HR"&!A`/\>(`5@%%*$N))MV&$`_Q`M?````-B`#'#_3.T$[
XM,O_P3EU.=4Y5``!(Y\@X)$`F02@O`"`@//___[AA`)WD<@$@"F$`_P8H0$J`+
XM9@1P`&`@(`13@"\`(BP`!"`+80`3FEB/(`13@$(S"`!A`/ZR(`M,[1P0__!.$
XM74YU3E4``$CGP+`D0"`\____O&$`G91R`B`*80#^MB9`2H!F!'#_8`IA`/Y\N
XM(&L`!"`03.T-`O_P3EU.=4Y5``!(Y\"X)$`@//__][!A`)U:3^_W^`P2`"]F+
XM`E**<@0@"F$`_G`H0$J`9P``ED'Z!1@@"&$`'`HO0`@$<O^R@&8(80#^)&``R
XM`'I"IW(`("\("&$`'))8CTJ`9NXF;``$+U,(`'`!L*\(`&8V2JL`#&<L2%<BQ
XM/```"``@*P`,80`;$%B/<O^R@&<4("\"P+"K`!AF"B`O`KRPJP`49P1"KP@``
XM<@`@+P@$80`;S"`O"`1A`!N<80#]LDJO"`!F!'``8`)P_T_O"`A,[1T"_^Q.C
XM74YU3E4``$CGR+@D0"`\___WM&$`G(9/[_?\#!(`+V8"4HIR!"`*80#]G"A`B
XM2H!G7D'Z!$X@"&$`&S@O0`@`<O^R@&=&0J=R`"`O"`1A`!O(6(]*@&;N)FP`0
XM!'`!L)-F``">2JL`#&<``)9X`&!<(`12A'(4LH!L''(`("\(`&$`&R8@+P@`J
XM80`:]F$`_0QP_V```-!P_["K`!!G#"(K`!`@*P`,80`<)G(`("\(`&$`&O9P(
XM!6$`&2Y"IW(`("\(!&$`&U18CTJ`9NYP`;"39BY(5R(\```(`"`K``QA`!GBX
XM6(]R_[*`9Q8@+P+`L*L`&&8,("\"O+"K`!1G`/]R)KP````!<`!A``_")T``]
XM"&$`''HG0``,)V\("``02%<B/```"``@*P`,80`9EEB/<O^R@&<.)V\"P``8#
XM)V\"O``48`A"JP`80JL`%'(`("\(`&$`&E0@+P@`80`:)&$`_#IP`$_O"`1,!
XM[1T0_^Q.74YU3E4``$CGP+@D0"`\___WM&$`FQA/[_?\#!(`+V8"4HIR!"`*<
XM80#\+BA`2H!G&$'Z`N@@"&$`&<HO0`@`<O^R@&8(80#[Y'#_8&Q"IW(`("\("
XM!&$`&E)8CTJ`9NXF;``$<`&PDV8X80`;LK"K``QF+DA7(CP```@`("L`#&$`D
XM&-)8CW+_LH!G%B`O`L"PJP`89@P@+P*\L*L`%&8"0I-R`"`O"`!A`!F0("\(*
XM`&$`&6!A`/MV<`!/[P@$3.T=`O_L3EU.=4Y5``!(Y\"X)$`@//__][!A`)I45
XM3^_W^`P2`"]F`E**<@0@"F$`^VHH0$J`9QA!^@(L(`AA`!D&+T`(`'+_LH!FF
XM"F$`^R!P_V```'Y"IW(`("\(!&$`&8Q8CTJ`9NXF;``$</\O0`@$<`&PDV9`N
XM80`:YK"K``QF-DA7(CP```@`("L`#&$`&`98CW+_LH!G'B`O`L"PJP`89A0@L
XM+P*\L*L`%&8*0J\(!"=O"`P`$'(`("\(`&$`&+P@+P@`80`8C&$`^J(@+P@$U
XM3^\("$SM'0#_\$Y=3G5.50``2.?(N"1`*`$@//__][!A`)E\3^_W^`P2`"]FW
XM`E**<@0@"F$`^I(H0$J`9QA!^@%<(`AA`!@N+T`(`'+_LH!F"F$`^DAP_V``_
XM`(9"IW(`("\(!&$`&+18CTJ`9NXF;``$</\O0`@$<`&PDV9(2%<B/```"``@U
XM*P`,80`7.%B/<O^R@&<P("\"P+"K`!AF)B`O`KRPJP`49AQP_["K`!!G%$*O<
XM"`0@*P`0T(0B`"`K``QA`!D,<@`@+P@`80`7W"`O"`!A`!>L80#YPB`O"`1/8
XM[P@(3.T=$/_L3EU.=4Y5``!(Y\`@)$`@//___[QA`)B><@`@"F$`_P9,[00"!
XM__A.74YU3E4``$CGP"`D0"`\____O&$`F'AR`2`*80#^X$SM!`+_^$Y=3G5#$
XM;W!Y<FEG:'1S("AC*2`Q.3@X(&)Y(')E8V-O=V%R92!S>7-T96US('!U8VAH]
XM96EM`%-Y<TEN9F\`4WES26YF;P!3>7-);F9O`%-Y<TEN9F\`4WES26YF;P!3%
XM>7-);F9O`%-Y<TEN9F\`3E4``$CGS+`D0"`\____N&$`E^A9CW@`<"@N@"`7#
XMY8AA``P,(&\`"""`9R0@%U.`L(1N)'`HT9<@%^6((@`@;P`((!!A``OP(&\`P
XM"""`9@AP_V```)12B@P2`"!G^`P2``EG\@P2``UG``!N2A)G``!H(`12A.6($
XM(&\`""!0)DHAB@@`>@!@0$H%9BH,$@`@9P8,$@`)9AY2BF`VNA)F!GH`4HI@9
XM(DH%9P06VF`:&AI@%A;:8!(0$DB`#$``(F?<#$``)V?68.I*$F<&#!(`#6:VW
XM0AM@`/]6(`3EB"!O``@@4$*P"``@!%B/3.T-,/_L3EU.=4Y5``!(Y\"P(#S_;
XM__^\80"6]B(\```,`$'Z`,H@"&$`%I8D0'+_LH!G(C`J`$!(P-"*)D!*@&<.\
XM(@M![J>L(`AA``OV8`H@"F$`%J)P`&`,(`IA`!:80>ZGK"`(3.T-`O_P3EU.5
XM=4Y5``!(Y\RX)$`F02AO`"@@//___[QA`):(2J\`+&8D0?H`82(((`MA``NH=
XM(@H@"V$`"\`B#"`+80`)KB@`9P0@!&`P80#_5"H`9R8B!2`+80`+@$'Z`#(BS
XM""`+80`+E"(*(`MA``N,(@P@"V$`"7I@`G``3.T=,/_H3EU.=6EN:70`+V1D7
XM+P`O`$Y5``!(Y\B`(#S___^\80"6!G(!0?H%$"`(80`)NC@`;A!R`4'Z!1`@R
XM"&$`":HX`&\$,`1@#'(!0?H%#"`(80`)EDSM`1+_]$Y=3G5.50``2.?.L"`\G
XM___[N&$`E;I/[_P`2FZGSF8``'PM;P0`I])!^@3D(`AA``FZ)$!*@&=(2A)G2
XM1'`OL!)G,D'Z!-(@"&$`":`F0$J`9PXB"R`O!`1A``KL2H!F#B(*("\$`&$`?
XM"IA@``&`80#_2&`(<@$@"F$`"10]0*?.2FZGSF8(80#_,#U`I\Y*;J?.;`@P.
XM+J?.8```^D*G<@`P;J?.(`AA``D*6(]P`#P`,$`J""1O!``P!DC`L(5F'DAX*
XM!`!![P`$(@@P;J?.(`AA``C06(\J`&\``19\`#`&4D9(P$'7$#`(`!@`<@VRH
XM`&82M>\$`&,R<%RP*O__9BI3BF"T("\$``:````$`+7`911(>`!00?H$`R((A
XM<`)A``B.6(]@!!3$8(Y"$B(O!`0@+P0`80``VDJ`9P#_>$INI]!F``"H)&\$Q
XM`$H29P9P.K`:9O9*$F<``(IP=+`:9NIP8[`:9N1P/;`:9MXF2E*+2A-G!G`Z'
XML!-F]$(34FZGT"(*0=<@"&$`_GQ*@&8*<``]0*?02,!@:E-NI]!'UTH39P9PP
XM.K`;9O8@"I"O!``B`"`+80`)+-*`#($```0#;11(>`!00?H#;B((<`)A``?@X
XM6(]@+"(+5XH@"F$`"21@`/]J,&ZGSB`(80`'U'`!8!)*;J?09@HP;J?.(`AA7
XM``?`<`!/[P0`3.T-</_H3EU.=4Y5``!(Y\"X)$$@//___\!A`).L(%=P([`0V
XM9T8F5V`X*$I*$V<$MPQG^%.+2B1F%G!\L!-G"G`ZL!-G!$H39@9P`6`@4HM*_
XM$V<,<#JP$V<&<'RP$V;N4HM*$V<&<#JP$V:^<`!,[1T`__!.74YU3E4``$CG0
XM@#`D0"`\____P&$`DSXF;J?22A-G!G`ZL!MF]DH39R80&[`29NQ*$V?H$!NPW
XM*@`!9N!*$V<&<#JP$V8$<`%@"'!`L!-FS'``3.T,`/_X3EU.=4Y5``!(Y\RPX
XM)$`@//___\!A`)+F(&\`!"908```UG@;8```SG@*8```R'@-8```PG@)8```(
XMO'@(8```MG@,8```L'`PL$1N``"H<#>P1&T``*!P,)A`>@+G3!`:2(!(P`2`=
XM````,(A`4T5*16<``()P,+`2;@``>G`WL!)LVF```'`0&DB`.``,0`!F9ZYBD
XM)`P``%YG6F(2#```7&=28J(,``!%9P#_>&"8#```8F<`_X9@C@Q``')G`/]PK
XM8@P,``!N9P#_8&``_WH,0`!T9P#_8&``_VX0&DB`2,!R'\"!.`!@#`Q$`%QG=
XMF`Q$`%YGYA;$$!I(@#@`2D!G!G`ZL$1FXD(;(&\`!"10(&\`!""+(`I,[0TPV
XM_^Q.74YU3E4``$CGP#`D0"`\____O&$`D<HF;J?22A-G!G`ZL!MF]DH39Q@0D
XM&[`29NQ*$V?H$!NP*@`!9N!P0+`39@1P`&`2<#VP$V;0(B\`!%*+(`MA`/Z2:
XM3.T,`/_X3EU.=4Y5``!(Y\PP)$`@//___\!A`)%L)FZGTDH39P9P.K`;9O9*%
XM$V<8$!NP$F;L2A-GZ!`;L"H``6;@<$"P$V8$</]@0G`CL!-FT'H*4HMP,+`3'
XM9@)Z"'@`8!PP!4C`,@1(P6$`"Q@X`!`;2(!(P`2`````,-A`<#"P$VX&<#FP-
XM$VS8,`1(P$SM##+_[$Y=3G4O9&0O<WES+W1E<FUC87``+V@P+W-Y<R]T97)M_
XM8V%P`"]D,"]S>7,O=&5R;6-A<`!415)-0T%0`%1%4DT`5&5R;6-A<"!E;G1R)
XM>2!T;V\@;&]N9R$-`%1E<FUC87`@96YT<GD@=&]O(&QO;F<A#0``3E4``$CG)
XM[[`@//___[QA`)!P1^ZGUBHO`#!\`'X`(!<D0$J`9@`!>$'Z`>!@``'0<"6P@
XM1&8``69@``#T<`JPA6XP<&2PA6X8(`5R9&$`"F9R,("!%L!R9"`%80`*@BH`8
XM3^W_V"`%<@IA``I*<C"`@1;`3^W_V"`%<@IA``IB<C"`@1;`3^W_V$J&9@1P9
XM`6`"<``L`$J&9P8@+P`$8`0@+P`P*@!@``#X$!I(@$C`VH!*A6<&<`VPA68(D
XM4H4@!E*`CH`6Q6"^$!I(@$C`NH!O#!`:2(!(P-J`8```Q%**8```OE*O``12.
XMKP`P4H5@``"P%H1@``"J(`5R"F$`";CIB"0`(`5R"F$`"=;4@"H"8```CB`%V
XM<A!A``G&XX@B!9*`*@%@``!Z0?H`YV```-(0&DB`.``,0``^9XQB,`P``"YG)
XM`/]N8A(,```K9P#_7&+6#```)6>:8,X,```S9P#^ZF+$#$``,F<`_OA@N@Q`G
XM`&1G`/[*8A(,``!$9Y9BJ`P``$)G`/]R8)X,0`!R9P#^]F*4#```:6<`_TI@6
XMBA;$$!I(@#@`9@#^BDJ'9TP@!P@```!G%"(ND"P@"V$``_8@+I`L80`#SM?`.
XM(`<(```!9RA*KI`P9QX@;I`P2A!G%B(ND#`@"V$``\P@+I`P80`#I-?`8`06S
XM_``(0A-![J?6(`A,[0WT_^!.74YU3T]04P!/3U!3`$Y5``!(Y^ZP)$`H`29O(
XM`"P@//___[QA`(Y4>@`@"F<``.AP,+`2;BYP.;`2;2AZ`#`%2,!R"F$`"#`23
XM&DB!2,'0@02`````,#H`<#"P$FX&<#FP$FS:<`HR!4C!80`("CH`<"ZP$F8<[
XM4HIP,+`2;A1P.;`2;0X0&DB`2,`$@````##:0'`JL!)F&C`$2,`R!4C!80`'N
XMU#H`4HI@"!`:2(!(P$Z32A)F]$I%9UQ*;I`T;59P$;!ND#1M3C`ND#1(P..(G
XM0>ZQ_#`P"`!(P&P"4H#B@-I`,"Z0-$C`XXA![K'\,#`(`$C`,@5(P20`(`$B0
XM`F$`!ZX\`&`,$"Z0*DB`2,!.DU-&2D9N\$SM#73_Y$Y=3G5.50``2.>`.'``U
XM*$`F0"1`<`UR`$'Z`&1'[H`,=@@F@R8NJZ8D+JNB*&ZR'DY``"%E/DJ39QA!!
XM^@!&<F1P`DY``(Q!^@`V<MT`/``!8"(]?`!!J")";J@D/7P``J@^/7P``:A`D
XM/7P``JA:/7P``JA<3.T<`/_T3EU.=6-I;P`J*BHJ(&-I;R!T<F%P:&%N9&QES
XM<B!M:7-M871C:"`J*BHJ#0!.30``3DT``4Y-``).30`#3DT`!$Y-``5.30`&/
XM3DT`!TY-``A.30`)3DT`"DY-``M.30`,3DT`#4Y-``Y.30`/3DT`$$Y-`!%.[
XM30`23DT`$TY-`!1.30`53DT`%DY-`!=.30`83DT`&4Y-`!I.30`;3DT`'$Y-S
XM`!U.30`>3DT`'TY-`"!.30`A3DT`(DY-`"-.30`D3DT`)4Y-`"9.30`G3DT`?
XM*$Y-`"E.30`J3DT`*TY-`"Q.30`M3DT`+DY-`"].30`P3DT`,4Y-`#).30`S+
XM3DT`-$Y-`#5.30`V3DT`-TY-`#A.30`Y3DT`.DY-`#M.30`\3DT`/4Y-`#Y.J
XM30`_3E4``$CGP(!/[__H0?H`5"Z(+V\`&``$0J\`"$*G0J="IR\NJZ9(;P`0K
XM(B\`%$'Z#"P@"&$`_Y)/[P`4+T``%$'O``P@"&$`"[*PKP`49O`@+P`,3^\`K
XM&$SM`0+_^$Y=3G5S:&5L;`!.50``2.>`@"`70>ZR(Q`P"`!(@$C`"````F<*Q
XM(!<"@````-]@`B`73.T!`/_\3EU.=4Y5``!(YX"`(!=![K(C$#`(`$B`2,`(!
XM```!9P@@%PC```5@`B`73.T!`/_\3EU.=4Y5``!(YX`P)$`F2DH;9OP@"Y"*2
XM4X!,[0P`__A.74YU3E4``$CGP#@D0"9!*$H0&QC`9OH@"DSM'`#_]$Y=3G5.5
XM50``2.?`."1`)D$H2DH<9OQ3C!`;&,!F^B`*3.T<`/_T3EU.=4Y5``!(Y\`PE
XM)$`F06`*2AMF!'``8!A2BA`2L!-G\!`32(!(P!(22(%(P9*`(`%,[0P`__A.J
XM74YU3E4``$CGP#@D0"9!*$H0&QC`;OIP?\$L__]"%"`*3.T<`/_T3EU.=4Y5%
XM``!(Y\@X)$`F02@O`"`H2B`$4X1*@&\,$!L8P$H`9O!@`D(<(`13A$J`;O8@/
XM"DSM'!#_\$Y=3G5.50``2.?(,"1`)D$H+P`<8`9*&V<44HH@!%.$2H!O!A`22
XML!-G[$J$;`1P`&`0$!-(@$C`$A)(@4C!DH`@`4SM#!#_]$Y=3G5.50``2.?(@
XM."1`)D$H+P`@*$I*'&;\4XP@!%.$2H!O"!`;&,!*`&;P2H1L`D(4(`I,[1P03
XM__!.74YU3E4``$CGR"`D0"@!N!)F!"`*8`9*&F;T<`!,[000__A.74YU3E4`K
XM`$CGR#`D0"@!E\NX$F8")DI*&F;V(`M,[0P0__1.74YU3E4``$CGSJ`D0'H`W
XM$!H<`'(@L@!G]G`)L`9G\'`ML`9F!'`!8`)P`"@`<"VP!F<@<"NP!F8<8!@@:
XM!7(*80`"XA(&2(%(P="!!(`````P*@`<&A`&2(!(P$'NLB,0,`@`2(!(P`@`?
XM``-FSDJ$9P8@!42`8`(@!4SM!7+_Z$Y=3G5.50``2.?`,"1`)F\`'"UO`!BK=
XMEBU+JYH@+P`$4X`B+JN680`"?-"*(@`@"F$*3.T,`/_X3EU.=4Y5``!(Y^"X.
XM)$`F05&/8```O"A*+TL`!"`NJY;CB"(+DHHD`"`!(@)A``)V(BZKEF$``C;0V
XMBBZ`8`8@+JN6V<`B%R`,(&ZKFDZ02H!M[&`(("ZKEI&O``0B+P`$(!<@;JN:9
XM3I!*@&WHN>\`!&(PN>\`!&0<(B\`!"`,86*YUV8&+J\`!&`*(!>PKP`$9@(NB
XMC"`NJY;9P"`NJY:1KP`$N>\`!&.<(`N0C"(O``22BK"!;`XB"R`,80#_2"9OK
XM``1@#"(O``0@"F$`_S@D3+7+90#_0E"/3.T=!/_L3EU.=4Y5``!(Y\PP)$`F'
XM02@NJY9@!AH2%-,6Q2`$4X1*@&;R3.T,,/_P3EU.=4Y5``!(Y^#@($`D020M#
XM``AG`F$*3.T'!__H8```VDJ"9TJQRF)(9T0P"@@```!G!!#:4X(P"`@```!FC
XM).**9`9A!!#:3G7BBF0&,-I@`B#:4<K__%)"4X)D]'0`3G40VE'*__Q20E."_
XM9/1T`$YUU<+1PC`*"````&<$$2)3@C`("````&8DXHID!F$$$2).=>**9`8QP
XM(F`"(2)1RO_\4D)3@F3T=`!.=1$B4<K__%)"4X)D]'0`3G5.50``2.?(,"1`$
XM)D$H+P`<8!P0$K`39Q(0$TB`2,`2$DB!2,&2@"`!8`Y2BE*+(`13A$J`8MQPJ
XM`$SM#!#_]$Y=3G5.50``2.?.("1`*`$J+P`@<``0!"P`8`(4QB`%4X5*@&+V'
XM3.T$</_P3EU.=4Y5``!(Y\X@)$`H`2HO`"!P`!`$+`!@#G``$!*PAF8$(`I@J
XM#%**(`53A4J`8NIP`$SM!'#_\$Y=3G5(YS@`)``F`$A#*`%(1,#!PL/$Q,;$^
XM2$#007@`UX300M>$2$!"04A!0D)(0M*"TH-*@$S?`!Q.=2\"=`!*@&H$1(!T-
XM`TJ!:@9$@0H"``%A(N(*9`)$@.(*9`)$@20?2H!.=6'4P4%*@$YU80;!04J`'
XM3G5(YS@`)`%F!H'\``!@;E.!9VHH`2(`M(%E#&<$<`!@7'`!DH)@5B8":_;&]
XMA&82XHIV_^**5<O__$2#YJC"A&`\<`!V_^.":@:T@6(*8`RT@53+__)G!%*#G
XMXHI$@V`$XX#BBI*"91!2@%'+__1@#N.`XHK2@F7P4<O_]M*"3-\`'$J`3G4J9
XM7U.%96(0&&?X#```#6=8#```(&?L#```"6?F#```+&?@4H(,```B9S`,```G)
XM9RI(:/__4X5E,!`89\8,```-9Q(,```@9PP,```)9P8,```L9N!"*/__8*A(J
XM4%.%90@2&+`!9O9@["!/2%<O`E."9Q#E@B`P*``AD"@`(,!1@F+R3M5.50``H
XM2.=@@"!!,CP``$Y``(U@``7&3E4``$CG8(`R/``!3D``C64`!;0@`6``!:Q.^
XM50``2.=@@#(\``9.0`"-9``%H@Q!`--F``62<`%@``6*3E4``$CG8(`@03(\\
XM``\D+0`(8*A.50``2.=@@"!!,CP`#F"83E4``$CG8(`R/``"3D``C64`!50@2
XM`F``!4Q.50``2.=@@#(\``5@Y$Y5``!(YV"`($$R/```3D``CF``!2A.50``I
XM2.=@@#(\``-@ZDY5``!(YV"`)`$R/``"8-I.50``2.=@@"!!,CP`#V#*3E4`H
XM`$CG8(`D`3(\`!!@NDY5``!(YV"`)`$R/``18*I.50``2.=@@"0!,CP`&F":%
XM3E4``$CG8(`R/``;8/!.50``2.=@@$CG&$`D`7($3.T#&``(3D``CDS?`AA@\
XM``2:3E4``$CG8(`D`3(\`!Q@ODY5``!(YV"`,CP`)&"P3E4``$CG8(`R/``EV
XM8*).50``2.=@@#0!,CP`)F"23E4``$CG8(`T`3(\`"=@@DY5``!(YV"`<`!.]
XM0``*8``$/$Y5``!(YV"`(&T`""(0($`@%TY``!=E``0D(&T`"""!8``$(DY5+
XM``!(YV"`3D``#V``!`CAB`C``!].50``2.=@@$Y```I@``/R3E4``$CG`,`@Y
XM02)`(BT`"$Y``!%E%'``8$I.50``2.?`P"!`3D``$&0V+4&`#&`L3E4``$CGN
XMP,`B0"!)#!@`+F?Z#"@`+___9_)3B$Y``!!E"DH`9PH,```O9]YP_V`$(`F0G
XMETSM`P+_]$Y=3G5.50``2.=@@$CG`&`D+0`,($`@`2(M``A.0``E90(@"DS?;
XM!@!@``-<3E4``$CG8(`@0$Y``!IE``-,(`%@``-$3E4``$CG8(`@0$Y``!]E?
XM``,T(`%@``,L3E4``$CG8(`@;0`(3D``&&```QA.50``2.=@@"!`3D``)F``U
XM`P9.50``2.=@@`C!`!]@#$Y5``!(YV"`)"T`"$Y``"=E``+F(`)@``+>3E4`A
XM`$CG8(!.0``+8``"SDY5``!.0`!23EU.=4Y5``!(YV"`+PD@;0`((FT`#$Y`Q
XM`!LB7V```J9.50``2.<P@"0!)B\`%"!O`!AR`DY``%-D!BU!@`QP_TSM`0S_(
XM]$Y=3G5.50``2.<P@"!`<@!@W$Y5``!(YS"`<@%@T$Y5``!(YS"`($!R`V#"0
XM3E4``$CG,(`@07('8+1.50``@GP`"$Y``%-D!BU!@`QR_R`!3EU.=4Y5```OP
XM`7(&3D``4V0&+4&`#'+_(`$B+?_\3EU.=4Y5```O`G0)8!).50``+P)T"F`(%
XM3E4``"\"=`O#0H)O``Y.0`!39`8M08`,<O\@`20M__Q.74YU3E4``$CG,`!T>
XM!,-")B\`$$Y``%-D!BU!@`QR_R`!3.T`#/_X3EU.=4Y5``!(YS``=`5@UDY5#
XM``!(YV"`($`P`4CG`&!.0```90(@"DS?!@!@``&"3E4``$CG8(`@0#`!2.<`4
XM8$Y```%@WDY5``!(YV"`+PHD0$Y```(D7V```59.50``2.=@@"!`,`%.0``=T
XM8``!0DY5``!(YV"`<@,@0,%!3D``AF```39.50``2.=@@'($8.A.50``2.=@Y
XM@$Y```A@``$03E4``$CG8(`@0'``3D``!&4``/XD"&<``/9"6#"!8```[DY5#
XM``!(YV"`3D``#6```-Y.50``2.=@@$CG'$!Z`V`N3E4``$CG8(!(YQQ`>@%@(
XM'DY5``!(YV"`2.<<0'H"8`Y.50``2.=@@$CG'$!Z`"!`)`$B;0`(,"T`$DA`/
XM,"T`#B(M`!1V`P@%``%G!"8M`!PH+0`8"`4``&8&3D```V`$3D``!4S?`CA@B
XM``!B3E4``$CG8(!.0``,8```4DY5``!(YV"`3D``#&4``$0@`6```#Q.50``U
XM2.=@@"(`3D``'&```"I.50``2.=@@$'Z`!(M0*N>9@(@0$Y```E@```.(`$@H
XM;JN>3I!.0``>9`PM08`,</]@!&7V<`!,[0$&__1.74YU3E4``"(`80``'F$`/
XM\H!@"$Y5``!*_"(`3D``!MZMWJT`/``!3G5.=0``*Z(```L:```H%@```B!"F
XM<F]W<V4@=&AR;W5G:"!A(&1I<F5C=&]R>2P@=W)I='1E;B!B>2!0971E<B!D_
XM82!3:6QV80U!9&%P=&5D(&9O<B!/4RTY('5S:6YG(%1/4"=S(&]S.6QI8@U34
XM>6YT87@Z(&)R;W=S92!;/&1I<CY=#49U;F-T:6]N.B!S:&]W(&%N(&QS+6QI/
XM:V4@9&ER96-T;W)Y(&QI<W1I;F<@=VAI8V@@8V%N(&)E("=E9&ET960G+"!I=
XM+F4N#2`@("`@("`@("!F:6QE<R!M87D@8F4@=&%G9V5D(&%N9"!I;G-P96-TD
XM960L(&1U;7!E9"P@97AE8W5T960L(&1E;&5T960L#2`@("`@("`@("!R96YAY
XM;65D+"!C;W!I960L(&5D:71E9"!E=&,N#4]P=&EO;G,Z#2`@("`@;F]N90T`8
XM````'@```````````````#L.```8-@```#8``#L/```[$@``.RT`````````J
XM`0``/"D``#PM```\,0``/#4``#PY```\/0``/$$``#Q%```\20``/$T``#Q1T
XM```\50``````````````````````````````````````````````````````1
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````"X`````````````````````````````````````````````````````N
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````````+V@P+W-Y<R]B<F]W<V4N;6%C<F]S````)
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````0```&CP!]`%U
XM-0.-`N<"F@%-`*8`4P`W`#(`*@`<`!0`#@`*``4``@```````0$!`0$!`0$!\
XM$1$!$1$!`0$!`0$!`0$!`0$!`0$!`0$P("`@("`@("`@("`@("`@2$A(2$A(7
XM2$A(2"`@("`@("!"0D)"0D("`@("`@("`@("`@("`@("`@("`B`@("`@($1$\
XM1$1$1`0$!`0$!`0$!`0$!`0$!`0$!`0$("`@(`$`3OD``(+23OD``(+<3OD`H
XM`(*\3OD```````!0#@``4`\``%`M``!00P``4%X``%!G``!0<```4'D``%""2
XM``!0BP``4)0``%"=``!0I@``4*\``%"X``!0P0``4,H``%#3``!0W```4.4`8
XM`%#N``!0]P``40```%$)``!1$@``41L``%$D``!1+0``438``%$_``!12```B
XM45$``%%:``!18P``46P``%%U``!1?@``48<``%&0``!1F0``4:(``%&K``!1V
XMM```4;T``%'&``!1SP``4=@``%'A``!1Z@``4?,``%'\``!2!0``4@X``%(7`
XM``!2(```4BD``%(R``!2.P``4D0``%)-``!25@``4E\``%)H``!2<0``4GH`5
XM`%*?``!2U0``4O$``%,9``!3(@``4RL``%,T``!3/0``4T8``%-/``!36```W
XM4V$``%-J``!3<P``4WP``%.%``!3C@``4Y<``%.@``!3J0``4[(``%.[``!3^
XMQ```4\T``%/6``!3WP``4^@``%/Q``!3^@``5`,``%0,``!4%0``5!X``%0G8
XM``!4,```5#D``%1"``!42P``5%P``%1Q``!4C0``5*0``%3#``!4Y```50,`[
XM`%4;``!5/@``56$``%5V``!5G0``5<4``%7E``!5^@``5@\``%8D``!6.0``'
XM5DX``%9C``!6>```5HT``%:H``!6L0``5KH``%;#``!6S```5M4``%;>``!63
XMYP``5O```%<G``!7,```5SD``%="``!72P``5U0``%==``!79@``5V\``%=XN
XM``!7@0``5XH``%>3``!7G```5Z4``%?&``!7X@``5_X``%@5``!8,```6$8`0
XM`%A@``!8=0``6)```%BO``!8TP``6.@``%C]``!9$@``62<``%D\``!94@``?
XM67T``%F;``!9NP``6=,``%GM``!:$0``6D(``%J```!:MP``6NH``%KS``!:M
XM_```6P4``%L.``!;%P``6R```%LI``!;,@``6SL``%M$``!;30``6U8``%M?+
XM``!;:```6W$``%MZ``!;@P``6XP``%N5``!;G@``6Z<``%NP``!;N0``6\(`0
XM`%O+``!;Z@``7`(``%PC``!<.```7%P``%QV``!<G@``7+(``%S0``!<]```J
XM70T``%TA``!=/```75D``%UU``!=B@``7:$``%W#``!=Y0``7@H``%XJ``!>>
XM0P``7F0``%Z"``!>G0``7K<``%[+``!>YP``7P,``%\H``!?1P``7UP``%]S_
XM``!?E@``7[0``%_%``!?Y@``7_\``&`>``!@/P``8&,``&!]``!@G@``8,``J
XM`&#3``!@YP``80```&$3``!A)@``84$``&%5``!A=```88L``&&T``!ASP``T
XM`1<RN#*R,JPRIC(>,?@RO#+`,L0RR#+,,M`RU#+8,MPRX#+D,N@R[#+P,O0R=
XM^#+\,P`S!#,(,PPS$#,4,Q@S'#,@,R0S*#,L,S`S-#,X,SPS0#-$,T@S3#-0=
XM,U0S6#-<,V`S9#-H,VPS<#-T,W@S?#.`,X0SB#.,,Y`SE#.8,YPSH#.D,Z@SI
XMK#.P,[0SN#.\,\`SQ#/(,\PST#/4,]@SW#/@,^0SZ#/L,_`S]#/X,_PT`#0$,
XM-`@T##00-!0T&#0<-"`T)#0H-"PT,#0T-#@T/#1`-$0T2#1,-%`T5#18-%PTX
XM8#1D-&@T;#1P-'0T>#1\-(`TA#2(-(PTD#24-)@TG#2@-*0TJ#2L-+`TM#2X,
XM-+PTP#3$-,@TS#30--0TV#3<-.`TY#3H-.PT\#3T-/@T_#4`-00U"#4,-1`UV
XM%#48-1PU(#4D-2@U+#4P-30U.#4\-4`U1#5(-4PU4#54-5@U7#5@-60U:#5L.
XM-7`U=#5X-7PU@#6$-8@UC#60-90UF#6<-:`UI#6H-:PUL#6T-;@UO#7`-<0U_
XMR#7,-=`UU#78-=PUX#7D->@U[#7P-?0U^#7\-@`V!#8(-@PV$#84-A@V'#8@#
XM-B0V*#8L-C`V-#8X-CPV0#9$-D@V3#90-E0V6#9<-F`V9#9H-FPV<#9T-G@V.
XM?#:`-H0VB#:,-I`VE#:8-IPVH#:D-J@VK#:P-K0VN"ST+0`M!"T(+10M&"T<,
XJ+2`M)"TH+2PM,"TT+3@M/"U`*Z8``````````RSF+/@KH@``````*+:-'
X``
Xend
Xsize 36942
SHAR_EOF
chmod 0003 browse.uu || echo "restore of browse.uu fails"
exit 0
 

mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)

Sorry for problems with this source when posted some weeks ago.
"browse.c" comes now in two parts.

Any complaints to:
----------------------------------------------------------------------
-- Carsten Emde --- Klinikum Steglitz --- Freie Universitaet Berlin --
-- Med. Klinik  --- Hindenburgdamm 30 --- D-1000 Berlin 45 Steglitz -- 
-- +49307982393 --- Fax: +49307984141 --- Gastrointestinal Motility --
-- E-mail emde@zedat.fu-berlin.dbp.de (checked 0800/1200/1600/2000) --
--  or {anything big}!unido!cosmo!mdnet (checked only occasionally) --
----------------------------------------------------------------------

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	browse_2a
# This archive created: Tue Jan 30 18:04:16 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'browse_2a'
then
	echo shar: "will not over-write existing file 'browse_2a'"
else
cat << \SHAR_EOF > 'browse_2a'
/*             -- Just what the hell am I ??? ---                            */

#include <stdio.h>

char help[]=
"Browse through a directory, written by Peter da Silva\n\
Adapted for OS-9 using TOP's os9lib\n\
Syntax: browse [<dir>]\n\
Function: show an ls-like directory listing which can be 'edited', i.e.\n\
          files may be tagged and inspected, dumped, executed, deleted,\n\
          renamed, copied, edited etc.\n\
Options:\n\
     none\n";

#ifdef mc68000
#define sr sr_
#define PC PC_
#endif

#ifdef OSK
#include <termcap.h>
#define GETCWD
#define getcwd getwd
#define minor(i) ((i)&0xFF)
#define major(i) minor((i)>>8)
#define SHELLSYM '$'
#define ASSISTCOM "more /dd/sys/browse.hlp"
#define SAVEMACROS "/h0/sys/browse.macros"
#else
#define remote
#define SHELLSYM '!'
#define ASSISTCOM "more /usr/hlp/browse.doc"
#define SAVEMACROS "/usr/tmp/macros"
#endif

#ifdef M_XENIX
#define USG
#define rindex strrchr
#define GETCWD
#else
#ifdef L_ctermid
#define USG
#define rindex strrchr
#define minor(i) ((i)&0xFF)
#define major(i) minor((i)>>8)
#else
#ifndef OSK
#include <whoami.h>
#endif
#endif
#endif

/* 		-- Miscellaneous include files --		             */

#ifdef OSK
#include <modes.h>
#include <direct.h>
#include <sgstat.h>
#include <strings.h>
#endif
#include <sys/param.h>							/* NCARGS, and others */
#ifndef M_XENIX
#include <sys/types.h> 				   /* data types for various files */
#endif
#include <sys/stat.h> 	/* stat data structure for getdir(), statout() */
#include <sys/dir.h>                /* dir data structure for getdir() */
#include <pwd.h>                 /* passwd data structure for u_name() */
#include <grp.h>                  /* group data structure for g_name() */

#ifdef BSD
#include <sys/time.h>            /* time data structure for printime() */
#else
#ifndef OSK
#include <time.h>    	         /* time data structure for printime() */
#endif
#endif
#ifdef USG
#ifdef M_XENIX
#include <sys/ioctl.h>
#endif
#include <termio.h>
#else
#ifndef OSK
#include <sgtty.h>               /* terminal modes for tinit(), tend() */
#endif
#endif

#include <signal.h>

/*		-- make information --
BUILD
browse: browse.c
	cc browse.c -O -o browse -ltermlib
END
*/

/*		-- Miscellaneous defines --				     */
#define FALSE 0
#define TRUE 1

#define MAXID 64
#define MAXLINE 256
#ifdef OSK
#define MAXENTS 512
#define NCOL 54
#define MAXNAME 24
#else
#define MAXENTS 320
#define NCOL 64
#define MAXNAME 14
#endif
#define FILENAME 256
#define MAXARGC (NCARGS/16)	/* Estimate max ARGC */
#define CHARSET 256		/* Number of macros == size of byte */
#define NOMAC (0)		/* Null macro (last) */
#define TERMBUF 1024		/* Size of term buf for termcap */
#define SMALLBUF 256
#define NAME 1
#define SEC 2

/*		-- Extended directory entry format --			     */
struct entry {
	char *e_name;
	int e_flags;
#define FTAGGED (1<<0)
#define FPERMANENT (1<<1)
	struct stat e_stat;                           /* file status field */
	char e_uname[9];                                      /* user name */
	char e_gname[9];                              /* user's group name */
#ifdef OSK
	unsigned long e_secno;
#endif
} 
*xentries[MAXENTS], **entries=xentries;
int nentries;

/*		-- Look-up cache for user names --			     */
struct idtab {
	int  id_id;                                    /* user (or group) id */
	char id_name[9];                                 /* name[8] + filler */
} 
u_list[MAXID],                                       /* Matched user id's. */
g_list[MAXID];                                              /* ditto group */
int u_ptr=0, g_ptr=0;                                   /* current entries */

/*		-- Global variables --					     */
FILE *efp;                                            /* Environment file */
char efname[MAXLINE];                                           /* " name */
char *tent;                                            /* Pointer to tbuf */
char PC;                                                 /* Pad character */
char *UP, *BC;                             /* Upline, backsapce character */
short ospeed;                                    /* Terminal output speed */
char termbuf[TERMBUF];				   /* Place to put term info */

char *macbuf[CHARSET], ungetbuf[SMALLBUF]; 
										/* Buffers for pushback and macros */
char c_macro=NOMAC;         		                      /* current macro */
char *macptr = "";                 /* Pointer to currently executing macro */
char *ungetptr = ungetbuf;            /* Pointer to pushed-back characters */

char *errname;                              /* Name of file error found in */
extern int errno;                                   /* system error number */
int xerrno;                                       /* extended error number */
int ccol=NCOL;			          /* Width of used display, current column */
int quickmode;							/* short display mode (files only) */

#ifdef USG
struct termio rawbuf;
struct termio cookedbuf;
#else
#ifdef OSK
struct sgbuf cookopts,rawopts;
int signhndl();
#else
struct sgttyb sgbuf;                     /* buffer for terminal mode info */
int rawflags, cookflags;		  	/* flags for raw & cooked tty mode */
#endif
#endif

char *cm,                                             /* Cursor motion */
     *cs,                                   /* Change scrolling region */
     *sf,                                   /*  - scroll forward       */
     *sr,                                   /*  - scroll backwards     */
     *ce,                                      /* Clear to end of line */
     *cl,                                              /* Clear screen */
     *al,                                               /* Insert line */
     *dl,                                              /* delete ditto */
     *so,                                                  /* standout */
     *se,                                              /* standout end */
     *us,                                                 /* underline */
     *ue,                                             /* underline end */
     *ti,									 		  /* Init terminal */
     *te;										 	 /* Reset terminal */
int  li,                                            /* lines on screen */
     co;                                              /* columns ditto */
char xn;										/* Magic cookie kludge */

/*		-- Global error messages --				     */
char *emesg[4]={
	"??",
#define TOO_MANY 1
	"Too many directory entries",
#define NOMATCH 2
	"No match",
	0
};

int	top, curr;               /* Positions of screen in directory */
#define bottom ((top+nlines>nentries)?nentries:(top+nlines))
char	*dot;                              /* name of current directory */
int	nlines;                        /* number of lines displayed on page */
char	display_up;                          /* Does the display exist? */
int	todump=1;				 /* Do we want to dump data? */
int	ended;                                   /* Have we quite finished? */
int	intrup;					/* Have we been interrupted? */
char	*HOME;					  /* Where did I start from? */
char	*SHELL;					   /* How do I run programs? */

/*		-- types of functions !!!				     */
char *getenv(), *tgetstr();
char *malloc();

#define NEW(t) (t *)malloc(sizeof (t))
#define NIL(t) ((t) 0)

/*		-- Code starts here: dummy main --   			     */
main(ac, av, ep)
int ac;
char **av;
char **ep;
{
	int i;
	
	if(ac>1)
		{
		for(i=1; i<ac; i++)
			{
			if(!strcmp(av[i],"-?"))
				{
				printf(help); exit(0);
				}
			}
		if(ac>2)
			{
			perror("only one argument may be specified.");
			exit(0);
			}
		if(chdir(av[1])==-1)
			{
			perror("can't access directory specified",av[1]);
			exit(0);
			}
		}

	sprintf(efname, "/tmp/br.env.%d", getpid());
	HOME=getenv("HOME");
	SHELL=getenv("SHELL");
	
#ifndef OSK
	dumpenv(ep);
#endif

	intrup=0;
	tinit(getenv("TERM"));
	clear_all();

#ifdef OSK
	stdin->_flag|=_RBF;	stdin->_flag|=_UNBUF;
#endif

	browse();
	tend();
#ifndef OSK
	unlink(efname);
#endif
}

clear_all()
{
	int i;

	for(i = 0; i < MAXENTS; i++)
		entries[i] = 0;
}

char *clone(name)
char *name;
{
	char *hold;
	
	hold = (char *)malloc(strlen(name)+1);

	if(hold==0)
		return 0;
	strcpy(hold, name);
	return hold;
}

newname(e, name)
struct entry *e;
char *name;
{
	if(e->e_name)
		free(e->e_name);
	e->e_name = clone(name);
}

#if (BSD || OSK)
readent(dp, db)
DIR *dp;
struct direct *db;
{
	struct direct *ptr;

	ptr = readdir(dp);
	if(!ptr) return 0;

	*db = *ptr;	/* V7 'C' and above... safe, since UCB=V7+ */
	free(ptr);
	return 1;
}
#else
#define opendir(n) fopen(n, "r")
#define DIR FILE
readent(dp, db)
DIR *dp;
struct direct *db;
{
	if(fread(db, sizeof(struct direct), 1, dp))
		return 1;
	/* else */
		return 0;
}
#define closedir fclose
#endif

getdir()
{

#ifdef OSK
	struct fildes f;
	struct tm t;
	int physdisk, oldid;
	char pdot[32], *slash;
#endif

	char *u_name(), *g_name();
	DIR *dp;
	int  valid;
	struct direct *hold = NEW(struct direct);
	int i, p;

	if(!(dp = opendir("."))) {
		errname=".";
		return FALSE;
	}

	p = 0;
	for(i = 0; i < nentries; i++) {
		if(entries[i]->e_flags & FPERMANENT) {
			if(p != i) {
				struct entry *hold;
				hold = entries[p];
				entries[p] = entries[i];
				entries[i] = hold;
			}
			p++;
		}
	}

	for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) {

		if(!entries[nentries]) {
			entries[nentries] = NEW(struct entry);
			if(!entries[nentries])
				break;
			entries[nentries]->e_name = NIL(char *);
		}

		if(!readent(dp, hold)) {
			p=nentries;	break;
		}

#ifndef OSK
		valid = (hold->d_ino != 0);
#else
		valid = TRUE;
		entries[nentries]->e_secno=hold->d_addr;
#endif

		if(valid) {
#ifndef OSK
			if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) {
				closedir(dp);
				errname=hold->d_name;
				free(hold);
				return FALSE;
			}
#endif

			newname(entries[nentries], hold->d_name);

#ifndef BSD /* truncate name to 14 characters in non-BSD systems */
#ifndef OSK
			if(strlen(entries[nentries]->e_name)>14)
				entries[nentries]->e_name[14] = 0;
#endif
#endif

			entries[nentries]->e_flags = 0;
			
#ifndef OSK
			strcpy(entries[nentries]->e_uname,
				u_name(entries[nentries]->e_stat.st_uid));

			strcpy(entries[nentries]->e_gname,
				g_name(entries[nentries]->e_stat.st_gid));
#endif
		}
	}
	
	closedir(dp);
	
	free(hold);

#ifdef OSK
	sortdir(SEC); /* optimize head movements */
	oldid=getuid(); super();
	strcpy(pdot,dot); 
	if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@");
	if((physdisk=open(pdot,S_IREAD))==-1) return FALSE;
	for(nentries = 0; !intrup && nentries < p; nentries ++) {
		lseek(physdisk,(entries[nentries]->e_secno)<<8,0);
		read(physdisk,&f,sizeof(f));
		
		t.tm_year  = (int) f.fd_date[0];
		t.tm_mon   = (int) f.fd_date[1] - 1;
		t.tm_mday  = (int) f.fd_date[2]; 
		t.tm_hour  = (int) f.fd_date[3];
		t.tm_min   = (int) f.fd_date[4];
		t.tm_sec   = 0;
		t.tm_isdst = -1;

		entries[nentries]->e_stat.st_atime =
		entries[nentries]->e_stat.st_mtime = mktime(&t);

		t.tm_year  = (int) f.fd_dcr[0];
		t.tm_mon   = (int) f.fd_dcr[1] - 1;
		t.tm_mday  = (int) f.fd_dcr[2]; 
		t.tm_hour  = t.tm_min = t.tm_sec = 0;
		t.tm_isdst = -1;
  
		entries[nentries]->e_stat.st_ctime = mktime(&t);
		memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize,
			sizeof(long));
		entries[nentries]->e_stat.st_uid   = f.fd_own[1];
		entries[nentries]->e_stat.st_gid   = f.fd_own[0];
		entries[nentries]->e_stat.st_mode  = f.fd_att;
		entries[nentries]->e_stat.st_nlink = f.fd_link;

		strcpy(entries[nentries]->e_uname,
			u_name(entries[nentries]->e_stat.st_uid));

		strcpy(entries[nentries]->e_gname,
			g_name(entries[nentries]->e_stat.st_gid));
	}
	close(physdisk);
	setuid(oldid);
#endif

	if(intrup)
		return FALSE;

	if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) {
		errno=0;
		xerrno=TOO_MANY;
		errname=".";
		return FALSE;
	}

	sortdir(NAME);

	if(intrup)
		return FALSE;
	return TRUE;
}

at_current()
{
	at_file(curr);
}

at_file(file)
int file;
{
	if(display_up) {
		if(file < top || file >= top+nlines)
			return 0;
		at(0, curr-top+2);
	} else {
		if(file != curr)
			return 0;
		cmdline();
	}
	return 1;
}

display_flags(flags)
{
	outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' '));
}

repaint_flags()
{
	if(!display_up) return;
	at(quickmode?0:NCOL-1, curr-top+2);
	display_flags(entries[curr]->e_flags);
}

/*
repaint_current()
{
	if(!display_up) return;
	at_current();
	dump(curr, curr+1);
}
*/

tag()
{
	entries[curr]->e_flags ^= FTAGGED;
	repaint_flags();
}

tag_all(flag)
int flag;
{
	int i;

	for(i = 0; i < nentries; i++)
		if(flag)
			{
			if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED;
			}
		else
			entries[i]->e_flags &= ~FTAGGED;
	if(display_up)
		todump = TRUE;
}

delete_from_display(file)
int file;
{
	if(!display_up) return;

	if(file>=top+nlines) return;

	if(file < top) file = top;

	scroll(2+file-top, 2+nlines, 1);
	at(0, 2+nlines-1);
	if(top+nlines >= nentries)
		outc('~');
	else
		dump(bottom, bottom+1);
}
		
delete_file_entry(file)
int file;
{
	struct entry *hold;
	int	i;

	delete_from_display(file);

	hold = entries[file];
	for(i=file; i<nentries-1; i++)
		entries[i]=entries[i+1];
	entries[nentries-1]=hold;
	nentries--;

	if(file < curr || curr >= nentries) {
		curr--;
		if(top >= nentries) {
			top--;
			display_up = 0;
			todump = 1;
		}
	}
} 

remove_one(file, doit)
int file;
int doit;
{
	if(!doit) {
		cmdline();
		outs("Delete ");
		ctlouts(entries[file]->e_name);
		outs(" [n]?");
		fflush(stdout);
		doit = getch() == 'y';
		outs(doit?"Yes.":"No.");
		fflush(stdout);
	}
	if(doit) {
		if(unlink(entries[file]->e_name) == 0) {
			cmdline();
			outs("Deleted ");
			ctlouts(entries[file]->e_name);
			outs(".");
			delete_file_entry(file);
			return 1;
		} else {
			wperror(entries[file]->e_name);
			return 0;
		}
	}
	return 0;
} 

remove(doit)
int doit;
{
	int i;
	int found_tags;

	found_tags = 0;
	i = 0;
	while(i < nentries) {
		if(entries[i]->e_flags & FTAGGED) {
			found_tags = 1;
			if(!remove_one(i, doit)) /* decrements nentries */
				break;
		} else
			i++;
	}
	if(!found_tags)
		remove_one(curr, doit);
}

insert_entry_at(ent, i)
struct entry *ent;
int i;
{
	struct entry *hold;
	int j;

	/* Allocate slot at end */
	if(!entries[nentries]) {
		entries[nentries] = NEW(struct entry);
		if(!entries[nentries])
			return 0;
		entries[nentries]->e_name = NIL(char *);
	} else if(entries[nentries]->e_name) {
		free(entries[nentries]->e_name);
		entries[nentries]->e_name = NIL(char *);
	}

	/* Copy data into slot */
	*entries[nentries] = *ent;
	entries[nentries]->e_name = clone(ent->e_name);
	if(!entries[nentries]->e_name)
		return 0;

	if(i != nentries) {
		/* Rotate slot to middle */
		hold = entries[nentries];
		for(j = nentries; j > i; j--)
			entries[j] = entries[j-1];
		entries[i] = hold;
	}
	nentries++;

	if(display_up) {
		if(i < top)
			i = top;
		if(i >= bottom)
			return;
		scroll(2+i-top, 2+nlines, -1);
		at(0, 2+i-top);
		dump(i, i+1);
	}
}

insert_entry(ent)
struct entry *ent;
{
	int i;

	if(nentries >= MAXENTS)
		return 0;

	for(i = 0; i < nentries; i++)
		if(entcmpnam(&ent, &entries[i]) < 0)
			break;

	return insert_entry_at(ent, i);
}

assist()
{
	char cmdbuf[MAXLINE];
	
	sprintf(cmdbuf, ASSISTCOM);
	if(sys(cmdbuf, 1))
		perror(cmdbuf);
}

hexdump()
{
	char cmdbuf[MAXLINE];
	
	sprintf(cmdbuf, "dump %s", entries[curr]->e_name);
	if(sys(cmdbuf, 1))
		perror(cmdbuf);
}
	  
move()
{
	char scratch[FILENAME];
	struct entry hold;
	char inps();

	hold = *entries[curr];

	cmdline();
	outs("Rename ");
	ctlouts(entries[curr]->e_name);
	outc(' ');
	if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
		killcmd();
		return;
	}
	if(link(entries[curr]->e_name, scratch)!=0) {
		char tmbuf[42];
		sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch);
		wperror(tmbuf);
		return;
	}
	if(unlink(entries[curr]->e_name)!=0) {
		wperror(entries[curr]->e_name);
		return;
	}

	hold.e_name = scratch;
	hold.e_flags &= ~FTAGGED;

	delete_file_entry(curr);
	insert_entry(&hold);
}

pname(name, mode)
char *name;
int mode;
{
	int i;
	char *slash, *rindex();
	int max=quickmode?MAXLINE:(MAXNAME+1);

#ifdef OSK
	if(mode&S_IFDIR)
#else
	if((mode&S_IFMT)==S_IFDIR)
#endif
		max--;
		
#ifndef OSK
	else if((mode&S_IFMT)==S_IFREG && (mode&0111))
		max--;
	else if((mode&S_IFMT)!=S_IFREG)
		max--;
#endif

	if(!quickmode && (slash=rindex(name, '/'))) {
		name=slash;
		outc('<');
		max--;
	}
	for(i=0; i<max && *name; name++)
		i += ctlout(*name);
	standend();
	if(i==max && *name)
		outs("\b>");
		
#ifdef OSK
	if(mode&S_IFDIR) {
#else
	if((mode&S_IFMT)==S_IFDIR) {
#endif
		outc('/');
	}
	
#ifndef OSK
	else if((mode&S_IFMT)==S_IFREG && (mode&0111)) {
		outc('*');
	}
	else if((mode&S_IFMT)!=S_IFREG) {
		outc('?');
	}
#endif

}

sortdir(ele)
int ele;
{
	int entcmpnam(),entcmpsec();
	
	if(ele==NAME)
		qsort(entries, nentries, sizeof(struct entry *), entcmpnam);
	if(ele==SEC)
		qsort(entries, nentries, sizeof(struct entry *), entcmpsec);
}

#ifndef OSK
addname(flag)
char flag;
{
	char buf[FILENAME], *ptr, *tmp;
	char scratch[FILENAME];
	struct entry hold;
	char inps();

	cmdline();
	outs("Add ");
	if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
		killcmd();
		return;
	}
	
	if(stat(scratch, &hold.e_stat)==-1) {
		wperror(scratch);
		return;
	}
	if(flag!='+' && *scratch != '/') {
		strcpy(buf, dot);
		ptr = scratch;
		for(;;) {	/* eat '../' and './' */
			if(ptr[0]=='.' && ptr[1]=='.' &&
			   (ptr[2]=='/' || !ptr[2])) {
				tmp = rindex(buf, '/');
				if(!tmp) break;
				*tmp=0;
				ptr += 2+(ptr[2]=='/');
				continue;
			}
			if(ptr[0]=='.' && 
			   (ptr[1]=='/' || !ptr[1])) {
				ptr += 1+(ptr[1]=='/');
				continue;
			}
			break;
		}
		if(*ptr) {
			strcat(buf, "/");
			strcat(buf, ptr);
		}
		hold.e_name = buf;
	} else
		hold.e_name = scratch;
	strcpy(hold.e_uname,
		u_name(hold.e_stat.st_uid));
	strcpy(hold.e_gname,
		g_name(hold.e_stat.st_gid));
	hold.e_flags = 0;
	if(flag!='+')
		hold.e_flags |= FPERMANENT;
	insert_entry(&hold);
}

addperm()
{
	char buf[FILENAME], *ptr, *tmp;
	struct entry hold;
	int   entcmpnam(), i;

	if(entries[curr]->e_flags & FPERMANENT)
		return;

	if(entries[curr]->e_name[0]!='/') {
		strcpy(buf, dot);
		ptr = entries[curr]->e_name;
		for(;;) {	/* eat '../' and './' */
			if(ptr[0]=='.' && ptr[1]=='.' &&
			   (ptr[2]=='/' || !ptr[2])) {
				tmp = rindex(buf, '/');
				if(!tmp) break;
				*tmp=0;
				ptr += 2+(ptr[2]=='/');
				continue;
			}
			if(ptr[0]=='.' && 
			   (ptr[1]=='/' || !ptr[1])) {
				ptr += 1+(ptr[1]=='/');
				continue;
			}
			break;
		}
		if(*ptr) {
			strcat(buf, "/");
			strcat(buf, ptr);
		}
		hold = *entries[curr];

		hold.e_name = buf;
		hold.e_flags &= ~FTAGGED;
		hold.e_flags |= FPERMANENT;
		insert_entry(&hold);
	} else {
		entries[curr]->e_flags |= FPERMANENT;
		entries[curr]->e_flags &= ~FTAGGED;
		repaint_flags();
	}
}

delperm()
{
	entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED);
	repaint_flags();
}
#endif

entcmpnam(e1, e2)
struct entry **e1, **e2;
{
	if((*e1)->e_name[0] == '/') {
		if((*e2)->e_name[0] != '/')
			return 1;
	} else if((*e2)->e_name[0] == '/')
		return -1;

	return strcmp((*e1)->e_name, (*e2)->e_name);
}

entcmpsec(e1, e2)
struct entry **e1, **e2;
{
	if((*e1)->e_secno < (*e2)->e_secno) return -1;
	if((*e1)->e_secno > (*e2)->e_secno) return 1;
	return 0;
}

dump(start, end)
int start;
int end;
{
	int  i;
	int  lo = (start<nentries)?start:nentries;
	int  hi = (end<nentries)?end:nentries;

	for(i=lo; i<hi; i++) {
		statout(entries[i]->e_name,
		&entries[i]->e_stat,
		entries[i]->e_uname,
		entries[i]->e_gname,
		entries[i]->e_flags);
		nl();
	}
	return TRUE;
}

SHAR_EOF
fi
exit 0
#	End of shell archive

mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	browse_2b
# 4. Merge browse_2a and browse_2b to create browse.c
# This archive created: Tue Jan 30 18:04:32 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'browse_2b'
then
	echo shar: "will not over-write existing file 'browse_2b'"
else
cat << \SHAR_EOF > 'browse_2b'
statout(name, sbuf, user, group, flags)
char *name;
struct stat *sbuf;
char *user, *group;
int flags;
{
	int mode = sbuf->st_mode;

	if(!quickmode) {
#ifndef OSK
		printf("%5u ", sbuf->st_ino);
#endif


#ifdef OSK
		if(mode&S_IFDIR) outc('d'); else outc('-');
		if(mode&S_ISHARE) outc('s'); else outc('-');
		if(mode&S_IOEXEC) outc('e'); else outc('-');
		if(mode&S_IOWRITE) outc('w'); else outc('-');
		if(mode&S_IOREAD) outc('r'); else outc('-');
		if(mode&S_IEXEC) outc('e'); else outc('-');
		if(mode&S_IWRITE) outc('w'); else outc('-');
		if(mode&S_IREAD) outc('r'); else outc('-');
#else
		if((mode&S_IFMT)==S_IFCHR) outc('c');
		else if((mode&S_IFMT)==S_IFBLK) outc('b');
		else if((mode&S_IFMT)==S_IFDIR) outc('d');
		else if((mode&S_IFMT)==S_IFREG) outc('-');
		else outc('?');
		triad((mode>>6)&7, mode&S_ISUID, 's');
		triad((mode>>3)&7, mode&S_ISGID, 's');
		triad(mode&7, mode&S_ISVTX, 't');
#endif

		outc(' ');

		printf("%1u ", sbuf->st_nlink);
		printf("%-8s ", user);
		printf("%-8s ", group);

#ifdef OSK
		if(!(mode&S_IFDIR))
#else
		if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR))
#endif
			printf("%7ld ", sbuf->st_size);
		else
#ifdef OSK
			printf("    --- ");
#else

			printf("%3d,%3d ",
			major(sbuf->st_rdev),
			minor(sbuf->st_rdev));
#endif

		outc(' ');
		printime(&sbuf->st_mtime);
	}

	display_flags(flags);
	pname(name, sbuf->st_mode);
}

char *
u_name(uid)
int uid;
{
	int  i;
	struct passwd *pwptr, *getpwuid();

	for(i=0; i<u_ptr; i++)
		if(u_list[i].id_id==uid)
			return u_list[i].id_name;

	if(u_ptr>=MAXID)                                   /* cache full */
		u_ptr = 0;        /* simplistic algorithm, wrap to beginning */
	/* with MAXID >> # common id's it's good enough */

	u_list[u_ptr].id_id=uid;

	if(pwptr=getpwuid(uid)) { /* Copy name */
		for(i=0; pwptr->pw_name[i]>' '; i++)
			u_list[u_ptr].id_name[i]=pwptr->pw_name[i];
		u_list[u_ptr].id_name[i]=0;
	} 
	else /* Default to UID */
		sprintf(u_list[u_ptr].id_name, "%d", uid);

	return u_list[u_ptr++].id_name;
}

char *
g_name(gid)
int gid;
{
	int  i;
	struct group *grptr, *getgrgid();

	for(i=0; i<g_ptr; i++)
		if(g_list[i].id_id==gid)
			return g_list[i].id_name;

	if(g_ptr>=MAXID)                                       /* cache full */
		g_ptr = 0;        /* simplistic algorithm, wrap to beginning */
	/* with MAXID >> # common id's it's good enough */

	g_list[g_ptr].id_id=gid;

	if(grptr=getgrgid(gid)) { /* Copy name */
		for(i=0; grptr->gr_name[i]>' '; i++)
			g_list[g_ptr].id_name[i]=grptr->gr_name[i];
		g_list[g_ptr].id_name[i]=0;
	} 
	else /* Default to UID */
		sprintf(g_list[g_ptr].id_name, "%d", gid);

	return g_list[g_ptr++].id_name;
}

printime(clock)
long *clock;
{
	struct tm *tmbuf, *localtime();
	static char *months[12]= {
		"Jan","Feb","Mar","Apr","May","Jun",
		"Jul","Aug","Sep","Oct","Nov","Dec"
	};

	tmbuf=localtime(clock);
	printf("%2d %3s %02d %2d:%02d",
	tmbuf->tm_mday,
	months[tmbuf->tm_mon],
	tmbuf->tm_year,
	tmbuf->tm_hour,
	tmbuf->tm_min);
}

header()
{
	int	i;
	if(quickmode)
		printf(" File Name");
	else
		printf(
#ifdef OSK
"Attr   Lnk User     Group       Size      Modify Time File name"
#else
"Inode Long mode  LNX User     Group   Size/Dev  Modify Time     File name"
#endif
		    );
	nl();
}

#ifndef OSK
triad(bits, special, code)
int bits, special;
char code;
{
	if(bits&4) outc('r');
	else outc('-');

	if(bits&2) outc('w');
	else outc('-');

	if(special) outc(code);
	else if(bits&1) outc('x');
	else outc('-');
}
#endif

outs(s)
char *s;
{
	int  outc();

	if(s)
		tputs(s, 0, outc);
}

outc(c)
char c;
{
	putchar(c);
}

/* Screen manipulation primitives: dumb set for smart terminals */
at(x, y)
int x, y;
{
	outs(tgoto(cm, x, y));
}

nl()
{
	outs(ce);
	outc('\n');
}


/* Scroll lines in window (from:to) n lines */
scroll(from, to, n)
int from, to, n;
{
	if(cs && sf && sr) {
		outs(tgoto(cs, from, to-1));
		if(n<0)
			while(n++)
				outs(sr);
		else
			while(n--)
				outs(sf);
		outs(tgoto(cs, 0, li-1));
	} 
	else if(al && dl) {
		if(n<0) {
			int i=n;
			outs(tgoto(cm, 0, to+n));
			while(i++)
				outs(dl);
			outs(tgoto(cm, 0, from));
			while(n++)
				outs(al);
		} 
		else {
			int i=n;
			outs(tgoto(cm, 0, from));
			while(i--)
				outs(dl);
			outs(tgoto(cm, 0, to-n));
			while(n--)
				outs(al);
		}
	}
}

wperror(file)
char *file;
{
	extern int errno;
	extern remote char *sys_errlist[];

	cmdline();
	ctlouts(file);
	ctlouts(": ");
	ctlouts(errno?sys_errlist[errno]:emesg[xerrno]);
	if(!display_up)
		nl();
}

fperror(prog, file)
char *prog, *file;
{
	extern int errno;

	fprintf(stderr, "%s -- ", prog);
	if(errno)
		perror(file);
	else
		fprintf(stderr, "%s: %s\n", file, emesg[xerrno]);
}

tinit(name)
char *name;
{
	char *termptr;
	char tbuf[TERMBUF], *tmp;
#ifndef OSK
	int  intr();
#endif
#ifdef BSD
	int  stop();
#endif

	termptr = termbuf;

	tgetent(tbuf, name);

	tmp = tgetstr("pc", &termptr);
	if(tmp) PC = *tmp;
	UP = tgetstr("up", &termptr);
	BC = tgetstr("bc", &termptr);
	cm = tgetstr("cm", &termptr);
	cs = tgetstr("cs", &termptr);
	sf = tgetstr("sf", &termptr);
	sr = tgetstr("sr", &termptr);
	ce = tgetstr("ce", &termptr);
	cl = tgetstr("cl", &termptr);
	al = tgetstr("al", &termptr);
	dl = tgetstr("dl", &termptr);
	us = tgetstr("us", &termptr);
	ue = tgetstr("ue", &termptr);
	so = tgetstr("so", &termptr);
	se = tgetstr("se", &termptr);
	ti = tgetstr("ti", &termptr);
	te = tgetstr("te", &termptr);
	li = tgetnum("li");
	co = tgetnum("co");
	xn = tgetflag("xn");

	nlines=li-3;

#ifdef USG
	ioctl(1, TCGETA, &rawbuf);
	cookedbuf = rawbuf;
	rawbuf.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
	rawbuf.c_cc[VMIN] = 1;
	rawbuf.c_cc[VTIME] = 0;
#else
#ifdef OSK
	_gs_opt(1, &cookopts);
	memcpy(&rawopts,&cookopts,sizeof(cookopts));
	rawopts.sg_echo=rawopts.sg_pause=FALSE;
	rawopts.sg_eofch=rawopts.sg_eorch=0;
	
#else
	gtty(1, &sgbuf);
	ospeed=sgbuf.sg_ospeed;
	quickmode=ospeed<10;
	cookflags=sgbuf.sg_flags;
	sgbuf.sg_flags = (sgbuf.sg_flags&~ECHO)|CBREAK;
	rawflags=sgbuf.sg_flags;
#endif
#endif
#ifdef OSK
	intercept(signhndl);
#else
	signal(SIGINT, intr);
#endif
#ifdef BSD
	signal(SIGTSTP, stop);
#endif
	rawtty();
}

int tmode=0;

entty()
{
	if(!tmode)
		outs(ti);
	tmode=1;
}

extty()
{
	if(tmode)
		outs(te);
	tmode=0;
}

rawtty()
{
#ifdef USG
	ioctl(1, TCSETA, &rawbuf);
#else
#ifdef OSK
	_ss_opt(1, &rawopts);
#else
	sgbuf.sg_flags=rawflags;
	stty(1, &sgbuf);
#endif
#endif
	entty();
}

cooktty()
{
#ifdef USG
	ioctl(1, TCSETA, &cookedbuf);
#else
#ifdef OSK
	_ss_opt(1, &cookopts);
#else
	sgbuf.sg_flags=cookflags;
	stty(1, &sgbuf);
#endif
#endif
	extty();
}

#ifdef OSK
int signhndl(signum)
int signum;
{
switch (signum)
	{
	case 2: intrup=1; break;
	case 3: intrup=1; break;
	default: break;
	}
}
#else
intr()
{
	int intr();
	signal(SIGINT, intr);
	intrup=1;
	bell();
}
#endif

#ifdef BSD
stop()
{
	int stop();
	signal(SIGTSTP, stop);
	intrup=1;
	tend();
	kill(getpid(), SIGSTOP);
	rawtty();
	display_up=0;
}
#endif

tend()
{
	cmdline();
	cooktty();
	fflush(stdout);
}

char *
pwd()
#ifdef GETCWD
{
	static char mydir[FILENAME+1] = "";
	char *getcwd();

	return getcwd(mydir, FILENAME);
}
#else
{
	static char mydir[FILENAME] = "";
	int  status;
	int  pip[2];
	int  n;
	int  (*sigs[2])();

	sigs[0] = signal(2, 1);
	sigs[1] = signal(3, 1);

	if(pipe(pip)<0)
		return 0;

	if(!fork()) {
		close(1); 
		dup(pip[1]);
		close(pip[0]);
		execl("/bin/pwd", "pwd", 0);
		exit(-1);
	}
	close(pip[1]);
	wait(&status);
	signal(2, sigs[0]);
	signal(3, sigs[1]);

	if(status) {
		close(pip[0]);
		return "/";
	}
	n = read(pip[0], mydir, FILENAME);
	close(pip[0]);
	if(n<=0)
		return "/";
	mydir[n-1] = 0;
	return mydir;
}
#endif

browse()
{
	int  c;
	char *env;

	if(env=getenv("BROWSE"))
		macptr = env;

	defmacs();
	newdir();
	redraw();
	ended=0;

	do {
		if(intrup) {
			intrup=0;	/* clear interrupt */
			cmdline();	/* go to the command line */
			outs("Interrupt");	/* let us know about it */
			endmac();	/* clear macros */
			clearin();	/* and input buffer */
		}
		here_i_am();
		fflush(stdout);
		c = getch();
		cmd(c);
	} 
	while(!ended);
}

clearin()
{
	fseek(stdin, 0L, 1); /* stay here messily */
}

cmd(c)
char c;
{
	int	i;

	if(intrup)
		return;

	switch(c) {
	case ' ':
		if(isdir(entries[curr])) {
			if(!cd(entries[curr]->e_name))
				wperror(entries[curr]->e_name);
		} else
			if(!macro(c))
				bell();
			else
				cmd(getch());
		break;
	case '&': 
		syscom(0); 
		break;
	case SHELLSYM:
		syscom(1); 
		break;
	case '=':
		todir();
		break;
#ifndef OSK
	case '?': 
		sample(entries[curr]->e_name); 
		break;
#endif
	case '[':
		define();
		break;
#ifdef OSK
	case '?':
#else
	case 'a':
#endif
		assist();
		break;
	case 'B'-'@':
		prev(nlines);
		break;
	case 'D'-'@':
		next(nlines/2);
		break;
	case 'F'-'@':
		next(nlines);
		break;
	case 'H': 
		curr=top; 
		break;
	case 'J': 
		tail(); 
		break;
	case 'K': 
		home(); 
		break;
	case 'L'-'@': 
		redraw(); 
		break;
	case 'L': 
		curr=bottom-1; 
		break;
	case 'M':
		definitions();
		break;
#ifdef OSK
	case '.':
#else
	case 'N': 
#endif
		next(nlines);
		break;
#ifdef OSK
	case 'o':
#else
	case 'P': 
#endif
		prev(nlines);
		break;
	case 'R': 
		move(); 
		break;
	case 'S':
		savedefs();
		break;
	case 'I':
		installdefs(entries[curr]->e_name); 
		break;
	case 'U'-'@':
		prev(nlines/2);
		break;
	case 'D':
	case 'd': 
		if(getch()==c && !intrup)
			remove(c=='D'); 
		else
			bell(); 
		break;
	case 'h': 
		ccol=0; 
		break;
	case 'l': 
		ccol=NCOL; 
		break;
	case '<':
		quickmode=1;
		if(display_up) {
			todump=1;
			at(0, 1);
			header();
		}
		break;
		
#ifndef OSK
	case '+': case '^':
		addname(c);
		break;
	case '(':
		addperm();
		break;
	case ')':
		delperm();
		break;
#endif

	case '>':
		quickmode=0;
		if(display_up) {
			todump=1;
			at(0, 1);
			header();
		}
		break;
	case 'J'-'@': 
#ifdef OSK
	case ',':
#else
	case 'j': 
#endif
		newline(); 
		break;
	case 'K'-'@': 
#ifdef OSK
	case 'i':
#else
	case 'k': 
#endif
		upline(); 
		break;
	case 'n': 
		next(nlines/2);
		break;
	case 'p': 
		prev(nlines/2);
		break;
	case 'q':  case 'Z': case 'Q':
		if(getchar()==c && !intrup)
			ended=1;
		else
			bell();
		break;
	case 'r': 
		reload(); 
		break;
	case 't':
		tag();
		break;
	case 'T': case 'U':
		tag_all(c=='T');
		break;
	case 'x':
		hexdump();
		break;
	default:
		if(!macro(c))
			bell();
		else
			cmd(getch()); /* make sure it does something */
	}                                 /* and thus avoid unneeded redraws */
}

cmdline()
{
	at(0, li-1);
	outs(ce);
	fflush(stdout);
}

newdir()
{
	if(display_up)
		at(0,0);
	fflush(stdout);
	dot=pwd();

	if(!getdir())
		wperror(dot);

	curr=0;
	top=0;
	topline();
	if(display_up)
		todump=TRUE;
}

reload()
{
	getdir();
	curr=(curr>=bottom)?bottom-1:curr;
	if(display_up) {
		topline();
		todump=TRUE;
	}
}

topline()
{
	if(display_up)
		at(0,0);
	printf("%s: %d files", dot, nentries);
	nl();
}

redraw()
{
	outs(cl);
	display_up=0;
	topline();
	at(0,1);
	header();
	todump=1;
	display_up=1;
}

dumpdata()
{
	at(0,2);
	dump(top,bottom);
	if(top+nlines>nentries) {
		int i;
		at(0, bottom-top+2);
		for(i=bottom-top; i<nlines; i++) {
			outc('~');
			nl();
		}
	}
}

upline()
{
 	if(curr>0)
 		curr--;
 	else bell();
}

home()
{
	curr=0;
}

next(l)
{
 	curr += l;
 	if(curr>=nentries) curr=nentries-1;
}

prev(l)
{
 	curr -= l;
 	if(curr<0) curr=0;
}

tail()
{
	curr=nentries-1;
}

newline()
{
 	if(curr<nentries-1)
 		curr++;
 	else
		bell();
}

here_i_am()
{
	int c;
	if(*macptr)
		return;
	if(todump)
		display_up = 1;
	if(!display_up) {
		cmdline();
		statout(entries[curr]->e_name,
			&entries[curr]->e_stat,
			entries[curr]->e_uname,
			entries[curr]->e_gname,
			entries[curr]->e_flags);
		at(quickmode?1:ccol, li-1);
		fflush(stdout);
		if((c=getch())=='\n') {
			redraw();
			here_i_am();
		} 
		else
			ungetch(c);
 	} else if(todump) {
 		if(!(curr-top > 0 && curr-top < nlines)) {
 			top = curr-nlines/2;
 			if(top<0) top=0;
 		}
 		dumpdata();
 		at(quickmode?1:ccol, curr-top+2);
 		todump=0;
 	} else {
 		int lines_to_scroll = curr-top;
 		if(lines_to_scroll > 0)
 			if((lines_to_scroll -= nlines-1) < 0)
 				lines_to_scroll = 0;
 		if(lines_to_scroll < 1-nlines) {
 			top=curr;
 			at(0,2);
 			dump(top, bottom);
 		} else if(lines_to_scroll > nlines-1) {
 			top=curr-nlines+1;
 			at(0,2);
 			dump(top, bottom);
 		} else if(lines_to_scroll) {
 			scroll(2, nlines+2, lines_to_scroll);
 			top += lines_to_scroll;
 			if(lines_to_scroll < 0) {
 				at(0, 2);
 				dump(top, top-lines_to_scroll);
 			} else {
 				at(0, 2+nlines-lines_to_scroll);
 				dump(bottom-lines_to_scroll, bottom);
 			}
 		}
 		at(quickmode?1:ccol, curr-top+2);
 	}
}

bell()
{
	outc(7);
}

/*         (Never used)
perform(command)
char *command;
{
	char cmdbuf[MAXLINE];

	cmdline();
	extty();
	outc('!');
	printf(command, entries[curr]->e_name);
	sprintf(cmdbuf, command, entries[curr]->e_name);

	sys(cmdbuf, 1);
	entty();
}
*/

#ifdef OSK
sys(command, rdflag)
int rdflag; /* Should I redraw? */
{
	char shellstr[MAXLINE+64];
	cmdline(); fflush(stdout);
	cooktty();
	sprintf(shellstr,"setenv FILE %s;%s %s",
		entries[curr]->e_name, SHELL, command);
	if(errno=system(shellstr)) perror(shellstr);
	getchar();
	if(rdflag)
		{
		redraw(); display_up=1;
		}
	rawtty();
}
#else
sys(command, rdflag)
char *command;
int rdflag; /* Should I redraw? */
{
	char scratch[32];
	int status;
	int (*sigint)(), (*sigquit)();
	char c;

	sigint=signal(2, 1);
	sigquit=signal(3, 1);
	cooktty();
	fflush(stdout);
	strcpy(scratch, entries[curr]->e_name);
	if(!fork()) {
		int i;
		static char *envp[MAXARGC];
		static char env[NCARGS];
		char *hold;
		char line[MAXLINE];
		char *tmp;

		signal(2,0);
		signal(3,0);

		if(!(efp=fopen(efname, "r"))) {
			fputc('\n', stderr);
			perror(efname);
			execl(SHELL, SHELL, "-c", command, 0);
			execl("/bin/sh", "sh", "-c", command, 0);
			perror("/bin/sh");
			exit(-77);
		}

		i=0;
		tmp=hold=env;

		while(!feof(efp)) {
			fgets(line, MAXLINE, efp);
			if(strlen(line)+(tmp-env)>NCARGS)
				break;
			if(line[0]=='$')
				if(tmp>hold) {
					envp[i] = hold;
					i++;
					if(i > MAXARGC-2) break;
					tmp[-1]=0;   /* eat line-feed at end */
					hold = tmp;
				}
			strcpy(tmp, line+(line[0]=='$'));
			tmp += strlen(tmp);
		}
		if(tmp>hold) {
			envp[i] = hold;
			i++;
			tmp[-1]=0;               /* and eat this one as well */
		}
		sprintf(tmp, "FILE=%s", scratch);
		envp[i++]=tmp;
		envp[i]=0;

		if(rdflag)
			putchar('\n');
		else
			putchar('\r');
		fflush(stdout);
		execle(SHELL, SHELL, "-c", command, 0, envp);
		execle("/bin/sh", "sh", "-c", command, 0, envp);
		perror("/bin/sh");
		exit(-77);
	}
	wait(&status);
	signal(2, sigint);
	signal(3, sigquit);
	rawtty();

	if(rdflag || status!=0)
		display_up=0;
}
#endif

char
inps(buf, text, termin)
char *buf;
char *text;
char termin;
{
	int i = 0, j, found_tags;
	char c, *ptr, *txp;

	txp=text?text:"!";

	while(!intrup &&
	    (fflush(stdout), c=getch()) != '\033' &&
	    c != '\n' &&
	    c != termin)
		switch(c) {
		case '\b': 
		case '\177':
			if(i>0) {
				printf("\b \b");
				i--;
			} 
			else
				bell();
			break;
		case 'U'-'@':
			txp=text?text:"!";
		case 'X'-'@':
			if(i>0)
				while(i>0) {
					printf("\b \b");
					i--;
				}
			else
				bell();
			break;
		case 'K'-'@':
			if(*txp)
				ctloutc(buf[i++] = *txp++);
			break;
		case '%':
			found_tags = 0;
			j = 0;
			while(j < nentries) {
				if(entries[j]->e_flags & FTAGGED) {
					found_tags = 1;
					if(i+strlen(entries[j]->e_name)+1>=MAXLINE) return '\033';
					for(ptr=entries[j]->e_name; *ptr; ptr++)
						ctlout(buf[i++] = *ptr);
					ctlout(buf[i++] = ' ');
					}
				j++;
				}
			if(!found_tags) {
				if(i+strlen(entries[curr]->e_name)+1>=MAXLINE) return '\033';
				for(ptr=entries[curr]->e_name; *ptr; ptr++)
					ctlout(buf[i++] = *ptr);
				}
			standend();
			break;
		case '#':
			for(ptr=dot; *ptr; ptr++)
				{
				if(i>=MAXLINE) return '\033';
				ctlout(buf[i++] = *ptr);
				}
			standend();
			break;
		case '~':
			for(ptr=HOME; *ptr; ptr++)
				{
				if(i>=MAXLINE) return '\033';
				ctlout(buf[i++] = *ptr);
				}
			standend();
			break;
		case '@':
			outc(c);
			fflush(stdout);
			c = getch();
			if(!macro(c)) {
				ungetch(c);
				buf[i++]='@';
			} 
			else
				outs("\b \b");
			break;
		case '$':
			outc(c);
			fflush(stdout);
			c = getch();
			if(c=='$') {
				char tmp[10];
				sprintf(tmp, "%d", getpid());
				outs("\b \b");
				for(ptr=tmp; *ptr; ptr++)
					{
					if(i>=MAXLINE) return '\033';
					ctlout(buf[i++] = *ptr);
					}
				standend();
			} 
			else if(!macbuf[c]) {
				ungetch(c);
				buf[i++]='$';
			} 
			else {
				outs("\b \b");
				for(ptr=macbuf[c]; *ptr; ptr++)
					{
					if(i>=MAXLINE) return '\033';
					ctlout(buf[i++] = *ptr);
					}
				standend();
			}
			break;
		case '!':
			while(*txp)
				{
				if(i>=MAXLINE) return '\033';
				ctlout(buf[i++] = *txp++);
				}
			standend();
			break;
		case '\\':
			outc(c);
			fflush(stdout);
			c=getch();
			if(c=='~' || c=='%' || c=='#' ||
			    c=='\\' || c=='!' ||
			    c=='K'-'@' || c=='U'-'@' || c=='X'-'@' ||
			    c=='\b' || c=='\177' ||
			    c==termin || c=='\033' || c=='\n' ||
			    c=='@' || c=='$') {
				outc('\b');
				ctloutc(buf[i++]=c);
				break;
			} 
			else if(c>='0' && c<='7') {
				int n, val=0;
				for(n=0; n<3 && c>='0' && c<='7'; n++) {
					val = val*8 + c-'0';
					outc('\b');
					ctloutc(val);
					c=getch();
				}
				ungetch(c);
				c=buf[i++]=val;
				break;
			} 
			else if(c=='^') {
				outc('\b');
				outc('^');
				fflush(stdout);
				c=getch();
				if(c>='?'&&c<='_') {
					outc('\b');
					ctloutc(buf[i++]=(c-'@')&'\177');
					break;
				} 
				else if(c>='`'&&c<='~') {
					outc('\b');
					ctloutc(buf[i++]=c-'`');
					break;
				} /* otherwise default */
				else buf[i++]='^'; /* after adding caret */

			} /* otherwise fall through to default */
			else buf[i++]='\\'; /* after adding backslash */
		default:
			if(i>=MAXLINE) return '\033';
			ctloutc(buf[i++] = c);
			break;
		}

	buf[i] = 0;
	return intrup?'\033':c;
}

ctlouts(s)
char *s;
{
	int cnt = 0;

	while(*s)
		cnt += ctlout(*s++);
	cnt += standend();

	return cnt;
}

ctloutc(c)
char c;
{
	int cnt;

	cnt = ctlout(c);
	cnt += standend();

	return cnt;
}

int somode = 0;
int ulmode = 0;

standout()
{
	if(!somode) {
		outs(so);
		somode = 1;
		if(xn) return 1;
	}
	return 0;
}

underline()
{
	if(!ulmode) {
		outs(us);
		ulmode = 1;
		if(xn) return 1;
	}
	return 0;
}

standend()
{
	int cnt = 0;

	if(somode) {
		outs(se);
		somode = 0;
		if(xn) cnt++;
	}
	if(ulmode) {
		outs(ue);
		ulmode = 0;
		if(xn) cnt++;
	}
	return cnt;
}

ctlout(c)
char c;
{
	int cnt = 0;
	if(c&'\200') {
		cnt += underline();
		cnt += ctlout(c&'\177');
		return cnt;
	} 
	else if(c<' ' || c=='\177') {
		cnt += standout();
		outc((c+'@')&'\177');
		cnt++;
		return cnt;
	} 
	else {
		cnt += standend();
		outc(c);
		cnt++;
		return cnt;
	}
}

todir()
{
	char cmdbuf[MAXLINE];
	static char lastdir[MAXLINE] = ".";
	char *slash, *rindex();

	cmdline();
	printf("goto ");
	if(inps(cmdbuf, lastdir, 0)!='\033' && cmdbuf[0]) {
		strcpy(lastdir, cmdbuf);
		if(!cd(cmdbuf, 0)) {
			if(!fgoto(cmdbuf))
				if(slash=rindex(cmdbuf, '/')) {
					*slash++=0;
					if(cd(cmdbuf, 1)) {
						if(!fgoto(slash)) {
							errno=0;
							xerrno=NOMATCH;
							wperror(slash);
						}
					} else
						wperror(cmdbuf);
				} else
					wperror(cmdbuf);
		}
	} 
	else
		killcmd();
}

fgoto(file)
char *file;
{
	int i;

	for(i = 0; i<nentries; i++)
		if(match(entries[i]->e_name, file)) {
			curr=i;
			return 1;
		}

	return 0;
}

match(target, sample)
char *target, *sample;
{
	while(*sample && *target==*sample) {
		target++;
		sample++;
	}
	return !*sample;
}

killcmd()
{
	if(!intrup) {
		cmdline();
		printf("Command killed");
		if(!display_up)
			nl();
	}
}

cd(dir, flag)
char *dir;
int flag;
{
	if(flag) {
		cmdline();
#ifdef OSK
		printf("cd %s", dir);
	}
#else
		printf("cd %s\r", dir);
	} 
	else
		outc('\r');
#endif

	fflush(stdout);
	if(
	
#ifndef OSK
	access(dir, 5)==0 && 
#endif
	
	chdir(dir)==0) {
		newdir();
		return 1;
	} 
	return 0;
}

syscom(rd)
int rd; /* should I redraw? */
{
	char buf[MAXLINE];
	static char lastcmd[MAXLINE] = "";
	char inps();

	cmdline();
	extty();
	putchar(rd?SHELLSYM:'&');
	if(inps(buf, lastcmd, 0)=='\033') {
		entty();
		redraw(); display_up=1;
		killcmd();
		return;
	} 
	else
		strcpy(lastcmd, buf);
	sys(buf, rd);
	entty();
}

isdir(entry)
struct entry *entry;
{
#ifdef OSK
	return((entry->e_stat.st_mode)&S_IFDIR);
#else
	return((entry->e_stat.st_mode&S_IFMT)==S_IFDIR);
#endif
}

sample(name)
char *name;
{
	int col;
	int c, i;
	FILE *tfp;

	if(!(tfp = fopen(name, "r"))) {
		wperror(name);
		return;
	}

	i=0;
	do {
		cmdline();
		col = 0;
		for(c=fgetc(tfp); col<72 && !feof(tfp); c=fgetc(tfp))
			col+=ctlout(c);
		standend();
		if(display_up)
			outc('\r');
		else
			outc('\n');
	} 
	while(!feof(tfp) && (i=getch())=='?');

	fclose(tfp);

	if(i && i!=' ' && i!='q' && i!='?')
		ungetch(i);
}

macro(c)
char c;
{
	if(c==NOMAC)
		return 0;
	else if(!macbuf[c])
		return 0;
	else if(c==c_macro) {
		cmdline();
		printf("Recursive macro.");
		endmac();
		return 0;
	} 
	else {
		c_macro = c;
		macptr = macbuf[c];
		return 1;
	}
}

getch()
{
	char c;

	if(ungetptr>ungetbuf)
		return *--ungetptr;
	if(*macptr)
		if(*macptr=='\007') {
			macptr++;
			if(*macptr!='\007')
				return getchar();
			else {
				if((c=getchar()) != '\n')
					macptr--;
				else
					macptr++;
				return (c=='\n')?getch():c;
			}
		} 
		else if(*macptr=='\\') {
			if(macptr[1]=='\007')
				macptr++;
			return *macptr++;
		} 
		else
			return *macptr++;
	else {
		endmac();
		return getchar();
	}
}

endmac() {
	c_macro=NOMAC;
	macptr="";
}

ungetch(c)
char c;
{
	if(ungetptr-ungetbuf>SMALLBUF)
		return;
	*ungetptr++=c;
}

define()
{
	int c;
	char buf[SMALLBUF];

	cmdline();
	fflush(stdout);
	printf("define ");
	c = getch();

	if(intrup)
		return;

	ctloutc(c);
	printf(" as [");
	if(inps(buf, macbuf[c], ']')=='\033') {
		killcmd();
		return;
	}
	printf("]");

	defent(c, buf);
}

defent(c, buf)
char c;
char *buf;
{
	if(macbuf[c])
		free(macbuf[c]);

	if(!buf[0]) {
		macbuf[c]=0;
		return;
	}

	macbuf[c] = (char *)malloc(strlen(buf)+1);

	if(!macbuf[c]) {
		cmdline();
		printf("No room");
		return;
	}

	strcpy(macbuf[c], buf);
}

defmacs()
{
#ifdef OSK
	defent(' ', "$more %\n");
	defent('%', "$%\n");
	defent('s', "$scred %\n");
	defent('b', "=..\n");
	defent('c', "$copy % ");
#else
	defent('/', "=/");
	defent('.', "=.");
	defent(' ', "!more %\n");
	defent('%', "!%\n");
	defent('$', "!vi /tmp/br.env.$$\n");
	defent('v', "!vi %\n");
#endif
	defent('~', "=~\n");
}

definitions()
{
	int	i;

	cmdline();
	for(i=0; i<CHARSET; i++)
		if(macbuf[i]) {
			printf("define ");
			ctloutc(i);
			printf(" as [");
			ctlouts(macbuf[i]);
			printf("]\n");
		}
	getchar();
	redraw(); display_up=1;
}

savedefs()
{
	int i;
	char filename[MAXLINE];
	static char lastfile[MAXLINE] = SAVEMACROS;
	FILE *fp;

	cmdline();
	outs("Save macros as ");

	if(inps(filename, lastfile, '\033')=='\033') {
		killcmd();
		return;
	}

	strcpy(lastfile, filename);

	if(!(fp = fopen(filename, "w"))) {
		wperror(filename);
		return;
	}

	for(i=1; i<CHARSET; i++)
		if(macbuf[i])
			fprintf(fp, "[%c%s]\n", i, macbuf[i]);

	fclose(fp);
}

installdefs(s)
char *s;
{
	FILE *fp;
	char macc,macs[80],*macp,firstchar;
	
	if((fp=fopen(s,"r"))==NULL)
	  {
	  wperror(s); return;
	  }
	cmdline(); firstchar=(char)fgetc(fp);
	while(!feof(fp))
		{
		if(firstchar!='[')
			{
			printf("illegal syntax in '%s'",s);
			fflush(stdout);	break;
			}
		macc=fgetc(fp);	macp=macs;
		do *(macp++)=(char)fgetc(fp);
		while(*(macp-1)!=']' && *(macp-1)!=-1);
		if(*(macp-1)!=']')
			{
			printf("illegal syntax in '%s'",s);
			fflush(stdout);	break;
			}
		*(macp-1)='\0';
		cmdline(); printf("define "); ctloutc(macc); printf(" as [");
		ctlouts(macs); printf("]\n");
		fflush(stdout);
		defent(macc, macs);	fgetc(fp);
		firstchar=(char)fgetc(fp);
		}
	getchar(); fclose(fp);
	redraw(); display_up=1;
}


#ifndef OSK
dumpenv(envp)
char **envp;
{
	if(!(efp=fopen(efname, "w"))) {
		fperror(efname);
		exit(-1);
	}
	while(*envp)
		fprintf(efp, "$%s\n", *envp++);
	fflush(efp);
	fclose(efp);
}
#endif


#ifdef OSK
link(str1,str2)
char *str1,*str2;
{
	char shellstr[80];
	sprintf(shellstr,"copy %s %s",str1,str2);
	return(system(shellstr));
}

#ifndef LINT
int super()
  {
#asm
 move.l #0,errno(a6)
 moveq.l #0,d1
 os9 F$SUser
 bcc.s NoErr
 move.w d1,errno(a6)
NoErr
# endasm
  if(errno) return(FALSE); else return(TRUE);
  }
#endif

#endif
SHAR_EOF
fi
exit 0
#	End of shell archive