]> andersk Git - moira.git/commitdiff
Initial revision OPSSRC_BASE
authordanw <danw>
Tue, 2 Jul 1996 01:48:42 +0000 (01:48 +0000)
committerdanw <danw>
Tue, 2 Jul 1996 01:48:42 +0000 (01:48 +0000)
58 files changed:
Makefile [new file with mode: 0644]
afssync/INSTRUCTIONS [new file with mode: 0644]
afssync/Imakefile [new file with mode: 0644]
clients/moira/Doc/Makefile [new file with mode: 0644]
clients/moira/Doc/delete.doc [new file with mode: 0644]
clients/moira/Doc/internal.PS.Z [new file with mode: 0644]
clients/moira/Doc/internal.mss [new file with mode: 0644]
clients/mrtest/scripts/dcm.sc [new file with mode: 0644]
clients/mrtest/scripts/doit.sc [new file with mode: 0644]
clients/mrtest/scripts/filesys.sc [new file with mode: 0644]
clients/mrtest/scripts/list.sc [new file with mode: 0644]
clients/mrtest/scripts/mach.sc [new file with mode: 0644]
clients/mrtest/scripts/misc.sc [new file with mode: 0644]
clients/mrtest/scripts/queries.sc [new file with mode: 0644]
clients/mrtest/scripts/users.sc [new file with mode: 0644]
clients/mrtest/scripts/zephyr.sc [new file with mode: 0644]
clients/userreg/login.info [new file with mode: 0644]
clients/xregister/Makefile [new file with mode: 0644]
clients/xregister/help [new file with mode: 0644]
clients/xregister/welcome [new file with mode: 0644]
gen/report.dc [new file with mode: 0644]
include/afs/auth.h [new file with mode: 0644]
include/des.h [new file with mode: 0644]
include/kadm.h [new file with mode: 0644]
include/mit-sipb-copyright.h [new file with mode: 0644]
include/prot.h [new file with mode: 0644]
man/canonicalize_hostname.3 [new file with mode: 0644]
man/format_filesys_type.3 [new file with mode: 0644]
man/mr_auth.3 [new file with mode: 0644]
man/mr_connect.3 [new file with mode: 0644]
man/mr_disconnect.3 [new file with mode: 0644]
man/mr_do_update.3 [new file with mode: 0644]
man/mr_host.3 [new file with mode: 0644]
man/mr_motd.3 [new file with mode: 0644]
man/mr_noop.3 [new file with mode: 0644]
man/mr_query.3 [new file with mode: 0644]
man/mr_set_alternate_input.3 [new file with mode: 0644]
man/parse_filesys_type.3 [new file with mode: 0644]
man/sq_create.3 [new file with mode: 0644]
man/sq_destroy.3 [new file with mode: 0644]
man/sq_empty.3 [new file with mode: 0644]
man/sq_get_data.3 [new file with mode: 0644]
man/sq_remove_data.3 [new file with mode: 0644]
man/sq_save_args.3 [new file with mode: 0644]
man/sq_save_data.3 [new file with mode: 0644]
man/sq_save_unique_data.3 [new file with mode: 0644]
man/sq_save_unique_string.3 [new file with mode: 0644]
man/strsave.3 [new file with mode: 0644]
man/strtrim.3 [new file with mode: 0644]
reg_svr/regtest/create [new file with mode: 0755]
reg_svr/regtest/message [new file with mode: 0644]
reg_svr/regtest/message.head [new file with mode: 0644]
reg_svr/regtest/message.tail [new file with mode: 0644]
reg_svr/regtest/names [new file with mode: 0644]
reg_svr/regtest/names.crypt [new file with mode: 0644]
reg_svr/regtest/printit [new file with mode: 0755]
reg_svr/regtest/script [new file with mode: 0644]
server/TODO [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..aff57e9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,274 @@
+# Makefile generated by imake - do not edit!
+# $XConsortium: imake.c,v 1.86 93/10/11 12:12:36 rws Exp $
+
+#
+# This makefile is automatically generated by imake... do not modify
+# or you may lose your changes when imake generates makefiles again.
+# Ignore this message if you are not using imake.
+#
+#      $Source$
+#
+
+NEWTOP=.
+BUILDTOP=.
+
+INCLUDE= -I$(BUILDTOP)/include -I$(BUILDTOP)/lib -I/usr/athena/include \
+       $(SS_INCL)
+CFLAGS=$(DBG) $(INCLUDE) $(DEFINES) $(GLOBAL_CDEFS)
+LINTFLAGS=$(INCLUDE) $(DEFINES) $(GLOBAL_CDEFS)
+
+#      $Source$
+#
+
+CURSES= -L/usr/css/lib -lcurses -ltermcap
+
+OSDEFS= -DPOSIX -DSOLARIS -I/usr/openwin/include
+OSLIBS= -L/usr/ccs/lib -lcurses -ltermcap -lresolv \
+       -lsocket -lnsl -lc /usr/ucblib/libucb.a -lelf -ldl
+CURSES=
+
+GLOBAL_CDEFS= -DHESIOD -DZEPHYR -DGDSS -DATHENA -DDBMS=INGRES -I/usr/athena/include $(OSDEFS)
+
+SRCTOP=/mit/moiradev/src
+
+DESTDIR=
+
+USRDIR= /usr
+ETCDIR= /usr/athena/etc
+PROGDIR=/usr/athena/bin
+LIBDIR= /usr/athena/lib
+LINTLIBDIR = /usr/lib/lint
+INCLDIR= /usr/athena/include
+MANDIR= /usr/athena/man
+
+LZEHPYR=-lzephyr
+
+LIBGDSS= /mit/gdss/`machtype`/libgdss.a
+GDSSINC= -I/mit/gdss/include
+
+LINTLIBFLAG=-C
+
+MR_LIB=$(BUILDTOP)/lib/libmoira.a
+MR_LIBDEP=$(MR_LIB)
+MR_LINTLIB=$(BUILDTOP)/lib/llib-lmoira.ln
+GDB_LIB=$(BUILDTOP)/gdb/libmrgdb.a
+GDB_LIBDEP=$(GDB_LIB)
+GDB_LINTLIB=$(BUILDTOP)/gdb/llib-lmrgdb.ln
+
+COMPILE_ET= compile_et
+
+COM_ERR = -lcom_err
+
+MAKE_COMMANDS= mk_cmds
+
+SS_LIB = -lss
+
+LLIB = -L/usr/athena/lib
+
+CLIBS= $(MR_LIB) $(GDB_LIB) $(LLIB) $(LZEPHYR) $(COM_ERR) -lkrb -ldes -lhesiod
+
+SQL_LIB= /usr/ingres/lib/libingres.a -lm
+
+ARCHIVE= ar cru
+
+RANLIB= /bin/true
+
+INSTALLFILE= install -c -m 444
+
+INSTALLLIB= install -c -m 444
+
+INSTALLPROG= install -c -m 555
+
+INSTALLRAW= install
+
+LD=ld
+
+AS=as
+
+LINT=lint
+
+CC=gcc -traditional
+
+CCRO=$(CC) -R
+
+HCC=$(CC)
+
+CPP=$(CC) -E
+
+DBG=-O
+
+HCFLAGS=$(CFLAGS)
+
+TAGGER=etags
+
+MAKE=make
+RM=rm -f
+MV=mv
+CP=cp
+LN=ln -s
+LPR=lpr -p
+CHMOD=chmod
+AWK=awk
+
+DEPEND=makedepend
+IMAKE=imake -I$(BUILDTOP)/util/imake.includes
+
+#      $Source$
+#
+
+# $Header$
+#
+# Copyright 1990 by the Massachusetts Institute of Technology.
+#
+# For copying and distribution information,
+# please see the file <mit-copyright.h>.
+#
+# Imakefile for top level directory.
+#
+
+CODE=Imakefile
+CLIENTDIRS=util include gdb lib clients man update
+SVRDIRS=server db backup dbck dcm gen reg_svr incremental regtape
+
+SUBDIRS=$(CLIENTDIRS)
+
+all::
+
+world::
+       make ${MFLAGS} clean-imake
+       make ${MFLAGS} Makefile
+       make ${MFLAGS} Makefiles
+       make ${MFLAGS} depend
+       make ${MFLAGS} all
+
+clean-imake:
+       cd util/imake; make clean
+
+imake::
+       cd util/imake; make
+
+install::
+       -mkdir ${DESTDIR}
+       -mkdir ${DESTDIR}${USRDIR}
+       -mkdir ${DESTDIR}${ETCDIR}
+       -mkdir ${DESTDIR}${PROGDIR}
+       -mkdir ${DESTDIR}${LIBDIR}
+       -mkdir ${DESTDIR}${LINTLIBDIR}
+       -mkdir ${DESTDIR}${INCLDIR}
+       -mkdir ${DESTDIR}${MANDIR}
+       -mkdir ${DESTDIR}${MANDIR}/man1
+       -mkdir ${DESTDIR}${MANDIR}/man3
+       -mkdir ${DESTDIR}${MANDIR}/man5
+       -mkdir ${DESTDIR}${MANDIR}/man8
+       -mkdir ./bin
+
+et:
+       cd util/et; make ${MFLAGS} DEPEND="$(BUILDTOP)/../../$(DEPEND)" depend; make ${MFLAGS} all
+
+ss:
+       cd util/ss; make ${MFLAGS} DEPEND="$(BUILDTOP)/../../$(DEPEND)" depend; make ${MFLAGS} all
+
+makedepend:
+       cd util/makedepend; make
+
+all::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" all "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) all ; \
+       echo "### Done with" `pwd`); \
+       done
+
+install::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" install "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) install ; \
+       echo "### Done with" `pwd`); \
+       done
+
+clean::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" clean "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) clean ; \
+       echo "### Done with" `pwd`); \
+       done
+
+depend::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" depend "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) depend ; \
+       echo "### Done with" `pwd`); \
+       done
+
+tags::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" tags "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) tags ; \
+       echo "### Done with" `pwd`); \
+       done
+
+print::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" print "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) print ; \
+       echo "### Done with" `pwd`); \
+       done
+
+src::
+       @for d in  $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making" src "in" `pwd`; \
+       $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) src ; \
+       echo "### Done with" `pwd`); \
+       done
+
+Makefiles::
+       @echo "### Making Makefiles in" `pwd`
+       @for d in $(SUBDIRS); \
+       do \
+       (cd $$d; echo "### Making Makefile in" `pwd`; \
+       $(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \
+       NEWTOP=../$(BUILDTOP) \
+       BUILDTOP=../$(BUILDTOP) \
+       -f ../Makefile \
+       Makefile; \
+       $(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \
+       NEWTOP=../$(BUILDTOP) \
+       Makefiles; \
+       echo "### Done with" `pwd`); \
+       done
+
+depend:: $(SRCS)
+       @echo "### Now computing dependencies"
+       @$(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS)
+
+clean::
+       $(RM) *~ \#* *.bak $(TAGSFILE)
+
+tags::
+       $(TAGGER) *.c *.h
+
+Makefile::
+       -$(RM) Makefile.bak; $(MV) Makefile Makefile.bak
+       $(IMAKE) -DNEW_TOP=$(NEWTOP) -s Makefile
+
+print:: ${CODE}
+       ${LPR} ${CODE}
+
+src:: ${CODE}
+
+${CODE}:
+       $(RM) $@
+       -$(LN) ${SRCDIR}/$@ $@
+
+install::
+
+Makefiles::
+
+# DO NOT DELETE THIS LINE
+
diff --git a/afssync/INSTRUCTIONS b/afssync/INSTRUCTIONS
new file mode 100644 (file)
index 0000000..05bc250
--- /dev/null
@@ -0,0 +1,168 @@
+Date: Tue, 26 Jul 1994 14:37:39 -0400
+To: Kimberly Carney <kim@MIT.EDU>
+Cc: dkk@MIT.EDU, op@MIT.EDU
+In-Reply-To: Kimberly Carney's message of Tue, 26 Jul 1994 14:00:29 EDT,
+       <9407261800.AA13079@chich.MIT.EDU>
+Subject: Re: AFS prdb sync'd with Moira 
+From: "Richard Basch" <basch@MIT.EDU>
+
+[ Note: make sure that you have the binaries from afsuser copied
+  locally onto your local machine; also make sure that you have all
+  scripts (see below) copied locally before you start, since AFS may
+  disappear on you.  Altnertiavely, your machine should not be
+  depending on the Athena cell.  For syspacks, root.afs (/afs), etc.
+  Make sure you have superuser tokens for all cells that you might need.]
+
+The binaries are now in /moira/sync/ on the Moira server.
+Most of the commands must be done on the Moira server.
+
+  touch /moira/afs/noafs
+(This gives you some grace time, but watch for critical AFS errors after
+this happens, as you will have to handle those by hand.)
+
+[ 30 minutes after an AFS incrementals starts, they will time out.... 
+       So after that, they will log critical error and then they will
+       have to be done by hand! ]
+
+  /moira/sync/afssync /var/prdb.moira
+(I recommend that you do the following few steps concurrently with this,
+as the "noafs" lock file doesn't give you too much grace time.)
+[ ^^ This takes roughly 20-40 minutes.]
+
+[ Check all PTS servers to make sure they have a consistent versions.
+  Note the PTS database version number, make sure no write
+  transactions are in progress.   "udebug -p 7002".]
+
+  rcp root@orf:/usr/afs/db/prdb.DB0 /var/prdb.old
+(use "udebug <server> -p 7002" before and after to make sure the version
+hasn't changed.)
+
+[ Check to make sure that the version number is the same with udebug.]
+
+  /moira/sync/pt_util -x -m -u -g -d /var/prdb.extra -p /var/prdb.old
+  perl /moira/sync/pt_util.pl < /var/prdb.extra > /var/prdb.extra.sort
+(These two commands extract and prepare the personal groups and special
+user entries in the old prdb for being reincorporated into the new prdb.)
+
+*** Make sure the "afssync" command has completed ***
+  cp /var/prdb.moira /var/prdb.new
+  /moira/sync/pt_util -w -d /var/prdb.extra.sort -p /var/prdb.new
+(This almost completes the preparation of the prdb.)
+[ ^^ This takes 40 minutes, may take longer.  Exponentially with
+number of personal groups.]
+
+  pts listmax
+(Save the numbers printed.)
+
+copy /var/prdb.new to *ALL* the database servers (/usr/afs/db/prdb.new)
+
+The following should be done as quickly as possible...
+
+foreach i ( <db servers> )
+  bos shutdown $i ptserver
+  bos exec $i "rm /usr/afs/db/prdb.DB*; mv /usr/afs/db/prdb.new /usr/afs/db/prdb.DB0"
+end
+
+foreach i ( <db servers> )
+  bos restart $i ptserver
+end
+
+Watch the status of the servers using "udebug" to make sure things are
+going well...  make sure the beacons are working, and that once quorom
+is established that the servers are resynchronizing their notions of the
+databases and that the dbcurrent and up fields all become set and the
+state goes to 1f.  Also watch out for large rx packet queues on port
+7002 using rxdebug, as the fileservers may get excessively backlogged,
+and restart servers, if necessary, if the congestion remains excessive.
+
+[ Use udebug on prill.... will take 75 seconds for the pts servers to
+elect a master, and then additional time for the master to propagate
+its database to the rest of the pts servers.]
+
+  pts listmax
+(if the id's are lower than the saved ones, reset them appropriately to
+the saved one's, using "pts setmax").
+
+  pts ex system:administrators
+(good spot check, especially since it has special people)
+(also spot check one of the personal groups and perhaps, something like
+the membership of rcmd.ronald-ann)
+
+  rm /moira/afs/noafs
+(You need to remove the lock file you put on.)
+
+-Richard
+
+***************************************************************************
+
+NOTES:
+
+1. There is also a faster pt_util command for integrating the various personal
+groups.  However, it has not been fully verified.  It can be found in the 
+development sources as pt_util-fast.c.  Feel free to try using this one, but
+I would also recommend generating the database the old way just in case...
+
+2. The goal is to minimize the outage and minimize the potential for changes
+so concurrency is highly recommended.
+
+3. Make sure you copy the database to all the protection servers, as the
+servers will be more than happy to give "no such user" answers and users
+will not be able to reestablish authentic connections without doing
+"aklog -force".
+
+4. Don't do this when you're tired...  There may be no cleanup procedure
+available, with certain mistakes.
+
+5. /moira/afs/noafs is only good for 30 minutes.  Keep track of the
+critical log, and you may have to do some operations by hand when the
+operation is complete.  Also, if requests depend on other requests, they
+may be processed out of order, and fail, and may need to be done by hand.
+
+***************************************************************************
+
+(The following is a very old message...)
+
+
+To: op@MIT.EDU, mar@MIT.EDU
+Cc: tjm@MIT.EDU
+Subject: AFS/Moira sync
+From: "Richard Basch" <basch@MIT.EDU>
+
+
+I have rebuilt the AFS protection database from the information in the
+Moira and old prdb (for the special entries and personal groups).  It
+has been installed without a problem.  The old prdb is in
+
+       prill:/usr/afs/db/prdb.old
+
+As usual, I installed it with no interruption of service (there may have
+been a couple minutes when AFS was a bit slow as the protection database
+servers were being restarted, but that's it).
+
+The following is the basic procedure I used to create the new prdb...
+
+-Richard
+
+
+moira2# /moira/bin/afssync /var/prdb
+Doing users: Tue Sep  7 23:59:37 1993
+Doing groups: Wed Sep  8 00:16:26 1993
+Error adding group system:mit id -101: Entry for id already exists
+Error adding group system:authuser id -102: Entry for id already exists
+Error adding group system:administrators id -204: Entry for id already exists
+Reading/preparing members: Wed Sep  8 00:30:11 1993
+Doing members: Wed Sep  8 00:34:22 1993
+Done (16591 users, 18144 groups, 23 kerberos, 39097 members): Wed Sep  8 00:41:10 1993
+
+prill# /mit/opssrc/moira/afssync/pt_util -x -m -u -g -d /tmp/xxx
+prill# perl /mit/moiradev/pmax/afssync/pt_util.pl < /tmp/xxx > /tmp/prdb.extra
+
+moira2# cd /var
+moira2# cp -p prdb prdb.new
+moira2# /mit/moiradev/pmax/afssync/pt_util -w -d /var/prdb.extra -p /var/prdb.new
+Ubik Version is: 0.0
+Error while creating who:rune-staff: User or group doesn't exist
+Error while creating system:gsipbbin: Entry for id already exists
+Error while creating celine:admin: User or group doesn't exist
+Error while creating celine:titan: User or group doesn't exist
+
diff --git a/afssync/Imakefile b/afssync/Imakefile
new file mode 100644 (file)
index 0000000..c27e135
--- /dev/null
@@ -0,0 +1,24 @@
+DBCFLAGS=
+DBLIBS= -L/usr/ingres/lib -lingres -lm
+
+DEFINES= -I$(AFSDIR)/include -I$(AFSDIR)/include/afs -I../include
+LIBS= -L../lib -L/usr/athena/lib -lmoira -lcom_err -lkrb -ldes ${DBLIBS}
+
+OBJS= ptutils.o utils.o ubik.o
+SRCS= ptutils.c utils.c ubik.c
+CODE= $(SRCS) migrate.qc sync.dc
+
+AFSDIR = /mit/afsdev/bld/dest
+AFSLIBS=$(AFSDIR)/lib/afs/libprot.a   $(AFSDIR)/lib/afs/libauth.a \
+       $(AFSDIR)/lib/libubik.a       $(AFSDIR)/lib/afs/util.a \
+       $(AFSDIR)/lib/librxkad.a      $(AFSDIR)/lib/afs/libsys.a \
+       $(AFSDIR)/lib/librx.a         $(AFSDIR)/lib/liblwp.a
+
+sqlrule()
+
+genutil(afssync,sync.o $(OBJS),,$(AFSLIBS) $(LIBS))
+genutil(pt_util,pt_util.o $(OBJS),,$(AFSLIBS) -L../lib -L/usr/athena/lib -lcom_err -ldes)
+/* genutil(ptdump,ptdump.o $(OBJS),,) */
+
+sqlfile(sync)
+sqlfile(migrate)
diff --git a/clients/moira/Doc/Makefile b/clients/moira/Doc/Makefile
new file mode 100644 (file)
index 0000000..021061b
--- /dev/null
@@ -0,0 +1,9 @@
+# $Header$
+
+all: internal.PS
+
+internal.PS: internal.mss
+       scribe internal
+
+clean:
+       rm -f *.PS *.err *.aux *.otl
diff --git a/clients/moira/Doc/delete.doc b/clients/moira/Doc/delete.doc
new file mode 100644 (file)
index 0000000..f8aa2f2
--- /dev/null
@@ -0,0 +1,158 @@
+
+Here is the explanation of the steps involved in deleting users and
+lists, the examples were created using cut and paste, so they should
+reflect what actually is printed to the user.  The one thing that
+something like this can't give you a feel for is how long it takes to
+delete a list or user.  If you let the client do all the work of
+removing references then deleting an average list or user seems to
+take 7 or 8 minutes.
+
+Comments on this, Anyone???
+
+                                       Chris
+
+------------------------------------------------------------
+                       Deleting lists
+------------------------------------------------------------
+       
+Before a list can be sucessfully deleted a number of things must be
+checked, they are:
+
+- This list may be a member of other lists.
+
+- This list may have members of its own.
+
+- This list may be the ACL of another object.
+
+Since the SMS server makes these checks internally we will make an
+attempt to delete the list, and only if this fails with SMS_IN_USE
+will we attempt to check and assist the user in deleting the list.
+
+Once this list has been deleted then some new lists that may be likely
+canidates for deletion, these would be lists of the following types:
+
+- The ACL of this list may now not be in use.
+
+- A list of which this list was a member may now no longer have any members.
+
+In both these cases the lists mentioned should be deleted.
+I suggest, and have implemented the following user interface.
+
+delete list foo:
+
+------------------------------------------------------------
+list kit is the Access Control Entity (ACE) for the following data objects:
+
+FILESYS kit
+LIST kit
+LIST xconq-acl
+LIST plx-acl
+
+The ACE for each of these items must be changed before
+the list kit can be deleted.
+
+Command:
+------------------------------------------------------------
+
+Once this has been changed, we try again, and...
+
+------------------------------------------------------------
+Are you sure that you want to delete the list kit [n]: y
+List kit has 4 members:
+
+USER kit  
+USER kubitron
+USER mar
+LIST xconq
+
+Remove these members from list kit?  [n]: y
+list kit is a member of 2 other list(s).
+
+mar
+xconq
+Remove list kit from these lists?  [n]: y
+List kit deleted.
+
+Delete the unused Access Control Entity (ACE) foo?  [n]: y
+Are you sure that you want to delete the list foo [n]: y  
+
+Delete the empty list xconq?  [n]: 
+Command:                       - ready for next command...
+
+------------------------------------------------------------
+
+and the process continues until all dangling references are cleaned up.
+
+
+------------------------------------------------------------
+                       Deleting Users
+------------------------------------------------------------
+
+       Checks must also be made before a user is deleted.
+
+- The user's home filesystem should be deleted. (query first) ?
+
+- The user's group should be deleted. (query first) ?
+
+- Is the user an ACL of any object in the database ?
+
+- Is the user a member of any lists ?
+
+Once again, since the SMS server makes these checks internally
+we will make an attempt to delete the user, and only if this fails
+with SMS_IN_USE will the client attempt to check why it failed and
+assist the user in deleting this user.
+
+If these checks are passed then another attempt will be made
+to delete the user.  This time there should be no way to get an
+SMS_IN_USE error.  Now that the user has been sucessfully deleted,
+one last check is made to clean up dangling references in the database.
+
+- Remove any lists that are now empty due to the user being deleted from them.
+
+NOTE: postoffice and finger info are deleted automatically by the SMS server.
+
+User interface for delete user:
+
+------------------------------------------------------------
+Delete user
+Login name: foo_bar
+Are you sure that you want to delete this user? [n]: y
+
+Delete the filesystem named foo_bar (y/n)? [n]: y
+Filesystem Successfully Deleted.
+
+There is also a list named foo_bar, delete it? [n]: y 
+Are you sure that you want to delete the list foo_bar [n]: y
+List foo_bar has 1 member: 
+
+USER foo_bar
+
+Remove this member from list foo_bar?  [n]: y
+
+user foo_bar is the ACE for the following data objects:
+
+LIST xconq
+
+The ACE for each of these items must be changed before
+the user foo_bar can be deleted.
+
+------------------------------------------------------------
+once this has been done then we try again and get...
+------------------------------------------------------------
+
+user foo_bar is a member of 2 other lists.
+
+kit
+xconq
+
+Remove user foo_bar from these lists?  [n]: 
+
+User foo_bar deleted.
+Command: 
+
+Delete the empty list xconq?  [n]: 
+Are you sure that you want to delete the list bar [n]: y
+List Sucessfully Deleted.
+------------------------------------------------------------
+
diff --git a/clients/moira/Doc/internal.PS.Z b/clients/moira/Doc/internal.PS.Z
new file mode 100644 (file)
index 0000000..0ad09a1
--- /dev/null
@@ -0,0 +1,152 @@
+\1f\9d\90%B@\99Ò"\b\997bÊ´\90á\ 2\86\82\12%¨¤¡Ã¦\8c\ e\10iÜÐ)#ÇM\186.ÚÌ\99ó°\ 4\917cê´)£ÑÈ\e\8ds.¢\b³Ñ\r\99\14%\87È)Có\8d\9c\8bMÂÈY\ 3"\88\v\10RÞÌa9gcF\16,\8aÐ\80ÑbÆ\8c\18MX\­1\ 3\ 6\v\e6b\80½\81\ 3D\18\9b ¦\8c\91\93&!\88\e(bÜ\80\ 1\ 3'D\9d<é¤yI\84¦E\101j\800RF\8c\9c:BóÎ\91\ 3\ 6`\19:jÔ(       %Ì\9921A̬y³d\11\9bCÞ´Y       ó!\b(Jé¨e\v\87Îé\9d\90)\ 3Â\8cÏ´kÛ\96q¡à\85\90) ö¼\98b\ 5Ä\9c0vhÏ6\ 3\ 2F÷9\18:¦#çì\1c6~A4\8c\ 1¢Åvãc>\96é\ 3BLF2 \96÷.\ 2\1c4oîÀ±L\9b8\88\9dM}\8e/\7f>}\193½M1DpKQw\86\18c¼Á\86\99\87\96z/\18Ñ\ 4\15X\80Ð\ 6Mláá\1f\80/HA\84\11Á]a\ 4\15i1A¢s\8e\95\11\a\b
+\80\10Ü\14ShÑÜs(¦\15#\bn\94\8c\8eÕ(!\85få·S\1f-¾xc\8dS\98\88£\8eÆeT"\89   Î\91^\1avØ(c\eu°aå\92;Öèã\84\15\86!äxE¦aF\19l,ea\18kü÷\92k\ 5Ú¦Q\83ýA\98ä\89ÏÙ\99Dp \f§d\19x\8c\81\ 6\bcØ!Ç\86H}Hç\83ÿõ&"\89/\84V\a[\1cÕv\9e\9c®Ù     â\1e}>
+\ 2 \82Zj\13¦\88zhÄ¢èÙyc\ftÕ¨*\9fÃÝ\bê ¬Ö\88¥\96Ë%z*\7f\8cr\18Ħ\9d\8eøi \83\9a\9b\88Æ*ã¬\80ÑõÜ­¥*Êkª\8d¾0a\9f\91\1c\1do\80°`\18Ôr\88E\13Á¥$ÇN\1aÁñFF®1«.\1c\16j[\ 6·¨nØ[\15L\ 4wÆqÉ-)\1fM\83f»m·dÔ\ 1¯tSVY#³r\b\eE\1a7/\e\19\95qG\1adÐ1h\8drP\9c#·ÆQ÷F\9b \9c\81\1f·CNkï\vL ¡/¿´åø¯Æñ\ e,1E\15_\9c1\1a\11sìñÃ\11ï\8b\1cmMÉ12m&c\86ò~\ e\86Û\e\13Åí!t¿2ÏG³Ã \17ø³Î\1a÷ü\1cÃ?s\e4Ì!\eMrÒcÖ\v¡\10\15JMvÕ×üðÍ[cܵ\8bÃ
+\1aqÁðú\±Øx3»0±\Þ\176ÄxçØås\1dÿ\8d¸\8bc,¸\94Õ<ã=5Ñ"\9f}²~jWË6wRo\9erÓ+³-\ 3\81\13çl7­7\9b\1c\86bE\1f]²èL×Y-\14B\ 4÷\ 2\14Å\91\9d+Ü4Sg\1dv\eEÜl\8d-ÔúÜ\1cáU\ 4»}¾\17ß|\97\ 5GÞr\9ds\bE\11Áñ~\9fÒ\9c«\fá\11¹\vç½ïÿùK9\b»q]vFÓá\97ñdP\99\9eÁà\89wüsÉ;ë\18óú{\81ôþU½=\ï?ÙëÍ\11¸·\aïÑ.\81\11*_ýÆ\90)üEèMA\81\ 3\11Ò@Á¼\r*W   9CF (¡rÙÁ\r\1e$Ô   S\88=ñUË\b\fd       z^à\934\88Ð#lh\81±F\85¬\17ì\90\f¤úV¸\äÃci$b{àÛ`0\18\ 6\rr°]\84[\83\eâã\86=¸D#\19Ü`\a\99u\19:\90ÇL\11«á\r?¢C#zqC\10\14Â\80Ü64¹\81L\89)"\ã>Ö-Á\19Îq\85\8bc¨æ8·È)¥\fë\8b\\1aàÁ"\fè\ 5h[\9a·Þ®\95MÁe\ 2\84Ï\1d\16ÙH\b5¡mÌ\1a \8fî\83µ7@ð
+ÁqÌ\fNG\83îpÇhlÐ\12×Ð0ÀO¶M\94§\13LòU®N\93\1cë$\ 4¥°Få9¦\7f5\ 2`E\14\10\16\84Õ¨}ï+^\v\1aø7ȯxßñ\ e\f¸#ÌÚõê^¼\f\8e/Mé¿ü\r\93\99\8e\89ßüZPL\1a=\a\99Ä+\83\ 2¢ù\9djîr\b½ì&0\97×<u"ï\ 6Ñ9guÜ\97N\10\80\93\96ÏT';§éMk:í\ 5Uàe<\91·Íj*`\99\1csfvj\84O\84¡s~\ 3¥f=\13\b\91Ï\90\ 1
+¨|Ã\19(C\9f\8b8&\ 6
\8d\ 2\1c3\85$( \ 6§{\81DV2\87\16\bAAèù\95\ 2d\10\83\18Ðà\ 6\80\99Á\rlPÊ        )\ 5T@\ 3m\82 1\96\84!-\1c±\ 3\ai\13\14\8f\\86\99B\1e\9aR\866¤à\91;\9d\ 1\rlp:±àÀ\ 6\8e1*
+¦Ð\ 4à\f\81b,qM\12\11\1cJé$)ÁêW\91Ð\9b\99\ 5I\90\1fÅÆ\90\16#ìô\ 6£ÌÁbrP\ 3\e\80@­C@\ 3[îz\14\8b#sxÉ^û\9a\ 6\9a¶ )\17\14\f+\97\eÈÀ15ÀAcÓJ\85£\86\ 6\ ey`Ë\19Ð@\87Í\ e'\ fm\10\83\82
+»S\19àà· \18×Q¹0Ê\19ØÖ¯5\ 5íYx+\ 3\1aÄ`\ 6\8e\15n\\18\93V1\1dGPu(\10\1dæ\80\93®8æ
+(Á\\9b2\91:l\ 4\ 4o`\ e\15Ê ¨).è\fyØ,{Hz\99\8bpG\ 6)\9dÂJÓâRVõ      ¹\9f\15ÍruZ\ 3\1a¤Ö14ð­cÕ\1a\83Í\8aå¿\9dýëMÙ\90SÃâÀ·\8e¹°i\1fÛÚ¸\1ce®"+\18\ 5÷â\ 6\aÇ\14ÀÊE¡NYE\16Çä\a]áðQ\93Z\86ãF¸¦\81ý\b\ayû\«pGºS\10      \bÞ\9a\86¸¦`\ 6ª\ 5Á\158ëÙ\14ó\98±6P¬tá`4×µ\ 1\ 4w\10\93\7fæ`Ã\1c¡\ad\1fYÐ$}R?\8fÈA1ÙŬY\9aÔ\ 688o%\1a{\ 3zÒ{d\1c\94\17ÆÁI\9f\v\µÂ\81#¶iXFv\14æôÐ$\fb\10\13mB;È,Ñ\84ÄRJÐh^\ 2\ 2¥îÄ,µ½\ 1w\96\e\ 3V°;\1e­\ 2\19\1aH¹     G\ 5é\eÔÀ^×0U©\1eI\81¦\95Ìä¿:YÔ(8
+\8dqB\83\ 4+9¼i>\14»8\12\ 6
+Jéb\1a\93õéð\8cáÇä`¬2FAS\9fWåê\YcF«Ãl×¼\11Aã°<\8aF\ fiêp\14\10$5\rR
+s|¤\94fô2g\ eB¦ôSuVã°*\16¼ °\83P\8aL\aÅÐY\ 6H¦u\9eOj`\18\14µÃn¦I Er\94\81bmên\r¾\e^*\97AªoÈîó\8a½\ 6ú\1cÛÒ\8b>\8bbêg\863¡Ë5\82\8c+ww*\18\81#1c/f\8esföuëÏrX¸YR\99\ 2\198\96Ùz\ 6\f\1aí¦ªI~sXÃ\1cX\80\13\e\15ßMM\ 1XhÝiÏæx°<F«O\83\8bêµ
+\99ÈF\9e:§Q,`Ñ\1a\96§a)å\94«\1d\86+«û\ eéN%zqþè\97H      dnÁùÂË\80\1e3\18íÊ/¡M\13ÝÌÁº»Á\ 5Rÿ¹\ 2\ 6\ e\98¡\9e6Úç\96\12Ìî®T\10\ 4\9b}\116\v\13\88A1h@ΠqRà_ï\K\92Î\16
+ß@w½Ø\1d#«Ï\11¡^\92\1c7\14Y#ÏÃÎ\18vã¢$¤@2\ 2ov\f\97²¨5ôý\9aÃ\9fqÿÔ3¼AÎþù\88»1¿\12BUä,\83¶<¼¦\9d ÙØ|M$\9b\88åm¯slg|¶\19¯íKImúiÇ5\r;IÁsï¼øf\9f\16±\vîpÊ\99\8f\96¶c\99-zá\ 6;¢1è\96\1e\12qõ}\80\92pN\92YÕGg\8b×rá5m³1\ 6è\ 6iGÑ\ 4 Çz´Q\80\1aC\13ì\83\ 6\ 5x1<wVÁ\17t2\90\82Ï\16mo\a\ 2y\90\a.}\97\17\93\82\19X6\11\83òTm\90\11\9d¥\12Ó×v\19\87{\9cç\13\ 2A\82eh¢%ZÆ\13\&\80!H\eÈ4\11$&\7f8poõ\87\82HV\ 3§£V        A\a\12.\98q\87Ò}\82\87\16;\98#\88\a\ 5#,âsS1\ 3o±Z¬uTDP\1d\1aé\ 5\18\82A\18\86\81\1857|\8d!_ú\ 5\11\95Q_ p:3\90_ûÕR/å\18UgkeW\14\86UL\b¦`Ñ&\ 3\9bÕ\Í\ 5\87\87ÑV\87ap\87Ó\17\18\83Q\18\87\91\18\8bU\17`5_\84XR \87\88,Õ_\8eHv¡%\89
+P`\a\ 6\ 2  f\82je\jèX\8fXS\13VaW\98a2°ajÅ\10 ð\ 4É!\aRe1&\ 6aM\16\89+\ 6\ 3-æO06\87H%\82\92×j$Fm\98¡r%Ã\12ÄÆ\ 68ñ\Ë\16^ â\ 6»×\1a\94\a\82ðAa!\98mèg^O8{³QnS \1a´\91\87Ó6\11]Å]=v\82{\86dÆ×a\17\ 2;eÐUìÃ\16\11F(\ 6øÈ-]diO¨\18m\ 2HùH\86³ç>èV\13®q\16èQ\a6\81Yòc\13\88V\11iÈW[7\8c6\85S¸Èx\81qZùwT\f\11\ 3Ga\ 4ià<O \ag\80}z`xÓ\b\93Nv\8dÙ(\16CupGÕ\ 4©a)\15\11i>\81\1fê\82\16 \13\93\a\7f6}\ 2yeN\12u1`gT\a`W\17j\86Ej\9dxjGÅVS`cÕx\8b¢\86\ 6\87ÒE\ 6\87\96hKa\84sP\a¡"&é(\96øF1M±tk"(\15³tT\b\87@wR0\96\82Ñ\169ÙÕm\849/cPn4¦&Æ\12\95fqiKÁ\ 6ÌÑ\8eòS1è\91Y!\b\82/X\a\84²\pÀADA\92\84\ 2\1f\7f\84\13sazw \82¡\ 2\90J¥&§)k\9bv\8c\8bñ[Üx\a\19G\8f\10\a\85oÀk÷\ 6ljâ$"ç/Öw{®q\9aþa\81Þ\87wuÐ\93d k ·\99\82W\e\16c\1c\7ff\81Ò\97\99\81\99Ò-ST[4P\16\8by\88>\15pje\e©\14\1f!X\80íX{®wxnùWeIX¢ÆxW`@¥VæÕ\93.0\ 6û\99\\91(jÅ\17tÒU\ 5zA1ýV\e&9b¯\97fèñykâ\ 6þÆ\1cÓæL\18I\9e\92µ\86c æ\9f\16f\7f\Q\ 3\8a¥Vãv     \1a`pIZdá ]×\ 4,\81\9aËÁ\83ù)%\81\96\8fïwi\837X\86G¢0Ù\9f¼\ 5 \9a6k.\1a\ 6\19\ 1£`e\94\vJ£ÀÉu3Vy\17â$d\91\95b\9e\95F\92\9a\85\97\9f!#\14®a0FJ\96'\9a¤öW\850\16m³Q\11\e\ 1¥|%¥3úR5ê\18Òe\ 4\15Ú£¥é\1a¡g\13Î\13§ó\12\8ey(\98Û¥y%¹\14r0¢1\8a¤ÿÙl]\81O\82¡Vg° \89\96&tZ¢2º\\f\9a§V\8a\ 2A w\97\8a\10Ò§ol±\92Êñ\1f<\8a\81\ eVJ0Y\8c3)©cõ\\97è\ 2Ì\18\1a£á\9a?\19\94¶7\94ùY\94¶8`¤\85\8dA\a]rÁ\1djU\ 4Å\1609\8a\11\eqe¡'%Xé\9a\ 6þ&{fЧáh](\91\ 6~\81\1eÈ6(\13a\84\1f\11gÚ6(Óv\1c+Ñs³Ö\9eBeZ-ÚaÛê\8e\90åA\e\18Z\1e\8aá\85Ý\821ï×<\16ò¬]é¨/U\ 3\9b\16^»FL\ 4\85oBq\ 6\b\b\13\e7\12|÷}FG\eõj¡î#\7f\13g\90¯\18\1d80 ôúwù8n\e7\ 6\1dW=BQ\86\9bY\1d\1dú\9aBQlÝV6\83\96nVYyn \12   q(\10xa¦W45\v{ù(\14.\8bxoÚ\9eSag\95Úa4f)\8dª~ÏEq\9b    ±X%´ÓF´¯\ 3\ 2\\ 3\13÷°v°\ 5\ 5[\8b°\18Ay1Óvÿè¡XJ°Ñú§_*%      \ 1\86\9dÙj|\87x0e\85\8c\97`o\byh qWKA\88¡%\97§|ìe&E\86\1e\ f\e±\89º²\13»\14£)?r\10\80\84æ\1aëÊ^/\81¸@©¸Z˵0àµ[\10\ 3b˵:ùªÔ(a2©SyKV<u«3p\14NÐvÙç\9aºZµ¡á\ 6ø       iÂêiGY¬ÙøS7\80OѶ'í\16f²ygìØD\13!}r*\99µq\eíØ\14g±]FX\9b=I\e¨
+®b\10¦B*wðVhË\8b\8a\16\19ë§++k-ç\9b¦f\15"{T;aqKAW\19ª\18;\88\aÙ\17\1e«)X\8aj\1c\17"wßÛ¨Fh¿ÉK1z\90}<\11*Â)\aèñ\95\957¾áè\11+Qn¾ÇX\1e;qU¸´GÕn\vâ\84\f¬Y¹hz\ el\83Z¶ÁîÃ\9d\96·\97\18é\99\9a©T±éU\13á\8b\1e\19¼#\1f\9cn\97\86\92-ñ§x\8c§\85\ 6\ 6\87j5\eÌÃ\1az\91\1cÚ   s¼æk\ e+¤Þ9I"\1c\8fç)\9b        \8b#ÎÔ¼ó9IÓ6¿\15k¿6;\9aû\8bz´÷~/Át³Ù\9e\ 56MÊÚa\17\97\91\91
+\1fj²'ÍS\11s\86\8ft\16¥jªc(zXÎ%\18@ÖVLÐ\161zk\86\85\ 2L\87Ç\9e\ 6©g\19\96\ f&]C\10Èb0ÈSzTFx\eWü¬ó\81²ôA¢,\16t\8dåtg|TÌ\1a*äù¶k¦TàÂ\11éh\ 3ìÉ\8eo⤶ç\84Ó&\ 5\17w\81\94V»"£%ZÅUW6¶0ÀKS0¶Ü\91-$7¦á¨\17í*\16xÛl©¥\82,\88\16\ eH\eÞ\882\8a\91\11\vgxæzlIx\84Ñ\f{×L¦\88\96~ùH\9e\88GLëhnJÅk×~]\95pçõ£\ 4È]a1Á9@\16ë\8b\ 2\ 5øT¥üÁèq\ 2¨<\erp\ 2å6ÊhP¼¦'¦üT©\97\80\16·{e¶#â\aĹá \ 3¸ÀÜ\1aƧg¾\1e\e\16beÁ(p½ªÊn\8eûÂù¨o±\ 1\85¡G¹ÞH¡ö\1a\8e;A\a\93â>åæ\ 4Îd\83yH¸âéÅîXWÍ+\a8ÑÊõé£\17]bOç\9b\18>Üa\8cû\11¤\89¨\15\vr\96iÑ-MiÑêÎ\1d(%Ì  \95õæS@=Ç|§\97\93Be\17(\80Øú)S\94®Fx\ 2",Ðògj\eÝkó¬VOÐTc(\1aXEô\91p\ e\8deÛ9xF#Ö~ÁÉ,\ 5\1c;ET0À\89\9e¨V (\8ayH\8a|x\8a\7fH]\82H_\7fQJ\93¡R³Ø\88¥« ·¨S\94È\8b\96¨V4@º±zº\93\bS\19Æg·J\ 3GAËÔQdRå\84v)?µA²\95\v\8dª¬\86'¦»ÖhadåbQv\93k\95\11»\87\87\9b´A1;øL\90æn=G¶c\97Èk*jÍ\95\ 3W\11ªl)Éw\9a\8c¬|:Òå\81)-Å8!\ 3Ð\1d^qP\a\1c!¿Yë\16\80Â^æU±;a.\\96\1cØj®<GÞßEL¨\r\180UzjeÍ>q!dúÒ1Íw«\fÔ\1aúTç\9dÞ\16\12\99ùú=»G%\15\9b\10\81V\86 Z)\v^sá\81\8d\aî½\11Ùé"Tp\9cÊLk\9f\rS8SÑf\ 6ÅÖ\93É{^T&RÖv\86;Âem6X\13¡\18{2&ù\bà\rcxß\ 3Ó\1d
+p\ 3Æ[Û¢ñ)Í
+\ 2\19\1aÑ-
+\8eÞè-k\8a©ß\8f÷\9e³©VZ\96\86Õ®Q\80ñ]\ 6\12\1eâè\9cÏU\9cnlæfe`ßè:[éøS¦W\1dt=°8ìä51ßk>°q6gfÐÖìiå'Å¢¾\15m]$¹\9b\19\84_¶Ò1\9e½]UnA\90\9e\18       .ú¦\11ô1}ñ¬çð\91ÀNÜ$;-ÅsGlä\e\7f=u¾'nä¾\88Æl\92}zý\8f(D\81\87v\84\13Ñ]?çÊ4\ 5n(\8bä×Vy\8cú\8cù\88Ì(\r\82·Íë\84k\13ßh\13£'T&¾ßÃgpL)m\957ÛO\ 5\aW\12[\80\1a1h!<\88%m`®K²{#\91ãB\8b\1d\10ÕdÖRe4np×\82m#m¨·\88\8dVܸØxÈ\1c\8em\8a\18\80¨\8a\8a%P\88\7f!\18\8bü¥ÙvJ¬¹h`A×\8bÂ]\ 3\ e&\8c&«¨Ûl\1a\85\1dÖºE\ 1\a\84\17\1edz\ 5\v\ 2DÀª¶×£¹û\96\bßÉ.¶\8d|[\80K¡±7(w    Âë\85\7fÚtÉI(F3\12,íòºe\92vI)\84IܱñÐ%\83©§ºo!Ít¬ì±=\85\90ÑV4|)䫺CRhw$ý¼)\99)"_õ2MÚ\11oÚ¾Y\930 Ü­«\93 p\ 4F¯%V\80ô\8cÎ]º½Ù\9dªb¼\etJIT|[c\88luÓMZ\93ª§]Ç\96CFíµ\ 5Sôwðf÷R\8dÁ\15¡:­kv&\93\99\9aol\1f\95åLø¦7\ 5Ä]o\92!µÒI\82Zr\18(Ä.ÝÒT¹n\8fðQ\91éÜßLß\98\16\7fTbÊñǬT\8a\91\12½\ 3«\11á\bÕ\8fº÷¾yZ4pÝ~Ævmð\ 5\1f¬Ý\9eJ¥6z¥\ 5\bÞgû\80}þRH<\81\95\17ãVF(\93rre\9d\10\ 4ìá)\ 1â$\ræóB)Éq\13\9b\rê\18<µ¤+N²\9e\e¶°·ûzÌ\\92\91â¡\9a¥\87\87 y\ f\89w\9a\8fu\91\8a\85Zh^]0Feü\ eßù\vU\91§l=¡¦£\98ÂË\a³t\95çò\98\vì§\18Ú[÷Ë>Ó\86úY\9bï\17wHS\81\90:ôç6\97\14çÑ2Bÿ3K\88¯§¨\9d®cÿ6\95áã-ü/ÿ\99¨ø÷ÿÐ\1fXHFÑæ\19é\96¥Py\f¨\92.   0\9f\95\87çs}P\88ICo\7fjzÁ\9aÁ\10\ 4\98À\14à\1eBn\84¥\97ç7ϠγC\13\97å#\19\8b\1f\97\9f\10\ fZ¡5"\10\9fØ*µâ\12\ e\ 5\ eë@nà\9b\85£¥@4À\11¥am6 MI7\1a\98¢PP=#o+\ eÑ}\81\ 3?U\95\ 2\82+M\bê\16\ 5Á\13Z]x{;f«ç\8c%O#«â\12t±{Ò\ 5¤°\v!\90\a¨\80V*\ 3¾L\98õAÃâ\~\1f]ê:¾¬åÑ\81£ÀÚ\80
+Bã\16ãÍô¸\ 5UudÀ ¨º
+f¬èt\8bÔc\92Æ\14m\18Wãl¨©0\8fQÑhC\93s[\19Á\ e\1c\r/\97ÍÆ\9bÔz9rÇ/\r\1fWX¥F\89\f¨g,Hõì\889vwþÕvA\13f\80\93Áª¯G\8f&Þ±
+\v¤è\17᪣0\ 5¨CÔ«A oë\91¼·÷\ 2\91Ò±\1a*\88åî\19·²\ 6ù¤\ fÔ\ 3\\97fG\8d¼pÄü\8c\eƲd\95gÁ!A,\88UÊÍ\15\bo{Âó}\ f\93\13\83¸KQc<3 :?4\16\10¥ÜU3\v\80ë\84­\99\83P\a²\97\18m\ 2\86\85$·UhÚ\80b\10\88!ÇöÀ\ 1GC¦\9aØæ\9a\90\14â*M\18\18\1e\99
+dAJ\9b\9d\82´L´;\f¾Ð"\92¨¼åsè\9f\87®!\ e\10Äà°Y~ËÂ\8b\88Nçé\99Ã\ e¢\14+\82WQ\8dAj©\80\ 5\ 2Í\1dØ\ 1M±J\19\18ò\96Ô\8e
+Rdr\ 4\11'dEÓ³\15¿@¢AY`\11¬8E\ 4c\ 3¸\82N\14\14B\ 1\ 4¨&÷\ 5 ]\ä+y\8b,àAµÒ\aþb#ÊF\13g=y´¦\85\12\r\r\11\15+\85­B\9a%\80\fã\91â}¾¥×\15é\82\17\ f\85
\84£&,Á¹ï&Ò*\96O,GllǨ\8bas(t\9f\1aÚ\86\8c\10ìí°ßwØ¢MëÂx!\8fê­C\97´ÛL\9eÜ;\8c\9e,µÄµ\ eS\ 6¿\a¸@4.nBÑ5Íwä\96Ú\12Ã\bm\86\bÙ¾z\88+Ô!\ 6r\11|jª¡\90ÕHW\1aÕû\ 3>ÑMïÑÁ\ĵ¢L¨\1a\ 2 \11a\99\96\15xT8\83Íù=çk\87\19¹eÈ\85\8cSºú><q4u\8b=\81| Ð%\\ e' bE\1dbró\10\1aw\94L;`0X\81uA\ 6\8c\90\111$Í\bD\16¡P\ e\85BT\eGRçÏí°*ô»¢ÍN`\88 Ã%z)\ 2×\11¤\18\ 1\12@FhØ\\ 6ÿ\95¿\80\96"LT    \1cÑ·< Ø²QX°\ 1ÈN­<º\vw(¨ã\86hU\18­      <\ 1\ 5\8cÀ\13\90\ 2\bP\81\14Y\1a¿L·øf%KÎ\18.ØÇÁ\9e¡éñq\ 2n
\98ö\84#\87\8fGËCË¥+õ4jÃ.\ 6\r\ 4ûrX-:F.Ûç¥J¢\944\16T2ô¥ÁG\94\88ɬS\80î+®\bÈÑ\17\ 1       `]|k\9d¨,¢\xé¾\99\11\ 2\19\eiû¤3\19øiÆc
+ê)\9bñïµ\95À\a\9d@c2R-Þ­ë<¯\90\14WjdÐq:ÎEPÎ\155(ozÞH
+}mK\81)\87»¤h\14 \89ô2üJ\7fÍ\81/Ðä2¡èz\7f£æé\84\97å\82µ^\96\8bÜ\17\88'àpI\ e\19ÊP-[    ¹\85#d\9fÚD\13R\80\81Y\84âÑÿ\91\96\14gpB\15\80\ 3\8d(`\vÜ\80. 7Ü\83#9p2K\9cÊ\ 4¦~\9e%¾)@ê"Ü1:`\88\95ÔÓ>³Í¦©­\1aÓk %\7fâ}Zè\ fJʶ$\17\9bÍ\\b\80Ñf
+D\95Jq-S\8b½älÇï¨hKn¹\90HOW{eNBÒ¨¹\8dPÖÀ%ÌÁ=X²H\89¸n\91YØ@¿Ð-4\ 3¹©\89Eg\15¥\84ïaQ`p°µ!Ã\16ïèÂ'²CõN\ f\95¢>\84\8aöÝdkE\86ȱÜ\82Ç\88üK;<m\8f\87áE\e\e0\8dØ\10 \ 3\ 1zf\9d\1d\9f\16ò\ 2\91{W»òfL\1f}Èõ|Ôm(`\83\82 & ä6µ4\17¢\9a>XÓ1F»K趢Î\18ãT\8aìh2\16£Øa\1fØÑ\b ±§¨\16?ÖuÒÌ\88*
+ÝÅe\ 6¦\91(2i\83·t\v¶Áç       ­Á#CÒ\80\86H\ 2Ù\f     %C³¥ÕNà\1eû}U(S\1e\15·\1cFTAc\94\84쨴;£©\89~_\1c\92w/3\14ÅÌ{G3#[ ZE\83èß¹" \82\ 3x&-\82{»+áí"¡©VnÀÃ\83{\12¯\ e"#eÔaX\e\b\80PÉQ1dG\8dåöx#ììmÀ1åÅ\18µ"Çx"\88\93\18ÏHú\14(  ¥\18Ddx\vTdÀy¤\1e\81ä\sÃPã\8dýà\e\r\15Z^VÔ\ 18:Løð\99\84tT\¢ªü=Ë\ 6mò>±pZèæZ\9a\94o³¶h¡\83\19÷``\11ã\81
+`oá\e\97¨w\ 2\}z\91Þ"\r\90\8cu\852²O\1eÊ\98d\8a\9eÞD\93\9e!´Q+\8d\88\1fIc\83\9c\84ßIrQ\a0ÉOGi\15ªå\1f\ 3\ e\ 2\13·ù4\11ú\ 2q\8d\11j\8c\8cf%\12\ f\12óBÑÛ\99Á\80}\92#\90\86û\ 4P
+\10¡4©à4;\bJb´!î\94\8dÂ\87õE\eÖföÊa\rqB®É\bì\ 41'Ë*O\14°\88%Oÿ\9d<cuR^LÐÑ\91R"=U¬\ 6ä\ 6Q\b\ 1öMK\107Ñ0z\ 2(P#¢\94æ\83æ:zYÔ.ãx\8c\88,*RÞO\14:0}\1a\9c\v\8fZôð\19\18²Â\1eñ\99äY\1a        \f\85D¹20åþhï{Oìs&H\9eç£H½\9c«\949cîBî<2å¥\ eByòFJOñ\946z\14\97ÆJ\87\ 42KcT¾\ 1[\89°°e1´\93´i\9b}(Ùã¥üNCJ\84Q±=© \1c Ü\1acm\ 2C/\87\84Q½÷P±pa¹\8aQ\8dðì4\96ä\87\ 2¤hCº¢\8c\14\13r.M\889'\99!#a\12\8d-$\ 4ôà\1a]\12\17=D\8d¥±D\9b*pt¤\9aÆJ\ 1/\86\7f&SÄ7©°[*\9d\93¬´ÁTÓíÆ\15f\8d\1a\8adæÍI.èÒ0éøÃu\v\10\1a\ 2Ò\19(-\ 3hX>'\14ª¨PtZG\87ÕáÓB¾Erâ³'g\16\18ªÇJF<¥Ù¡Dr\98ÉêÍï»\93ðl¥5Æ\ 2D\ 6ò\80\ 3+<nìô \84pU²O\17C  ñ´\9c-=|³° §é\91Y\81Ë\9bÑÉ\b\96\19
+
+Y¼Ó,"ÒÁ        \ 2\9c¾È\17Ýæ\f\85+\9bwSk\9f¯|m/R\93æ¬dɳÞ\r\17Vk¥õÊÔÄáh\ 3\13êIñe¦ú¦®PBó à$\94æ4X1Êu:|~\8bD\95\14\1a!\b¥9\10O-%XXO¡*\14\1a\998\ 3\84ÙP\94\10\ 6´¾\89Z[úå±r.}¦m¾SÛàË\1c'\f|XcÀ\\ 1%;`\84 \1d¶¤¦\80QR       ¨!
+7\19eÚ|1xUº@Vli\18!¢Óù\82j¥3êÅÏèYçgF\8d.]Çk\91Ö¦(©ôÌ\ 5Õ?¡Ç3:V\ 6\15\18 M]:4³µµ\8eǼ5M\80\8f\96\ 3Jø¯N9T\1f¨/¯TÌÐY\95â¦]U)1\1f(V"\9dZv@\ eFK\14\98·\86OT<®gÀ\ eÄÍ\1fØu\1e]ËÊZÒ\95- P¼\839ôÃu\9d6\eu·êN^\14¯t¢e\9d§  óJ\97 ð<ÖEw´XÓo'`\1c\8d£51¦!,@(±\92\1d
+£Ê\ 4ò\85\99p0 ªàüÉÿ\ 6'N\1f=j\9a~á§5Gç´QE\ d7p ^\8a+\1c¤äBÅ\1c{\8fG\8bS­SS\13*Ý©~P¥u\15¿\1aÀ\b\8b\96\96»YÖë# Ao%\9e\9e'ZE\97þufõCìÐ\14>\85UL@ª\92É E\aóM\11Vj\11\94Hæ(Àå\ 2\8e\9aûA%F¸\16T\80cp`ë\1eµ\94¥ÆË¢\80_è¥\84S\96XT(­\9dB\8e©H&\ 2\r£Z*ç¯z²>æÑÎbUtH{q)ö\80¢zTK+3+0ÎE*Ò\ 4\8d³gáͬ¬\95\9cK\ 4üBìY\11D\80\11\9aª_àa\11&Ik\84\9cèNP¥FÈ\ 4\10Daf\18Q\1e\b`QHæ\9e5-\90¶.\97"\96(²­ê\84¥£\1a +\1f\\81ø>\f\96   (X\8eõçF)z\88K\88e\ 5¡Ò\17\vO§©è\ 2\8d¿\ fa©¥AÙ\93´\ 4uèWP\8e\f$:\8c\ 5\7f\9a\ 2­Ýh0àÙx´\ 2\e3/]c\ 43Öï\Ä\95²\ 6(BRö¹¶á\rüiD5àà\ 6äÍ\vJr ÑT\8f\8aÀØ\f!æà8Fk£á7A9julÚ2²\ eé\97\1eX)ñ\v_%Vc\9cD¶]\1cY\ 3\9b\8f\12¬¢JGC¥ý¤Õ)TZÔ©Lª\81 À°\rÇ£\ 2MÑÛ\88\83\ 31V¹ò¶;ÅÕp tÑ«.\8fµÉaf\1c,l\86ÒW\8eëût\91\ 5hPÛ\ fëÁ·U\8bk\1a\15*
\ 2¢[7Á\\1aµÆB\1f;\fù|J<RÉFÓOç=í\ e\89z\86ÍÆé ¬bù\ 5\9a®ÓmºL6\eÍ\85d\ 5y\9eä\14\161\7f5'h\17$2K\8f%r35¼\18Ó"\94\vµ£Ô±B¶\96·8\97¹ð      \8f\8a3-\ 3\15W\9aN\1cÌÊ©2§b\f8¤±\84Õ-\ f\8bnήÇZRV2>éÂ\9bklÖLc´q=)/J»Ê\83\950ìóü<éHÅYÁ\1aÓSzSÚŵ-v×^Ú^;w\7f­\8cU»b\85ø\84*\11¦]M\17\84geëì©)\1aw3®Á[®:Å\rÕÆN\ 4:\15\eÌ\1cE{\bßÕLÉ\86:)ÛE(\v9Àu¾Þ\8d\8bð>\eíì08 h\12¶Ï\964\ 5¥-\ 5ar\a\ 4ÅÀcÁ\95\8f\97n>D.\ eâh\ e\85ÁuM
+ñ \80\9bD\17´Ì\ 4ËeµWr\9ffIÍb0\97Ìg[\9bÅrL¼×\8a8t\vP
+{*±\96}p\ 4¥êýT*Ç3\8d\aͧÿû¸Ô+°\94uçlT¡#Vá\98ܯ²kz:QÝÄI¼Öu\11\90\93üR\1f³!¡\90\83 {Ð*ÞÓ¸Ûu\8fÁBÇäÈ@ã(\81)\12õ¥\8e\81xºI\8bèf9qB¥§ä@\ 6ù\82\95\9d©\81\86d\90õZÄƪeQ 
+H\8b\9f\17×ÐÝ\13GVÞÔQ\9c\8aIq)²V\10|/Ç£:"Á]\a\b3a\84yøP\80eÌc\ 5õÄÁ\98è\10m¤pÝ\9dd5ññìW\ e\ 5s\91¬»U\8bç¬Ã¢3¯\8aû.\8d/-¶\ fîù¢\87\9d\80n³çÌ\81\805ƺ\81AV{åx)YèÂ\ 3×5TWÇeDÓ®gÛoÇÔ\b7\91{\14âîcÁ>2\94(±CØëÛ\1e\ f~óoLk\81Õ\92ø\90}LFÆ\81\17y\88\80\ 2\1a\ 3º=[\9d\98P:ìR\18zLÍÇKã\ø\83\87E\91:D\f\16\7fS¿@N\8e¢\173\b\89Ybì\12ºèÍÑÉ\9d4ÖÄÒ\11\17v9p\98ÑÒ\86ü;\88÷¤üÑÃ\ eØ\12§¸,G\11\1d\12sR¤\1aﯥªó\12\98\11\12ssîUf\1f\11Þ\80\82å³\rv(þ¶W\ 4\ 3T\9eZ\19q¢bÙÚ\1cxAm\7f\100F¹(\rc\r5dúpÏRG\13³q÷âºÞ\16ZÈHÔg³
+Sa°ÚY%\\83\1f\8fXae\914 ³\1e\1e<\85\eeAýÁVñ²z^¾r\90óh³[ÈVQ/Ê×õ\93\82\17&ÈGå
+ÏÁ,¼ß\90L;\16\94'y¹2(>ì÷\8eÊ£«\80\81\ 6ÅhZz\89Q?^<ëØ\13\86Ã\ e#\911®¯m¥A\98´ ¬Õ%]üm¯{¹õXæf]}8áªÙâÊ\\ 51\13i\9a ©\85°Q´yºO·)\ 6e²ð]3±>6»kõ'\a\86v¬GQ@Ü\85«t` Ëä³\83Q\7f\8c¦\fB\89jÚLÕ\9d\ 56\ 31VS¤÷Ø ï7S\93\96¢\r»hȨ\85U<Kµò\96ñ2E\1e¡\179&\13ß*<\84÷\9b\16ò1Rñ0PE\86Ü\83÷Ø\13\199)§ä\91üÙíTÄ]%nÒäPu\93Ë0Á\85¯K6-\9f^ üxX\94Ó\19¬\8dÙ$Åå£,O+ræ¤\9f\¸)Ï\8b\98Æ8÷rte\ eÔö/cÝ¡K\95;\83°\f/\1aJü$.¬\92"]\ 3d¼       È.\1a;\86b²<;\8cdÌÇóØ5\93ÝæT\8fÃï\e(ÄÜÐ\18}¶ºhp")kÃxrÕe=b\95è\8b5Ë$\9eÌ3i\1d\83\85¡#\ f{%µ²ª\ 6XJôGãà\8f6T£\99¡qt¨ýç'\ 4\7fÐË\1d8<.B\ 1¯²¦ê²\9a¤N\96?\ru%£Àõ\9câì\9eZq\9b\82\bVþù\9bëç°]j#Á\ 2\7f\1f·\90\7f\93jF\bW\10\f\85¬±s\14ÔÊV:\1aÑøf\8aP\e\84\10\92\95aÃR±?ù§\90E\17»y\19+o\ 6\8dëù\ e\ eVÇk\83Zôþ}ÑÏÓ?oNÂÖ9[æ¼»½\8d\96N}Ç{û]ê\ 4x\17A±°
+áë3)±ì\x¡­Ãä\80\93»áÜË0\82UPÂe¹º/ä2~þT\ 5FÌ&\bÝ\\9c¡kU\15ÏÊ\19ÿ\1eUýëmXêVM¯5Kκ\18âS\ 2;kf¥{¨­XÎé¹ú\98íèE¾\96¢\19\ 5ÐÝ
\9eî\99jU\ 1K\182£@\98âSÄ,¦öÍÖÔÏÒ=\ 3Ó\8ao±m\80°ÍUT¡c¤ú¤=B\94\ eÀy¨3ʬJñ+\1d\95l¾µoú7\r\82\97é4]=Ò¢Y.ØæPå\94õ²\9f\9e>½Z'ÏjBÍ\7f\ 1°|FÔ\b´\19ß\ 4èöH\91\8cp\ 3\19\13ÁÑÍ\9eI\83BÚÍ¿Éo\97÷ìÐ\85*t\1e\8b5¥FÖ¨z»±²Nd-«¡þå^"\81VÚÐ<À\82\86²Ê\ 3\89\84\99À\9d"µ®\16V62ËP\97ZÐf÷5µ5\80ÝÉg&q\ e\90®*f\1458EXÂ\rzÁ4)Qhó5¢\9d8\8av_;Ú!ã®ë4ç\92´ÂL²î\8bJ»XÍ1\bдV\91Óf"\90\85þ\8c\;þÊ`\19ꪡoê]\96Þ;¶º\réôj¢ê¤\võ­¾Ö:hµ\9b¨ó«Õ®oyS«·!ÁXxý\85ïÔzê5Ã\96ôÒÖcå]¹\91\18[[\94\8c\92Ûêv§èÔ\9e8#y¢¾êL½©i\15WXÒ¹uµ\8edRí[»Î©®Ú   Ó
+\8fdÓJT\8aåÝFÉúµ¼Nk\17m«­5zMÚ\bT\ 2³T\¨\82ãé¡ì\16\80s\8a\99][;\117ÊÙ:Û\9bö®òÇ\8d\9cR\915\18ñRè\ 2=½Û]\14.Ñ@[]³j}M/\ 5þ¢`Uîq¸\98LýÂ@ã,=V\82á¥\91ÔÕÉ\ f¼´Õèß¹L\95ü\16½\91\97\97Pn\8acF\80^;Í\b\81n¿ð\ 5¾¦ÝÜ9٢Ȯ+Ô=\9dÉ\91y¢Bù-o\8dEáÖE\9awHú\ 2\11ç\v\99\8e"¢é±\98袸©J5Q½%\16¢ú·nky\9f\97\fWd¤\ 4áUi\94÷4#-´"\96Ô\8aÌÀ\11¨\9b½æ£\96w¹Äsä\95\1aQ\91o\15èpgsGC¿@\86\81¹â\ 4,ÆëZ        vÚ7ªÝµk\97Û§.\94AÅY\1a1p¤µ\94\ 6ë\ 3Ô2\95«\1da.8û\9a+Oö.{\12ZM$\95°\9a (ÏÉE@íC͹ö\9d¨\ eÂ\83ö\87¿Ç§"\98èà2\8fâ\82\18\85aûÓ²
+.¬V¾öM0¬¨\ 5àüá\ f-Á)¸\ 5G[\95\1a\vû`÷hÑ\96FFÊ\8f\1aµ<Âf÷©Cµ¥\1eÕ¯ÕZÎÉà\1aÆ?­©éX©5n\9bq-î\99\98-~\99Z%\87`6åÉþ¥NüÛs\19OÅjþZ´«5æBÚ\94ñwf>\8eZ~\v\93òÎ^<Y\93Wçê\9c\1e ¿\ e\83äÏ$RT¸È\1d¡\9d)\vßm\8d\8bfè2MÄ,\bJ\97\o$\87Êý\19Ê×v¼ÎÛ\9f«\vxÊíì\j£\Ûiüx6ó\99Sú÷ª¸\e¨àwà\82Ë]\18@wQ2ú\f´Ò\85ñÅ­í8\8a\e\ 6\v\ 3Ì<<\81\16\9bÂ\8eí÷YÚéÌ\rm´OV,©¦\9f
+©À\8elæ!j\9b8\9bÊì\83Ãná\ e¨»3PnN\82\e8\ 1P\8bèà\9b4#\7fp$ÿL\9b½¦\1d\ f[@~§\vÙ\16`\ 2\b\f\81"À-¥]ÍA\85b¡Ê1\9eÛÜsÙ×+¾8à¹ØÜÛi\83¨ÊùJCh\8cï=\98       \10'\9bnê0®<4\ fT\12ü\8d^èÑ\ 3ôᱧƤÏO      Tï\19µ\9dÒ+soÑÞ"Þaè\1dî\9d\99\90\8dK\9fN/í{\9b\ 5\7f#Óµ\b?\1fâ \99¦\8f
+«ðz±ÑM\1fÍ\14\a\9f\vð\9dS <\81+-á\88\87çn|)½1\90æçÇÃK[µY¦bb\ 6\ 3
\16lw~O\ 3\aÖ½\85¨HT&ð|\8c\ 5ãxûð¹!Õ\e[mB.Gë\99\91\95w\1dhzfØúD¦Ú(\99Ô\98\9a\ e>\13.;ҷ\9a\87è\ 2¹ë\\rͺvæoä­Ùå\9d\12æ\f
+\81èg¦»\9c³¨</\ 3³\87U\ efÂä°\84âÖ\85¾\90»=:cÝ}:±#cyÓ3o9q¾Å\16\13å}í×Ý:1ßÈq\9dÇ\14\171\9b'%\96\ e\9a\17\99î\a%\1d\1c\8a\8f\85Mgï\9e@Nz\9cÙ\aW@\9dy\83äkÕë\87V¹t}4±\1c7ªí\19\8b\1a\96Ém\91mîBFüP\9a°ùÒÅò\95c»Ü\b\1e\83÷Ä\8eÜÉÔx\7fF8¹«\98áå\8c\ 4±ù\a\ 6Ò\ e¼1\17é\82Ý\ 1{ ïE\bµëhm°¢\85£Ã`uâ\88ù\10     Ö\9b­Vú;Úîä\85\8c\ 1#TÛ\87ç\17ïÍG3£® #¬\99\93pH\9eã\1aÚ3;C\89*áÙx\86¿\94ÜÈ\b,H°\rá±b§\ eU\15¾B\99ø3¾Ç>Û\bd×j¥Ä'ëÕ\f\b\8d\13=ÎÉR\99'\93fZ<u£M\8cwGªÙ´Ôänt\96]\1eÈXïã}Éqvú¾\eÌ»(\19>VáîÍív¬øø{[·ðÉú ¶]\14Àø¦\8d|
\1a\1e\bÒjÑ%e/¦Ø÷Ù½ºq.ås²       \14;G\13!\8bÞ\1cO\7f\83q\82'5HFP"x\ 2ß\92÷³N<ò+\98s¥m~®Á\850n?È\94Ê£\95ñ\91Ì\18LP+?Ny|È\aMºà¡;\f£×îJYÉ#ÀÊs¨\117VeÝ\87Ô½\1e!¦]\91Ófè\85à]\87+Þ×W~ø²\90è\95.t>TLyØ,äåbP\ e\80Â\8d¦íh©Âe(M\ 1º\10Þ'¤Þw\1aÏ\\8aâ°Eô\96²¢HÔ5+¾KäS9\82U\1e¬$£Á¬i\12ëQÁÜ_ÀÊó"Ð\1aI\93sè|l²[\90Ù\1cz((\9c~\bC\93\82¬\87¾H\13f\9eùO\93\1dÈwö\ 4ûC{Siö)c/ÚØ÷»Î[êYÈ
+U|=\ f8øÛ\ e×\ 1ww#ìÙ&e{\8el\99\13K$\1dô\14¿6+¼f\97ð\17\96ðFH\12\84
+e\84\97'ù¢;\ fìÁ«zá\13üü£ÆBµÃ£Å\ f?·G|¨Òñ´\1e\ 6\1aÆÒ¬iÄ)\19\9c\90r Bú´\16ßôJO$T¯tÌç|\³ó-³\9dñ5dpÅ?ñVÏû\9eÍÁ\97.&\9fõ(ýÜÎô]þ\1d\8c¤\9f\9aÒ{ëPÕäV¾\ 1\9eñtüµï·°cî\19Îçú¡^\fw\9d¦%áÅ3\1e\ eÌ\9a~;C\17·¦VD~Ò\97ñ;^Ô÷xyï¶\14"\ fýr±{
+\85Æs¶x\8b»Y0\95%vPà´)ÉÚÍßj&*ÖmÚêûU[°û|\9es³ÕÞ\bÚÛ)«ñdH\fçõ5çW¾0\8eeùEý\r\]Z.é\98ÆtCð©[;¶ô]'\v`\ 6\9avE'\ 24\1dÞn »SaÞâ\f\ 3üpá\1\91\17¹\e     G\8dÞ\f/\3Øôd\8b¼¡×¾\9eÉò\8c\99\9f|$\1føå¾ò\13jÚ±[Öû\ 4ÖÙ/\8fux9Þ1\ f\94'>¹\93\81\7f\90\b\89\ 1N\1f\11Ôí~hü\fÃÛÙº5t\14p\eÌïrT\80×J¶âUÙyî\16ÞGè=\1e\9aÆsQ,\95}¿\92\83Áãu\1dB\80\98 \1aý\1dØ\8e²×s 1ø\1d^ÇÊÜz¹ßî÷\ 6ô~tÀï\97\9f\b\7fýS\¢ZÔF¢\95ìÇçä#ÁÆ¡¤ë°|\9bHÊäîì\14ðÎçDÓÑ!X\9a½£¥åt©Èͤ:\19"2\18L\ 1Ô\1dO\9d\8daQÆ i§\8eQ\87á©8FÓ\ 1Ô|yHÃÙ\90\13¿,@-^d7\1au\1d~ßÖ\17Ø\8d=ôOÞE8\9d$\17Ø¥ó+}\1få\87E#wÄ8m\ 6\12Gô}Sê\88qÕad\81\80ßÒGZ \15¼ÜäDï­0\8b
+q'6\85\fª\9e\93\90ïÉw¸G\90\87Þ(o\ fÇ\1döÿ\15 \ 1 Ô\11?\ 5QL]´\81\95ÔcI\16¿÷RTAá\85\93@s\r
\ 1\ fD?Ýs\98QV\ 4\90i\7fZ_\1c\b÷åJSÁ\92g\9f\8c\7f7\bº\92\14íkz ôWÏÅOÌ\1eÄ\95Ð=r©\ 6Ò§\ 5\ 6\ 5ÂRH\95y\9aX\15\93}|3\16[Xâs\bJa\1f\14·\18\14\18:\11\1cè\8edq!\1e\fôé\r\7f\8e\1e\\a ¼d\92\9e\1c\aâíq\fJ\1awé¡}͠ĥ\82ÔK®\1a¦'\a
+rÌTÓRê%r\9b\ eË3T¡p\8b\12ÕwG%\80m\99¬\a\\89f8\11Ù\82ë!gu\1e \88øQy³Ü!2\8d       7»\ 6Ñg\15tyX -(
+\ 2nU\88®Õu8eOÅ\18\88ê­h\82\a\ 6¾G\ 1\94W6y¥|fß Á\82!7ÎRÀ7PÅ$³\19\80\88\15ÑFÖgÛ\15s¸ WàÖH\17¤W\99³r\b\15\18Èü\94k)\17\98\91\80\8c
+F0/\1d\19çK,È      eT\85\94Ix\vösä\91sAØ)wôHBÀ\13z,W\ 1Òõ\98\8c\7fELw\91åá\e¯R"\aP\81%¢TÚGÝ\98\1aVÒÑÇ.\f\85\8dÞY2M/yWv\11¸\94\1dI÷qMb\12h\ 2Ë\8cQgØ\83\ 1¯ø\16p\\87Áu\19\v
+\1865FåÝ\1a\98\8d\90\1a\b\v7"\14\1e\84¸ £¶ÏÝ\81tLäG}\80\9fû\80þI '\80ú7\a\9c\14¡OÑjñzîß)ÆÂ0\aô\1fÓÁÕ0\85s\81ÏÖax`ÙÖÉ!\9e\9d\7f\19©\ 4¡­aóP\ 5\14(\8c\f\9f´ü`5û\1e\16U\7f\98\1e\8cO\bÄùncÕYás fÔ\99Ðr   ¦&<P2\92¡a\83ê\9aê\82ð\81\82pX\bêí\14ÄÇu\93wy5   ÌhÀwX_hB|qX´Zã\8a»Rki\85\9cÐØ&f\ 5\1eà[´\ 2l]\18ÍE¨òj\81\fT\80\14P\ 5\14\ 1\88ǥĠ   \ eW7Ñ4Ñ¿Ívé\r´\17æ-e\8b\ f;¨fíT\16[\82\81\8d\b7\18\1fúb\15\10\1dÙ_~¸ý%z\ f\9e;x©ÍI\95L\8eP\1e¦fl\en§½\11\15`\9f58·i\83v\9b(7\ eêmÆ «F\12ª\157\85\82°å\11\1f\85\14\95$që\89Á!(=\83% ò³ä\99\83¸\9a©\97\ e¦z;\ 1â\92\bµx1\98\@öõEóà8X\ f\12v¹^ÖDò\83{ÛMôb¸\81G\85\8ah\1eJr±Z\10$%´\87ï¡NX£!4\ 5\88öã\84P\87¤\am\82\83\883§X+ȨL$ìE\18\85@ ÊÒ\15hñyR\16"øp\b\80Ð\8a5VÆW;\eb\84#ÅCj\85°\17ã\10\90\94\80ìýC\87\ 2«\97\ 12\17WÛ°e\12\92\80\99ÓUð[\8cyÔ^UxíÙ[Ó\1f[Õd!5\82Ò¡èß\11\85ÅÇ\86!Z\99\17\ 2\86^0Ç(\ 6à]"Ô~\89j"\18\8a\r\86Üß8\88GÅCÒŸ"ÎÌ1Ä]\107\1f\16\ 6×2æ)\83ÉÕ(X`<dÖR\9fc\f¢\15,J±t\bR+o"\10GL\I©Ò\9ch\11Ípø\9bcG*2\17Ä\87     µ×1\87Î!4x\96 \16È\9cÝ\16wp\ 4ÏÓâ¥fÉ,±RÔÑ\13\82\87ä\11+³ä9\89\14â8¸Ðix9ÐäÃ{\98{\12G\ e·\9d\1c{ïÞ\a\92ÒÅ\89W\91\95\84oP5\9e\93ÎlIÏ"®\15\1d\f[¸"°u\15èay\97\ 5ôÞ<w®É´\11l\1c\19Ù[Ò\ 5\13Þ3è\12\ 5Ø\7fiP\ 5à\99Ç\899!UÖ\8d\r\8a\10×\r\ 4¼|hbHq\13\1aÌ\ 6:h´Ðý\166\16~Ø×µu¾\8c\84÷\ 5¤\17úZ4\15ò!}\81LS\80iýN!\96_\903\92]"À\150\9c \aÒIqrÍõ\8cç\ 5¢"\ 2ÈlM\eÄ¥i$\18\82\129U)\bL\98Aʸ³\11\81\b\8fìe¥\85N\8c\8d\ e\88Óå;=`ï\85\ 5*Îs1\ 4þLGÓñeÔa"o\8fÑÄ|ÅiF^Hr\11Ø\ 6âà¨ñÙH\178
+U\15\13l\16  Æ~#]\90\1a  \9eu\13m­<RÂ×$\ 4yb\ 6Ãf\81¬x\7f\11\90\ 4\10\ 1V#_Ñ72\8e/Æa\93àÉMlÓQ!4.wE£\ 2e\9cÀKÙÁ×D7¾D0@\1eð\ 2¸\ 1/@\1c@rm\ 1n@\17\109Òf\ 4G\81Q,%@\v\8eû\97Ϩ\80wßåñ£`v\9bWr\86\ 5PGÎ÷\85\16ø\7f¤\9ecH0I     \92á\13RbxN\8f\9dX\10méD\82¢OXä¼\18\9f \82\18
\8a£`Bç#N\87PaïÑÙ\9d\7fª\fVtóØ_ì\1fªô\91\ 4 Â\9bqÓø-   x\80À¥\ fÖP±N­\90ì\9cwuÑ=³¥°\1eÔ\8a\1dÓÙ-\bPY\e\96\1dªc\96Øaã#¾c\95GU\88íáaGÆqØ\84mYÓ\ 4×\12ª\14\8c¢\19Y\94på]z\19êÆ5!*ÝE\9bW\863ýBÇxeù2i\80\vÀ{Ð\8d~U\84vd(\1e6^XB¯\1dE\9dÅ\95\19\9f\bÃtø>g\9d\ f\94\90\85*N@\96À\ 6\1c~\88¢5Å$ù\a¡IbHF\85\.À\rðaô94äG¸N\ 5\91t\91\12<ä¥\18\16\ 2\8f?\85ý4(IYûÊû\94Dfxb\ 5ö§Ôè\16\1d$\1e`e9\ f\1aãÅà\84\98YI!x\86\1f\88K¯£\8d7¯5;\9b#=Ò9.PÝ\82ü\96Ü\8cD££/c:¢\8eªã­Ä:º\8eH\9dg\91;åyØ\bìçÔÕGÁ\11`\8e°\ 5¹¢­\956=\17w\15vÓVÔ~s   Döík´D\81\92#\14OX\1dÖø\eù\86°D2¢\13]&PÈX\aß\8dkªG&)ñ­\1cõR\12\83\8fé\88²RÍxf°`sÌ[¤t\94\eä\14q§&\94bÎR\95s\90\ 5z÷LÄw\98T\1ah\ 2\1c@­Ì9\1aPÛ±\12xG\9dEe\87\1d\965\vîc\ 6Ì>áM¿±\95$\ 6\83fr\9aø4£\86[\83oüB}\17©\91ßtdxT\17\86\a\84'Ýb·ð*\ 1\90¢\84\9eÁ$¢Rã\ 2ÄbÔ\90Ù <\84Ý`Xm@\ fÉq\91\ 5§\19\v!vÒ        57ÅÜo\9aG¿\92\7f\ fΫôº\81%\1eaÀh\ 4\16\92K^vs\8a\12¼Ô\18Ô6õQ®\14¬£H\95kHc\9e#\83\9cc\84Êü¶¯      fAÓZÖ¨\15V\19_%"\ 6\ 5Lø¤ë\ 5Jò"ºH±Ä_M\ 1c$>\ 6\ 1©YC\rI\89``\8b\82\92ÆFhÅ\92\1f\e\f \ 2Ø\91Þ[S0²Mj&[×ò®!,*\e\1að\ 4ÝάÆ4ò\15Û^Ð$\11y4à\1e% ;*q\15L´ñD²\ 1Ã\93>\99_\8dE\84\9d'\15F\81(±ËH"w\90\860\8d\9a\13ô¸\ 6i!Fp\ 6L\11øÁ\13Ò\ 6è\94\9f\96PqðÝb(åÑ´ùà\89\1dÆW\19VJ\91¦\17Z÷R²Z\88\85 $XV(b¥\ 1d`\18LeáR°­¨\12K\90t¸Üo\18ÐAi¯)\85¹\92+æº=w\14ÉHri¤0¬\91Ò\17Ö\19ó#j10
+\8bJE\83\ 6\9a¨\1cF\88ð\92r\89\1f\88]B\84Â)\r¿àÕD¿p\15\9d\ e\98$Íy\1e "e\17»LPãäÚ×\8eñ}ú\a\ 5 K;ˬD3~M¿Pø\ 4m\ 4äE\15E\e\18\90ö\16³\88eø%\88ÏÍCZvG¦åüUc\9c\16ÅåãAHye9\9efy\14ðWìÊ\95e®©-}WÓHZtuKÞb¹\f\12\96Ö¢æ\94à©u\8c\81 µ±\81\1dÛ¡µ¯ù2"@÷\86¨\80osÒQY²\1dkJeR\19\ 34\95F\88}\19YI\95¢K§¥2Ñ\801àLw¥\89N7Ýc\ 36ÚLbã\ fH6Â!>ÅÙh¦\1d\81\95H\12\18\17#.       l$H"QA\a\9e-\7f­ÍC\17Ûì\bRã¡0W¬D}¥\8a\836zZ]\1d@Ø-$JkƦÄ[\9e)9!kÄâ\147ÅFγr¼'¦\9b\17\b)\1a\ f\91\92\9f¸\80ù\e,H.\16\1cIFB\95?µ5Z&Q¸tI\8b\ 3Ð'\95e2=ýM³SFþ\82
+Ú÷¡\8cÅ\vÎÖ$(ÿ]\1e\19\ 1\8f©Ié\86AW±ñ\8e<OpFp\97\87¼4âÏè!\16Ð\1f\15T\8a3XÑ\99n\8f©\91\ e\14µ\v½G¿¡\12ù\935\17\81\ 1(W\10\8a\ 6­\ 1\82Éc6\960\90\12ÄA\90+ÊÙ%\93³$P\86Ab@ÒL\e\7fèÓàAí\89\82|tã\88¼ç«int\ fz7Nñ@òåú±®=\90\16£Ç£1äFf"\e°\9b½u\18\9e1'D\85*%\fr\9d}\1fh ¶ã0æ\84?Ê£xÒ¬yò\x\81îá\1e¨\90=×jª\16Þ\1e
+°'~<ô_*\98\83l\bÁ¦k\80íYl¾Ï\17åé9j\8fÔP!ܨ\1ai ¯\89\ 6\9bâ\123\88\1c\1e\15Í&ÙE\91\98\ 13\9c\19P\11¸\ 1\95Õ\7fÐò\19\83\Öþ\14ÇåE×à\ 29ªÙq¡J¾\99Q&\9c\ 4Õ¨V\17Ù*Òžiâ\ 1(\9eP$u\98µxä^¨²oþ\9b\17§\8aBH=&rÜÜÆpÖ%\ 2g¦Gpþ.^$¾i1Âjåà\vh\801\9b\16#NX)\8c+è&c±\98ù\u\80¯è\92LrL^yÐs\82Hêd\14¸A\1a\8fÂ\86~b\f^\ 5hI´ñq²\ 4\8cè±\ 4g@ÈÔÙU\85û¦Éa±ù\18æÑ\ f\93\9c\15Äâ\88\9fä3m\82\90ÌA\8b\ 4\89"\80\ 2D\81ü\aå¦_\15u\1d+v\ 6A¡#e%«\89Àrby\8bà\9fËs;\82uëÆëHÝ\11W#aÀT2Ò\ 6'£E 2ÞD\82\9dG\ 3\ 6ò&½)l\12\98;&>"m"AÊ^"7²í\9bF\88\10P\ 5\18\ 1-\85\16`\84\88tãÒXaj\95©\v¤tkN\8d·\94à\19Èå-g\ 5\8e×aT\9e#\89Ù\89y\ 2D\98Ã̹\ 5Ð\8d\80d®éii!5V´ñxÒ\ 1\91'ÜYoâ\971boa\89´\8apØ«$\9b\9c3¾Lò@r\11\8f\8e\9f\13 bâ\fnR1b\9a®\ 1.\ 4\9a \12-zô®ø&²£\1e¦VÜ\ 6ÝLÐe}²   0Ku@Ap\ 4G\17ÍöiñoX%æ¦Uþ\9e!ËÎyTè~sï'¼\8d\80Èçoöb\f:\91e\fw\8aÙ\9c\87Â"åþ=\84 A\91\ 5\88o\8e\97H3<\15T\89Ý\91¶p,Ð\16\85á \95Bòè\134\1dÀK\8ev\9eõ\1ej%i"B$\a\8c\93ùGn\92\9d\ad\92Å®\8an\87\87I\9a!aÒ\15\96L\(ÀðY|\8e\9d\93gjMYlw¢âC"\12AI\1c{f¾©\15ü§ÿ\89\ 4ö¦Â¹Çx\9b\16ãDB\ 4õE_ç(¨©Y\88I\17\8e4\18áVBÁ\96GT\88Y*\80ér¶q§\95\f6\84\9a\88\8aèqN¡Ë\ 17xo.tw\107"\86\8e\83\81\e\10Þ\1c5ç³ysâ Ó_ÚÄxô|£\84ÓÉ\86\80\eÐÙ´,\aå¦í\99ç\80c\18  \95È=Ü\ 6F@\13ô\ 4Át\85\8dL\97ØÔt9 Ìäaî^;\9d\ 2àï\80i\80A)\11\18\98\98B\1dÐ\94b
+7>\ 5\9b\ 6\12\1a#/eåE¶¡Iè\aø\7f\92\18\9cæ§bZ´eN\19#Z)8¢»\98l"ÿE¢NP\11p\8e¥K\\86GD:J\9f·\92¼Q\1eðDD\81\86¢\87Ê\ 1\88\87\91\93Z>\ 6sA³Ó´è\86zæHW±`{>\8amÃî\910\91á   \90Öd\ 1â(\bp\ 2¼s$Í   à\ 4\b4\11\9aÜ\11tq£;Z\1ax£u~y\98\15râ$\18\bb\87qyàB"\14p}°oH§9\9a\aP\86·Á9*д\9d®É\ 1\8a\19\823AÉ\93¢\95);\a\93UúzWÎo±u¨\15Rãý\19m­3ÒE,
+\ 2\8a\80´¨\ fºÝh"ÃV²\89\9ad\19Øæ7
+2ôGåÛeÈxµ\ 6±¡\92%\9di3\8b\93ü!,ex\87MP5\13\ 4¤\1eè¡0Eà\95%Y§wT\94\88èÈDy\88\86Ü\88Gz\9d\84\80³(\13ªèµxP(÷)\85*\bT¨Ïi\85Vf\96Øz\ 2]\90\9c]h\8b÷É\81¡s¨\15ÚôYbÅÄ`E\94îm\9dH!5\b±\ 1\eê\84ª}Ò\18ÀQ,\85¥\80Û\ 3h\87^U4'÷\89\80\8a\9b}(ïs\90Ñ\ 5\9e\13\172\88Z¥u©à7÷\89\9d\89(¶÷\8d\87\ 2/
+\89J¢ð!ê¹\8e\91\1aÉ\88\94ú~Mið'\92&L§\ 5\94\99w\9d\92\88\17¹ó\1eõVôäÙA|Øs\1d©\a\b\92:¥ÄfFéA\81\8b\ 3\12iº/\16\8bèÛhwÕp,¾d¡\ac\bJ^J¡¤\v±F\16G^Vy´  [\859\1a\aP\86®É       \10\ 5P\86Ó[õ¡e\88 t\80¡óT¬\9f\11@\89OÇKv1z|T¥i\9e·\85\15K\97)Sº\84j¦­©$·\9e\f[ CU\18}Ær§¶·\95!\18\82\95\11ÖaL¤\80QPfA   J\a\11\18rmR.PÎMø\8c\8eI!¥ßô\12lAë\17M\98\8fi\95¡\968åÈ\f¨ðG>¹\99
+R      \86\82*àå\94  ^¯\ 1cx4g©QZ«\18\92®\ 5\83Ú04¡\11ç\13J\97\ 6rW(\g|Ùl\9eZÉÉq\8e}k\a÷é\96\86¨pé\10\87±E\e#*¦h\97\ 6\9dwh<êl~£8§dªñ\99:ÑFíB Ö¢¤ÅïCqj\8bkÆä§c\90chVÒ©h¶\84.!áwì\15Bü©1&ÿ¹\ 5ûJ"8|ÄO¥\19\8e\14ð©\15\88Ý\85°\ 6d\1f\ 1ª\16Ô \16\8dè\85o\ 4\16?ÍÑ"vÁaÍäuè\17\945U!/J}æ\e\1cÁ\ e\844¤==Ç1æW\92\ e©å<èUm\90ËSöL\9fR\ 2\ 4¥H7N\1e\80C\81 :Z;B \ 29#Hô²w5#tÍÅ@µ\92\95àH\92tp\17Ì£_ùl8&l¢Þ\95\80:\8bÔ]OqØX\91JéxJ¤\12lØH!¥\9d:! _4Ç\ ej>¦G¾9½\90XO\ 5\82\8e~y\88¢
+\1fz\8fRÇ4\8aVT\8eEÇ7ú\80"\8fffÆøO6\9fF§¹á\1e
+£èE¦\8a\ 6Âê%õY\1e]ïiÄå[è¤ôéVY\17½mZ\9eïÉ\96IT\8a$\1d°ö\9c4R\94h\90c¾ª\8fRcÀ¬¥\1f\15\83\ 2´¯\80\fvd\92\8a\97^o@\19m¢eX\1c\ 3Öu@}\r`KU\92ñØ9\1dÑVpBb5n¼\19\ 1ú,|e\827\17\14EÑFºº®¢7íj\eð®>¥\ e¢\ f¦«öW¬ÑÀ\99\ 5\81\ 1&vT\14\83\1dë\1ecÝà~.§\8b\9a©\19\1aÈÚ\1dY\983`\95f\ 3n\98]£&ª{\99\8e'ú¥¹"¤\88X@\8ajp\ 4FÒr\8aF\e\81\81*\8a¤xCp\9aÒ\84\9cPbÌ\99{b@x¨^ú\9fö¨^i³ñb°\1f~F\90\95ÛС@'\7fu u)ìß\9a0\80\8dQmËC(ÀÙ\91ÏÝmðT\8c­\81\10kE\8aj\19\e8q\94eG\85Åjoe¬\eky:\ e¦ ]\81¥éÐEARÂ\14P\ 5\b\ 1_@\11 \ 5H\ 1GR\9az'Ý©\97\87a ;d\9f\9d]¾)nö©6\11Ýs\ 3Izo\ 2ø9\ 4|ciB}p¸~\ 1\91\94$1\ 1w&=Ò\82\rÉsg\92D%+G\ 3Ö©*@±Ö©\89³|'«kÏAA%Qa\89 ¤¸EihÁØz\81A^U`¥)QÁ­ØRüi\7fÐ\ 5+ä|j\7fÖ\89(H2µÎ\9e\9dÝ\ 1¹¶v\94\9a\8eæqd¬ \1f\14X¹L'\94       \16\96(\84BU\1eà<¬¥\85\10é(\ 2\b\95½è¨Á½\86\17"@\f`z\92-M\85\81ê/Ö\18å$\rjXÚ\1f·\9b \94®Æ¢\17k\19À·2*ðjfTHÉ\90Ð]_ò©î¥a\82\8aO<K©iÿ)\8bºª\ fªÿ\94Äù\1caÉIyÁ\1a9´`ã8/°{ëßÑ·ö¬ÒcT\9a\ 6\1a!Èk\85(\r¶)\9dH\8a\8ap\9a\9cyZà     µ~\880+ÄIýyf      à\98\97Â~\88zÜ[
+q\ 5®SGðã²\82­açÔ*ËT­ià^\8aµ¦¬\8cÜ+âsLq\b\87×:ô\11±Ì\94Ø*Å>lfë\82°×\88Ij+䦯`¯çØÛzÅ\82\fs«Fú\17\8aAÜÈÿê\ 1\ 6°\ 3,G¯®(m\19SSt\12®iÁ誸2®R\80\95ø\9fJ®$\ 3å\9a\8f8\9c\92×Xõl\88\86G\85÷Ù¹*\bá'Ic¸"®¥+\92Ô\ 4\96\86¦Zå\ 5ZÝ+ïs\82\ 5g]Ç\ e;
+\92r\ 4EÞ%\87u\a¿S!¨ó\88\1f\ 5HþÕ\ 2ä/øÁ¼à,-\827\11\ 3ö­Ý\1cAV¶\13ãà\1ceÍïº\8d\ 2«ÌÁú*\ 2ü%\bÜm\10¿¶\9d³ÁòAô\18\fübq\87\1aj\1esú÷°Q!\84æMDÞÜ\87GEíØ\ 5Qn\v\8ff$Ü\84«\9eÖO\ 1I\96«L,\83\82\90Y\91\80O
\8cl¯hW G^N\90QØ9Ùjø(Õ\vÞ\89\1d0\1c,\19\15+\12\7fà\1a\\bI\a.YNÑKz\13È8_­'QF³\93®\82\9e\96Ð\9fÁ`2|ÅfJø4\8e\10È°î9~á\fê\13sL\12\a¤öÉÎæ\85\16ÛÄ!\1c\19fìæ\ e£B\ eV\ 3í\14PÐb\ 6 ê\r\v\ 3i²(Y\89\8aáí0[A\86\88pÚ°\8fdsQ·á\9b\8bjÒB\\92Á\13K£Ö´Që\92gŲFXì\ 4\94\80ز\9d\ 14\16^\88([EÚJ6u±\ f\ eÛ\1aÆ¢S÷_\9a
+Jp+¬uTÑ­ºÜ7\15\16\90\ 5\1eMH;Ò\1e´(!¦\bc4\91\v¡ÑY¸Ú±\8bë\91¤Ç~£|ì?¢?þ±/çÁ\82À\19²\1a\81çê\19\8aS\\12B滢\ 5\8b,éjº>²<\92${&í\1c¤ ÖÓá1N   \82¶ÕA\98\a®\ 1^\98\14j\87A\87Ã2ÜY\97¦êã\97\1aB\ÄU+\16Ka\935\99ç|\9b\ f\8dZÔjõªÆ§°©\88V2\9f\89\18²\14HUß RË˸³xR<kë´&\89P:Å%\11\15(\93ÿ\86»\8e~Âë\8a\16_T\81fL!\85Ò\92¨GdÞ$µL\11n@\v vþ#ôHU«fIn\94¨Öx³r\8d£Ó\ eøavi>kO÷`È\ 5C«V7Ô\1d­\f\ 6Ñô\1a\1dQJ\1dó¥Ú\886Ede\81ôe\1fI\81&\89\19¨¢±ÓK\19dF\eQ\96\90¢Ä8>¨\11\8dvøe\1fÂä&Ynxn\82ØzK«J \1cØ-Dbõ·\9f\14\7få\vÀÁ¥>`\91ÝÓ#ÕÁIX¬g;5±JËIÛ\12L1.³\81\8eqFâ Ú%1ö\9dì·\1a\8c\82V¾!påË6Û<Æv\83Õ\8cÖÆ\98\87ºB0`\ 6\13\8d4\ 3\93z\88\90¶z.@tawªr¤\ 5!»ðª&+ô\9a?\19þ=yH\1fzayÊ\1dÉ\99ÐÒÙ\1e\94¡ßë¦Ð\10/;\85Á:\81\1c'\99Ñ4*\17\1c\88¡%Kòk\rëå\189\rV\eçÈzZ\9c\16\91\94ßWÒ¦M\85Ý\190az-ÿK\98aK^xc)úãSlxëf_)=\ e\15û]l\85\\99x6\1e\8aÇ\95zF0mÕG=\86*²ÕË*\92     \84¬\8c\9e&çr\1c6mÚdã­'²§ëóçv\7fRçsEUY\89Ñ\9aÃÆ\9cLV}éxäF\16\95x\85é²f\8aT\8d\88\ e\ 2C\8c\13×uÉ\rU\91`lÖÍ\9a¢þ ÂB\f>º(K\92Ç8Ò4®\81Ô8¹å\9a/¥ú¢\7fæ Hß\90[ÝX\91N\19\ 5\f\ 1O\80\13@\ 5T>7\e¾Q\ 4Àw¤GXÒ~d\1e¾iøw
\81ÐÊÍÀ8ùH\82*å58V²¢nKÆ\15Ørô\8a\1eÄ\a%k%Ù\92Ç\1eN«ÜjK¦iH0jE¸\1aì.\89\1e\8d¹\aïm\97¸G4s"\11\1aöl¼À\99HuKª\804]fv_\90þJü9Ym\99ßG     \8d´¯j®!^<?\88ÕMe\15JLå\vÊôØuB\16e\93H\98\92\8b\9d\88\7f!ZMVØ\12ØÂ-\91\14ºF.B\92@îÉ\8aë®\ 1q\93\9eÁL\r\10f˵áÅ~
\8dôQ¿ªEô(ûåV\8cÃ\ 6\99\ 3/ª©\ e%ðXH\86*µ$¤K\ fª\161FÞ\15k¡SþÞ`ö\fu°õk·+³Øob$\ 5\14'÷§\91#¯z\85\1a\8bWZ¨ö\Ī¡¦\1dÉ Ò÷ð^Bk.ïÓæ¾¹\93U\9c\9bJ̹*l\fPçò"FÎô:9±\9b{.D\86è^º<l\85\1a²p¨(À¤Çq\1eº#oxõpÖ|\8d.ÒûòFº~©eö\92q#£Õ©;ø\19gÆݪë馺áU¨Ë\92ÕfnÈ`\95èÒ¡7ªyu\ eFkj«\9cGÛ¼º} ²Øëͺ~e¯a²\16¾\8f¯\1a\92¼\99\9aÉÛ-a\9a+K\18¸Òt\874àÏB\1d\8c\ 1m\ 6\væ\9aP\9fÔ×¥¡"äTUï´ÑVV\ 4=G\95\83ÿ}Z¬Öi\16ü\ 4½\1fF\89áüõ¼J*êÑ*ýR\97FÒ{ë\94²\83Z¡ñü\820\97ÆáW·ø¨ÛY´¥\93\95\10Û[Á2(\13'.jÖ¦\ 5mŲÛì>».´Ëàø:Wâo\8a\18¢­Þ.Ë\15µ\98\1eÔ\91M\1aõ\9a\97d\91×æ.6/>Ï\1eT ½»ïa¼k^ö\1a¤ªó\9a³\89{\b+ÄJ½æ#JÅ\ e©SñSÆ\1e\8eHä<Co\14`VÈAi\86ÛS\15 )\8fz\17\8f+Pù³GS£ký¾\81H_\94µC\1a»\80!C{äâ¡ì\ 2ì¦\1a\8eIÏ(^ù/\ 5¢fïÈÚíY»}_\ e\L¶½ã\11
+@S\1c\a\97\81ȪÙpN5 \86IÝv\98;«N׳~¢@+P\11\96t·Ã_ÑÚ\8e\81·\1d\86\ |±\b\8cÇ\13xp\12º\eb©VÿÌ\1cô\ 1äK\1fÒ=Ó\ 4\12¬\90ÐÁUpO;êÙ¸"ð\14\éÈ_DÛ F¸\19jªn¯\86Õ¢u\9eV`°÷    \9f\ e<ÿÒ(Å\15³vÿ\12\ 1M\80_ëÈ"UPN\15CL\8aÀ\b®½¶\13Ø?ÜL\vé<ü«JA1Ê\92P³'\85iáóiÀ`ÙÜÙE\9d¦ÑF~J\13Æ\8a(\98\8fë¦,y\96¢ß:
+b°[©\91ëò\80\90òG\ 3\90\ÿ\1fãâë|\1c`\88ù\9bú¬3änA5qÈÁ`ïß\87=¢d\8aeØì0vøQ´Ú\ f­\85\9d]W\92"\85ÃÑÊ1û1?mêAÓl¹\8f1Wgwþ*\8f?Tæ\8aþ\90U\87æ>{\7f\ e\1fWàQñUª¹\930\9e¨ùÀNÞ\1c+þ¤Ya\14Ú\82nr\85d\9c\8aÚÆù\1c<\ 5\ f\17»\1ckÑ«¶Õ\8d)mÛ\86\82x½Â\8dá\vûÒm¦\9a\87(\96^°¼\94\ 3\19\ e:\18)N\15\9bê"r\8a°\19{Xµ}^¥\ eÉ\ fûÂ\ e\1f\90*\9cѱfÞ:l÷%Y[\95Ã\ 6®\15\9c`eôu\88®\9c\15jò¢gI\1d+Z[\8d«K\94\v\80\ 3d èÆî\91J\9c\ 5e@Æ!%OÔÓ``âÞgDk°\96\90u¼Ý\bËSF\9d\8f°\fãt2ä\8e\11\8a¸ÓÄ`\99j\ 2\a\ 6Ï\19G)\95±\80øa[ÿ\97óqfô\83½\b`yTd¤¾§\ 5%f½]\8f\ e\19ðVð\ 4r¼êSÔK÷\14ÐÖ\9dTµ®É«%~\90±W-\8bøSLX\1dF\81\98ºÜJ9XCÒ\17ÿÅB\ 1\14|\91Á­FÈóU\1e\81\91ú2èÊmD\1f\87\86¬c(úâ\e
+J\19êF\1cmÑuíÓ\14õ\19§ÆÒã\ e\83\8dèÁ§qw4^\rr2ë̲>r±\86ñ.f}Æãp\8d&&\91¿\r\16<LL\1c9fÞ>ö'-\19\aPWÆ\ 4Û\85o\80\r\1dtÁq¸\96$z2\81\1e\19Ç:~0 \84S\86\7f\1fA\96Q\9c\16\b\8c\13p<«i\97º!ñ8\eJ«ïa:\92\1e\9eK^\8eü\ 1\r\93\83¨ÅÒ%ÜÈaÊ«'³6]nÏkE&)ÚH)È\r|T¬«\18\8307äò¹K\9e À^\10\ 5YCÐf~É\84h\8eI\831pÕG´é\9c\1cÇ\ 5 ´Ã»\ 1¡¡\92YJ\84þ\8a²c$\85 \93\ 1
+rD\Âr\92\151\16ú)!¬  ñ\v\9d\9c]\a\8bL¢ö°0jÈh\91ö\94»±Ôj\15\82\f\ e\12ݲLÓ­íÅafi_#'ú\ 5ÿ¬@`Y0|\90ÁýÓw\vÚ¨\98\1a¼UºÁ\1fp\ 5Y}\90\8fæ¦\8eÑ é®ßaQÌ\$t\12Õ\89\9c"ÃÄælÈb\ fÆV\15\92\82æ\84ë#É\14°\8dvx\19Ì\81¸Øu<\85=ºßÀ_P \1d\96\e\91Å\83L\81ý\89ß\a\e´ÖÚ_^\'\89\85ÇÛ\9aA\82\90\ 1á\ 1\ 2ó¿@L#\8cò!Ñ\11&·Á´"\7f,À{Æs¡\13Eª¹Õ®æ\1d)¸jê®\94JD5ï±\86¢£­\ 4ÖAb\a(\84\1e\91\89\84#1\b\ 5\82\82viV~)\82
+ÑP ñ\92~*l\17e¸}"Èz\15ÞHªö\9dØô!?¤W\8e£\13Ù»ë\98\PÝp³40«\80\1e"@"Å¥R\ 6X\ 1\1fá\94Ì\ 6\ 5¬dÐ\96a\89éÆHð­,nqÞ¢\91£È:ÈbÀÖ&\9d9\bèRØ<\ 2'nßèS-;\ fÓ\86\ eôG\14\8a\96\10î\92\8e\86rò÷\8a¸ì©èb\ 1£?cO\7f\ 6È[%ÀAjèDñdôèÚe\83\92Á\98W\ e5*CÃ\82ÜÃÄ\9cT'¬Åf\a\96rq£!ÿo¿\12\85´\8c'«B\9cáÕE9\92bE1'\a\9a±\ fV4XÁ6\9e`D\f\9aÌÒãÊ*f½Ì´1¹hã1\ 6¸1
+\803\93¾\86é]:sz)ÜðJÚFtÌ\82\aÁú<ý(Ú1°;\99blÍÎÄ\f3\f¹\94é\92Ç\10*RJs\16Ãz\98O2§ª#ÛîÄ\ 3ó+ò/]³\bó½«i\b\99ÆÁÐÐt\98G\ e\v
\ 4$\ 1$Âã\88#<kþ\8a¬IÂ\g_\8dÔq6Qw\9d\90X"]|\ 6k\81VB\a¼ÍTÀãøª.]W_]7õÑÀÆ\17L!\8dª\15Ç\92¼\80\ 4h%°\ 6X\8bÛ¥´cïU\10ÄFÆ4\98\86\ eV\80ó\99Ñ\1a\10Î\86³\8aL.úÌ\16çË:·áH\89óäD\ 6`¾®ÔHÆS¤\16ßò:\1c;W\81ÎEË\8b\ 2\ 4\0ó`Æj5u%³\8c\fûÚÌêaêLÃ.º\eñÓÖ\96a\f°³¢[è:anJíü´,¾U &2æñÎ9s7Hëþ\14vÆ=£|\18ÏÙã\8dÚ´d\9d\95½:ÇÆ4@\8a;":?O\172æëùV\7fVe]ôǽÎ~\9a®\9bé\8e\1f£Ýú<F¡\aîsÞ§Äi³+Î:l\84`Ï@3ãØ´\80ÃJ,\1cÓ\81ðÏÏÚ\86«üªÏ\82³\99\84,çÇ\99\1fζ\ 1\e¥¬\96\861\83±x#k°È\15GÎÉÁä\f\aTÎ-ó\13Z4\84µSäzvØ\18Ì\¨nµ¢²¬>3u`\a\7f¾Û\19~\13IýÌásÐÜ\15Ão\fÔÌ\89\v¡\ 1\943SÐ\r;\fJ\10\18Ò\1c\9b]XQ«å\94Ñ\96Å\16:¥xL¿w"\9e{Tèh1L¥0 \ 1Ñ#4S\10ÝfÁ\97(\ ex${\8d\9b(Ïê\ 3\82¢ËÐi\ 1%ÇN(æ\94\8c\8a®iÁ\byk\14Ç\98\18\81HZÅá_¯"\94\8a\93À\93D%ð-ò\ 4dºc_\9dK\94G_vK\ e×$¢è_VÉÍ{Þ\b$lFâ\ 5\8d\1e\87ï\91\8b\7øÆ\80æ\13ø*i\93ú\84¨ \99Ŧ¼Ò\1d$Ýf\9bDÒÕ}\86t;»ÔÜpãk\94éâJ\1f¡0\11\yX¸ã\N&Ôj\ 4Ù\ f\15u\ 6P!\1a\92ð¡\17G\e\aLH¤}\10\8d¹\14\15\98m\98yo\96\16D\87h\15\9d6+.\10\89Ú\19ë\965%\96yiä3\17`V(&\97RNÇ­h\v\14\9c\17B\vlµ»\183\r¥½6\17Öô\8b9\9buj3­¨\92t\80\9eg\9b7-\9a\ 5Q\89Ñ\8a\904\r¬â£ðÎd\8d\81\98\15Ò¶Ó(ôsX \7fAÂp\17\ 4\ 2\10\86G\bý\91éÙ$Ý~\BÇF2ÖFè3í¬\97Â(\8f0ÔîþÔj\ e\1d
+YgáHË\9aôôZ\89Î!\rÙ\86&·$(^¯ôËUJ³$\11\9aÍ2,Ô\94\1f    \97\ 1ÐÈ\93\16aØãxp#«´\96à>eY\eq\8aC\8a(Óò\83 ÐL\13\851\90\80\·f#g®ºY\v~\85Ü´\91\86&\8bµí\18aW\80\98ÏdR ¸ä\1a[ ]âW*\81\89\1c\90Ô6:\17lú£\9017\84\ 5ÊÚût4iî6ÝN/z\1eq\8b¼Â¢ ?\ 58ØB\93ÆÉ35\f\14SÄ7òvl\ 3\1cmP\\88òÆ+pávÈ\1dnè 1æ\92\82 \13uÜ¡FYÕ\8a\14ä×ÀzWÌÐOå)\aÐQÉV}WªÄb[\f\ 6        #Õüôå\8c\v¶}\82+\99w«¦Í\19²\9aç\97L½³"
+\ 4\v¥SÕpµ\98|>BM/(\84üíUÆpóW\85ÜI®ÉßôJ®zÙ\9cm[ôBD\aÚû\15\12\86\98\ 1\e£´\9bï©\85\f×½°;ý·\16È\9d55$­YO H¾ê\9a\94©®m´2kB\87\92ÊÃgAÇÂæê_hõÉ\94ëtR½JõÃrA'T¯é]\17\98\92Ö\91\1deGrý$ Õµ\9c¨\1a\ 6\88Ï\85]\1cC?\1a\86\18\1c¹m\87\11\ 4\84×g5TÊÅaÈË\1e\89j\11#\18\11Ñ°«\11\17½\1c±\1a§W×Õ!âeV,µÆ\fök\Háq\81oÖºð`\8bÜ\b\8cø\9b\85­\83\86\b#r*XÅ\82ú\ eË\94²a=\ 2\17¨öñ\13\1d\86ÂMD[{Æ×w¥\8b`\v\97]~çL~Ñ0òYa\9d¦F1ç\93\9fzÝ`²ÝQá«\9a¶ð(\92;\8e`\9bì_ä5g\8e\89ù\vbwDçØQî\8e½)GµUÊÒ\95N\1dW=v\8a\1c\87è\88{\82\8eç\85Ûªl¥|ïó\1eÃÒ6\90Ñ\ 6\86\9d=\82Øèëra½\867\88\1d/J1¥   \ 1ð\ f¼jÝTþé7ú1\8bp.v\96\11\88£\1fíÆ°D\99\bt¡T½hÕ¼\8cí*·HpÝ®è³i¼Eïzbùl\83¢ÙÄ!\\87*\15]KåCQÚ©j\9a8ÿ\fVS\80/\aÌ\9dÉÊõ/\8cX0SÄ0_¥  y\17)\93\8dÔT[£\ 5d´ZÑö9ÓÝì®\8d\12\7f½\ 6°ÓÝt?\9d\1c¼\94DU\80¤\85¥ÛäU»Eæµ
\11?ØD¡XÑ\9eý½ò\99èD0\ 1*ZÆ2GfÃyÁÃíz\a,ÛF\8d\14wàÙ[wSä!\15\16H\ 20zÍlRvpfµUU\ fÁA  ]\93}$YÒuÿ¡l=c\eMDÔ\9dµO\8b¶d-ºÕoÅ\9bÛÊQ\86n\ fí\8a\rä(\94}Çß±Ê0¸õ\á³ej!u 
+н¹¶n\91Ê\87\1d$\ 4E©º\98t\15\18ݦm­n[\80\8c5³í\99ÁØ\ e6]M\14\9e\16Ô\ 5µý:h\97Ѧ"ufÓØXæ\8e\9cZ(G\81\86?àB\8bu+Æ%U£Â\rO\94Yx\ 4ëÒ«udwÉ'\8dÕ\14\83Eï3»SÏÕÑÞÖªrÓH²pÄUÏ|©Yr:³7¯¼ze[æfÇÄ\12\84\1d@4ß\bþv\86]Ý×ôÙ\91vHT¥ö aÅ\ 5sX\?\8c\96¨8\ 1u\9f¸\v=M\ 5\85¸Tr\ 1Üq2~þ¡0\85Pêì\14ØÚs#µìsi5.\b¸\9ehN\95\vx
+>o\ 6\9b|v\1eL\15F·|lzDoDwú(ÀáE\ 2\88it³ø-\ 1\16ß!ò\1882\18t|aJ·Z°\91\9c³\92N< \88ÉÓ\8d\8d\17\81%\86R`6\ 5O\99V\8a¦\8dE\1d
+pZXÉo£ÓzTÀ£Pu6ªó\ 4$\88uV\95Ï8U7ÚÍã-QÑ/A=\8b¥¦\\84ªÄ@<ýËp\bÊ«ªN£|2zÛW     Ì\134\7fóS\bJÌr²\\90\10\90\80·9Í\bW^cÞ>\1dlkÖ\98â\ 3\81Ë궴s\9c\8c\1a8\10¾±Þ\95b\ 67\99\12o[\1aÇN¤YôN\1c:´D9\ e\9e8\8dÅ\9e×aÐo6\88\86Lcã\95Ê\9a|*Tá×eCÔ3óáYbîY¡\13\99ßJ5    {:{¶]\»R÷&x\9dé;Yæ\16½|ngíÙ\ 2º\88Ø`\,\89Õ53\8bÚulÝ\106ìkã!¥EÇ%d?ÿÁîì\8d\84býökKfu\vbj\9eãqc%éE\82Ä\ 4\ 4\ 1B@\11 k=\16\ 2\1d\12\90\ 48\ 1¨\88&ý®f#ÐVªV\1c\ 1\8ck\15\ 5\bÇMP\12\10\ 4L\ 1\9a\94\85Ì?£-\91·\80XZ\8b\87\fvOÉàô`ïºä)ÃÿÑ\7f\10 !.Í¢sa\85L¿\18l\ 6|T\84\10\19A,³#\14\89ZM\9a\1d£\1e"øÄ\88\bÉià\ 5ôýlÉÝ\1cÖ\ 5n-x\80Ùüér6\17\8b{\'@\88t§ªî/aG\81\8f×Kõ\14)\17Ô\8fát    \9c¤\9aÂæò\9e3}\88©z åÍË\9a\1eô7\1cUbÜ Ó¨X±\1e\11:\83²äCÍÈ.¢$É/Ñ¡ÐE *]\10ào%®l\87\19Ö?ÍÍ\83]\16ÝWaå±wrL\1eÛ\80É\9b¡²÷o\bõç\1cdEØ`U÷My\8b\14\124QÇ.r\87*^e\87\8bé\8c9ó³ôQ\10\fs@e\9d\vý\1f\81{Y¼\9f7\81\99çñ\93ÜHÕ\9b\7fµn\ 5Î\9d|'\7f
+ä¸\19Ä\a_Dê¯ï[Üá¸SÁÄÁ\8d\ 4\ 1wH\97²Ò \8e \18sPSÛÍ\1cT\br/·I\19\91\eóæ p\89m\ 5\9a\8b¡fêÓJÒÞ\K$õ¢¬a\9bj´Kë¨\1eeÍz×E\98\96òÖQ\924\ 1*éqä´w×Ñ\12a\ 6½{ª8|4\8d~T\ fÆùé¬jGÊYØtRÛ \86òÕ"\11Ö\ f\87S\12°Eg\98]4
+`Ó!Éa´\17<F»"«K
+rF#Oi´Úh{/\81\10\8f\98\1c{\91\ 5$aÅ\13m\ 4\ 1?¹á$^Àj*ÎÖ\9aÞMâé\99÷Ê\96\r[þ7\r,Óv\81Ó"\8331g\1fñYÖ\92\e\ 1I\e\vVìÝÎW\84Ï\88¦V¼¡\1a·yR@\17Ýæ^dncuÏ\9fV\ 3\16\85\867×ܬËb\86\92£UcDàNc'\17í"wîãÜaäY~Ù6þs\15Y\1ca\15(\19t,ák\ 4éN.y¼øPD\99\93\15¨ÕeÞ\14Qæi©p³\17Á\8b\84yÏKf\1cg_6\v\97¨¼OUàï²\12îK&\98\9bG³6Tý\ 6³dÞ¤£eËlj\94ù¢8XíE;ïöëÑQÕ\90jëºYúM\81Êe\80¹\80gðhßD\91¯æ(\88\19\13IíE )÷br=8È\10\e`\84ø2ðÁ\9f1Y\965:@\vÐ\9e\ 2F»HFU-©\15}y|Nls#{Qd1Y¨E \13¾A\ 4T\16\97E£Bi\9c²c*\1d\ 4Äâ±Æd\8e\85Ô3®yÄõ\ 2à\ fzòÅ\80õ³~98Å\10G\e\v`[H
+\94\82\1c°\8a6±Ï\900\18m\8cfÂIÂ\1c \98¶Aå\14î-\9d\ 6\a\v}T\8cT\19\b\80¢Ë\19ÿÁ¬\94Äù\18-'
+@¢»#C\ f\ 2,7-@\82\16´\85\v\80\ 6ì²K'«\85·êè1º\13\10\ 44\ 1ÜCÏ
+\11Õ\9dÅ\12_^\8eÐ\ 1\91Öîñ\ 5´\e\19:\8bÈ*è½Lúç]\14\ft_\15\90\ 5l\ fÍ\ 1\8b\18 \fV0º\98\15\ 1¤ë\93Î=¬´\8c'X \13µé;ÄRA¦\17\ 1N\11à"°\8dmÜX¡\81îåà9Å e\94æz\91\86\1e"V!)ó\8b\1e£gá[x\9c\ e¥»\bR:3ã\137;xz½
+©O\ 1\99Î=\ 6I\1cÃ[,eê²Ç¦^¦K\ 1A\80\13\1cêäçÓ\16I\91êK\ 5\13 \85sê|:\11\80\13<\12á\85q1\18G\8cÁ\11D\15mXéoEdB0\ 5ß¼x¢\1eª\93\r¬>dHêEÀ­\8e\ 4\84\17uÁïóx\90\86}­¬\ f\ 1_\11À\1e\f\ 1R@\12\ 5P\ 1ÎzxÑ`ìêÐ\16\8d\ë_\13ð\ 4\f\ 1JR\12Ðì\86ë\87H[£¿\85Ûó¤Z\81®\vID@á\f¥ÃëÆ\ 5ÚÁ«ë}zË\88\1e£cëøº\10\90\ 5Àë£\r'\v\89\1dƽ>$]\ 1p3\12¯;<þúF\ 3,¾ê\ 3{âÚ§ÃëDSbô¯G\\12ø`\ 5¬Ç\ 6\Å¡Ð\17Ð6Úx±Þ¥\e\83\9aÆ(\91¬\ fìD\92\93¾¯+¸z\9a®°\8bÞ\9e$.Bz\17åG9\18Ý\ 5\87\8d«·\88Ùz\9f\ eÇS^\ 4ÒÞ*f
+R\94pèE\86\87>H¾\8d\83£½\ e³§ëD¸\11\ e¯7\18O[yéb¸ì\ 2»\98>\ 4\10ID\80\92\14\ 4Àë\98ÈÍ^Ý\8d=\81iÃ>µ×êüz/9­Ww£D\87D¨§Cr
+UÑUðeº\18t\19\9cc\ 6GÁÊ>²\ 6\ 6ex×\9e§\83<\99°¬.ÒÂëu\81Ù^ꤠ\18»\98\8e   wêÛÃÕ~Bö³Z\98."¸×«\8f;\94Þ\ 4\14áRÙ®»&¼Õ\1dõȦÇè\8f;ÛN³?ë¯\88Û®µ\1f\8dpc¥ïÑ\98Aqª²+êf®­{®Çè '³\8e¸ÿ\1eCÅêî\86À9R»\98\9e»\9bé\91ûé.®óî {̼\94\î²Gî\9e$\r\ 1J8\13î¹+î\88\98~7ªãî\9c:\14 Ð-\ 1\92¾º\93U[¶Ú.¼sê\990\14ð\ 4,áàºñÎ\8bLîß{²âÑ(ë¹»@7ÐÁ\b\13»êÞ\8aÓÃÌ;¶Ê©3»M\94îì¶%ê;Ñ\94µ·â¿\ fré¨\8fï_À\13p\ 5\9d»ún;yì­ø'ó²#ð
+<\ 3\ fÀ×ìÉ\97´þ½G\19
+x\98>¸çîÜz\11 $5ëêû\9a¦Á·âÛÈí\8eÀ\ 3tÄ;  _³\1fu'üc\a\15\r\90âû\a\ fIúº\v\8fº÷\14ìûL\1em  â\a¼\rÿ\ 5\14ì\a»ú\ e\1e\ 6Çê\9e`\907×;\ 2\8f¯CìT\80ÄnÄ\e\17Ô{ÐDj\10²\1e\9a»\9bî/üh\83!*ñ¿\8dȾ\17¥« ÀÏØ\8c0\ay#_\86¨ûíiã¢8Á\ fîG\80º\9e       Ëì:<´ÞsT)\8fÝ4,\84Öðõj\1cÿ\ 4\ 2]ál\ 5Ôñ :¹\9eÇ[\86*<\1c\7f\ 1PÀá*«£Gê;&bÈû\95\97Ò=£¬ûñ\99°\12N\ 4hëN@Û>É\97\1c¦\1e£còC|\10\90\ 44XI\80H»¾cÐ\ 5\ 6á{É/òTø\13`\85×ï\15{\1e\9fM7î\8aü\1f¯±Ûê\ 1|\ f\9fÇ[7:©\95®H²1Ò\87\19\9f²ïíw\13\e¿\9e\91\97o|½
+ÐÑñ»û\7f°Z\ 5ºw\16/{t\81|\120ÈKî\9füÚ7V\18ÈÖ<mÐ5òBÀ#ï¹wóæ¥,fÉÇè\9d&ÏÉ{òù\9c±z\8b\8aòb:@\97$\9dò\86;\89\18¥¬L°\98¿\97ñ_@,?Ë«ï\14»óh¬R\17¸¼3\1fÐ?\8e\1c»/\7f4me[h\10¯Ð¿é\90;÷`;]\8dh£ÍZzc¢_´Îº¥\ 1íÙ-ë}\94\1e\bìÝ3\ 5uYqÂs\ 6«Ñ\97\b\8bÙIF
+bHÓþ¡3­H\13]p§³ó\ 1\1d\99NÇ#MI\9c\e\ 6ï\83;@§­\v\bðú\9a\87=h» ¤¬Ûó8|\120©7\vI\O\11\12ÿóL=\11`°_íX»AßjÆíë|=?Ä?ì\11»\8b\e\83>\ 5\8b\aõ»üÕNÅ÷ç25ãþ«ïEf|\1a\ fÁk<í\1eö\88îT}á\9eʧï5{]0ÉgÃrÁM_ÏgÂ-<7\1fÏ+l\8aX^?Ä\17\ 1\9b»â\1a¯\13\9cH\ 6W¼ÔgÂ\<êÞ¯kõ½\ fQ\ 1¼w\18VzP`\98È\1eǼ²d\83°ñ"aSýÏÏñrúî\1eÃ\8fU+tB/{\10ö\9eºä¾ÚCDîûiÿÕçëN=!\8f\89Ôòc\15þ\ eÔ׫\990\11߶\9bí¼uèeÛ?ñ\11;Âþ¹\7fìWüæ,Ñ¿öi=A\8fÄÏëS:¬=·{öÁr½!êA\1d³\10É>³d\10\8e@Ú×\87ÖÍY\ fÜ\a\ 1P@)\ f½/á\9f\8e¦1ñ§=z¿ì2\ 1U\80HëØ\83ê!â\15ïÚS\15ò}e\1f^\94íl}êræ¾õE\15èù|J-#ôVq\14Ôõ,¢\eÿÏ;\ 1¹;4¯¾×\ 5¼½mì\b?ø¹;\11\90\ 44ð/ü\1d\1fÙ\92\9f\88<\86Ï©këV@\120Ðýé¡z%/â\7f\ 1\92Tß»\b.ýl¤\98­øM\90º\ eÉ×ì£Í_ÿgõ\8d+~èIÈ\17ô û\ es˯øøz\ e\1fq\1dë\ËûÞ¤;ïCÒUïÀËë\1f;¨¥\93\10þ\rO\ 4@ñ.Còõ+r\81\82ýà^åG÷5»Q\8fÇ\e5Ô¼ d¥\9bïC\90\86\10Ú\8fnãý§¤Îÿóæ»î>á/÷\eÍ<\ fç?\ 1\15½ä^á']ª\85þÜÓ\ 6\10ð\ 4`\ 1\9eûQ\ f\87êww>\98oÙ{øù\8dì\9dÒïìµ\17G\7fz[·JòRn\88¤\87ä\8dÑ^|I½Iû>o<Áô\93\82Lÿ´ï7zFÔÎÙïEW\94Dño\8fövý\89\93ÔÿóQ@\91tʳ\a\ 5\8fºûõ\87}u×µÁúéú\13à8vòF<£¯årõ¼~\14P\ 5<\ 1TÀØ\1eÉ\vûÍ#«fÞË\1e±¾\86/\ 5\18\12\91\94\ 5¤îF)àn\86òñоz\1f½\13ò9~®¿¸\ fkÜ>m\10ë\17ù¹}ý\8eÎ3&\96ûoßí\v÷½üQ\7fâàõî¾¹\7fÛcùðºí´î»'\81=¯ïßóô«ý\vÞ\bÎí9fý\1d\8eÌî\1c¸fßÕ\ fîU\80\9cß×Óù\8f\9dqèw+ë\r\7f\15ÀÐ\aûò~õnÚ×û¿\13\8b\8f\ 4\18áLÀ9/î·d­ý?ßð\ fá\87»ú~Ù'ï-YmÏñ7ü\ f\92\14\90òãøPþý~Ø\8cîbzÃÿ6oòLÀ§îð\18¥]¤\ 1\1fÎwü->\15\13Mû~sßÌË\1e:?Ü|ñ×ìúþÈï\90qðJ}\8cÞð?2[¸­\1f^HèR\7f;iÝ\97û\1d?º?©³Ñ#ë\f¿ð׫:\7f\93_Ä¿ð¸þ¼n|ýðÏ>m\90ö_ùa=\ f¯¡¦ $óÐßðÿûG|Æ\1f4Qºï{át¢SN5z¸§¾óå²Na~\12\98HfÁ\99-rü»fA@~t\17 ?Cßn×;úw9\86é9mô^ô¤\9f$\8bÑ!&(\8a\aù\1c\9aþo\14\95×ÞäÍíd\88\9d\1d\9dÈ:£\95ëH]yPþð\18\9aÚȾ\8d\ 2\98ñy\b\8e\92³\10&V\1d¤AÒ$|E\15\18ÞG\1fí\8dðTàÕQr&\vu\10´Y\80\8e\94ô\98þ,Ý{\14¥dd4ÿælZº\v²\83S\14¯ÑjU\ 4ô\ra2m\18\rÎÄ¡Ô´\ 3\ 6ù\8b^P)0#EÁ\94`\19X\eÎ\r´Ñj\86\8e¨\89\9a(ÿ\17\91\9cÄþâE\12 \94\7fv´Ä\14Ã5Ñÿ»¯èHÊ%W\13f°×\ 4\r×µê\86\8a£3\959ò:Ü\150\T\85^\f\82\ 6§Ö\e`Úq\ 4>tÛ\9dV\ 1ëÎ\92Ä`8
+ø2 \13%»æOÍ.XW²KüI-t\7fä\86ÍBV\ 4ý\11"»U\90\8e\["@Ô\1dì\8eÑf\1e²\e\15æP\80$\8a\15 8\ 5kc\eñr.\10\151ÀðÂÏhåཻ© \ 5\8e!µÇB\8e"\a¨\ 1|b9÷P¾\13\85à³'wi0¨ï°{\15\ 3\13 é\ 1\a¨\ 2l\ 2ʼ\ 4%s4_F\1a\84Ád\ 5¬ÙA\ 1\80h\\86æAÓ¡Edz¨ò)\ 1s\16L@\97\89\ 5å\ 6\84\ 2\88\83\90\8e\82\rAÀß      \ 1$\17Ñ»Û\ 2.\ 1»\80.\93I\ 5\r¯=â\ 3\9c8X$¬eyÀ\11Ç\19ÀZÆk\18%H-Þ\v7\84=ÜF\89Ï\91\r\ 1\ 4Â\12\ e\e\1a\95\f`\916l*\ 3¢î@@\88\87" tÌÅTX\9aU¼CJ\1cÌ\13¡\9cÙ\83'ñ´07\8cÿP\80\9c$&\10\95\ 6\9fp¬h\f@}:\f$ÀïÞ¹,Ja\ 1tÚýdt\80Î\85Ó
+ÒJ\138@È\ 3¦«H\ f}ÀE\99wo®·SqÁ\80\15\80\81Ï\10óS\87\81\19áË\90\ 1\r\ 2\9d\81/\9eÅë\7f\ 3\ 2ì6Ä\ 1\11\fF*n\ 4ÆÃ\97aGÊ\ 3V\ 1:J\8dÀi\1d;b\19\98t\9a¯Y\ 2aJd\85{F\14\90s\11 Ê\ 3\86<êvéÀÎ\8f}\82\1dø\räE\ 4´\9a\1da@ÎÅ\85@ãQ³È\ 3b\ 1s\ 4ã\r<\9e¢[\90\v¬\14\80÷\82\16\Àg \ 6p=\81Á\1a\9ah\ 2Ç@"ùA\1e°!ÈM\8aá\85\17NvO\85\88 _\ 1\18ÈX\80b\1d\15\8cH¤#{ÙR \118/«7ÜìÂ\vزt\8bR@Ü\91\87¸\a^\16ú\81\14\fzW\87\ 1\1aE:z\95ä\ 1]\e1\8d| ËE\1c\11°º}¤%\82.\13\88J\91MÚ       <\ 4V\ 4X\82\8b@è×uJ\1d¸HX\ 4:P&\81î\86J RP\8c\ 30Á h\ 29\81y@P òNåE\14\12ò\1dº\8e"\92\84LD|jÉÓ½é\ 6~­ÈO¯?¥Æ½MÛ³\16\f\ 5Ù\81\8a#ÆÝ\1aNÙò\ 5p\vN±ÈO\8c\ 5\83     \81\ 2\1dH\17l6H\17î\82º¿ 3\84\99BTò\v\16¡\8e\8e\94\a\90\99\82\18,\ 1\82\15\16\83K\9eU_\10/x5â\9c\10É8\7fF¹L\14êíºÕ\89\ 2\83\1c\vÉ\88Ò\1f.Âø\82ú\13o}ú\;±\97i\98b¡Ô×ì\98\ 1úÛP\80\eº\98Þ\ 5p\9dÂÊ8Í°
+XgÃ@ÒQ\17Á\18¨ÊZ\8eE¶Â\v¶Á×\960G¼\80X3ÈÔ\9dø\e\81A\17`5PÙr\r¼·\19\a¥\16À\9cÁ@\ e.mÕ-       \1eË\b<ÏAu\84Nj\1cȹÀ¼]\ 6Ì\81èÀ© Ô"9ضP¥\90À\94N\1c\99ð ²,)F:ª\aþZÔw6Á\8d\80P\10ßÀ\1eäª\81\a}\83,
+ªÛQ! 8q\b\92­\ 16\82J\85\WQHja^ù¯y]¬/ÎÀø oдPͳ\ 3V\ 3\rud@x\9d\83p\¦\1f\\10J ÆMýÁÉÚ\7f\90Ý\aÎC   \92\ 3q\bà\8a\f!~\10Ýð Ì°Ø¥\16º\98§B\88Ð9è\e\\12Ý3\96b¤£ó\86DAEX³KõÉ\ fö\83á\ 5\91 1á9ÈS(¯E\er\9a@\95`\15\10\bd\ 4¾\bM\ f\1d\bM\909\90\1fü\18\ 5º\ 6;H+çé(\ 4æÖñ\ 4\86\17t`pd`Â+¼à\ 2(\13¾`\88\84.\99H
+OÐ\97á\13¼\ fÖì\80\82\1d\ 1 !Í©\96!\153
\bÑ\1fK\19\8fF1,fÔ\12\84
+:      =\82UÁH q#\7f1\ 5¹\13\1e"4{\83\958ÀWp)\15\16\J\85\ 2\93\81£ \9dYB\88СÊRC\18\9aØ\82ó\82®H\ e®âÖ¼A4      þ<r\13\8f\86\f\82$æ7ê:LÜ6\85\9f\87N!ÆMq4M`\1cÉ 4\85\915NÒA¦¹ÐÁ2\ fÞw\18\19\8c£Sa¬\90Sxqû\14^\ 6[\85K\1e¢\92këÏ#T@¿x\9dð\81\96ÂRáQAW\18»\9b\95¤
+{\85\19\8f²\10\ 5 \19\1c\16\ 2ý\12#3³\a\19©0W\98)Ô1ø%\80~Z¨\b\f\86p[\88)ÄÒy\v9I]\81iá«ð\øç\19*\fe.\18(Âo¡KâRh\17ì\16\8e\v\7f\85ÓBÍ »°3H¥á¢Eú:\7fÕ­Ï\9fR.ôÇ\94\ 3\16T\83f0$\90p#\19¡\8a\1a$)Ïf\83\80©¸Q\91\ 5\vÔ\rú\ 2g3:Àß ðÌÃÀ/\93\ 3Ñ\r       \aí\90\12\14|\93±­\19\148ï@©Þ;\89\1ax²¡\ eº      Qwx\ 1\17¡60Gó\9dø\19õ\ 3Å\83\83\15òàÄ¡\1cø2\f/\9c\ 3ã%rB]Íûi²à)ZÐ<\15P\86[ÁPTjA'2\ f\9c\a[)øA,H\87\10PøT°\19¦\f\ 3\84\r\8fEazã\v0
+\93\17\90\@\fÄ\86\11Ã\8cä{à0Hì\88Ib\84ü\8b\90Äu-cH!\14\94X\b\ 5\82w;Ì\82A0nÈMz ¾\ 1Q\13§¬  Iæm8à¯\91ëyG|KVäa\ 6«D¨    <0\ 1\80?£ñ\86Vo\986'¹\eÞ\fm\84Ñ\ 6\1c¡/CG\88th\14J\14ä\84BB\1d`\91Ð2wT@\12¦\ 4³e+Á\9e¡¹¡%¨\ 5Ä7D g\82\13\8a\9a Ôðc\ 4 Pf   5\81\Â< ßGL(µ\13ö\ 3\ 1\ e2/\ f\89&°M\b5|\13\1a\9dä\84J¶¢à\8bâ\1dÈÄ\8bè1\ 5IGNÁ%¡ú®I(\15\ 4\14B\ 2¯\82\84Â\92Ãí\10Q\18mP\14æ\b\19\85¢C± (p\14$\12\9a\14¢\ 5ã\ 3jAà©0Sh8ô\88Ñö2X,\88¹ U©.x\18$\1f~oî6\98AD\17_\10\83´t¢\15\16KìHáCÊ û°)0£Ë\v\8a\ f/\18\1d¥¢R_    "R,´\1f­\ eó\87åB\ 1bÿð2¨\17¬\17\9a\vµtô\9cÉ (\ 1\98P.1\970\v3#3\80Ñ\7f¨?ÄÒ½o2\88Ë%º!\ 2ñ\15\11\14bé.\88\8d
+\10\90¯\10?D9Õí6\88\12D±ÙA\ 5N±:\f!RUº"\7f\a\18b\e\aÉÐ\18Xík¸\86]\ 5\b±}èAT\e\82\10Q\88\1cÄÌ`\r\11\85\88C\14\rè\10¯`T\9aÏ ÏN4Hé\ 3ý\ 5íD\7fe\81g\bÂp{\86úÓò½\ 6­rÊ\14\80VMo>×a8\bÚír\16¹ÁPßnð'Ó\e<)\8c=6\86f\8fP\88ÇPtx\fä\ 3\8e       \v\13Ù=\83\1f0mD\b\1d\\19j\ 2­\81¢Clà\1að8¸føßL\ 1³{\86B\9ca\ fð\ eØQB\ f\ 2\rÕ\83\93·fE½J\15\97H\9c\ f¢·ê\83«C{à\ 1\11\92h\ 59öH\12Ñ\10gBa>M\8e¦    \1c\b\86÷x\84¨;3bB\90\90\b\8fá\b>b\b\82\b\14!a\e±ñ¸²\b~\ ee\82¡ÃÞ!ê\8e\12ìÏÁ\ 4A\87SBºÝM0\94H"äF¬  9\17¼C/!RàwÈI¼r\11\ 5÷\ 2\1a\87á!\1f±­b,Dc4\ 5û\84¢C^¢\9cðyè\84\90\ 5
+\85ÄD~\1fçp̲(\9c\b4
+µcÛC\94̤«KòôH\v&\v¹\85'ÄOâ}ÇÆ\13,ºg\8c
\89     ÄCb\16\10_è*ä\vê\13\11\82F)\8c
\v\80\b4Ä':\10\97KòDVá´\90¨ôO\9c'"b>9ö\95\ 3¢A\91\88\88\ 2*\14\19G\9aÁ\86"$n\13áѨ\12â\11ëUE3\1e\1c\9b@Wö\80\98s\18\bï&Å\11Ý\ 3\81íÊMH3Ú\bé\89UÆ9c\99SÏÉM9d""ÒÀÉ\89Ç\b«°þ\8aRh\15r\v»\85HÅÒã\8awüÓÔ<±@#Ä\aÆQ\12\80qÒPLRa\94.\83w£ñ!\96n×Á\11ø\ 2À1°t\7f\9b\9f¢nA\97\91¢\18*þ.\8c\87\\80£¢h&©¸äY*\96\89\89\1d7 UQ1\18U\\16f
\80     >\16\99V1¨ØU,\vDDÒRÑ\86°¢Ó\ 1©8-\94«äc\84\14d\987Ý1«7µÒh*~H.&à\ eÅQ[Qâ\96)\+Z\15S\ 3YºÈ\9cVi\13Q\e    \ 6â@òD §Ó\1a\10¥r7L#vè0\80\93\88ç \ 6\f\a\15GDþÌ\11u\89á\85)@ZÐ\8e(µX.¨\15ÁqáÄÇ\92IÐööGt\19¢\16\8b\ 2ÖÁ\99axᵨB1\14\8e\15ºJâ\10Fb¼Ä\91è"\ 4\14ò\16\9f\11¾Å\vÃR°i\b\ 3x\1a*\13«\84rÂã"ü)¶ÈX\b¼t\18\b\84\9bÀ:À\8eÐrø#l&:\ eÃ\89\14\8cWÔÛpâ $ô\13J\ 5í\86§C.Cê\90J¸:4\14\1e×Ê^;ÁÝ¡Ñé'ÈL\ 4\14\ 6\ f¡\89~¢? \1fQ%dT;\1eò    £\82ÊÃ\9a\9d6Ñ»ÈM\94\ 4F\ fµ\82\12BÔÂO\ 1\a3\80+'v\ 2áuÚCH¡:Ñé\13áú\1e~Û&\8aREâ\87\19\80\ 6ôú\94\87\8b3\a\ 2\11®Øaä'î\ 5É\1aF\ eãVa¿Ô\8eùéé£\b\83óÂia÷\86ĸb41\86*\88J4FYáÚ§H8X\91\fÆ\18á\89)ƸâE1\81HqK\15æ\18É\85\11\17«@øÎÈVC<2ò\vß\1d\7fah°£7\1a¬ô\11\f/}\8a\85®À\16Q¥§0¼D\90ý^z°Á³Cì      NCF¼\8bå\84(\86u\8a^ h\11\ 1Ô\18FRJ\8b\13\87÷BF \ f¨Z\ 4\1fz\bç9I¦à\9b\86\88Bø`Ü\f½$\1e\r\96áÄá\83Ag\-\8e\f+[Ú8U\99A,e\18·Ë\19^\ 4\89,¨ÄÔ¢¡1\89çÁÃM\1f\82\r\81\9a\92\81\84\ 3\85\109°.Ü\f-\89N\1dÒ\111ÃLæº-ê\r«`ÞÅB\83î¨È@aX\e\19±\86¤Äâ\9c²\ 5\ f\18\ eÚ\r\9f
+ÿ\9bËÃúÈC¦h¸\19\rm\89lB\1d\ 1§$0&:¤e\88\10J\80U.BâSÁ\15$8T-\10\ e1\89u;M">лÈl\1c        ¶\19!\87j\ 5É!çB6\90I\14\1dB\17\9f\84xÆJ\81\86â:ñë²6Ê\ 1!%Í\ eÏ¡/C] [À\ 3È\ eS\ 3¤\aJ#¾á Pr\98*\80n
+\1a\ 2!aë\10KÈ`Ð\12N\ eµ\8b\1aÁì!À±\81ug\f\12ê\17\17biB¤\15\9c\11\ 6P^Ì&\92\ eÁ\8d¿D\b0±Jx;Ì\13ê\ e{\82óÅbc}Ñ\118\14\ 4\17í\84ÄCêa\8eç\9a\b`4/zT8\8e\81\89j\19ôÐZ!=$\1eþ.úkÑ,\aã9\11\89\93N|=I*H5Â\r\10\18\15\8a\14L õÃ\89\83    '\92³>ü\1f2\16±t=G##ѱ·W£xL@\1aw\8enE¤#£\82SØi\1c     ÜèøoÍ\8eQã4       êxtÜÒM\1d\9f\85?G
+`\v±n\12@|\18-\9dp$©9×Ǭ\91\12C\14­ð\ 5Í\8e;Ä¥DÏMØh\19,:v\10½\8eUE¥#!\ eþft¤Ã\f\eñ\8e\7fÁ¢Z;ɧ\17mX\ 2ä©Ê1ß\b\15\8a\ 2\84\87¸H\13\9cgXD\82\95é\18\93\11YhwT"¾\10á\8e|Ç»c\91Ñâæ)\8c\16
+\1ey\11k\99È`\rÑZÈBl R\14Q\88Î%\râ
+\91`ãÌ2×Ñ\10_\88«Ç±ãÉÊ\82H7L=>\11?\8fù\9c\84\8b¥b\7f¸]8"\8a\10\19\88\8c"Ý°\898üX=â\1e¹\ 2ù¨¨£\ 2\11~hzÌ0Jtð\8e,¢»J$\85ÛHyd=Þ\1d\93\8e*\1frc\121¯Â¹p3h\1c
+\r\\13\ eR\15\90(&~3\ 5&fZ\7fÁ\v¡\1c3B`¢Âq\ 5:\ 4s\14±ÀÓ\81g0\8f\92W"+x4\\89 ÁÎbÅP\8dx1Dëè\e\vä\r\9dȱ\18(:¬3~ÛX\8b¦\87ü£2ê\ 4\ 5\86à\bâ\ 4[X\vÃÚ"\19 :\98\rd\ 3úç^\1dØ\16\ 6$
\ 1ù\ eL-0ê\16\89¾\fç"¼\ e\84vr¤
\1f3\90\9bÆÀGb°\1f\88Vh\88Ñ\a}\19\rÇÛâ\80\11½\bL\/
+\13ç\14ïÀ\83Êe1¾\88q\8c\82Ð\17£ ÀC<\14\9d0\9axpd3ºL\8a0n5B ò\10\9b(\83|8:\ fU\8eÝD¬ 81iØ·ÁAY\ fÿ\8dæD\81#:QÂhsü\94¸\vohîÄÊãAÑ/\98\11l`ý\8aª\10\99\80úÐúxbÜ\f&\ 6Ë\90I\9c©\8b¼êXxYà:V\ 6»\rpHà#3E3H\86\9cõ@\11c:³\97)"\95±\8a80¼"º"b\fW\81-#kPÅÔ\15h\18\82=\12\aÚ ÄP®\10|C3V-\86kÆY¢\9b18(\ 5¤\e\16\1aí\8cTôá`âû0\1cj>¤ Q\88ù\8a\18\86¬0<\bh\94\ e\fÏ\10\9fÈ\ 3$\ 4Ïa\91\8d³®%°ÆM\1aH:\a_Æ[\ 2.8C¤\ 1Â\89\8aÄà¢/\83 \17iL\v¬\16C\91Z\82÷Í-R\8d\11R»®i"A\8dG\ 5æâJ${ÁA\88EÊ    \v\rÓH¬C\96\82\17ò[rF\86\aa\8dj\ 5ìâ6ò}c\8dÜ),\ e\856ÛÈìÃû&\91økT+\1c\13'\ eÉÄ\11äÆ\91*x_¬\13J\13\13\8c\80\ 1gc;\8eä\88\bt8\ 2\18·\89PH\ 3\11Á8$¬\11ª\16î\19WHÎ\ 5XP\vIsäB\12\85^pW\81¬ãïñÇ\98@ü Ò\8c\90\88\ 1ű\ 2\1d°\17       t¤H\1e\14\9f\8f\11ÄÚÝo\81\8cD2îâ\ 2\17\86\v¾Ã\17ÀÀ¤6äÀ\ 1^hT\1d\91Á\82I2Ö\83\92Ä\v¡\18Y\92\83   \ e\9cÒB#ç¤H%´$1\8cÀ9\1d\83Mr%É{´\91\95ÝX\ e5\89W\84X`\10\88\ 2x\bÆ\12w\81iFL$oð9(V\80ïuE\8dM\84r¤nñ\11C\ 5ü>ø\ 5×\ 4°DvN8\110\84Å\134v.\94-~A
\9bC\7f\13^h(Úk\14\1aì@oäi\ 60\97d\10F"\13»
+iI\8d£Ã`-)µpK\ 2\82rÉvÒ\80ï\92\b\83\ 4\1d\ 6\18w\89\ fG\1a¤ÄÑ\ 6Iq\1cK2\16ö?ïH\18@<R}\a'Ô~Ù\17\85\90ÂÃ"ä,1i!\85³&.!K\8eþÈ?!Ê1¼P`\1c\14\ e$}\8b³3AIBrâ°\90¼-F\18Aw\13F®LX\80\e1\10\9cI*\1f\e\8a_n\81\e²d\87P\f\13\9e½fk FÇ P²ë¨Q´1R\14\85\93\1eIK\9b\a\88bÄMê&\91\93i£A\96\9a\10\19ôH\9e\1eå\89¹É7Àn\12\ fY\9b4(òßf_\19Eì¤\1ce;ù\16\Cô\v£\8c\9e\9dG/õ\86Ý2\rþ\ 5®\e£\84-ãé\8f\11¹\ 4Êê´i\8c\11>\a\8eÆ\18±Ùá7ÔèÀ\v,\91 ¾Ïâ:%cøF|3J Õ\92×A\8b\17*\92ïô[ú3F\a\97\11òE\87\ 1}q/\99jÔEV
+t1\97\ e¤¡¹ñ/\17G³Kv-R       ZI\v¤ôÃ\¦7º)\15\8eB\12\9fÆ¥á\vrÛHÀ*@\1a\1a\93\81#J\våßÐCA6©ï)®n\86àÈëbá0$Q\8e<4^2J\94    ²I>Ï×XKT+\8c\17a¿\92r¤}qm\ 1¤¤Qn%DZÝ:'À\11àf¨\8f\8c6\98\b9\171Heâ\fÒ\97\b\ 2H/N\1cÛ\8b)Cl#\ f2Øè\83Ô8\ 2\8bõH"$\1c\90x\88n,:ð#\9f\82¡Éæáh2P¸rü&¶\1c\93\86\ 52?\1f9ñz\98\85tM:
\82$\9aI\ 6\80¬\17I¹'\8a\8eÍÉá£nrõ¨¤HÄ@\81ö\92mÇ®\83ðñ\868\9edT¶)º2¯&Ï#û0Ã\88zT!\86$@bz\ 6á\ 6æñóxz¬=z*\9d-K§%Î`Åø¸©¼M\9a*\9fK\9fÊú¡^)33z\88Tº*õF§J=\97®\8då\10\1dzEDÌî\19¨\81"\v½\11NB\eÀ7ê\1f£\92üÇ5£\ e0²×Á\1a@\9e\16\95\89\ 6HÚ¡Å+ØpÌJ\97Ô;\88\95i¾~`\82­Ûd\96,\10Ð\19\8b\83[I_\ 66P8vj¬\ 2®\19¨\95Ô\15 K½\91´ó\ 6À\ 3ô\ 3\8dV\1e\r\9d¡d2\88È2ÓK
+\11+\94èÊþ
+gn]I\eh7¾+y
+v8(`\92Ð0ir,\1dF\1c¥\84\8cI0eÒ°\80w\84\1aSÞ%Ë\94·ÅÊd\10ò\99h\8f,B\ 2\ 3«Hß\9a7åar!ø\8f$0\ 6$M\93vJ\82$0\90\ e¤\9a\9492$\1f\85°É.¤\8cÊö7@°Cf
\8díÊP]S-cS)<Tf\18a\96x\80í#Eѱ¸1»ê|\1e\8fkz¹\ eC\81à\v\80³$Z²\1et\96\97%B fi\fâ
+8=Ü\91ôÊû\ e©RRYCÄY2YjVRD)£z²ÊhE\fé í\9c\88D\84Iïu\826ZD\92=Xu>¦0caCª·\9f,    \r\1c\8f\95\97ÈdåTÒ7X äD\9a\16\97\ 3=JycxaèVÙ¢\1c>\15@H(\84%\80\10à=W\90Ü3<(§\81\17A4ÞRtX®\8c7²%WP¦­Ë\83ß2\91Øh\ 4A\9a\16ý\96åÈ[£©ê\98U?¸        ù-M\93Y5ÉZ%QEI\98l\19\92\ 10\97µÆÎ\804/jò¿é\\12\ 5>\97?\8aË\83\a\8cÌQ\ e\b\13\97¨KScu®\97X\98[62*8\97è\86×åÛrv¹\1dô\ fâ#\9de\15ÂÝa\e w©L$A\1a\95¿K\ 2WðRÉ¢ê#^Æ
\15\89Ä*eíd`\89KÜX\8e\ e;\96\8aI\84åË¢19M\14S²/ä\8b\10Ëæå<²îF±TS\1e\ 5ñ\91\9bÃø\9fƲ`é±´
+F!\ f\8c\86Â<å\ 2Èdé§ÜB¦,\1f\92\88\18Be;±\r5\9cìÞ`{\\92\8eÊ8\ e\ 1Ó:Iv\8c\97|\ 1\ e\98ÆÉ\f#\ 4ÓÌ\85)ér¡\ 1ü\96¶É®ã\18P_s9\f(V\8eblÊ\16\fæpòU¸Á\14a\96ýT\95$'\13æK\81^HQ,a\ e\1c\87\8c7Æ¢\v³\83\93⨠      \97\97\ 2æ[qÃÈÁü\11F0'\8f\97\85\14c\ fÓ\féM©Yù\vÓ\93TD\81!HÏ=y\11Èò\88\15ä\93F+\96Þ/Â¥÷`Xý\1d\16\96H\93\ e¥\7f\rÿ§ÿó=h{ZÊ\93Îͳ\82
+puÙ ¬ÿÚ\ e\8c\12\899\88TbªÞ¼\96 (\92\10©A\11Éé#{xú4\7f[#Ó[À0)·Äd\92½'\ 5\ 3Ð\ 5(æJO*\a8j£Y1Û`ZÌ£Â\a6\90³\94\8bäìV\f\rDVÁ~\83Xc\1d\92X\18\17JA`\90H¦b¦Ù!¤jP\85¢:B\8d>M&î&Hµ`\ 2øõ³P0t\8fÈ\9ep#t&8#\9dùéªd\98LèX$ó\93Q\e\ 4ú\b}>- ÌL¦ð¡.Òmz\90à\1e\1c\1e±L¬\8eð!ä5Xq        DÀº\19ÀÌSf$ÓÎÐ\99,ÛXÆ@\ 3×\87C\81\1a,\98\89Êì¢\90\ro\17U\8a?!\97)Ë\^e¹*cp\97¬\8bí\84\9aÙ@\ 4X2x\88#m¦K¦2ÓþÀSè\99©x\18$¸Lr¦ý!"Ò_ôj1Ôô\10ÜLa&[Í\16\9a\17°±DX9¡T\94<\13\ 5ÑÌ\88¤¨±$XÿLwU@3\99\19Ê´?ÀC\84\eª\94ÊI<s\9di\aáa\18yÚ:P½\81¦(\81Ù\11IAôd4)\9a¡¤¢"¾®Hò×"\1104u\99\87\95ÁXK,\950<y\fä3«\99¾J.ÐJ\93\rà÷y\fX§b\99âº\8b\1eo$»F\vk\82\ 5ÁÄ\ 2\ 6¢^      \9c\aÿ\1ai   \1d\82\9a\95\e¿\e®¨YpÓ,ÌÙýv\9aµ@¿\97OS#&<jj4y\11c\8f¥ ªÁÊ@ü@Ý\9c\99\v\ fGØ»©×\84\83\90\ 6\9e\vHͧ\88\¢$´\14ùjê3Á\81\81+·¥õ\b\ 3\94\1c\rÍ\97Ñõ\88°À*hjJ-\9e\9aoM\7f``@¸\91\9bÁ=dðì\9a?\85\95^\82Èâòr9l64\17\1e\91\93H
+       R\84V9ËG¦5Q\vØ\bÝcÛ\ 4\9fäÒ¼jªGè\80i·     Î/ç\8aS}0áÙ5\81Oé¡\ fMËæ-pÙÌ+qÜ\ 2\ 1²\ 1,ó´i\17\112-\ 2Ñ\ 4éÅ2À¶\8c60Û|l¢\16Ö#Í\8e\82\9f[\13¦\19 dât\18Ìd¨\9bi¦]SÞQ\93;nº\8b¤\ 4êLßfÄ%Ú\ 2ÎËmN4¥\9bñÀnS«Êý\83Ö¼jÞ\89\96\82á©Õ\14
+A yÊ\1c½­1qV{Ì\9fÝ\e\93\89IB\14\9bÑ1\89:\8cH× \1e³H&éKo~ôÖ\9b\8b@\1aà\15Ñ:\19[\ e_Rz\1c·\11\8d\17iÈT[\927üyqÁ\19\83ªbú\80ËP9XÉ\18\ fõ\8c¢¢Ù\ 3Ä`4\101¨Uø
+\80\16f
+\9d\ eRÃq\84P6#\9e\11Ñ\88\v#\86ÓBµä¡b^\98\f>'\85m\ f7"'±\93hgÙÑ~\15\92\98\11ç.âo¤\ 2LJ\b\15æ\90\88Ë\\85]\83W\ 1\94¸£]8Ï4%Î\1açª&d±ât\ 1`<.8±\v´Àì"\ 1Q»¸]\94
\bf\8aK\ fÅ©\87`,\149}'®\8d@\93lãÕ\81¡Ôu<\15e\9cÌ\94;¦,\90\r6Ìl«-\12¹r\e\ f \87ÇÃû0\97Û\87<9G\9cl@éÂϯ\88i4¡r\86
\8e²G")íÑ¥|nn\16¢\9cK\9e9g\12\8dîÁ\18HB¢Z\17ëG$\f:¤ÍY5ùs*<\ 2\9dBN;\97\a\88\e±\8e¼9\81\9c¡
+Aç\98³÷\11Ù\991ýNÊb\13\8aÞߥ3ùäÑiþ!\a\9dó°\95UR¬\89Ò@\81¢ \ 5Þ.z ¸\8b£sÆÙu0uR9ñ\e\92G\81%3Â\11SU8ÐÄ81\9dÒ\ 5/"ªóP\18m\991Ág\ 20½ÎHÌ\8f\13Ð\19ª\10vÞ:\97\143&¨\ eÁ\8bª\93u\11uÖåF\9c+=éÂQç\19HT»0\b\ 6\ fI\89¤E\12\aá®óHÂØtÖÒr¡69Ü%\89Á\11
+stf;»\ e\91 Qͺ±1\84\83Ô\98^\eµ\f'DÁ\8föäîÔpN9ÿB\ 6\87\g)D½U&qB´·VIýÎ%\ fP\93Ûɵ15Ì\98p\84M\80¦X\12\ 2*V'¤\8a\89\9d\9c¤4\9a¶ÓÔ¹é$ 
+V\ 6+s4kg3¢Ç     ã$S\fÒ´\83|4('BBáùeä­±ZdJ\̨Яæ\91\14Ð:wN\92|O¼\94ß\9c[\ 6\93ô\96sBÄå\14\ 3\8cΫ\ eW VÃS¸Ñ\1d«<\1ahÎÂIPî(\80ûCãÁ\1f\1d$
+\9aß\1f&I\98\93ñ\y\86*R\7fOÆa§PA1\92~\ 4\98µ8[\81\12\81÷ãî/áyõ\14tR9³\10\901E¦ú\91\1cb¹@\v\84=\ f\ 5°@²§tá\19òà¬\ fés¶r\Lý_\ 6b\8c\ 4WX\19þ\9cVÏ¿Q\8c¯\95¥\9fd\9e\9c$\1a\99\18ÎÀgס\90YÄTcZ¢´\96IL>&~³$@ÆìIr\ 4(\e\99\ 1$CI¯ ¸¸"l\17.\ 2Ë\15×\8eV\b·°Ut\ 5\8aß\90\14jÆb\84\ 2
\ No newline at end of file
diff --git a/clients/moira/Doc/internal.mss b/clients/moira/Doc/internal.mss
new file mode 100644 (file)
index 0000000..6d6f1f5
--- /dev/null
@@ -0,0 +1,1765 @@
+@Comment($Header$)
+@Make(Manual)
+@Device(PostScript)
+@PageFooting(center "Draft of @value(date)")
+@style(spacing = 1.5, indent 5, FontFamily = TimesRoman, size = 12)
+@style(LeftMargin 1 inch, RightMargin 1 inch)
+
+@Begin(TitlePage)
+@Begin(TitleBox)
+@b[The Athena Service Management System]
+@blankspace ( 1 line )
+@b[SMS Client Internals Document]
+@blankspace ( 1 line )
+@i[Chris D. Peterson]
+@End(TitleBox)
+@CopyrightNotice(Massachusetts Institute of Technology)
+@End(TitlePage)
+
+@Chapter(Introduction)
+
+The @i(Sms Client) program was designed to allow ordinary users a
+simple method of performing all database manipulations common here at
+@i(Project Athena).  The user interacts with the program through a
+terminal based menu.  This allows use of sms on a wide variety of
+platforms.  Unlike previous packages where many different clients were
+necessary to perform all these tasks, the @i(Sms Client) program
+allows all operations to be performed from one application.  This
+saves the user time and effort by having all common operations in one
+convenient place.  I have spent a good deal of time cleaning up the
+code to make it uniform throughout the entire client and am writing
+this document to explain some of the decisions. My hope is that this
+will allow you to add features with a minimum of amount effort, as
+well as easing the transition between your code and mine.
+
+@Chapter(Overview)
+
+This section presents general concepts that hold throughout the code.
+Some of the items may seem trivial, but together they keep the code
+consistent and understandable.
+
+@Section(File Organization)
+
+Most files correspond to one type of item in the @i(SMS) database,
+such as lists, machines, clusters, etc.  These files are self
+contained so that you can pick and choose which of these you would
+like to use in any new client you decide to build. There are a few
+special files that do not follow this convention.
+@begin(description)
+
+@i[util.c]@\Utility functions used by many of the other files.
+
+@i[menu.c]@\Menu definitions for the entire application.
+
+@i[main.c]@\The main driver that handles application start up.
+
+@i[delete.c]@\Functions that handle deletion of lists and users.
+
+@i[globals.c]@\All global variable definitions.
+@end(description)
+
+@Section(Command Organization)
+
+Each menu item has one and only one function associated with it,
+although the same function may be used by two identical menu items.
+The arguments passed to these functions from the menu package are an
+array of character strings and the number of strings in the array.
+The first argument in the array (argv[0]) is the name of the menu item
+that has been selected.  Thus the actual user specified arguments are
+passed starting at the second argument (argv[1]).
+
+@Section(Naming and Comment Conventions)
+
+@Index(Variables)
+@Index(Functions)
+
+I use all capital letters for constants, while variables are all small
+letters, and functions are represented by mixing capital and small
+letters, capitalizing each word in the function name.  I use long
+function names as functions are usually not called often, and long
+names are much more descriptive.  There are a few functions that do
+not follow the mixed caps and small convention, these are generally
+those I called out of @i(SMSLib), @i[CLib], or the menu package.
+
+@Index(Comments)
+
+Each file has a header containing the Revision Control System (RCS)
+modification time and some history information, as well as some
+information about the file.  The template for this is a file named
+'header'.  Each function has a comment preceding it describing the
+function, all variables used, and the value that this function
+returns.  Notes of special concern for this function are also listed
+here.  The function template is in a file called, surprisingly enough,
+'function'.  Other comments are placed where appropriate.
+
+@Section(Retrieving data from the server)
+@Label(queue-def)
+
+Since one of the limitations of @i[SMS] is that no query may be
+executed recursively, all information returned by a query must be
+received before another query can be executed.  To facilitate
+programming simplicity I store the information returned from each
+query into a queue as soon as it is received.  This allows a simple,
+although rather memory intensive, method of getting around this
+problem.  Another advantage of this method is that since no operations
+are taking place on the data as it comes back from the server the time
+that the server spends sending the data to the clients is kept to a
+minimum, a necessity in large-scale environments.
+
+@Chapter[Application Wide Definitions]
+
+This section will cover all items that cross function boundaries,
+including global variables, structure definitions, and constant
+definitions.
+
+@Section[Global Variables]
+
+@Label(Globals)The @i[SMS Client] has a few global variables.  Since
+you will run into them throughout the application they warrant mention
+here.
+@Index(program_name)
+@Index(user)
+@Index(verbose)
+@Index(found_some)
+@begin(description)
+@i[program_name] @\This is the name of the program currently being
+executed, and is retrieved from argv[0] in @i[main.c].
+
+@i[user] @\This is the name of the user currently executing the program,
+and is also set in @i[main.c].
+
+@i[verbose] @\This is a boolean value that, when FALSE turns off the
+delete confirmation.  For more information see section @ref(confirm).
+
+@i[found_some] @\This is a boolean that allows the @b[PrintByType()]
+(sect. @ref(pbytype) function to be able to communicate with the
+function calling the query that invokes it, as well as among calls to
+itself.
+@end(description)
+
+@Section[Structure Definitions]
+
+@Index(qelem)
+
+The only global structure definition is the one for the queue element.
+What I will refer to as the queue is actually a doubly linked list
+that all my queue manipulation functions (sect. @ref(queuecount))
+treat as a true queue.
+
+@begin(Format)
+struct qelem {
+  struct    qelem *q_forw;
+  struct    qelem *q_back;
+  char * q_data;
+};
+@end(Format)
+
+The queue data need not be a string; @i[char *] is used as a generic
+pointer here.
+
+@Section[Definitions]
+
+@Index(FVoid)
+@Index(FInt)
+@Index(FCharStar)
+
+For readability there are a few important global definitions.
+Function pointers in @i[C] tend to be tough to read so I have typedef'ed the
+function pointers; FVoid, FInt, and FCharStar.  These refer to functions
+that return nothing, integers, and strings, respectively.
+
+@Index(MOD_FORMAT)
+
+Another global definition, MOD_FORMAT, is used to format the
+modification information of an item for printing.  It is important that
+all modification information is presented to the user with this
+format, to keep the @i[SMS Client] consistent.
+
+@Index(Infodefs)
+@Label(infodefs)
+
+Information about an item in the database is returned by sms_query()
+in an array of strings.  Remembering what @i[info][7] is can be
+difficult and it is possible that in future updates of the @i[SMS
+Server] @i[info][7] may contain completely different information.  To
+solve both of these problems I have created a set of definitions for
+each element of the argument list of each data type that the @i[SMS
+Client] uses.  A list of these can be found in appendix
+@ref(a_infodefs), as well as the file @i[infodefs.h].
+
+@Chapter(Utility Functions)
+
+I created several utility functions that handle common operations used
+by many of the functions in the @i[SMS Client].  These functions
+perform things like the storing of information in a queue as it comes
+in from the @i(SMS Server), queue manipulation, querying the user, 
+and printing information.
+
+@Section(Storing and Freeing the Queue) 
+
+As noted in section @ref(queue-def), all incoming information from the
+@i(SMS Server) is stored in a queue as soon as it is received.  The
+function that does this, @b[StoreInfo()], as well the one that frees the
+queue when we are finished with it, @b[FreeQueue()], are described here.
+
+@Index(StoreInfo) 
+
+Use the function @b[StoreInfo()] to store all information received
+from the @i[SMS Server] into a queue.  Space for this queue is
+dynamically allocated using malloc().  The actual information is
+stored in a NULL terminated array of strings.  The number of strings
+in this array can be easily found with the function @b[CountArgs()]
+(sect. @ref(countargs)).
+@begin(format)
+
+int
+StoreInfo(@i[argc, argv, data])
+int @i[argc];
+char ** @i[argv];
+char * @i[data];
+@end(format)
+@begin(Description)
+
+@i[argc] @\The number of strings passed in argv.
+
+@i[argv] @\An array of strings to be stored in the queue.
+
+@i[data] @\A pointer to the previous element in this queue, or NULL if@\it
+should create a new queue.  This is updated with each call to @b[StoreInfo()]
+and the value associated with this pointer is the last element in the
+queue.
+
+@end(Description)
+@blankspace(1 line)
+Here is an example of an @i[SMS] query that would use this function to store
+its arguments.
+
+@Begin[Format]
+
+struct qelem * elem = NULL;
+status = sms_query("query handle", num_args, args, StoreInfo, &elem);
+
+@End[Format]
+
+The variable elem must initially be set to NULL, or @b[StoreInfo()]
+will try to add the first element of this queue to a currently
+existing queue that is really just the garbage left on the stack.  The
+value of elem when this query returns is the last element in the
+queue, and the function @b[QueueTop()] (section @ref(queuetop)) should
+be used to get the top element of the queue, which is expected by most
+other queue operations.
+
+@Center(________)
+
+@Index(FreeQueue)
+
+To free the queue and any data associated with it, the function
+@b[FreeQueue()] is used.  This function expects a queue similar to the
+one created by the @b[StoreInfo()] function.  @b[FreeQueue()] frees
+all memory associated with this particular queue, and will do bad
+things if the information stored in the queue is not a NULL
+terminated, allocated array of allocated strings.  All allocations
+are assumed to have been done with the @i[C] malloc() function.
+
+@begin(Format)
+
+void
+FreeQueue(@i[elem])
+struct qelem * @i[elem];
+@end(Format)
+@begin(Description)
+
+@i[elem] @\Any element in the queue.  The entire queue will be freed
+regardless of the element passed.
+@end(Description)
+
+@Section[Queue Manipulation]
+
+The following group of functions perform common tasks that involve
+retrieving information from or manipulating a queue.  All these functions
+will handle NULL passed to them in an appropriate manner, either returning
+zero, or NULL.
+
+@Label(queuetop)
+@Index(QueueTop)
+
+To find the top element of a queue use the function @b[QueueTop()].  
+
+@begin(Format)
+
+struct qelem * 
+QueueTop(@i[elem])
+struct qelem * @i[elem];
+@end(Format)
+@begin(Description)
+@i[elem] @\Any element in the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[QueueTop()] returns the top element of the queue defined by its
+argument.
+
+@Center(________)
+
+
+@label(queuecount)
+@Index(QueueCount)
+
+The function @b[QueueCount()] counts the number of elements in a queue.
+
+@begin(Format)
+int
+QueueCount(@i[elem])
+struct qelem * @i[elem];
+@end(Format)
+@begin(Description)
+@i[elem] @\Any element in the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[QueueCount()] returns the number of elements in the queue defined
+by it argument, it need not be the top element, any
+element will do.
+
+@Section[Array Manipulation]
+
+The arrays of strings have some manipulation functions of their own.
+All arrays used in the @i[SMS Client] are assumed to be NULL terminated. 
+In general this is no problem as @b[StoreInfo()] creates NULL terminated
+arrays.
+
+@Label(countargs)
+@Index(CountArgs)
+
+@b[CountArgs()] counts the number of elements in a NULL
+terminated array of strings.
+
+@begin(Format)
+int
+CountArgs(@i[info])
+char ** @i[info];
+@end(Format)
+@begin(description)
+info @\A NULL terminated array of character strings.
+@end(description)
+
+@blankspace(1 line)
+
+@b[CountArgs()] returns the number of strings in the NULL terminated array
+of strings passed to it.  A common use of @b[CountArgs()] is to tell
+sms_query() how many items are in the argument list passed to the
+query, as shown below.
+@begin(format)
+
+status = sms_query("query", CountArgs(args), args, StoreInfo, &elem);
+@end(format)
+
+@Center(________)
+@Index(FreeInfo)
+
+To free all elements in a NULL terminated array of strings use the 
+@b[FreeInfo()] function.
+
+@begin(Format)
+void
+FreeInfo(@i[info])
+char ** @i[info];
+@end(Format)
+
+@begin(Description) 
+
+@i[info] @\A NULL terminated array of strings allocated with malloc(),
+to be freed.
+@end(Description)
+
+@Center(________)
+
+
+@Label(sinn)
+@Index(SlipInNewName)
+
+Most update queries use the same argument list that is returned by the
+information query for the database item is question.  For instance,
+update_list uses almost the same arguments that get_list_info returns.
+The difference in these arguments lists is that update queries expect
+the new name to be the second element in the list.  The
+@b[SlipInNewName()] function adds the new name as the second argument
+in the list passed to it, bumping all the other arguments down one
+slot.
+
+@begin(Format)
+void
+SlipInNewName(@i[info, name])
+char ** @i[info];
+char * @i[name];
+@end(Format)
+
+@begin(Description)
+@i[info] @\A NULL terminated array of strings.
+
+@i[name] @\The new name to be slipped into @i[info] at position @i[info][1].
+@end(Description)
+
+@Blankspace(1 line)
+
+Once @b[SlipInNewName()] has been performed on a argument list do not
+try to use the definitions for that type of element,  as they will be
+wrong.  Don't use @i[info][L_ACE] to try to retrieve the ace of the
+list, as this function has shifted all the items except the old name
+down one element.
+
+@Section[Special Queue Functions]
+
+The following two functions @b[Loop()] and @b[QueryLoop()] are used
+when an operation needs to be performed on every element of the queue.
+The difference between these two functions is that @b[QueryLoop()]
+presents a method of asking the user if the operation should be
+performed, while @b[Loop()] just performs it on each element.
+
+@Index(Loop)
+@Index(LoopFunc)
+
+To perform an operation on every element in the queue use the
+@b[Loop()] function.
+
+@begin(Format)
+void
+Loop(@i[top, LoopFunc])
+struct qelem * @i[top];
+FVoid @i[LoopFunc];
+@end(Format)
+@begin(Description)
+@i[top] @\The top element of the queue.
+
+@i[LoopFunc] @\The function to perform on each element of the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+The @i[LoopFunc] has the following format and is performed with the
+data of each element in the queue.
+
+@begin(Format)
+void
+LoopFunc(@i[info])
+char ** @i[info];
+@end(Format)
+@begin(Description)
+@i[info] @\The array of strings that is stored as the @i[q_data] of each element
+of the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+No provision is made for the @i[LoopFunc] function to return a value.
+
+@Center(________)
+
+
+@Label(qloop)
+@Index(QueryLoop)
+@Index(PrintFunc)
+@Index(QueryLoopFunc)
+
+If you want to query the user before your function is called on each
+element of the queue, use the @b[QueryLoop()] routine.
+
+@Begin[Format]
+void
+QueryLoop(@i[top, PrintFunc, QueryLoopFunc, query_string])
+struct qelem * @i[top];
+FCharStar @i[PrintFunc];
+FVoid @i[QueryLoopFunc];
+char * @i[query_string];
+@End[Format]
+@begin(Description)
+@i[top] @\The top element of the queue.
+
+@i[PrintFunc] @\The function that will print information to the user
+about each specific element of the queue, its return value is appended
+to the query string, and asked as a @b[YesNoQuitQuestion()] (sect.
+@ref[ynqquestion]) of the user.
+
+@i[QueryLoopFunc] @\This function is called  if the user answers yes to the
+question asked of him, or if there is only one element in the queue.
+
+query_string @\Basic prompt for the @b[YesNoQuitQuestion()] asked of
+the user, the string returned by the @i[PrintFunc] is appended to this
+string to form the full prompt.
+@end(Description)
+
+@blankspace(1 line)
+
+@Index(PrintFunc)
+
+@i[PrintFunc] is called using the data stored in each element of the
+queue, unless there is only one element in the queue, in which case
+@i[QueryLoopFunc] is called without querying the user. @i[PrintFunc]
+has the following format.
+
+@begin(Format)
+char *
+PrintFunc(@i[info])
+char ** @i[info];
+@end(Format)
+@begin(Description)
+
+@i[info] @\The array of strings that is stored as the @i[q_data] of
+each element in the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+The @i[PrintFunc] returns a string that is to be appended to the
+query_string() of the @b[QueryLoop()] function.  This string is then
+used to ask the user if the @i[QueryLoopFunc] should be called.  The
+return string from the @i[PrintFunc] is usually just the name of the
+item contained in the data field of each queue element.
+
+@Index(QueryLoopFunc)
+
+@i[QueryLoopFunc] is called each time the user answers 'yes' to the
+question asked of him, with the current element's information.  The
+only exception to this is if the queue has only one element, in which
+case @i[QueryLoopFunc] is called immediately with @i[one_item] set to TRUE.
+@i[QueryLoopFunc] has this format.
+
+@begin(Format)
+void
+QueryLoopFunc(@i[info, one_item])
+char ** @i[info];
+Bool @i[one_item]
+@end(Format)
+@begin(Description) 
+
+@i[info] @\The array of strings that is stored as the @i[q_data] of
+each element in the queue.
+
+@i[one_item] @\This is TRUE if this function is being called without asking
+the user, because there is only one item in the queue.
+@end(Description)
+
+@blankspace(1 line)
+
+No provision is made for the @b[QueryLoop()] function to return a value.
+
+@b[QueryLoop()] automatically performs the @i[QueryLoopFunc] without
+calling the @i[PrintFunc] if there is only one item in the queue, but
+the @i[QueryLoopFunc] is alerted to this fact by the @i[one_item]
+variable.  If there is more than one item on the queue the the
+@i[PrintFunc] is executed, and the user is prompted, as in the
+following example.
+
+@begin(format)
+@tabset(10)
+
+@b[Source Code:]
+
+QueryLoop(top_of_queue, PrintListInfo, UpdateList, "Would you like to update list");
+
+@tabclear()
+@tabset(50, 60)
+@b[User Sees:]
+
+List: foo  @\Members: @\35
+This list is a group@\GID: @\9803
+
+Would you like to update list foo (y/n/q) [n]: 
+@end(format)
+
+This question is asked of the user for every item in the queue, and if
+the answer is yes then the @i[QueryLoopFunc] is called.  If the answer
+is no then it continues onto the next element, quit drops out of the
+loop entirely.
+
+@Index(NullPrint)
+
+The return value of the @i[PrintFunc] is the name of the list in the
+above example (i.e. foo).  A simple print function, @b[Nullprint()],
+is detailed in section @ref(nullprint). If @b[Nullprint()] were used
+in the above example following would be the result:
+
+@blankspace(1 line)
+
+@begin(Format)
+Would you like to update list foo (y/n/q) [n]: 
+@end(Format)
+
+@Section[Generic @i{SMS} query routines]
+
+These two very common routines are used as sms_query() callbacks.
+Using these common routines helps other programmers immediately
+identify what type of tuples your query is expected to return.
+
+@Index(Scream)
+
+Use the @b[Scream()] function when you do not expect any tuples to be
+returned by the @i[SMS Server], as in an update, add, or delete query.
+
+@begin(Format)
+int
+Scream()
+@end(Format)
+
+A Sample use of this function.
+
+@begin(Format)
+status = sms_query("update_list", CountArgs(args), args, Scream, NULL);
+@end(Format)
+
+@Center(________)
+
+
+@Index(NullFunc)
+
+@b[NullFunc()] does nothing at all with the tuples, it just ignores them.
+
+@begin(Format)
+int
+NullFunc()
+@end(Format)
+
+@b[NullFunc()] is useful when you are expecting tuples to be returned,
+but are not interested in their contents, I used it when I was testing
+for existence of a list by performing a count_members_of_list query
+and then testing the return value, but was not interested in the
+tuples. A sample use of this @b[NullFunc()].
+
+@begin(Format)
+status = sms_query("get_list_info", CountArgs(args), args, NullFunc, NULL);
+@end(Format)
+
+@Section[Retrieving User Input]
+
+To keep a consistent user interface across the entire application, the
+@i[SMS Client] uses the following functions to handle most user input.
+The only other accepted method of retrieving user input is by making
+a call to @b[Prompt_input()], which is in the menu library, and the
+basis for all these functions.
+
+@Index(PromptWithDefault)
+
+Use @b[PromptWithDefault()] when you need to prompt the user for a value
+and you want to provide him with a default value.
+
+@begin(Format)
+int
+PromptWithDefault(@i[prompt, buf, buflen, def])
+char * @i[prompt], * @i[buf];
+int @i[buflen];
+char * @i[def];
+@end(Format)
+
+@begin(Description)
+prompt @\The string to prompt the user with.
+
+buf @\The buffer to return the answer in.
+
+buflen @\The length of the return buffer.
+
+def @\The default return value (if NULL then "" is the default).
+
+@End[Description]
+
+@Blankspace( 1 line)
+
+A typical call to this function is as follows:
+@begin(format)
+
+@b[Source Code:]
+
+PromptWithDefault("Input a value for the string", buf, BUFSIZ, "foo");
+
+@b[User Sees:]
+
+Input a value for the string [foo]: 
+
+@end(format)
+
+@b[PromptWithDefault()] will return (-1) if the user breaks out of this
+prompt with control-C or some other break character.
+
+@Center(________)
+
+
+@Label(ynquestion)
+@Index(YesNoQuestion)
+
+@b[YesNoQuestion()] is used to ask the user a question that is best
+answered with a response of either yes or no.  It also gives the user
+a default value in the same form as @b[PromptWithDefault()]. 
+
+@begin(Format)
+Bool
+YesNoQuestion(@i[prompt, bool_def])
+char @i[*prompt];
+Bool @i[bool_def];
+@end(Format)
+
+@begin(Description)
+@i[prompt] @\The string to prompt the user with.
+
+@i[bool_def] @\The default value, either TRUE or FALSE.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[YesNoQuestion()] returns either TRUE or FALSE, or possibly (-1) on
+a break by the user.  The only accepted values from the user are 'y',
+'Y', 'n', and 'N'.  All other values prompt the user with "Please
+answer 'y' or 'n'." and ask the question again.
+
+@Center(________)
+
+
+@Label(ynqquestion)
+@Index(YesNoQuitQuestion)
+
+Use @b[YesNoQuitQuestion()] when you want the user to have the option to
+quit as well as answer yes or no.
+
+@begin(Format)
+Bool
+YesNoQuitQuestion(@i[prompt, bool_def])
+char @i[*prompt];
+Bool @i[bool_def];
+@end(Format)
+
+@begin(Description)
+
+@i[prompt] @\The string to prompt the user with.
+
+@i[bool_def] @\The default value, either TRUE or FALSE.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[YesNoQuitQuestion()] is very similar to @b[YesNoQuestion()], in
+fact the only difference is that this function interprets the keys 'q'
+and 'Q' the same as hitting a break, causing
+@b[YesNoQuitQuestion()] to return (-1).
+
+@Center(________)
+
+
+@Label(confirm)
+@Index(Confirm)
+
+When you want to ask the user for delete confirmation use the @b[Confirm()]
+function.
+
+@begin(Format)
+Bool
+Confirm(@i[prompt])
+char * @i[prompt];
+@end(Format)
+@begin(Description)
+@i[prompt] @\The string to prompt the user with.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[Confirm()] is a specialized user input function.  This function is
+meant to be used only when making delete confirmation.  It will
+immediately return TRUE if the verbose global variable (see section
+@ref(globals)) is FALSE, implying that no confirmation is wanted.
+Otherwise it asks the user a @b[YesNoQuestion()] using its argument as
+the prompt, with a default value of FALSE.  If the user answers yes
+then the function will return TRUE, otherwise FALSE is returned.
+
+@Center(________)
+
+
+@Label(gvfu)
+@Index(GetValueFromUser)
+
+The @b[GetValueFromUser()] routine is used to update a string that was
+previously allocated with malloc().
+
+@begin(format)
+int
+GetValueFromUser(@i[prompt, pointer])
+char * @i[prompt], ** pointer;
+@end(format)
+@begin(Description)
+@i[prompt] @\The string to prompt the user with.
+
+@i[pointer] @\A pointer to the malloced item that is to be updated, or a
+pointer to NULL.
+@end(Description)
+
+@Blankspace( 1 line )
+
+@b[GetValueFromUser()] returns SUB_ERROR if the user broke out of the
+prompt with control-C, else SUB_NORMAL.  The old value is freed,
+unless it is NULL, and the new value is allocated and pointed to by
+@i[pointer].
+
+@Center(________)
+
+
+@Index(GetYesNoValueFromUser)
+
+If the value to be updated is an @i[SMS] style boolean ("0" or "1")
+then use the the @b[GetYesNoValueFromUser()] function, which asks the
+user a @b[YesNoQuestion()].
+
+@begin(Format)
+int
+GetYesNoValueFromUser(@i[prompt, pointer])
+char * @i[prompt], ** @i[pointer];
+@end(Format)
+
+@begin(Description)
+@i[prompt] @\The string to prompt the user with.
+
+@i[pointer] @\A pointer to the malloced item that is to be updated, or a
+pointer to NULL.
+@end(Description)
+
+@Blankspace( 1 line)
+
+@b[GetYesNoValueFromUser()] also returns SUB_ERROR if the user broke
+out of the prompt with control-C, and SUB_NORMAL otherwise.
+@i[pointer] is freed - Unless it is NULL - and reset to point to a
+properly allocated value of "0" or "1" depending upon the user's answer
+to the question.
+
+@Center(________)
+
+
+@Index(GetFSTypes)
+
+The @i[SMS Server] expects file types to be passed as an integer bit
+mask.  Use the @b[GetFSTypes()] function to query the user about the
+new value of this field.
+
+@begin(Format)
+int
+GetFSTypes(@i[pointer])
+char **  @i[pointer];
+@end(Format)
+
+@begin(Description) 
+@i[pointer] @\A pointer to the current allocated filesystem type that
+is to be updated, or a pointer to NULL.
+@end(Description)
+
+@Blankspace( 1 line)
+
+@b[GetFSTypes()] returns SUB_ERROR if the user broke out of the prompt
+with control-C, and SUB_NORMAL otherwise.  It also constructs the
+correct bit field by asking the user about each type, providing a
+default value, of course.  The new filesystem type is passed back as
+the new value pointed to by @i[pointer].  If non-NULL the old pointer
+is freed.
+
+@Section[Printing Routines]
+
+Here are a few general printing routines.  Most printing is done with
+routines that are specific to the type of database item we are dealing
+with, but these few printing functions are general enough to describe
+here.
+
+@Label(print)
+@Index(Print)
+
+Use the @b[Print()] function to print out all elements in each tuple 
+returned by a call to sms_query().
+
+@begin(Format)
+int
+Print(@i[argc, argv, callback]);
+int @i[argc];
+char ** @i[argv], * @i[callback];
+@end(Format)
+
+@begin(Description)
+@i[argc] @\The number if strings passed in argv.
+
+@i[argv] @\An array of strings that is the data to be stored in the queue.
+
+@i[callback] @\Not Used.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[Print()] returns SMS_CONT.  Every time this function is called it
+sets the global variable @i[found_some] to TRUE.
+
+@Center(________)
+
+@Label(pbytype)
+@Index(PrintByType)
+
+If you want something a bit more specialized then try
+@b[PrintByType()].  If a string compare of @i[argv][0] and
+@i[callback] shows them to be equal then the tuple is printed.  If
+@i[callback] is NULL then it acts exactly like @b[Print()].
+
+@begin(Format)
+int
+PrintByType(@i[argc, argv, callback]);
+int @i[argc];
+char ** @i[argv], * @i[callback];
+@end(Format)
+
+@begin(Description)
+@i[argc] @\The number if strings passed in argv.
+
+@i[argv] @\An array of strings that is the data to be stored in the queue.
+
+@i[callback] @\@i[Argv][0] is compared to this with strcmp() and if
+they are equal then the tuple printed.  In the special case where
+callback is NULL all tuples are printed.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[PrintByType()] returns SMS_CONT.  Every time this function is
+called it sets the global variable found_some to TRUE.
+
+@Center(________)
+
+
+@Index(PrintHelp)
+
+If the help information is stored in a NULL terminated array of strings
+then use the @b[PrintHelp()] function to print the information for the user.
+
+@begin(Format)
+int
+PrintHelp(@i[message])
+char ** @i[message];
+@end(Format)
+
+@begin(Description)
+@i[message] @\The help message stored in a NULL terminated array of strings.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[PrintHelp()] returns DM_NORMAL to allow help routines to remain as
+simple as possible.
+
+@Center(________)
+
+
+@Index(NullPrint)
+@Label(nullprint)
+
+When using the @b[QueryLoop()] function (sect. @ref(qloop)) there are
+times when all the @i[PrintFunc] needs to return is the name of the item, if
+the item's name is the first element of the tuple then use the @b[NullPrint()]
+function to retrieve this name.
+
+@begin(Format)
+char *
+NullPrint(@i[info])
+char ** @i[info];
+@end(Format)
+@begin(Description)
+info@\ An array of strings.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[NullPrint()] returns the first element in the array passed to it,
+@i[info][0].
+
+@Section[Miscellaneous Utility Functions]
+
+This section contains the rest of the utility functions, these don't
+really fit into a category.
+
+@Index(FreeAndClear)
+
+Use @b[FreeAndClear()] to free a pointer and set it to NULL.
+
+@Begin[Format]
+void
+FreeAndClear(@i[pointer, free_it])
+char ** @i[pointer];
+Bool @i[free_it];
+@End[Format]
+
+@begin(Description) 
+
+@i[pointer] @\A pointer to the item to free or clear, if this item is
+NULL then the function does not try to free it.
+
+@i[free_it] @\This function always sets the item to NULL, but only if
+this is TRUE is it freed.
+
+@end(Description)
+
+@Blankspace(1 line)
+@Center(________)
+
+
+@Index(ValidName)
+
+@b[ValidName()] check to see if string is a valid name for a new
+item in the database.
+
+@begin(Format)
+Bool
+ValidName(@i[s])
+char * @i[s];
+@end(Format)
+
+@begin(Description)
+@i[s] @\The string to check.
+@end(Description)
+
+@Blankspace( 1 line )
+
+If the name is not valid, @b[ValidName()] alerts the user to the
+problems encountered and returns FALSE.  Checks are made to see if
+this name contains a wildcard, contains spaces, or has no characters
+at all.  This is by no means an exhaustive search, but does handle some
+common things that confuse the database.
+
+@Center(________)
+
+
+@Index(ToggelVerboseMode)
+
+The @b[ToggleVerboseMode()] function is associated with the menu items
+that allows the user to toggle the verbose global variable (see sect.
+@ref(globals)).
+
+@Center(________)
+
+
+@Index(Strsave)
+
+Use the @b[Strsave()] function to allocate space for a new string.
+
+@begin(Format)
+char *
+Strsave(@i[str])
+char * @i[str];
+@end(Format)
+
+@begin(Description)
+@i[str] @\The string that needs to have space allocated for it.
+@end(Description)
+
+@Blankspace( 1 line )
+
+@b[Strsave()] returns an allocated copy of the string passed to it.
+
+@Center(________)
+
+
+@Index(EncryptMITID)
+@Index(RemoveHyphens)
+
+To save an MIT ID number two functions are needed, @b[EncryptMITID()] and
+@b[RemoveHyphens()].
+
+@begin(Format)
+void
+EncryptMITID(@i[sbuf], @i[idnumber], @i[first], @i[last])
+char * @i[sbuf], * @i[idnumber], * @i[first], * @i[last];
+@end(Format)
+
+@begin(Description)
+@i[spbuf] @\The buffer used to return the encrypted id number.
+
+@i[idnumber] @\The unencrypted id number.
+
+@i[first, last] @\The name of the user whose id number we are encrypting.
+
+@end(Description)
+
+@Blankspace(1 line)
+@Center(________)
+
+
+@begin(Format)
+void
+RemoveHyphens(@i[str)]
+char * @i[str];
+@end(Format)
+
+@begin(Description) 
+
+@i[str] @\This is the string with hyphens to remove, when the function
+returns it will no longer have hyphens.
+@end(Description)
+
+@Chapter[Function Organization within Files]
+
+The functions within each of the files tend to be quite similar.  I
+have organized these so that at the top of the file are all the
+general routines for the type of element currently being worked upon.
+In @i[attach.c], for example, there is a @b[PrintFSInfo()] function, an
+@b[AskFSInfo()] function, and a @b[GetFSInfo()] function.  Each of the
+item types will have a file that contains very similar functions, and
+all will be grouped near the top of the file.  As an example consider the
+general functions in @i[attach.c].
+
+@b[PrintFSInfo()] is used to print out all the information about a filesystem.
+
+@begin(Format)
+static char *
+PrintFSInfo(@i[info])
+char ** @i[info];
+@end(Format)
+
+@begin(Description)
+@i[info] @\A NULL terminated array of strings that contains all information 
+about a filesystem.
+@end(Description)
+
+@blankspace(1 line)
+
+@b[PrintFSInfo()] has the same format as @i[PrintFunc] (sect.
+@ref(qloop)) and can be used as the @i[PrintFunc] for @b[QueryLoop()]
+calls in the functions that update and delete filesystems.
+
+@Center(________)
+
+
+@b[AskFSInfo()] is used to ask the user to update the current filesystem
+information.
+
+@begin(Format)
+static char **
+AskFSInfo(@i[info, name])
+char ** @i[info];
+Bool @i[name];
+@end(Format)
+
+@begin(Description) 
+
+@i[info] @\A NULL terminated array of malloced strings that contains
+all information about a filesystem.  When the function is called this
+array contains the default values to present to the user, and when the
+function is returned this array contains the argument list for the
+update or add query.
+
+@i[name] @\A boolean value that when TRUE tells this function to ask
+the user for a new value for the name of this filesystem, and then
+slip it into the @i[info] list, using @b[SlipInNewName()] (sect.
+@ref(sinn))
+@end(Description)
+
+@Blankspace( 1 line )
+
+The return value of @b[AskFSInfo()] is just the @i[info] array after
+it has been updated with the new values.  This function is used to
+perform most of the information gathering in the update and add
+filesystem queries.  For an update query the information returned from
+a @i[get_filesys_by_label] can be used for the @i[info] array, but for
+an add filesystem, the program must come up with a reasonable set
+default values for the @i[info] array.
+
+If the @i[name] flag is set then the @b[SlipInNewName()] function is
+called to add a new name to the @i[info] array, this causes the array
+indices for most values to be changed and thus the predefined values
+used to access the information in this array can no longer be used
+(see sections @ref(infodefs) and @Ref(sinn)).
+
+@Center(________)
+
+
+The @b[GetFSInfo()] function is used to to perform common information
+gathering @i[SMS] queries for a filesystem.
+
+@begin(Format)
+static struct qelem *
+GetFSInfo(@i[type, name])
+int @i[type];
+char * @i[name];
+@end(Format)
+
+@begin(Description)
+@i[type] @\The type of filesystem query to make, can be one of;
+LABEL, MACHINE, GROUP or ALIAS.  The valid names for @i[type] are 
+typedef'ed at the beginning of each file.
+
+@i[name] @\The name to pass as the argument to the query.
+@end(Description)
+
+@Blankspace(1 line)
+
+The @b[GetFSInfo()] function is a simple method of making the most
+common information gathering @i[SMS] queries, it handles all return
+values from the call to sms_query() and returns the top element of a
+queue containing all information returned by the server.  If an error
+is detected then NULL is returned and an error message is printed to
+the user.
+
+After this group of general functions come those that actually
+correspond to items in the menu.  These commonly perform get, add,
+update, and delete operations.  For more information on the functions
+in each of the files see the appendix @ref(fqlist).
+
+@Appendix(The @i[SMS] Query String Array Definitions)
+
+@Label(a_infodefs)
+
+@Begin[Format]
+
+/*
+ *     This file contains all definitions that allow easy access to 
+ * elements returned by most of the @i[SMS] queries.
+ *
+ *     If the order of the arguments in the @i[SMS] queries change (again)
+ *  then all that needs to be changed are the values of these items 
+ * and all should be well, (hopefully :-).
+ *
+ *                                 Chris D. Peterson - kit@@athena
+ *                                   6/8/88
+ */
+
+@Begin[Verbatim]
+
+#ifndef _infodefs_
+#define _infodefs_
+
+#include "mit-copyright.h"
+
+#define NAME 0
+
+/* get_ace_use */
+
+#define ACE_TYPE 0
+#define ACE_NAME 1
+#define ACE_END  2
+
+/* alias queries. */
+
+#define ALIAS_NAME  0
+#define ALIAS_TYPE  1
+#define ALIAS_TRANS 2
+#define ALIAS_END   3
+
+/* Cluster information queries */
+
+#define C_NAME       0
+#define C_DESCRIPT   1
+#define C_LOCATION   2
+#define C_MODTIME    3
+#define C_MODBY      4
+#define C_MODWITH    5
+#define C_END        6
+
+/* Cluster Data information queries */
+
+#define CD_NAME      0
+#define CD_LABEL     1
+#define CD_DATA      2
+#define CD_END       3
+
+/* Delete Member from list queries. */
+
+#define DM_LIST      0
+#define DM_TYPE      1
+#define DM_MEMBER    2
+#define DM_END       3
+
+/* Filesys queries */
+
+#define FS_NAME         0
+#define FS_TYPE         1
+#define FS_MACHINE      2
+#define FS_PACK         3
+#define FS_M_POINT      4
+#define FS_ACCESS       5
+#define FS_COMMENTS     6
+#define FS_OWNER        7
+#define FS_OWNERS       8
+#define FS_CREATE       9
+#define FS_L_TYPE       10
+#define FS_MODTIME      11
+#define FS_MODBY        12
+#define FS_MODWITH      13
+#define FS_END          14
+
+/* Get List Of Member queries. */
+
+#define GLOM_NAME     0
+#define GLOM_ACTIVE   1
+#define GLOM_PUBLIC   2
+#define GLOM_HIDDEN   3
+#define GLOM_MAILLIST 4
+#define GLOM_GROUP    5
+#define GLOM_END      6
+
+/* General List information queries. */
+
+#define L_NAME     0
+#define L_ACTIVE   1
+#define L_PUBLIC   2
+#define L_HIDDEN   3
+#define L_MAILLIST 4
+#define L_GROUP    5
+#define L_GID      6
+#define L_ACE_TYPE 7
+#define L_ACE_NAME 8
+#define L_DESC     9
+#define L_MODTIME  10
+#define L_MODBY    11
+#define L_MODWITH  12
+#define L_END      13
+
+/* List Member information queries. */
+
+#define LM_LIST   0
+#define LM_TYPE   1
+#define LM_MEMBER 2
+#define LM_END    3
+
+/* Machine information queries */
+
+#define M_NAME       0
+#define M_TYPE       1
+#define M_MODTIME    2
+#define M_MODBY      3
+#define M_MODWITH    4
+#define M_END        5
+
+/*  Machine to cluster Mapping */
+
+#define MAP_MACHINE  0
+#define MAP_CLUSTER  1
+#define MAP_END      2
+
+/*  NFS phys. queries. */
+
+#define NFS_NAME    0
+#define NFS_DIR     1
+#define NFS_DEVICE  2
+#define NFS_STATUS  3
+#define NFS_ALLOC   4
+#define NFS_SIZE    5
+#define NFS_MODTIME 6
+#define NFS_MODBY   7
+#define NFS_MODWITH 8
+#define NFS_END     9
+
+/* PO box information queries */
+
+#define PO_NAME    0
+#define PO_TYPE    1
+#define PO_BOX     2
+#define PO_END     3
+
+/* Quota queries */
+
+#define Q_FILESYS   0
+#define Q_LOGIN     1
+#define Q_QUOTA     2
+#define Q_DIRECTORY 3  
+#define Q_MACHINE   4
+#define Q_MODTIME   5
+#define Q_MODBY     6
+#define Q_MODWITH   7
+#define Q_END       8
+
+/* User information queries */
+
+#define U_NAME    0
+#define U_UID     1
+#define U_SHELL   2
+#define U_LAST    3
+#define U_FIRST   4
+#define U_MIDDLE  5
+#define U_STATE   6  
+#define U_MITID   7
+#define U_CLASS   8
+#define U_MODTIME 9
+#define U_MODBY   10
+#define U_MODWITH 11
+#define U_END     12
+
+#endif _infodefs_      /* Do not add anything after this line. */
+
+@End[Verbatim]
+
+@End[Format]
+
+@Appendix(List of Menus, Functions, and Query Names)
+
+@Label(fqlist)
+
+@blankspace(2 lines)
+
+The menu tree for the @i[SMS Client] has three levels, the root, tier
+1 and tier 2.  A diagram of the menu tree is show in appendix @ref(tree).
+The root of the tree is composed of calls to other menus.
+
+@blankspace(2 lines)
+
+@begin(Group)
+@Center(Sms Database Manipulation)
+@begin(Verbatim)
+
+ 1. (cluster)      Cluster Menu.
+ 2. (filesys)      Filesystem Menu.
+ 3. (list)         Lists and Group Menu.
+ 4. (machine)      Machine Menu.
+ 5. (nfs)          Physical NFS Menu.
+ 6. (user)         User Menu. 
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+@Hinge()
+@Section[First Tier Menus]
+
+@Center{ @b[Cluster Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Get cluster information.
+ 2. (add)          Add a new cluster.
+ 3. (update)       Update cluster information.
+ 4. (delete)       Delete this cluster.
+ 5. (mappings)     Machine To Cluster Mappings Menu.
+ 6. (c_data)       Cluster Data Menu.
+ 7. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@Begin(Format)
+@tabset(20,40,60)
+show@\get_cluster
+add@\get_cluster@\add_cluster
+update@\get_cluster@\update_cluster
+delete@\get_cluster@\delete_cluster
+
+@End[Format]
+@Hinge()
+@Center{ @b[Filesystem Menu] }
+
+@begin(Verbatim)
+
+ 1. (get)          Get Filesystem Name Information.
+ 2. (add)          Add New Filesystem to Database.
+ 3. (change)       Update Filesystem Information.
+ 4. (delete)       Delete Filesystem.
+ 5. (check)        Check An Association.
+ 6. (alias)        Associate with a Filesystem.
+ 7. (unalias)      Dissociate from a Filesystem.
+ 8. (quotas)       Quota Menu.
+ 9. (verbose)      Toggle Verbosity of Delete.
+10. (help)         Help ...
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40,60)
+get@\get_filesys_by_label
+add@\get_filesys_by_label@\add_filesys
+change@\get_filesys_by_label@\update_filesys
+delete@\get_filesys_by_label@\delete_filesys
+check@\get_alias
+alias@\get_alias@\add_alias
+unalias@\get_alias@\delete_alias
+
+@end(Format)
+@Hinge()
+@Center{ @b[List Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Display information about a list.
+ 2. (add)          Create new List.
+ 3. (update)       Update characteristics of a list.
+ 4. (delete)       Delete a List.
+ 5. (query_remove) Interactively remove an item from all lists.
+ 6. (members)      Member Menu - Change/Show Members of a List.
+ 7. (list_info)    List Info Menu.
+ 8. (quotas)       Quota Menu.
+ 9. (verbose)      Toggle Verbosity of Delete.
+10. (help)         Print Help.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40,60)
+show@\get_list_info
+add@\get_list_info@\add_list
+update@\get_list_info@\update_list
+delete@\get_list_info@\get_ace_use
+@\count_members_of_list@\get_lists_of_member
+@\get_members_of_list@\delete_list
+@\delete_member_from_list
+query_remove@\get_lists_of_member@\delete_member_from_list
+
+@end(Format)
+@Hinge()
+@Center{ @b[Machine Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Get machine information.
+ 2. (add)          Add a new machine.
+ 3. (update)       Update machine information.
+ 4. (delete)       Delete this machine.
+ 5. (mappings)     Machine To Cluster Mappings Menu.
+ 6. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+show@\get_machine
+add@\get_machine@\add_machine
+update@\get_machine@\update_machine
+delete@\get_machine@\delete_machine
+
+@end(Format)
+
+Delete machine needs to make some other checks. For lack of time these
+have not been implemented.
+@begin(Itemize)
+@tabset(45)
+Is the machine a server@\get_server_host_info
+
+Is the machine an NFS server@\get_nfsphys
+
+Are there any ACE's that this machine references@\get_server_host_access
+@end(Itemize)
+
+@Hinge()
+
+@Center{ @b[NFS Physical Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Show an NFS server.
+ 2. (add)          Add NFS server.
+ 3. (update)       Update NFS server.
+ 4. (delete)       Delete NFS server.
+ 5. (quotas)       Quota Menu.
+ 6. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+show@\get_nfsphys
+add@\get_nfsphys@\add_nfsphys
+update@\get_nfsphys@\update_nfsphys
+delete@\get_nfsphys@\get_filesys_by_nfsphys
+@\delete_nfsphys
+
+@end(Format)
+@Hinge()
+@Center{ @b[User Menu] }
+
+@begin(Verbatim)
+
+ 1. (login)        Show user information by login name.
+ 2. (name)         Show user information by name.
+ 3. (class)        Show names of users in a given class.
+ 4. (modify)       Change all user fields.
+ 5. (adduser)      Add a new user to the database.
+ 6. (register)     Register a user.
+ 7. (delete)       Delete user.
+ 8. (udelete)      Delete user by uid.
+ 9. (pobox)        Post Office Box Menu.
+10. (quota)        Quota Menu.
+11. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+login@\get_user_by_login
+name@\get_user_by_name
+class@\get_user_by_class
+modify@\get_user_by_login@\update_user
+adduser@\add_user
+register@\get_user_by_name@\register_user
+@\Kerberos server is queried also.
+delete@\delete_user@\get_filesys_by_label
+@\delete_filesys@\get_members_of_list
+@\delete_list@\count_members_of_list
+@\get_lists_of_member@\delete_member_from_list
+@\get_list_info@\get_ace_use
+udelete@\get_user_by_uid@\(plus all of the above).
+
+@end(Format)
+@Hinge()
+@Section[Second Tier Menus]
+
+@Center{ @b[Cluster Data Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Show Data on a given Cluster.
+ 2. (add)          Add Data to a given Cluster.
+ 3. (delete)       Remove Data to a given Cluster.
+ 4. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+show@\get_cluster_data
+add@\add_cluster_data
+delete@\get_cluster_data@\delete_cluster_data
+
+@end(Format)
+@Hinge()
+@Center{ @b[List Information Menu] }
+
+@begin(Verbatim)
+
+ 1. (member)       Show all lists to which a given member belongs.
+ 2. (admin)        Show all items which a given member can administer.
+ 3. (groups)       Show all lists which are groups.
+ 4. (public)       Show all public mailing lists.
+ 5. (maillists)    Show all mailing lists.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+member@\get_lists_of_member
+admin@\get_ace_use
+groups@\qualified_get_lists
+public@\qualified_get_lists
+maillists@\qualified_get_lists
+
+@end(Format)
+@Hinge()
+@Center{ @b[Mappings Menu] }
+
+@begin(Verbatim)
+
+ 1. (map)          Show Machine to cluster mapping.
+ 2. (addcluster)   Add machines to a clusters.
+ 3. (remcluster)   Remove machines from clusters.
+ 4. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+map@\get_machine_to_cluster_map
+addcluster@\get_machine@\get_cluster
+@\add_machine_to_cluster
+remcluster@\get_machine_to_cluster_map
+@\delete_machine_from_cluster
+
+@end(Format)
+@Hinge()
+@Center{ @b[Membership Menu] }
+
+@begin(Verbatim)
+
+ 1. (add)          Add a member to this list.
+ 2. (remove)       Remove a member from this list.
+ 3. (all)          Show the members of this list.
+ 4. (user)         Show the members of type USER.
+ 5. (list)         Show the members of type LIST.
+ 6. (string)       Show the members of type STRING.
+ 7. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+add@\add_member_to_list
+remove@\delete_member_from_list
+all@\get_members_of_list
+user@\get_members_of_list
+list@\get_members_of_list
+string@\get_members_of_list
+
+@end(Format)
+@Hinge()
+@Center{ @b[Post Office Box Menu] }
+
+@begin(Verbatim)
+
+ 1. (show)         Show a user's post office box.
+ 2. (set)          Set (Add or Change) a user's post office box.
+ 3. (remove)       Remove a user's post office box.
+ 4. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+show@\get_pobox
+set@\get_pobox@\get_server_locations
+@\set_pobox_pop@\set_pobox
+remove@\delete_pobox
+
+@end(Format)
+@Hinge()
+@Center{ @b[Quota Menu] }
+
+@begin(Verbatim)
+
+ 1. (shdef)        Show default user quota (in KB).
+ 2. (chdef)        Change default user quota.
+ 3. (shquota)      Show a user's disk quota on a filesystem.
+ 4. (addquota)     Add a new disk quota for user on a filesystem.
+ 5. (chquota)      Change a user's disk quota on a filesystem.
+ 6. (rmquota)      Remove a user's disk quota on a filesystem.
+ 7. (verbose)      Toggle Verbosity of Delete.
+ r. (return)       Return to previous menu.
+ t. (toggle)       Toggle logging on and off.
+ q. (quit)         Quit.
+
+@end(Verbatim)
+
+@begin(Format)
+@tabset(20,40, 60)
+shdef@\get_value
+chdef@\update_value@\get_value
+shquota@\get_nfs_quota
+addquota@\add_nfs_quota
+chquota@\get_nfs_quota@\update_nfs_quota
+rmquota@\get_nfs_quota@\delete_nfs_quota
+@end(Format)
+@end(Group)
+
+@Appendix(Menu Tree Diagram)
+
+@Label(tree)
diff --git a/clients/mrtest/scripts/dcm.sc b/clients/mrtest/scripts/dcm.sc
new file mode 100644 (file)
index 0000000..08a6877
--- /dev/null
@@ -0,0 +1,140 @@
+% DCM Stuff
+qy dshi test kiwi.mit.edu
+qy dsin test
+
+qy _help gsin
+qy gsin *
+qy gsin nfs
+qy gsin no-such-service
+
+qy _help qgsv
+qy qgsv true true true
+qy qgsv false false false
+qy qgsv dontcare dontcare dontcare
+qy qgsv dontcare dontcare bad-type
+qy qgsv dontcare bad-type dontcare
+qy qgsv bad-type dontcare dontcare
+
+qy _help asin
+qy asin test 1 target script unique 1 user mar
+qy asin test 1 target script unique 1 user mar
+qy gsin test
+qy asin testing 1 target script bad-type 1 user mar
+qy asin testing 1 target script unique 1 bad-acl mar
+qy asin testing 1 target script unique 1 user bad-user
+
+qy _help usin
+qy usin test 2 trgt scrpt replicated 0 list dbadmin
+qy gsin test
+qy usin test 60 trgt scrpt replicated 0 list dbadmin
+qy gsin test*
+qy usin test 60 t s bad-type 1 list dbadmin
+qy usin test 60 t s unique 1 bad-acl dbadmin
+qy usin test 60 t s unique 1 list bad-list
+
+qy _help rsve
+qy rsve *
+qy ssif test now 0 1 msg
+qy gsin test
+qy rsve test
+qy gsin test
+qy rsve test
+qy rsve no-such-service
+
+qy _help ssif
+qy ssif test now 1 1 msg
+qy ssif test now 1 1 msg
+qy ssif test now 0 0 ""
+qy ssif test bad-date 0 0 foo
+qy ssif no-such-service now 1 1 msg
+qy ssif * now 1 1 msg
+
+qy _help dsin
+qy dsin nfs
+qy dsin *
+qy dsin test
+qy dsin no-such-service
+qy asin test 1 target script unique 1 user mar
+
+qy _help gshi
+qy gshi * *
+qy gshi nfs *
+qy gshi * kiwi.mit.edu
+qy gshi nfs kiwi.mit.edu
+qy gshi nfs e40-po.mit.edu
+qy gshi pop kiwi.mit.edu
+qy gshi no-service *
+qy gshi * no-host
+
+qy _help qgsh
+qy qgsh * dontcare dontcare dontcare dontcare dontcare
+qy qgsh test dontcare dontcare dontcare dontcare dontcare
+qy qgsh nfs true true true true true
+qy qgsh hesiod false false false false false
+qy qgsh no-service dontcare dontcare dontcare dontcare dontcare
+qy qgsh * dontcare dontcare dontcare dontcare bad-bool
+qy qgsh * dontcare dontcare dontcare bad-bool dontcare
+qy qgsh * dontcare dontcare bad-bool dontcare dontcare
+qy qgsh * dontcare bad-bool dontcare dontcare dontcare
+qy qgsh * bad-bool dontcare dontcare dontcare dontcare
+
+qy _help ashi
+qy ashi test kiwi.mit.edu 1 1 2 list
+qy gshi test kiwi.mit.edu
+qy ashi test kiwi.mit.edu 1 1 2 list
+qy ashi no-service kiwi.mit.edu 1 1 2 list
+qy ashi test no-such-host 1 1 2 list
+qy ashi * kiwi.mit.edu 1 1 2 list
+qy ashi test * 1 2 3 foo
+
+qy _help ushi
+qy ushi test kiwi.mit.edu 0 42 56 ""
+qy gshi test kiwi.mit.edu
+qy ushi no-service kiwi.mit.edu 0 1 2 3
+qy uwhi test no-such-host 0 1 2 3
+
+qy _help rshe
+qy sshi test kiwi.mit.edu 0 0 0 1 msg now now
+qy gshi test kiwi.mit.edu
+qy rshe test kiwi.mit.edu
+qy gshi test kiwi.mit.edu
+qy rshe test kiwi.mit.edu
+qy rshe no-service kiwi.mit.edu
+qy rshe test no-such-host
+qy rshe test *
+qy rshe * kiwi.mit.edu
+
+qy _help ssho
+qy sshi test kiwi.mit.edu 0 0 0 0 "" now now
+qy gshi test kiwi.mit.edu
+qy ssho test kiwi.mit.edu
+qy gshi test kiwi.mit.edu
+qy ssho test kiwi.mit.edu
+qy ssho no-service kiwi.mit.edu
+qy ssho test no-such-host
+qy ssho test *
+qy ssho * kiwi.mit.edu
+
+qy _help sshi
+qy gshi test kiwi.mit.edu
+qy sshi test kiwi.mit.edu 0 1 1 42 msg now now
+qy gshi test kiwi.mit.edu
+qy sshi no-service kiwi.mit.edu 0 1 1 42 msg now now
+qy sshi test no-such-host 0 1 1 42 msg now now
+qy sshi test kiwi.mit.edu 0 1 1 42 msg bad-date now
+qy sshi test kiwi.mit.edu 0 1 1 42 msg now bad-date
+
+qy _help dshi
+qy dsin test
+qy dshi test kiwi.mit.edu
+qy dshi no-service kiwi.mit.edu
+qy dshi test no-such-host
+qy dshi test *
+qy dshi * kiwi.mit.edu
+qy dsin test
+
+qy _help gslo
+qy gslo *
+qy gslo nfs
+qy gslo no-such-service
+
diff --git a/clients/mrtest/scripts/doit.sc b/clients/mrtest/scripts/doit.sc
new file mode 100644 (file)
index 0000000..051af83
--- /dev/null
@@ -0,0 +1,4 @@
+c
+a
+script queries.sc
+quit
diff --git a/clients/mrtest/scripts/filesys.sc b/clients/mrtest/scripts/filesys.sc
new file mode 100644 (file)
index 0000000..bb3087e
--- /dev/null
@@ -0,0 +1,138 @@
+% Filesystems
+qy dfil test
+qy dfil testing
+
+qy _help gfsl
+%qy gfsl *
+qy gfsl mar
+qy gfsl no-such-fs
+
+qy _help gfsm
+%qy gfsm *
+qy gfsm toto.mit.edu
+qy gfsm no-such-mach
+
+qy _help gfsn
+%qy gfsn * *
+qy gfsn kiwi.mit.edu *
+qy gfsn * /site
+qy gfsn kiwi.mit.edu /site
+qy gfsn no-such-mach /site
+qy gfsn kiwi.mit.edu no-such-dir
+
+qy _help gfsg
+%qy gfsg *
+qy gfsg mar
+qy gfsg no-such-list
+
+qy _help afil
+qy afil test rvd kiwi.mit.edu pack mount r comments mar mar 0 other
+qy afil test rvd kiwi.mit.edu pack mount r comments mar mar 0 other
+qy afil tset rvd no-such-mach pack mount r comments mar mar 0 other
+qy afil tset rvd kiwi.mit.edu pack mount h comments mar mar 0 other
+qy afil tset rvd kiwi.mit.edu pack mount r comments no-user mar 0 other
+qy afil tset rvd kiwi.mit.edu pack mount r comments mar no-list 0 other
+qy afil tset rvd kiwi.mit.edu pack mount r comments mar mar 0 no-locker
+qy afil testing nfs kiwi.mit.edu /site/test mount w none mar mar 1 homedir
+qy afil testing nfs kiwi.mit.edu /site/test mount w none mar mar 1 homedir
+qy afil tset nfs no-such-mach /site/test mount w none mar mar 1 homedir
+qy afil tset nfs kiwi.mit.edu /bin/test mount w none mar mar 1 homedir
+qy afil tset nfs kiwi.mit.edu /site/test mount h none mar mar 1 homedir
+qy afil tset bad-type kiwi.mit.edu /site/test mount h none mar mar 1 other
+qy afil tsetse afs \[NONE\] /afs/athena.mit.edu/astaff/project/longname /mit/longname r "" mar mar 0 other
+
+qy _help ufil
+qy ufil test tested rvd kiwi.mit.edu pack mount r comments mar mar 0 other
+qy gfsl test*
+qy ufil tested testing rvd kiwi.mit.edu pack mount r comments mar mar 0 other
+qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar mar 0 other
+qy ufil tested tested badtype kiwi.mit.edu pack mount r comments mar mar 0 other
+qy ufil tested tested rvd no-such-mach pack mount r comments mar mar 0 other
+qy ufil tested tested rvd kiwi.mit.edu pack mount h comments mar mar 0 other
+qy ufil tested tested rvd kiwi.mit.edu pack mount r comments no-user mar 0 other
+qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar no-list 0 other
+qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar mar 0 bad-type
+qy ufil testing testing nfs kiwi.mit.edu /site/test /mit/test r "" mar mar 1 project
+
+qy _help dfil
+qy dfil *
+qy dfil no-such-fs
+qy dfil tested
+qy dfil tsetse
+
+qy _help ganf
+qy ganf
+
+qy _help gnfp
+%qy gnfp * *
+qy gnfp kiwi.mit.edu *
+qy gnfp * /site
+qy gnfp kiwi.mit.edu /site
+qy gnfp no-such-mach /site
+qy gnfp kiwi.mit.edu /bin
+
+qy _help anfp
+qy anfp kiwi.mit.edu /u1 /dev/ra1c 0 0 1000
+qy anfp kiwi.mit.edu /u1 /dev/ra1c 0 0 1000
+qy anfp no-such-mach /u1 /dev/ra1c 0 0 1000
+qy anfp kiwi.mit.edu /u1 /dev/ra1c bad 0 1000
+
+qy _help unfp
+qy unfp kiwi.mit.edu /u1 /dev/ra1c 1 100 2000
+qy gnfp kiwi.mit.edu /u1
+
+qy _help ajnf
+qy ajnf kiwi.mit.edu /u1 -666
+qy gnfp kiwi.mit.edu /u1
+qy ajnf no-such-mach /u1 0
+qy ajnf kiwi.mit.edu /bin 100
+qy ajnf e40-po.mit.edu /site 50
+qy ajnf * * 1
+qy ajnf kiwi.mit.edu * 2
+qy ajnf * /site 3
+
+qy _help dnfp
+qy dnfp kiwi.mit.edu /u1
+qy dnfp * /site
+qy dnfp kiwi.mit.edu *
+qy dnfp kiwi.mit.edu /site
+qy dnfp no-such-mach /site
+
+qy _help gnfq
+%qy gnfq * *
+qy gnfq * mar
+qy gnfq test *
+qy gnfq mar mar
+qy gnfq no-such-fs mar
+
+qy _help gnqp
+qy gnqp kiwi.mit.edu /site
+qy gnqp * /site
+qy gnqp kiwi.mit.edu *
+qy gnqp no-such-mach /site
+
+qy _help anfq
+qy gnfp kiwi.mit.edu /site
+qy anfq testing mar 500
+gy gnfp kiwi.mit.edu /site
+qy anfq testing mar 500
+qy anfq no-such-fs mar 500
+qy anfq testing no-such-user 500
+qy anfq testing mar no-number
+qy anfq * mar 500
+qy gnfq * mar
+
+qy _help unfq
+qy unfq testing mar 400
+qy gnfp kiwi.mit.edu /site
+qy unfq no-such-fs mar 45400
+qy unfq poto mar 500
+qy unfq poto no-such-user 5
+
+qy _help dnfq
+qy dnfq testing mar
+qy gnfq testing mar
+qy dnfq poto qjb
+qy dnfq no-such-fs mar
+qy dnfq testing no-such-user
+qy dnfq testing poto
diff --git a/clients/mrtest/scripts/list.sc b/clients/mrtest/scripts/list.sc
new file mode 100644 (file)
index 0000000..a9e4747
--- /dev/null
@@ -0,0 +1,103 @@
+% lists
+qy dlis testlist
+qy dlis testl
+qy dlis testlst
+
+qy _help glin
+% qy glin *
+qy glin mar
+qy glin no-such-list
+
+qy _help exln
+% qy exln *
+qy exln mar
+qy exln no-such-list
+qy exln m*r
+
+qy _help alis
+qy alis testlist 1 0 0 0 0 "create unique GID" user mar desc
+qy glin testlist
+qy alis testlist 1 0 0 0 0 "create unique GID" user mar desc
+qy alis testl 1 1 1 1 1 1234 list testl desc
+qy glin testl
+qy alis tst 0 0 0 0 0 0 bad-type mar desc
+qy alis tst 0 0 0 0 0 0 user no-such-user desc
+qy alis tst 0 0 0 0 0 0 list no-such-list desc
+
+qy _help ulis
+qy ulis testlist testlist 1 0 0 1 0 "create unique GID" user mar description
+qy glin testlist
+qy ulis testlist testlst 1 0 0 1 1 "create unique GID" user mar description
+qy glin testl*
+qy ulis no-such-list testlst 1 0 0 1 1 "create unique GID" user mar desc
+qy ulis testlst dbadmin 1 0 0 1 1 "create unique GID" user mar description
+qy ulis testlst tst 1 0 0 1 1 "create unique GID" bad-type mar description
+
+qy _help dlis
+qy dlis testlst
+qy dlis testlst
+qy dlis dbadmin
+qy dlis *
+
+qy _help amtl
+qy amtl testl user mar
+qy amtl testl list testl
+qy amtl testl string "a random string (with * stars)"
+qy amtl testl user mar
+qy amtl testl user default
+qy gmol testl
+qy amtl no-such-list user mar
+qy amtl testl user no-such-user
+qy amtl testl list no-such-list
+
+qy _help dmfl
+qy dmfl testl user default
+qy dmfl testl user default
+qy dmfl testl user no-such-user
+qy dmfl no-such-list user mar
+qy dmfl testl list no-such-list
+qy dmfl testl string foobar
+qy gmol
+
+qy _help gaus
+qy gaus user mar
+qy gaus ruser gamit
+qy gaus user no-such-user
+qy gaus list testl
+qy gaus list no-such-list
+qy gaus rlist test
+qy gaus no-such-type mar
+
+qy _help qgli
+qy qgli false false false false false
+qy qgli true true true true true
+% qy qgli dontcare dontcare dontcare dontcare dontcare
+qy qgli true dontcare dontcare true false
+qy qgli dontcare dontcare dontcare dontcare no-such-bool
+qy qgli dontcare dontcare dontcare no-such-bool dontcare
+qy qgli dontcare dontcare no-such-bool dontcare dontcare
+qy qgli dontcare no-such-bool dontcare dontcare dontcare
+qy qgli no-such-bool dontcare dontcare dontcare dontcare
+
+qy _help gmol
+qy gmol testl
+qy gmol no-such-list
+qy gmol *
+
+qy _help glom
+qy glom user mar
+qy glom ruser mar
+qy glom list test
+qy glom rlist test
+qy glom user no-such-user
+qy glom list no-such-list
+qy glom string "a random string (with * stars)"
+qy glom bad-type foo
+qy glom user *
+
+qy _help cmol
+qy cmol test
+qy cmol testl
+qy cmol no-such-list
+qy cmol default
+qy cmol *
diff --git a/clients/mrtest/scripts/mach.sc b/clients/mrtest/scripts/mach.sc
new file mode 100644 (file)
index 0000000..ad7eaa4
--- /dev/null
@@ -0,0 +1,115 @@
+% Machines
+
+qy dmac test.mit.edu
+qy dmac testing.mit.edu
+
+query _help gmac
+%qy gmac *
+qy gmac no-such-host
+qy gmac toto.mit.edu
+qy gmac TOTO.MIT.EDU
+
+query _help amac
+qy amac test.mit.edu vax
+qy amac test.mit.edu vax
+qy amac testing.mit.edu no-type
+qy gmac test*
+
+query _help umac
+qy umac test.mit.edu test.mit.edu rt
+qy gmac test.mit.edu
+qy umac test.mit.edu test.mit.edu no-type
+qy umac test.mit.edu testing.mit.edu rt
+qy umac testing.mit.edu toto.mit.edu rt
+qy umac no-such-host newhost vax
+qy gmac test*
+
+query _help dmac
+qy dmac testing.mit.edu
+qy gmac testing.mit.edu
+qy dmac toto.mit.edu
+qy dmac no-such-host
+
+
+% clusters
+
+qy dclu testclu
+qy dclu testing
+
+query _help gclu
+%qy gclu *
+qy gclu no-such-clu
+qy gclu bldge40-vs
+
+query _help aclu
+qy aclu testclu desc loc
+qy aclu testclu desc loc
+qy gclu testclu
+
+query _help uclu
+qy uclu testclu testclu newdesc newloc
+qy gclu testclu
+qy uclu testclu testing desc loc
+qy uclu testing bldge40-vs desc loc
+qy gclu test*
+
+query _help dclu
+qy dclu testing
+qy dclu testing
+qy dclu bldge40-vs
+
+
+% Mappings
+
+qy aclu testclu desc loc
+qy amac test.mit.edu vax
+
+qy _help gmcm
+%qy gmcm * *
+qy gmcm toto.mit.edu *
+qy gmcm * bldge40-vs
+qy gmcm no-such-host no-such-clu
+qy gmcm toto.mit.edu bldge40-rt
+
+qy _help amtc
+qy amtc test.mit.edu testclu
+qy amtc test.mit.edu testclu
+qy amtc test.mit.edu no-such-clu
+qy amtc no-such-host testclu
+qy gmcm test* test*
+qy amtc test.mit.edu bldge40-vs
+qy amtc toto.mit.edu testclu
+qy gmcm test* *
+qy gmcm * test*
+
+qy _help dmfc
+qy dmfc * *
+qy dmfc test.mit.edu *
+qy dmfc * testclu
+qy dmfc test.mit.edu bldge40-rt
+qy dmfc test.mit.edu testclu
+
+% Cluster data
+
+qy _help gcld
+%qy gcld * *
+qy gcld testclu *
+qy gcld no-such-clu *
+qy gclu bldge40-vs *
+
+qy _help acld
+qy acld testclu LPR data
+qy acld testclu LPR data1
+qy acld testclu LPR data
+qy acld testclu no-label data
+qy acld no-such-clu LPR data
+
+qy _help dcld
+qy dcld * lpr data
+qy dcld testclu * data
+qy dcld testclu lpr *
+qy dcld testclu LPR data
+qy dcld testclu LPR data
+qy dcld no-such-clu FOO data
+qy dcld testclu no-label data
+
diff --git a/clients/mrtest/scripts/misc.sc b/clients/mrtest/scripts/misc.sc
new file mode 100644 (file)
index 0000000..98059e2
--- /dev/null
@@ -0,0 +1,106 @@
+% Miscellaneous stuff
+
+qy _help gsha
+#qy gsha *
+qy gsha toto.mit.edu
+qy gsha no-such-mach
+
+qy _help asha
+qy asha e40-po.mit.edu list dbadmin
+qy asha e40-po.mit.edu list dbadmin
+qy asha kiwi.mit.edu user mar
+qy asha soup.mit.edu none none
+qy asha * list dbadmin
+qy asha soup.mit.edu bad-type foo
+
+qy _help usha
+qy usha e40-po.mit.edu user qjb
+qy gsha e40-po.mit.edu
+qy usha e40-po.mit.edu bad-type foo
+
+qy _help dsha
+qy dsha e40-po.mit.edu
+qy dsha *
+qy dsha no-such-mach
+
+qy _help gpcp
+#qy gpcp *
+qy gpcp nil
+qy gpcp no-such-printer
+
+qy _help apcp
+qy apcp test test:rm=foo.mit.edu:rp=test:
+qy apcp test test:rm=foo.mit.edu:rp=test:
+qy apcp nil duplicate
+qy apcp testing "this one has spaces * and stars"
+qy gpcp test*
+
+qy _help dpcp
+qy dpcp testing
+qy gpcp test
+qy dpcp *
+qy dpcp no-such-printer
+
+qy _help gpdm
+qy gpdm *
+qy gpdm dexter
+qy gpdm no-such-printer
+
+qy _help apdm
+qy apdm test 123 PARIS.MIT.EDU
+qy gpdm test
+qy apdm test 456 MINOS.MIT.EDU
+qy apdm testing 123 no-machine
+
+qy _help dpdm
+qy dpdm test
+qy gpdm test
+qy dpdm no-such-printer
+
+qy _help gali
+#qy gali * * *
+qy gali * TYPEDATA *
+qy gali filesys TYPE *
+qy gali filesys TYPE NFS
+qy gali foo * *
+
+qy _help aali
+qy aali foo TYPE baz
+qy aali alias TYPE foo
+qy aali foo TYPE baz
+qy aali foo TYPE baz
+qy aali foo TYPE bar
+qy gali foo TYPE *
+
+qy _help dali
+qy dali foo TYPE *
+qy dali foo TYPE baz
+qy dali foo TYPE bar
+qy dali alias TYPE foo
+qy dali foo foo foo
+
+qy _help gval
+qy gval *
+qy gval users_id
+qy gval no-such-value
+
+qy _help aval
+qy aval testval 5
+qy aval users_id 3
+qy aval * 1
+qy aval newval asdf
+qy gval testval
+
+qy _help uval
+qy uval testval 7
+qy uval * 8
+qy uval no-such-val 9
+qy gval testval
+
+qy _help dval
+qy dval testval
+qy dval *
+qy dval no-such-val
+
+qy _help gats
+qy gats
diff --git a/clients/mrtest/scripts/queries.sc b/clients/mrtest/scripts/queries.sc
new file mode 100644 (file)
index 0000000..ae1d377
--- /dev/null
@@ -0,0 +1,16 @@
+% tests all queries
+
+query _list_queries
+query _list_users
+query _help get_user_by_name
+query none
+
+script users.sc
+script mach.sc
+script list.sc
+script dcm.sc
+script filesys.sc
+script zephyr.sc
+script misc.sc
+
+% Done!
diff --git a/clients/mrtest/scripts/users.sc b/clients/mrtest/scripts/users.sc
new file mode 100644 (file)
index 0000000..c44090e
--- /dev/null
@@ -0,0 +1,142 @@
+% test user queries
+
+qy _help galo
+%qy galo
+qy _help gaal
+%qy gaal
+
+qy _help gubl
+%qy gubl *
+qy gubl root
+qy gubl no-one
+qy gubl mar
+
+qy _help gubu
+qy gubu 17822
+qy gubu 0
+qy gubu 32777
+
+qy _help gubn
+%qy gubn * *
+qy gubn Jesus *
+qy gubn * Rosenstein
+qy gubn Mark Rosenstein
+qy gubn No One
+
+qy _help gubc
+qy gubc guest
+qy gubc none
+%qy gubc *
+
+qy _help gubm
+%qy gubm *
+qy gubm mitid
+qy gubm qwerty
+
+qy _help ausr
+qy dusr testing
+qy dusr tested
+qy ausr testing 4321 /bin/csh Last First M 0 mitid staff
+qy ausr testing 1234 /bin/csh Last First M 0 mitid staff
+qy ausr tested  1234 /bin/csh Last First M 0 mitid notone
+qy ausr tested  1234 /bin/csh Last First M 0 mitid staff
+qy ausr "create unique login ID" "create unique UID" /bin/sh TestL TestF TestM 0 mitid staff
+qy gubn TestF TestL
+
+qy _help rusr
+qy rusr 1234 root 1
+qy rusr 1234 tested 1
+qy gubu 1234
+
+qy _help uusr
+qy uusr tested tested 4321 /bin/csh Last First MI 0 MITID guest
+qy gubl tested
+qy uusr tested root 4321 /bin/csh Last First MI 0 MITID guest
+qy uusr tested testnew 4321 /bin/csh Last First MI 0 MITID guest
+qy gubl tested
+qy gubl testnew
+qy uusr testnew tested 1234 /bin/csh Last First MI 0 MITID guest
+qy gubl tested
+
+qy _help uush
+qy gubl tested
+qy uush tested /bin/tcsh
+qy gubl tested
+
+qy _help uust
+qy uust tested 1
+qy gubl tested
+
+qy _help dusr
+qy dusr *
+qy dusr testing
+qy dusr mar
+qy dusr no-one
+
+qy _help dubu
+qy dubu 1234
+qy dubu 32777
+
+qy _help gkum
+qy gkum * *
+qy gkum no-one *
+qy gkum * no-kerberos
+qy gkum mar *
+qy gkum * mar@ATHENA.MIT.EDU
+
+qy _help akum
+qy akum testuser testuser@ATHENA.MIT.EDU
+qy akum testuser testuser.root@ATHENA.MIT.EDU
+qy akum root testuser@ATHENA.MIT.EDU
+qy akum no-one foo.bar@ATHENA.MIT.EDU
+qy akum * *
+
+qy _help dkum
+qy dkum testuser testuser@ATHENA.MIT.EDU
+qy dkum mar foo.bar@ATHENA.MIT.EDU
+qy dkum no-one foo.bar@ATHENA.MIT.EDU
+
+% finger
+qy ausr testing 4321 /bin/csh Last First M 0 mitid staff
+qy _help gfbl
+qy gfbl testing
+%qy gfbl *
+qy gfbl no-one
+
+qy _help ufbl
+qy ufbl testing "Mr. Testing" nn ha hp oa op d STAFF
+qy gfbl testing
+
+% PoBoxes
+qy _help gpob
+qy gpob mar
+qy gpob testing
+%qy gpob *
+qy gpob no-one
+
+qy _help gapo
+%qy gapo
+qy _help gpop
+%qy gpop
+qy _help gpos
+%qy gpos
+
+qy _help spob
+qy spob testing no-type box
+qy spob testing pop no-mach
+qy spob testing pop e40-po.mit.edu
+qy gpob testing
+qy spob testing smtp "a random string (with * wildcards)"
+qy gpob testing
+qy spob testing none foo
+qy gpob testing
+
+qy _help spop
+qy spop testing
+qy gpob testing
+
+qy _help dpob
+qy dpob testing
+qy gpob testing
+qy dpob testing
+
diff --git a/clients/mrtest/scripts/zephyr.sc b/clients/mrtest/scripts/zephyr.sc
new file mode 100644 (file)
index 0000000..ca989bd
--- /dev/null
@@ -0,0 +1,33 @@
+% Zephyr queries
+qy dzcl test
+
+qy _help gzcl
+#qy gzcl *
+qy gzcl login
+qy gzcl no-such-class
+
+qy _help azcl
+qy azcl test user mar list mar none none list test
+qy azcl test user mar list mar none none list test
+qy azcl testing user bad-user list mar none none list test
+qy azcl testing user mar list bad-list none none list test
+qy azcl testing user mar list mar none random-none list test
+qy azcl testing user mar list mar none none bad-type test
+qy azcl name*star user mar list mar none none list test
+
+qy _help uzcl
+qy gzcl test*
+qy uzcl test test list test list dbadmin list poto list kit
+qy gzcl test*
+qy uzcl test testing user mar user qjb user kit user poto
+qy gzcl test*
+qy uzcl testing login user mar user qjb user kit none poto
+qy uzcl testing tested user no-such-user user qjb user kit user poto
+qy uzcl testing tested user mar list no-such-list user kit user poto
+qy uzcl testing tested user mar user qjb none none bad-type poto
+
+qy _help dzcl
+qy dzcl testing
+qy dzcl test
+qy dzcl *
+
diff --git a/clients/userreg/login.info b/clients/userreg/login.info
new file mode 100644 (file)
index 0000000..f9be0ea
--- /dev/null
@@ -0,0 +1,2 @@
+register
+athena
diff --git a/clients/xregister/Makefile b/clients/xregister/Makefile
new file mode 100644 (file)
index 0000000..6b71c81
--- /dev/null
@@ -0,0 +1,13 @@
+# $Header$
+
+CFLAGS = -I/mit/x11 -I/mit/motif/include
+XLIBS =  -L/mit/x11/$${HOSTTYPE}lib /mit/motif/`machtype`lib/libWc.a -lXaw -lXmu -lXt -lX11 \
+       -L/usr/athena/lib -lkrb -ldes -lhesiod -lm
+
+OBJS = register.o AriRegAll.o
+
+all: register
+
+register: $(OBJS)
+       cc -o register $(OBJS) $(XLIBS)
+
diff --git a/clients/xregister/help b/clients/xregister/help
new file mode 100644 (file)
index 0000000..1242022
--- /dev/null
@@ -0,0 +1 @@
+This is some context-sensitive help text.
diff --git a/clients/xregister/welcome b/clients/xregister/welcome
new file mode 100644 (file)
index 0000000..32d7a4d
--- /dev/null
@@ -0,0 +1,10 @@
+Welcome to Project Athena user registration.  To begin registering for
+your account, please type your first name as it appears on your MIT ID
+card, then press the key marked ``Return''.  If you make a mistake while
+typing, use the key above the Return key to erase what you just typed.
+
+** NOTE:  You must respond to each question within 90 seconds, or you
+          will have to start over.  (This is to prevent accident
+          and/or vandalism.)
+
+** If you have trouble, please call the account administrator at x3-1325.
diff --git a/gen/report.dc b/gen/report.dc
new file mode 100644 (file)
index 0000000..d9cded2
--- /dev/null
@@ -0,0 +1,286 @@
+/* $Header$
+ *
+ * This generates some useful reports.
+ *
+ *  (c) Copyright 1993 by the Massachusetts Institute of Technology.
+ *  For copying and distribution information, please see the file
+ *  <mit-copyright.h>.
+ */
+
+#include <mit-copyright.h>
+#include <stdio.h>
+#include <moira.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+EXEC SQL INCLUDE sqlca;
+
+extern int errno;
+char *whoami = "report.gen";
+FILE *out = stdout;
+
+struct user {
+    char name[9];
+    int uid;
+    int status;
+};
+struct hash *users = NULL;
+struct hash *kmaps = NULL;
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+    char *outf = NULL, outft[64], *p, buf[256];
+    struct stat sb;
+    struct timeval now;
+    int flag1, flag2, i;
+    struct hash *aliases = NULL;
+    struct hash *nets = NULL;
+    struct user *u;
+
+    EXEC SQL BEGIN DECLARE SECTION;
+    int id, sid, status, uid, ustatus, owner, creator, modby;
+    char login[9];
+    char name[65], vendor[33], model[33], os[33], addr[17];
+    char location[17], owner_type[16];
+    char schange[25], modtime[25], modwith[33], created[25];
+    EXEC SQL END DECLARE SECTION;
+
+#ifsql INGRES
+    EXEC SQL CONNECT moira;
+    EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED;
+#endsql
+#ifsql INFORMIX
+    EXEC SQL DATABASE moira;
+#endsql
+
+    if (argc == 2) 
+      {
+       if (stat(argv[1], &sb) == 0) 
+         {
+           if (ModDiff(&flag1, "machine", sb.st_mtime) ||
+               ModDiff(&flag2, "subnet", sb.st_mtime))
+             exit(MR_DATE);
+           if (flag1 < 0 && flag2 < 0) 
+             {
+               fprintf(stderr, "File %s does not need to be rebuilt.\n",
+                       argv[1]);
+               exit(MR_NO_CHANGE);
+             }
+         }
+       outf = argv[1];
+       sprintf(outft, "%s~", outf);
+       if ((out = fopen(outft, "w")) == NULL) 
+         {
+           fprintf(stderr, "unable to open %s for output\n", outf);
+           exit(MR_OCONFIG);
+         }
+      } else if (argc != 1) 
+       {
+         fprintf(stderr, "usage: %s [outfile]\n", argv[0]);
+         exit(MR_ARGS);
+       } else 
+         {
+           outf = NULL;
+         }
+    
+    EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
+
+    users = create_hash(12001);
+
+    /* 
+     * suck in user table
+     */
+
+    EXEC SQL SELECT modtime INTO :name FROM users WHERE users_id = 0;
+
+    EXEC SQL DECLARE u_cursor CURSOR FOR
+      SELECT login, uid, users_id, status
+      FROM users;
+    EXEC SQL OPEN u_cursor;
+    
+    while (1) 
+      {
+        EXEC SQL FETCH u_cursor INTO :login, :uid, :id, :ustatus;
+       if (sqlca.sqlcode != 0) break;
+       strtrim(login);
+       u = (struct user *) malloc(sizeof(struct user));
+       strcpy(u->name, login);
+       u->uid = uid;
+       u->status = ustatus;
+       hash_store(users, id, u);
+      }
+
+    EXEC SQL CLOSE u_cursor;
+
+    /*
+     * suck in host alias table
+     */
+
+    EXEC SQL SELECT modtime INTO :name FROM machine WHERE mach_id = 0;
+    
+    gettimeofday(&now, NULL);
+    
+    fprintf(out, "# Moira host table dump generated at %s\n",
+           ctime(&now.tv_sec));
+
+    EXEC SQL DECLARE y CURSOR FOR SELECT
+      mach_id, name FROM hostalias;
+    EXEC SQL OPEN y;
+
+    aliases = create_hash(1001);
+    while (1) 
+      {
+       EXEC SQL FETCH y INTO :id, :name;
+       
+       if (sqlca.sqlcode != 0) break;
+       if (id == 0) continue;
+       if (p = hash_lookup(aliases, id)) 
+         {
+           sprintf(buf, "%s,%s", p, name);
+           hash_update(aliases, id, strsave(buf));
+           free(p);
+         } else
+           hash_store(aliases, id, strsave(name));
+      }
+
+    EXEC SQL CLOSE y;
+
+    
+    /*
+     * suck in network table
+     */
+
+    EXEC SQL SELECT modtime INTO :name FROM subnet WHERE snet_id = 0;
+
+    EXEC SQL DECLARE n_cursor CURSOR FOR SELECT
+      snet_id, name FROM subnet;
+    EXEC SQL OPEN n_cursor;
+
+    nets = create_hash(301);
+    while (1) 
+      {
+       EXEC SQL FETCH n_cursor INTO :id, :name;
+       
+       if (sqlca.sqlcode != 0) break;
+       if (id == 0) continue;
+       hash_store(nets, id, strsave(name));
+      }
+
+    EXEC SQL CLOSE n_cursor;
+
+    /*
+     * dump machine table
+     */
+
+
+    EXEC SQL DECLARE x CURSOR FOR SELECT 
+      name, mach_id, status, statuschange, vendor, model, os, address,  location, snet_id, owner_type, owner_id, modby, modtime, modwith, created, creator
+      FROM machine;
+    EXEC SQL OPEN x;
+
+    while (1) 
+      {
+        EXEC SQL FETCH x INTO :name, :id, :status, :schange, :vendor, :model, :os, :addr, :location, :sid, :owner_type, :owner, :modby, :modtime, :modwith, :created, :creator;
+
+       if (sqlca.sqlcode != 0) break;
+       if (id == 0) continue;
+
+       if (p = hash_lookup(aliases, id))
+         sprintf(buf, "%s,%s", name, p);
+       else
+         strcpy(buf, name);
+
+       fprintf(out, "HOST|%s|", buf);
+       if(p = hash_lookup(nets, sid))
+         fprintf(out, "%s|", strtrim(p));
+       else
+         if(sid == 0)
+           fprintf(out, "NONE|");
+         else
+           fprintf(out, "%d|", sid);
+          
+       fprintf(out, "%s|%s|", strtrim(addr), 
+               status == 3 ? "deleted" :
+               status == 2 ? "none" : status == 1 ? "active" : status == 0 ?
+               "reserved" : "unknown");
+       
+       fprintf(out, "%s|", strtrim(schange));
+       fprintf(out, "%s|", strtrim(location));
+       fprintf(out, "%s|", strtrim(vendor));
+       fprintf(out, "%s|", strtrim(model));
+       fprintf(out, "%s|", strtrim(os));
+       
+       print_user(strtrim(owner_type), owner);
+       print_user("STRING", creator);
+       fprintf(out, "%s|", strtrim(created));
+       print_user("STRING", modby < 0 ? -modby : modby);
+
+       fprintf(out, "%s|", strtrim(modtime));
+       fprintf(out, "%s|", strtrim(modwith));
+       fprintf(out, "\n");
+      }
+
+    EXEC SQL CLOSE x;
+#ifsql INGRES
+    EXEC SQL DISCONNECT;
+#endsql
+#ifsql INFORMIX
+    EXEC SQL CLOSE DATABASE;
+#endsql
+
+    fprintf(out, "# End of Report\n");
+    if (fclose(out)) {
+       perror("close failed");
+       exit(MR_CCONFIG);
+    }
+    if (outf)
+      fix_file(outf);
+    exit(MR_SUCCESS);
+
+ sqlerr:
+    com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
+#ifsql INGRES
+    if (sqlca.sqlcode == 17700 || sqlca.sqlcode == -37000)
+      exit(MR_DEADLOCK);
+#endsql
+    critical_alert("DCM", "Report build encountered INGRES ERROR %d",
+                  sqlca.sqlcode);
+    exit(MR_INGRES_ERR);
+}
+
+
+print_user(type, user)
+     char *type;
+     unsigned int user;
+{
+  struct user *u;
+  char *c;
+  EXEC SQL BEGIN DECLARE SECTION;
+  int id;
+  char name[128];
+  EXEC SQL END DECLARE SECTION;
+
+  if(strcmp(type, "USER") == 0)
+    {
+      if(u = (struct user *) hash_lookup(users, user))
+       fprintf(out, "USER %s|", u->name);
+      else
+       fprintf(out, "USER %d|", user);
+    }
+  else 
+    if(id == 0)
+      fprintf(out, "smsuser|");
+    else
+      {
+       id = user;
+       EXEC SQL SELECT string INTO :name FROM strings WHERE string_id = :id;
+       if (sqlca.sqlcode == 0)
+         fprintf(out, "%s|", strtrim(name));
+       else
+         fprintf(out, "UNKNOWN|");
+      }
+ sqlerr:
+  return;
+}
diff --git a/include/afs/auth.h b/include/afs/auth.h
new file mode 100644 (file)
index 0000000..6f06fbc
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * auth.h:
+ * This file is automatically generated; please do not edit it.
+ */
+/* Including auth.p.h at beginning of auth.h file. */
+
+#ifndef __AUTH_AFS_INCL_
+#define        __AUTH_AFS_INCL_    1
+
+               /* no ticket good for longer than 30 days */
+#define MAXKTCTICKETLIFETIME (30*24*3600)
+#define MINKTCTICKETLEN              32
+#define        MAXKTCTICKETLEN       344
+#define        MAXKTCNAMELEN         64        /* name & inst should be 256 */
+#define MAXKTCREALMLEN       64        /* should be 256 */
+#define KTC_TIME_UNCERTAINTY (15*60)   /* max skew separating machines' clocks */
+
+struct ktc_encryptionKey {
+    char data[8];
+};
+
+struct ktc_token {
+    long startTime;
+    long endTime;
+    struct ktc_encryptionKey sessionKey;
+    short kvno;
+    int ticketLen;
+    char ticket[MAXKTCTICKETLEN];
+};
+
+struct ktc_principal {
+    char name[MAXKTCNAMELEN];
+    char instance[MAXKTCNAMELEN];
+    char cell[MAXKTCREALMLEN];
+};
+
+#if 0
+#define        KTC_ERROR       1       /* an unexpected error was encountered */
+#define        KTC_TOOBIG      2       /* a buffer was too small for the response */
+#define        KTC_INVAL       3       /* an invalid argument was passed in */
+#define        KTC_NOENT       4       /* no such entry */
+#endif
+
+#endif __AUTH_AFS_INCL_
+
+/* End of prolog file auth.p.h. */
+
+#define KTC_ERROR                                (11862784L)
+#define KTC_TOOBIG                               (11862785L)
+#define KTC_INVAL                                (11862786L)
+#define KTC_NOENT                                (11862787L)
+extern void initialize_ktc_error_table ();
+#define ERROR_TABLE_BASE_ktc (11862784L)
+
+/* for compatibility with older versions... */
+#define init_ktc_err_tbl initialize_ktc_error_table
+#define ktc_err_base ERROR_TABLE_BASE_ktc
diff --git a/include/des.h b/include/des.h
new file mode 100644 (file)
index 0000000..74bf279
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * $Source$
+ * $Author$
+ * $Header$ 
+ *
+ * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
+ *
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
+ *
+ * Include file for the Data Encryption Standard library.
+ */
+
+/* only do the whole thing once         */
+#ifndef DES_DEFS
+#define DES_DEFS
+
+#include <mit-copyright.h>
+
+typedef unsigned char des_cblock[8];   /* crypto-block size */
+/* Key schedule */
+typedef struct des_ks_struct { des_cblock _; } des_key_schedule[16];
+
+#define DES_KEY_SZ     (sizeof(des_cblock))
+#define DES_ENCRYPT    1
+#define DES_DECRYPT    0
+
+#ifndef NCOMPAT
+#define C_Block des_cblock
+#define Key_schedule des_key_schedule
+#define ENCRYPT DES_ENCRYPT
+#define DECRYPT DES_DECRYPT
+#define KEY_SZ DES_KEY_SZ
+#define string_to_key des_string_to_key
+#define read_pw_string des_read_pw_string
+#define random_key des_random_key
+#define pcbc_encrypt des_pcbc_encrypt
+#define key_sched des_key_sched
+#define cbc_encrypt des_cbc_encrypt
+#define cbc_cksum des_cbc_cksum
+#define C_Block_print des_cblock_print
+#define quad_cksum des_quad_cksum
+typedef struct des_ks_struct bit_64;
+#endif
+
+#define des_cblock_print(x) des_cblock_print_file(x, stdout)
+
+#endif DES_DEFS
diff --git a/include/kadm.h b/include/kadm.h
new file mode 100644 (file)
index 0000000..f139340
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * $Source$
+ * $Author$
+ * $Header$
+ *
+ * Copyright 1988 by the Massachusetts Institute of Technology.
+ *
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
+ *
+ * Definitions for Kerberos administration server & client
+ */
+
+#ifndef KADM_DEFS
+#define KADM_DEFS
+
+#include <mit-copyright.h>
+/*
+ * kadm.h
+ * Header file for the fourth attempt at an admin server
+ * Doug Church, December 28, 1989, MIT Project Athena
+ */
+
+/* for those broken Unixes without this defined... should be in sys/param.h */
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 64
+#endif
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <krb.h>
+#include <des.h>
+
+/* The global structures for the client and server */
+typedef struct {
+  struct sockaddr_in admin_addr;
+  struct sockaddr_in my_addr;
+  int my_addr_len;
+  int admin_fd;                        /* file descriptor for link to admin server */
+  char sname[ANAME_SZ];                /* the service name */
+  char sinst[INST_SZ];         /* the services instance */
+  char krbrlm[REALM_SZ];
+} Kadm_Client;
+
+typedef struct {               /* status of the server, i.e the parameters */
+   int inter;                  /* Space for command line flags */
+   char *sysfile;              /* filename of server */
+} admin_params;                        /* Well... it's the admin's parameters */
+
+/* Largest password length to be supported */
+#define MAX_KPW_LEN    128
+
+/* Largest packet the admin server will ever allow itself to return */
+#define KADM_RET_MAX 2048
+
+/* That's right, versions are 8 byte strings */
+#define KADM_VERSTR    "KADM0.0A"
+#define KADM_ULOSE     "KYOULOSE"      /* sent back when server can't
+                                          decrypt client's msg */
+#define KADM_VERSIZE strlen(KADM_VERSTR)
+
+/* the lookups for the server instances */
+#define PWSERV_NAME  "changepw"
+#define KADM_SNAME   "kerberos_master"
+#define KADM_SINST   "kerberos"
+
+/* Attributes fields constants and macros */
+#define ALLOC        2
+#define RESERVED     3
+#define DEALLOC      4
+#define DEACTIVATED  5
+#define ACTIVE       6
+
+/* Kadm_vals structure for passing db fields into the server routines */
+#define FLDSZ        4
+
+typedef struct {
+    u_char         fields[FLDSZ];     /* The active fields in this struct */
+    char           name[ANAME_SZ];
+    char           instance[INST_SZ];
+    unsigned long  key_low;
+    unsigned long  key_high;
+    unsigned long  exp_date;
+    unsigned short attributes;
+    unsigned char  max_life;
+} Kadm_vals;                    /* The basic values structure in Kadm */
+
+/* Kadm_vals structure for passing db fields into the server routines */
+#define FLDSZ        4
+
+/* Need to define fields types here */
+#define KADM_NAME       31
+#define KADM_INST       30
+#define KADM_EXPDATE    29
+#define KADM_ATTR       28
+#define KADM_MAXLIFE    27
+#define KADM_DESKEY     26
+
+/* To set a field entry f in a fields structure d */
+#define SET_FIELD(f,d)  (d[3-(f/8)]|=(1<<(f%8)))
+
+/* To set a field entry f in a fields structure d */
+#define CLEAR_FIELD(f,d)  (d[3-(f/8)]&=(~(1<<(f%8))))
+
+/* Is field f in fields structure d */
+#define IS_FIELD(f,d)   (d[3-(f/8)]&(1<<(f%8)))
+
+/* Various return codes */
+#define KADM_SUCCESS    0
+
+#define WILDCARD_STR "*"
+
+enum acl_types {
+ADDACL,
+GETACL,
+MODACL
+};
+
+/* Various opcodes for the admin server's functions */
+#define CHANGE_PW    2
+#define ADD_ENT      3
+#define MOD_ENT      4
+#define GET_ENT      5
+
+extern long kdb_get_master_key();      /* XXX should be in krb_db.h */
+extern long kdb_verify_master_key();   /* XXX ditto */
+
+extern long krb_mk_priv(), krb_rd_priv(); /* XXX should be in krb.h */
+extern void krb_set_tkt_string();      /* XXX ditto */
+
+extern unsigned long quad_cksum();     /* XXX should be in des.h */
+
+/* XXX This doesn't belong here!!! */
+char *malloc(), *realloc();
+#ifdef POSIX
+typedef void sigtype;
+#else
+typedef int sigtype;
+#endif
+
+#endif KADM_DEFS
diff --git a/include/mit-sipb-copyright.h b/include/mit-sipb-copyright.h
new file mode 100644 (file)
index 0000000..ffcfc38
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+
+Copyright 1987 by the Student Information Processing Board
+       of the Massachusetts Institute of Technology
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is
+hereby granted, provided that the above copyright notice
+appear in all copies and that both that copyright notice and
+this permission notice appear in supporting documentation,
+and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
+used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+M.I.T. and the M.I.T. S.I.P.B. make no representations about
+the suitability of this software for any purpose.  It is
+provided "as is" without express or implied warranty.
+
+*/
+
diff --git a/include/prot.h b/include/prot.h
new file mode 100644 (file)
index 0000000..5f8fc28
--- /dev/null
@@ -0,0 +1,87 @@
+/* 
+ *     $Source$
+ *     $Author$
+ *     $Locker$
+ *
+ * Copyright 1985,1986 by the Massachusetts Institute of Technology
+ *
+ */
+
+
+#define                KRB_PORT                750 /* PC's don't have /etc/services */
+#define                KRB_PROT_VERSION        4
+#define        MAX_PKT_LEN             1000
+#define                MAX_TXT_LEN             1000
+#define                TICKET_GRANTING_TICKET  "krbtgt"
+
+/* Macro's to obtain various fields from a packet */
+
+#define pkt_version(packet)   (unsigned int) *(packet->dat)
+#define pkt_msg_type(packet)  (unsigned int) *(packet->dat+1)
+#define pkt_a_name(packet)    (packet->dat+2)
+#define pkt_a_inst(packet)    (packet->dat+3+strlen(pkt_a_name(packet)))
+#define pkt_a_realm(packet)   (pkt_a_inst(packet)+1+strlen(pkt_a_inst(packet)))
+
+
+/* Macro to obtain realm from application request */
+#define apreq_realm(auth)     (auth->dat + 3)
+
+
+/* If there are long alignment problems, these */
+/* will have to be rewritten                    */
+
+#define pkt_time_ws(packet) (unsigned long *) \
+        (packet->dat+5+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \
+               +strlen(pkt_a_realm(packet)))
+#define pkt_no_req(packet) (unsigned short) \
+        *(packet->dat+9+strlen(pkt_a_name(packet))+ \
+       strlen(pkt_a_inst(packet))+strlen(pkt_a_realm(packet)))
+
+#define pkt_x_date(packet) (unsigned long *) \
+        (packet->dat+10+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \
+               +strlen(pkt_a_realm(packet)))
+
+#define pkt_err_code(packet) ( (unsigned long *) \
+        (packet->dat+9+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \
+               +strlen(pkt_a_realm(packet))))
+#define pkt_err_text(packet) \
+        (packet->dat+13+strlen(pkt_a_name(packet))+ \
+               strlen(pkt_a_inst(packet))+strlen(pkt_a_realm(packet)))
+
+/* Routines to create and read packets may be found in prot.c */
+
+struct ktext   *create_packet_to_kdc();
+struct ktext   *create_auth_reply();
+struct ktext   *create_death_packet();
+struct ktext   *pkt_cipher();
+
+/* Message types , always leave lsb for byte order */
+
+#define                AUTH_MSG_KDC_REQUEST            1<<1
+#define        AUTH_MSG_KDC_REPLY                      2<<1
+#define                AUTH_MSG_APPL_REQUEST           3<<1
+#define                AUTH_MSG_APPL_REQUEST_MUTUAL 4<<1
+#define                AUTH_MSG_ERR_REPLY                      5<<1
+#define                AUTH_MSG_PRIVATE                        6<<1
+#define                AUTH_MSG_SAFE                           7<<1
+#define                AUTH_MSG_APPL_ERR                       8<<1
+#define        AUTH_MSG_DIE                            63<<1
+
+/* values for kerb error codes                 */
+#define                        KERB_ERR_OK                     0
+#define                        KERB_ERR_NAME_EXP               1
+#define                        KERB_ERR_SERVICE_EXP            2
+#define                        KERB_ERR_AUTH_EXP               3
+#define                        KERB_ERR_PKT_VER                4
+#define                        KERB_ERR_NAME_MAST_KEY_VER      5
+#define                        KERB_ERR_SERV_MAST_KEY_VER      6
+#define                        KERB_ERR_BYTE_ORDER             7
+#define                        KERB_ERR_PRINCIPAL_UNKNOWN      8
+#define                        KERB_ERR_PRINCIPAL_NOT_UNIQUE   9
+#define                        KERB_ERR_NULL_KEY              10
+
+/* Byte ordering                                                                                                                  */
+static int     ONE = 1;
+#define                HOST_BYTE_ORDER (* (char *) &ONE)
+#define                MSB_FIRST               0       /*  68000                                                                  */
+#define                LSB_FIRST               1       /*  Vax, PC8086                                                    */
diff --git a/man/canonicalize_hostname.3 b/man/canonicalize_hostname.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/format_filesys_type.3 b/man/format_filesys_type.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_auth.3 b/man/mr_auth.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_connect.3 b/man/mr_connect.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_disconnect.3 b/man/mr_disconnect.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_do_update.3 b/man/mr_do_update.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_host.3 b/man/mr_host.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_motd.3 b/man/mr_motd.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_noop.3 b/man/mr_noop.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_query.3 b/man/mr_query.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/mr_set_alternate_input.3 b/man/mr_set_alternate_input.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/parse_filesys_type.3 b/man/parse_filesys_type.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_create.3 b/man/sq_create.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_destroy.3 b/man/sq_destroy.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_empty.3 b/man/sq_empty.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_get_data.3 b/man/sq_get_data.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_remove_data.3 b/man/sq_remove_data.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_save_args.3 b/man/sq_save_args.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_save_data.3 b/man/sq_save_data.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_save_unique_data.3 b/man/sq_save_unique_data.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/sq_save_unique_string.3 b/man/sq_save_unique_string.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/strsave.3 b/man/strsave.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/man/strtrim.3 b/man/strtrim.3
new file mode 100644 (file)
index 0000000..1e8ebec
--- /dev/null
@@ -0,0 +1 @@
+.so man3/moira.3
diff --git a/reg_svr/regtest/create b/reg_svr/regtest/create
new file mode 100755 (executable)
index 0000000..9939c59
--- /dev/null
@@ -0,0 +1,12 @@
+awk ' \
+{ \
+  if (NF == 4) \
+  { \
+     printf("qy ausr \"create unique login ID\" \"create unique UID\" /bin/csh %s %s \"\" 0 %s TEST\n",$1,$2,$NF); \
+  } \
+  else \
+  { \
+     printf("qy ausr \"create unique login ID\" \"create unique UID\" /bin/csh %s %s %s 0 %s TEST\n",$1,$2,$3,$NF); \
+  } \
+}' names | sed 's.,..'
+exit 0
diff --git a/reg_svr/regtest/message b/reg_svr/regtest/message
new file mode 100644 (file)
index 0000000..91e714f
--- /dev/null
@@ -0,0 +1,50 @@
+      Welcome to the Fall '89 Project Athena Registration Test.
+
+If you can find a free workstation, please use the "Click here to
+register for an account" button on xlogin.  If you are already logged
+in to your workstation, in an xterm that is at least 24x80 characters
+large, first do "access_on", then enter the command "rlogin [your
+workstation] -l register", then the password "athena" when it prompts
+for it (please use rlogin and not telnet so that the TERMCAP
+environment variable gets set).
+
+Please note the time when you start.  Follow the screen prompts for
+the registration.  You should be registering as:
+
+
+
+Choose whatever username and password you like.  Please answer the
+following questions when you are done, and return the form to E40-331.
+If you did "access_on" earlier, you will want to execute "access_off"
+now.
+
+Thank you,
+                                       -Mark Rosenstein
+
+-------------------------------------------------------------------------
+1. What time did you start registration:
+
+2. What time did you complete registration:
+
+3. What username did you pick:
+
+4. What password did you choose:
+
+5. Please note any changes you think should be made in the messages
+displayed by register.
+
+
+
+
+
+
+
+
+
+
+
+
+6. Please note any problems or bugs encountered while registering.
+
+
+
diff --git a/reg_svr/regtest/message.head b/reg_svr/regtest/message.head
new file mode 100644 (file)
index 0000000..ffcb347
--- /dev/null
@@ -0,0 +1,13 @@
+      Welcome to the Fall '89 Project Athena Registration Test.
+
+If you can find a free workstation, please use the "Click here to
+register for an account" button on xlogin.  If you are already logged
+in to your workstation, in an xterm that is at least 24x80 characters
+large, first do "access_on", then enter the command "rlogin [your
+workstation] -l register", then the password "athena" when it prompts
+for it (please use rlogin and not telnet so that the TERMCAP
+environment variable gets set).
+
+Please note the time when you start.  Follow the screen prompts for
+the registration.  You should be registering as:
+
diff --git a/reg_svr/regtest/message.tail b/reg_svr/regtest/message.tail
new file mode 100644 (file)
index 0000000..4e309dc
--- /dev/null
@@ -0,0 +1,37 @@
+
+
+Choose whatever username and password you like.  Please answer the
+following questions when you are done, and return the form to E40-331.
+If you did "access_on" earlier, you will want to execute "access_off"
+now.
+
+Thank you,
+                                       -Mark Rosenstein
+
+-------------------------------------------------------------------------
+1. What time did you start registration:
+
+2. What time did you complete registration:
+
+3. What username did you pick:
+
+4. What password did you choose:
+
+5. Please note any changes you think should be made in the messages
+displayed by register.
+
+
+
+
+
+
+
+
+
+
+
+
+6. Please note any problems or bugs encountered while registering.
+
+
+
diff --git a/reg_svr/regtest/names b/reg_svr/regtest/names
new file mode 100644 (file)
index 0000000..467ff09
--- /dev/null
@@ -0,0 +1,39 @@
+Bond, James D          007-00-7007
+Claus, Santa N         012-25-1988
+Reagan, Ronald W       842-48-4832
+Fonebone, Andrew T     617-25-3130
+Bestertester, Fester G 482-67-4583
+Tishan, Mat E          314-15-9265
+Rodriguez, Jose' J     564-43-4427
+Doe, John Q            123-45-6789
+Sample, Mr             000-00-0000
+Normal, Edgar J                637-00-1212
+Raker, Watch B         253-67-4261
+Backwards, Count I     987-65-4321
+Base, Natural L                271-82-8183
+Technology, Mass I     021-39-0770
+Two, Power F           512-64-1024
+Lee, Susan C           888-00-0001
+Lee, Susan C           888-00-0002
+Lee, Susan C           888-00-0003
+Lee, Susan C           888-00-0004
+Password, Forgot M     253-00-1325
+Bright, Miss L         000-18-6000
+It, Whattime S         637-99-1212
+Source, Master V       018-71-0012
+Source, Master R       018-71-0037
+Can, Trash T           839-99-1100
+Airlines, Eastern       262-00-3700
+Toolkit, The X         110-11-0110
+Engineer, Release C    987-65-4321
+Mctrouble, Have U      000-00-0000
+Dover, Ilean D         123-98-4756
+Phatt, Cuttov T                888-77-6666
+Telephone, New E       873-00-1000
+Information, Long D    005-55-1212
+Fonumber, Forgot M     411-41-1411
+Kong, King             999-99-9999
+Zzzzz, Zzzzzz Z                999-99-9999
+Salad, Potato R                443-22-3412
+Us, Toys R             111-22-3333
+Last, First Middle     872-23-1231
diff --git a/reg_svr/regtest/names.crypt b/reg_svr/regtest/names.crypt
new file mode 100644 (file)
index 0000000..2fe4415
--- /dev/null
@@ -0,0 +1,39 @@
+Bond, James D          007-00-7007     bjoFETcM/iECE
+Claus, Santa N         012-25-1988     csR5P3kxbAIqY
+Reagan, Ronald W       842-48-4832     rrUxVK4G1mdmM
+Fonebone, Andrew T     617-25-3130     faSozRn8h1syk
+Bestertester, Fester G 482-67-4583     bfPDJls8hgpyU
+Tishan, Mat E          314-15-9265     tmBrvq8rkWJFQ
+Rodriguez, Jose' J     564-43-4427     rjeEUcajIziuk
+Doe, John Q            123-45-6789     dj6yQFw.efB1.
+Sample, Mr             000-00-0000     smuivEIKvUwzQ
+Normal, Edgar J                637-00-1212     nePq.paPtHO0k
+Raker, Watch B         253-67-4261     rwJxqWDVOVFEw
+Backwards, Count I     987-65-4321     bcLs0PYq8642U
+Base, Natural L                271-82-8183     bnTWstl/Yb2bQ
+Technology, Mass I     021-39-0770     tmZLQwPijCjWs
+Two, Power F           512-64-1024     tppGScOhli9/w
+Lee, Susan C           888-00-0001     lsrayObeTeBo.
+Lee, Susan C           888-00-0002     lsETwfGqsHbf2
+Lee, Susan C           888-00-0003     lsKSOR21t9QH6
+Lee, Susan C           888-00-0004     lsBgtJ2zL8Lkk
+Password, Forgot M     253-00-1325     pf.wPS3Uq4QsE
+Bright, Miss L         000-18-6000     bm6T/hThvblUY
+It, Whattime S         637-99-1212     iw95GTPl9KSOk
+Source, Master V       018-71-0012     smZBfEDBysN9s
+Source, Master R       018-71-0037     smAAyQgx7Hln.
+Can, Trash T           839-99-1100     ctLeqlq5fGULM
+Airlines, Eastern       262-00-3700    aeipxaUaJD5Sc
+Toolkit, The X         110-11-0110     tt0pFaRJbbt5Y
+Engineer, Release C    987-65-4321     eryVuJArxQ6T6
+Mctrouble, Have U      000-00-0000     mh1UtJt6JsbeM
+Dover, Ilean D         123-98-4756     diCmwWNJMGov.
+Phatt, Cuttov T                888-77-6666     pcHR3IRp5gC0c
+Telephone, New E       873-00-1000     tneoaYUP61yX6
+Information, Long D    005-55-1212     ilKjqzfXv3ZeY
+Fonumber, Forgot M     411-41-1411     fflJjvDhb2AuQ
+Kong, King             999-99-9999     kkTb.KfG4uhTA
+Zzzzz, Zzzzzz Z                999-99-9999     zzdorTtAcPS4E
+Salad, Potato R                443-22-3412     sp9Jtl8zQ9CWo
+Us, Toys R             111-22-3333     ut9tdpLN4L6t6
+Last, First Middle     872-23-1231     fV4re5kaIrIg
diff --git a/reg_svr/regtest/printit b/reg_svr/regtest/printit
new file mode 100755 (executable)
index 0000000..5f71a24
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/csh -f
+
+while (1)
+       set input = `echo $<`
+       if ($#input < 2) break
+
+       echo $input | cat message.head - message.tail >> lpr.out
+       echo "\f" >> lpr.out
+end
+
+lpr lpr.out
diff --git a/reg_svr/regtest/script b/reg_svr/regtest/script
new file mode 100644 (file)
index 0000000..5342227
--- /dev/null
@@ -0,0 +1,39 @@
+qy ausr "create unique login ID" "create unique UID" /bin/csh Bond James D 0 bjoFETcM/iECE TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Claus Santa N 0 csR5P3kxbAIqY TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Reagan Ronald W 0 rrUxVK4G1mdmM TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Fonebone Andrew T 0 faSozRn8h1syk TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Bestertester Fester G 0 bfPDJls8hgpyU TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Tishan Mat E 0 tmBrvq8rkWJFQ TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Rodriguez Jose' J 0 rjeEUcajIziuk TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Doe John Q 0 dj6yQFw.efB1. TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Sample Mr "" 0 smuivEIKvUwzQ TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Normal Edgar J 0 nePq.paPtHO0k TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Raker Watch B 0 rwJxqWDVOVFEw TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Backwards Count I 0 bcLs0PYq8642U TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Base Natural L 0 bnTWstl/Yb2bQ TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Technology Mass I 0 tmZLQwPijCjWs TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Two Power F 0 tppGScOhli9/w TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsrayObeTeBo. TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsETwfGqsHbf2 TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsKSOR21t9QH6 TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsBgtJ2zL8Lkk TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Password Forgot M 0 pf.wPS3Uq4QsE TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Bright Miss L 0 bm6T/hThvblUY TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh It Whattime S 0 iw95GTPl9KSOk TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Source Master V 0 smZBfEDBysN9s TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Source Master R 0 smAAyQgx7Hln. TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Can Trash T 0 ctLeqlq5fGULM TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Airlines Eastern "" 0 aeipxaUaJD5Sc TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Toolkit The X 0 tt0pFaRJbbt5Y TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Engineer Release C 0 eryVuJArxQ6T6 TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Mctrouble Have U 0 mh1UtJt6JsbeM TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Dover Ilean D 0 diCmwWNJMGov. TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Phatt Cuttov T 0 pcHR3IRp5gC0c TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Telephone New E 0 tneoaYUP61yX6 TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Information Long D 0 ilKjqzfXv3ZeY TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Fonumber Forgot M 0 fflJjvDhb2AuQ TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Kong King "" 0 kkTb.KfG4uhTA TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Zzzzz Zzzzzz Z 0 zzdorTtAcPS4E TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Salad Potato R 0 sp9Jtl8zQ9CWo TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Us Toys R 0 ut9tdpLN4L6t6 TEST
+qy ausr "create unique login ID" "create unique UID" /bin/csh Last First Middle 0 fV4re5kaIrIg TEST
diff --git a/server/TODO b/server/TODO
new file mode 100644 (file)
index 0000000..1470b28
--- /dev/null
@@ -0,0 +1,34 @@
+Bugs
+----
+
+"Query complete." is printed twice after alis, dlis, and others.
+fflush() before the vfork(), strangely, does not fix this.
+
+The _exit() in next_incremental() may allow memory leakage from the 
+incremental updates, as well as leaving other things (?) not cleaned up.
+Maybe this should be investigated.
+
+Timeouts may sometimes be other errors.  Need to parse the error message
+string when the error number is 39100 to figure out if it is a timeout or not.
+
+gnfq/gqot do not handle wildcards in <login>/<name>.  (Could they?
+Do they need it?) They do handle wildcards for filesystem names.
+
+
+Try to improve performance:
+---------------------------
+gqot/dqot
+
+
+Improvements
+------------
+
+Add case insensitivity: List names, others(?)
+
+Abstraction for string retrieval
+
+
+Other
+-----
+
+rsve, dsin, sshi have range variable problems
This page took 0.306832 seconds and 5 git commands to generate.