From:	CRDGW2::CRDGW2::MRGATE::"SMTP::CUNYVM.CUNY.EDU::VMSSERV%FHCRCVAX.BITNET" 24-OCT-1989 10:34
To:	MRGATE::"ARISIA::EVERHART"
Subj:	VMSSERV_ROOT:[FILES]UAF.3_OF_3;1

Message-Id:  <8910241409.AA03219@crdgw1.ge.com>
Received: from UWAVM.ACS.WASHINGTON.EDU by UWAVM.ACS.WASHINGTON.EDU (IBM VM SMTP R1.2.1MX) with BSMTP id 7236; Tue, 24 Oct 89 07:12:23 PDT
Received: from FHCRCVAX.BITNET (VMSSERV) by UWAVM.ACS.WASHINGTON.EDU (Mailer
 R2.04) with BSMTP id 8052; Tue, 24 Oct 89 07:12:15 PDT
Date: Tue, 24 Oct 89 07:01 PST
From: VMSSERV%FHCRCVAX.BITNET@UWAVM.ACS.WASHINGTON.EDU
Subject: VMSSERV_ROOT:[FILES]UAF.3_OF_3;1
To: everhart@arisia.decnet
X-Vms-To: IN%"everhart%arisia.decnet@crdgw1.ge.com"

+-+-+-+ Beginning of part 3 +-+-+-+
X    if (!test && and) return(0);
X  `125
X
X  if (field.pwd_length)
X  `123
X    test = !((record->uaf$b_pwd_length < minimum.uaf$b_pwd_length) `124`124
X`009     (record->uaf$b_pwd_length > maximum.uaf$b_pwd_length));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.remote_access)
X  `123 /* minimum.uaf$b_remote_access_p,maximum.uaf$b_remote_access_s); */
X    int t1, t2;
X
X    t1 = check_access(
X`009`009record->uaf$b_remote_access_p,
X`009`009minimum.uaf$b_remote_access_p,
X`009`009maximum.uaf$b_remote_access_p);
X    t2 = check_access(
X`009`009record->uaf$b_remote_access_s,
X`009`009minimum.uaf$b_remote_access_s,
X`009`009maximum.uaf$b_remote_access_s);
X    t1 = t1 && t2;
X    if (t1 && !and) return(1);
X    if (!t1 && and) return(0);
X  `125
X
X  if (field.shrfillm)
X  `123
X    test = !((record->uaf$w_shrfillm < minimum.uaf$w_shrfillm) `124`124
X`009     (record->uaf$w_shrfillm > maximum.uaf$w_shrfillm));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.tqcnt)
X  `123
X    test = !((record->uaf$w_tqcnt < minimum.uaf$w_tqcnt) `124`124
X`009     (record->uaf$w_tqcnt > maximum.uaf$w_tqcnt));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.uic)
X  `123
V    test = uic_match(record->uaf$r_uic_overlay.uaf$l_uic,minimum.uaf$r_uic_ov
Xerlay.uaf$l_uic);
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.username)
X  `123
X    trim(record->uaf$t_username,UAF$S_USERNAME);
X    test = string_compare(record->uaf$t_username,
X`009`009minimum.uaf$t_username,UAF$S_USERNAME + 1);
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.dfwscnt)
X  `123
X    test = !((record->uaf$l_dfwscnt < minimum.uaf$l_dfwscnt) `124`124
X`009     (record->uaf$l_dfwscnt > maximum.uaf$l_dfwscnt));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.wsextent)
X  `123
X    test = !((record->uaf$l_wsextent < minimum.uaf$l_wsextent) `124`124
X`009     (record->uaf$l_wsextent > maximum.uaf$l_wsextent));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  if (field.wsquota)
X  `123
X    test = !((record->uaf$l_wsquota < minimum.uaf$l_wsquota) `124`124
X`009     (record->uaf$l_wsquota > maximum.uaf$l_wsquota));
X    if (test && !and) return(1);
X    if (!test && and) return(0);
X  `125
X
X  /* if it was an AND match then it was successfull,`009*/
X  /* if it was an OR search, it must have failed.`009*/
X  return(and);
X`125
X
Xdatecmp(long a[2], long b[2])
X`123 /* if a < b, return -1, if a > b, return 1, if a == b, return 0 */
X  long quad[2];
X
X  lib$subx(a,b,quad);
X  if (quad[1] < 0) return(-1);
X  if ((quad[1] == 0) && (quad[0] == 0)) return(0);
X  return(1);
X`125
X
Xstring_compare(char *s1,char *s2,int max)
X`123
X  struct dsc$descriptor d1 = `123MIN(strlen(s1),max-1),0,0,s1`125;
X  struct dsc$descriptor d2 = `123MIN(strlen(s2),max-1),0,0,s2`125;
X  static struct dsc$descriptor d3 = `1230,DSC$K_DTYPE_T,DSC$K_CLASS_D,0`125;
X
X  str$upcase(&d3,&d1);
X  return(str$match_wild(&d3, &d2) & 1);
X`125
X
Xstruct uic
X`123
X  union
X  `123
X    long value;
X    struct `123
X      short group;
X      short member;
X    `125 uic_fields;
X  `125 uic_overlay;
X`125;
X
Xuic_match(struct uic uic1, struct uic uic2)
X`123
X  if (uic1.uic_overlay.value == uic2.uic_overlay.value) return(1);
V  if (((uic1.uic_overlay.uic_fields.group == -1) `124`124 (uic2.uic_overlay.u
Xic_fields.group == -1))
V     && (uic1.uic_overlay.uic_fields.member == uic2.uic_overlay.uic_fields.me
Xmber)) return(1);
V  if (((uic1.uic_overlay.uic_fields.member == -1) `124`124 (uic2.uic_overlay.
Xuic_fields.member == -1))
V     && (uic1.uic_overlay.uic_fields.group == uic2.uic_overlay.uic_fields.gro
Xup)) return(1);
X  return(0);
X`125
X
X
Xcheck_access(char *r, char *min, char*max)
X`123
X  int t1, t2 = 1, i;
X
X  for (i = 0; i < 3; ++i)
X  `123
X    t1 = (min[i]?(`126r[i] & min[i]):1) &&  (max[i]?!(`126r[i] & max[i]):1);
X    t2 = t1 && t2;
X  `125
X  return(t2);
X`125
X
Xcmp_quad(int x1[2], int x2[2])
X`123
X  return( (x1[0] == x2[0]) &&  (x1[1] == x2[1]) );
X`125
$ GOSUB UNPACK_FILE

$ FILE_IS = "UAF.C"
$ CHECKSUM_IS = 306344136
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/* UAF, written by Joe Meadows, released to the world Jan 31, 1989.
X   This is a public domain utility. No parts of this utility are
X   copyrighted in any way. It may be used in any way, by anyone.
X   There are no restrictions on this code. You may include it
X   in a commercial package if you wish. Feel free to send money,
X   or better yet, make a donation to the FHCRC.
X
X  Joe Meadows Jr.
X  VAX/VMS System Manager / guru in training
X  Fred Hutchinson Cancer Research Center
X  1124 Columbia St.
X  Seattle Wa. 98104
X     bitnet - JOE@FHCRCVAX
X     arpa   - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU
X     voice  - (206) 467-4970
X*/
X
X/* Modification History
X   --------------------
X   Jan 31, 1989 JEM - Conversion from BETA to Release
X   Apr 2 - Fix a few display bugs
X   Jun 9, 1989 TTJ - modified for GNU C
X*/
X#include <stdio.h>
X#include <rms.h>
X
X#include "uaf.h"
X#include "uaf_cld.h"
X
Xextern int uafcld();
Xextern void *get_value();
X
Xmain(int argc, char *argv[])
X`123
X  struct FAB fab;
X  struct RAB rab;
X  struct UAFDEF record;
X  char *s;
X  int records = 0, sts;
X
X  init_cli(uafcld,"UAF");
X `032
X  init_parse("");
X  fab = cc$rms_fab;
X  rab = cc$rms_rab;
X  fab.fab$b_fns = sizeof("sysuaf");
X  fab.fab$l_fna = "sysuaf";
X  fab.fab$b_dns = sizeof("sys$system:.dat");
X  fab.fab$l_dna = "sys$system:.dat";
X  fab.fab$b_fac = FAB$M_GET;
V  fab.fab$b_shr = FAB$M_SHRGET `124 FAB$M_SHRPUT `124 FAB$M_SHRDEL `124 FAB$M
X_SHRUPD;
X  rab.rab$l_rop = RAB$M_NLK;
X  rab.rab$w_usz = sizeof(record);
X  rab.rab$l_ubf = (char *) &record;
X  rab.rab$l_fab = &fab;
X
X  if (cli_present("UIC_ORDER") & 1)
X  `123
X    rab.rab$b_krf = 1;
X  `125
X  sts = SYS$OPEN(&fab);
X  if (!(sts & 1)) return(sts);
X
X  sts = SYS$CONNECT(&rab);
X  if (!(sts & 1)) return(sts);
X
X  s = get_value("OUTPUT");
X  if (s) freopen(s,"w",stdout,"rfm=var","rat=cr");
X
X  while(SYS$GET(&rab) & 1)
X  `123
X    if (select(&record,rab.rab$w_rsz))
X    `123
X      display(&record,rab.rab$w_rsz);
X      ++records;
X    `125
X  `125
X  printf("%d record%s matched\n",records,(records==1)?"":"s");
X  return 1;
X`125
X             `032
$ GOSUB UNPACK_FILE

$ FILE_IS = "UAF.H"
$ CHECKSUM_IS = 275385536
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X#include "$prvdef.h"
X
X/* add the following for the second longword */
X#define PRV$M_UPGRADE 0x00000001
X#define PRV$M_DOWNGRADE 0x00000002
X#define PRV$M_GRPPRV 0x00000004
X#define PRV$M_READALL 0x00000008
X#define PRV$M_SECURITY 0x00000040
X
X
X/* *** MODULE $UAFDEF *** */
X/* ++ */
X/* User authorization file format */
X/* Note: With the exception of the username and account name, */
X/* all strings are blank padded counted strings. Username and */
X/* account name are uncounted, blank padded. */
X/* -- */
X#define UAF$C_USER_ID 1 /* main user ID record */
X#define UAF$C_VERSION1 1 /* this version */
X#define UAF$C_KEYED_PART 52 /* ISAM keys come this far */
X#define UAF$C_AD_II 0 /* AUTODIN-II 32 bit crc code */
X#define UAF$C_PURDY 1 /* Purdy polynomial over salted input */
X#define UAF$C_PURDY_V 2 /* Purdy polynomial + variable length username */
X#define UAF$K_FIXED 644 /* length of fixed portion */
X#define UAF$C_FIXED 644 /* length of fixed portion */
X#define UAF$K_LENGTH 1412
X#define UAF$C_LENGTH 1412
X#define UAF$S_UAFDEF 1412
X
X#define UAF$S_USERNAME 32
X#define UAF$S_PARENT_ID 8
X#define UAF$S_ACCOUNT 32
X#define UAF$S_OWNER 32
X#define UAF$S_DEFDEV 32
X#define UAF$S_DEFDIR 64
X#define UAF$S_LGICMD 64
X#define UAF$S_DEFCLI 32
X#define UAF$S_CLITABLES 32
X#define UAF$S_PWD 8
X#define UAF$S_PWD2 8
X#define UAF$S_EXPIRATION 8
X#define UAF$S_PWD_LIFETIME 8
X#define UAF$S_PWD_DATE 8
X#define UAF$S_PWD2_DATE 8
X#define UAF$S_LASTLOGIN_I 8
X#define UAF$S_LASTLOGIN_N 8
X#define UAF$S_PRIV 8
X#define UAF$S_DEF_PRIV 8
X#define UAF$S_MIN_CLASS 20
X#define UAF$S_MAX_CLASS 20
X#define UAF$S_NETWORK_ACCESS_P 3
X#define UAF$S_NETWORK_ACCESS_S 3
X#define UAF$S_BATCH_ACCESS_P 3
X#define UAF$S_BATCH_ACCESS_S 3
X#define UAF$S_LOCAL_ACCESS_P 3
X#define UAF$S_LOCAL_ACCESS_S 3
X#define UAF$S_DIALUP_ACCESS_P 3
X#define UAF$S_DIALUP_ACCESS_S 3
X#define UAF$S_REMOTE_ACCESS_P 3
X#define UAF$S_REMOTE_ACCESS_S 3
X
Xstruct uaf$r_flags_bits `123
X  unsigned uaf$v_disctly:1; /* no user control-y */
X  unsigned uaf$v_defcli:1; /* only allow user default CLI */
X  unsigned uaf$v_lockpwd:1; /* disable SET PASSWORD command */
X  unsigned uaf$v_captive:1; /* captive account (no overrides) */
X  unsigned uaf$v_disacnt:1; /* no interactive login */
X  unsigned uaf$v_diswelcom:1; /* skip welcome message */
X  unsigned uaf$v_dismail:1; /* skip new mail message */
X  unsigned uaf$v_nomail:1; /* disable mail delivery */
X  unsigned uaf$v_genpwd:1; /* passwords must be generated */
X  unsigned uaf$v_pwd_expired:1; /* password has expired */
X  unsigned uaf$v_pwd2_expired:1; /* 2nd password has expired */
X  unsigned uaf$v_audit:1; /* audit all actions */
X  unsigned uaf$v_disreport:1; /* skip last login messages */
X  unsigned uaf$v_disreconnect:1; /* inhibit reconnections */
X  unsigned uaf$v_autologin:1; /* auto-login only */
X  unsigned uaf$v_disforce_pwd_change:1; /* disable forced password change */
X`125;
X
Xstruct uaf$r_primedays_bits `123
X  unsigned uaf$v_monday:1; /* bit clear means this is a primary day */
X  unsigned uaf$v_tuesday:1; /* bit set means this is an off day */
X  unsigned uaf$v_wednesday:1;`032
X  unsigned uaf$v_thursday:1;`032
X  unsigned uaf$v_friday:1;`032
X  unsigned uaf$v_saturday:1;`032
X  unsigned uaf$v_sunday:1;`032
X`125;
X
Xstruct UAFDEF
X`123
X  char uaf$b_rtype; /* UAF record type */
X  char uaf$b_version; /* UAF format version */
X  short int uaf$w_usrdatoff; /* offset of counted string of user data */
X  char uaf$t_username[UAF$S_USERNAME]; /* username */
X  union `123
X    long int uaf$l_uic; /* user ID code */
X    struct `123
X      short int uaf$w_mem; /* member subfield */
X      short int uaf$w_grp; /* group subfield */
X    `125 uaf$r_uic_fields;
X  `125 uaf$r_uic_overlay;
X  long int uaf$l_sub_id; /* user sub-identifier */
X  long int uaf$q_parent_id[2]; /* identifier of owner of this account */
X  char uaf$t_account[UAF$S_ACCOUNT]; /* account name */
X  char uaf$t_owner[UAF$S_OWNER]; /* owner's name */
X  char uaf$t_defdev[UAF$S_DEFDEV]; /* default device */
X  char uaf$t_defdir[UAF$S_DEFDIR]; /* default directory */
X  char uaf$t_lgicmd[UAF$S_LGICMD]; /* login command file */
X  char uaf$t_defcli[UAF$S_DEFCLI]; /* default command interpreter */
X  char uaf$t_clitables[UAF$S_CLITABLES]; /* user CLI tables */
X  union `123
X    long int uaf$q_pwd[2];  /* hashed password */
X    long int uaf$l_pwd; /* 32 bit subfield */
X  `125 uaf$r_pwd_overlay;
X  long int uaf$q_pwd2[2]; /* second password */
X  short int uaf$w_logfails; /* count of login failures */
X  short int uaf$w_salt; /* random password salt */
X  char uaf$b_encrypt; /* encryption algorithm */
X/* encryption codes */
X  char uaf$b_encrypt2; /* encryption algorithm for 2nd pwd */
X  char uaf$b_pwd_length; /* minimum password length */
X  char uaf$fill_1;
X  long int uaf$q_expiration[2]; /* expiration date for account */
X  long int uaf$q_pwd_lifetime[2]; /* password lifetime */
X  long int uaf$q_pwd_date[2]; /* date of password change */
X  long int uaf$q_pwd2_date[2]; /* date of 2nd password change */
X  long int uaf$q_lastlogin_i[2]; /* date of last interactive login */
X  long int uaf$q_lastlogin_n[2]; /* date of last non-interactive login */
X  union `123
X    long int uaf$q_priv[2]; /* process privilege vector */
X    union prvdef uaf$r_priv;
X  `125 uaf$r_priv_overlay;
X  union `123
X    long int uaf$q_def_priv[2]; /* default process privileges */
X    union prvdef uaf$r_def_priv;
X  `125 uaf$r_def_priv_overlay;
X  char uaf$r_min_class[UAF$S_MIN_CLASS]; /* minimum security class */
X  char uaf$r_max_class[UAF$S_MAX_CLASS]; /* maximum security class */
X  union `123
X    long int uaf$l_flags; /* user flags longword */
X    struct uaf$r_flags_bits uaf$r_flags_bits;
X  `125 uaf$r_flags_overlay;
V  char uaf$b_network_access_p[UAF$S_NETWORK_ACCESS_P]; /* hourly network acce
Xss, primary */
V  char uaf$b_network_access_s[UAF$S_NETWORK_ACCESS_S]; /* hourly network acce
Xss, secondary */
V  char uaf$b_batch_access_p[UAF$S_BATCH_ACCESS_P]; /* hourly batch access, pr
Ximary */
V  char uaf$b_batch_access_s[UAF$S_BATCH_ACCESS_S]; /* hourly batch access, se
Xcondary */
V  char uaf$b_local_access_p[UAF$S_LOCAL_ACCESS_P]; /* hourly local access, pr
Ximary */
V  char uaf$b_local_access_s[UAF$S_LOCAL_ACCESS_S]; /* hourly local access, se
Xcondary */
V  char uaf$b_dialup_access_p[UAF$S_DIALUP_ACCESS_P]; /* hourly dialup access,
X primary */
V  char uaf$b_dialup_access_s[UAF$S_DIALUP_ACCESS_S]; /* hourly dialup access,
X secondary */
V  char uaf$b_remote_access_p[UAF$S_REMOTE_ACCESS_P]; /* hourly remote access,
X primary */
V  char uaf$b_remote_access_s[UAF$S_REMOTE_ACCESS_S]; /* hourly remote access,
X secondary */
X  char uaf$fill_2[514 - 502];
X  union `123
X    char uaf$b_primedays; /* bits representing primary days */
X    struct uaf$r_primedays_bits uaf$r_primedays_bits;
X  `125 uaf$r_primedays_overlay;
X  char uaf$fill_3[516 - 515];
X  char uaf$b_pri; /* base process priority */
X  char uaf$b_quepri; /* maximum job queuing priority */
X  short int uaf$w_maxjobs; /* maximum jobs for UIC allowed */
X/* 0 means no limit */
X  short int uaf$w_maxacctjobs; /* maximum jobs for account allowed */
X/* 0 means no limit */
X  short int uaf$w_maxdetach; /* maximum detached processes for UIC */
X/* 0 means no limit */
X  short int uaf$w_prccnt; /* subprocess creation limit */
X  short int uaf$w_biolm; /* buffered I/O limit */
X  short int uaf$w_diolm; /* direct I/O limit */
X  short int uaf$w_tqcnt; /* timer queue entry limit */
X  short int uaf$w_astlm; /* AST queue limit */
X  short int uaf$w_enqlm; /* enqueue limit */
X  short int uaf$w_fillm; /* open file limit */
X  short int uaf$w_shrfillm; /* shared file limit */
X  long int uaf$l_wsquota; /* working set size quota */
X  long int uaf$l_dfwscnt; /* default working set size */
X  long int uaf$l_wsextent; /* working set size limit */
X  long int uaf$l_pgflquota; /* page file quota */
X  long int uaf$l_cputim; /* CPU time quota */
X  long int uaf$l_bytlm; /* buffered I/O byte count limit */
X  long int uaf$l_pbytlm; /* paged buffer I/O byte count limit */
X  long int uaf$l_jtquota; /* job-wide logical name table creation quota */
X  short int uaf$w_proxy_lim; /* number of proxies user can grant */
X  short int uaf$w_proxies; /* number of proxies granted */
X  short int uaf$w_account_lim; /* number of sub-accounts allowed */
X  short int uaf$w_accounts; /* number of sub-accounts in use */
X  char uaf$fill_4[UAF$K_LENGTH - 580];
X`125;
X `032
$ GOSUB UNPACK_FILE

$ FILE_IS = "UAF.RNH"
$ CHECKSUM_IS = 1275594980
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X.ap
X.rm 70
X.lm 0
X1 UAF
X.lm 1
X
X  UAF is a program for searching through the SYSUAF.DAT file.
XIt has a fairly simplistic interface. You must provide a selection
Xcriteria, and a display criteria. Most fields are able to be selected
Xupon and displayed. Given no arguments, UAF will do nothing..
X
X.lm 0
X2 Examples
X.lm 1
X  To select anybody whose default or authorized privileges
Xare in the "ALL" class, and display their privileges:
X.i+5;$ UAF/SELECT=(PRIV=CLASS=ALL,DEFPRIV=CLASS=ALL) -
X.i+5;$_ /DISPLAY=(USERNAME,PRIV,DEFPRIV)
X
X  To select anybody whose authorized privileges are
Xin the "all" class, and who were not disusered:
X.i+5;$ UAF/SELECT=(PRIV=CLASS=ALL,FLAG=NODISUSER) -
X.i+5;$_ /MATCH=AND/DISPLAY=USERNAME
X.lm 0
X2 Qualifiers
X.lm 1
X.lm 0
X/OUTPUT
X.i+5;OUTPUT=filename
X.lm 1
X`009Redirects all output to a file.
X.lm 0
X/MATCH
X.i+5;/MATCH=[AND `124 OR]
X.lm 1
X`009Specifies, for multiple selection criteria, whether all criteria
Xmust match, or if any one is sufficient. /MATCH=OR is the default,
Xsignifying that any one match is sufficient. /MATCH=AND is allowed,
Xsignifying that all selection criteria must match.
X.lm 0
X/UIC__ORDER
X.lm 1
X`009Causes the SYSUAF to be searched (and displayed) in UIC order
Xrather than USERNAME order.
X
X.lm 0
X/WRAP
X.i+5;/WRAP=n
X.lm 1
X
X`009This is a kind of bogus qualifier (I admit it). If a field displays
Xpast the column specified by /WRAP, then the following field will start
Xin column 2 of the next line.
X
X.lm 0
X/SELECT
X.i+5;/SELECT=(item=(min,max),item=min)
X.lm 1
X
X  For all numeric and date fields, you may specify a minimum and a maximum
Xvalue. If you wish an exact value, you should enter the same thing as both
Xminimum and maximum value.
X
X  Privileges, login__flags, and weekday fields can be entered as a list
Xof items. If the item is negated, then that item must not be present
Xfor the record to be selected, if it is not negated, than any one match
Xwill suffice. For example, /SELECT=PRIV=(NOBYPASS,NOSYSPRV) means the
Xuser must not have either of BYPASS or SYSPRV. /SELECT=PRIV=(BYPASS,SYSPRV)
Xmeans the user must have either BYPASS or SYSPRV. /MATCH=AND does
Xnot change this behaviour.
X
X.lm 0
X/DISPLAY
X.i+5;/DISPLAY=(item,item,...)
X.lm 1
X
X  You'll probably want, at the very least, /DISPLAY=USERNAME
X
X.lm 0
X2 Item__Types
X.lm 1
X
X.lm 0
X3 Access__Hours
X.lm 1
X
X access hours look like:
X.literal
X  thing=([NO][PRIMARY], [n-m], [n] [,...]
X         [NO][SECONDARY], [n-m], [n] [,...])
X.end literal
X
X Used to specify hours of access for all modes of logins.  Specify hours
Xas integers from 0 to 23, inclusive. Hours may be specified as single
Xhours (n), or as ranges of hours (n-m).  The first set of hours after
Xthe keyword PRIMARY specifies hours on primary days; the second set of
Xhours after the keyword SECONDARY specifies hours on secondary days.
X
X Note the differences between this and AUTHORIZE. A range of hours must go
Xfrom a smaller value to a larger value. Hours must be given (i.e. doesn't
Xdefault to 0-23 as does Authorize). If only one of PRIMARY or SECONDARY
Xis specified, no assumptions are made about the other.
X
X.lm 0
X3 Numeric
X.lm 1
X  A numeric value. The range depends on the item.
X
X.lm 0
X3 Text
X.lm 1
X  A (wildcards allowed) text string.
X
X.lm 0
X3 Privilege
X.lm 1
X.blank
X   ALL - All privileges.
XACNT, ALLSPOOL, ALTPRI, BUGCHK, BYPASS, CMEXEC, CMKRNL, DETACH,
XDIAGNOSE, DOWNGRADE, EXQUOTA, GROUP, GRPNAM, GRPPRV, LOG__IO,
XMOUNT, NETMBX, OPER, PFNMAP, PHY__IO, PRMCEB, PRMGBL, PRMMBX,
XPSWAPM, READALL, SECURITY, SETPRV, SHARE, SHMEM, SYSLCK, SYSGBL,
XSYSNAM, SYSPRV, TMPMBX, UPGRADE, VOLPRO, WORLD,
XCLASS=privilege-class
X.lm 0
X4 Privilege__Class
X.lm 1
X.blank
X.literal
X   ALL:    bypass, cmexec, cmkrnl, detach, log_io,
X           pfnmap, phy_io, setprv, share, sysnam, sysprv, readall
X   FILES:  diagnose, sysgbl, volpro, upgrade, downgrade, security
X   SYSTEM: altpri, oper, pswapm, world
X   DEVOUR: acnt, allspool, bugchk, exquota, grpnam,
X           prmceb, prmgbl, prmmbx, shmem, syslck
X   GROUP:  group, grpprv
X   NORMAL: mount, netmbx, tmpmbx
X.end literal  `032
X.lm 0
X3 weekday
X.lm 1
X.blank
X  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
X
X.lm 0
X3 login__flags
X.lm 1
X.blank
X  AUDIT, AUTOLOGIN, CAPTIVE, DEFCLI, DISCTLY, DISFORCE__PWD__CHANGE,
XDISMAIL, DISNEWMAIL, DISRECONNECT, DISREPORT, DISUSER, DISWELCOME,
XGENPWD, LOCKPWD, PWD__EXPIRED, PWD2__EXPIRED
X
X.lm 0
X3 date
X.lm 1
X  Standard VMS date/time.
X
X  To specify all records with a date prior to something, use
Xthe date 17-NOV-1858 as the minimum date. For example:
X.i+5;INTERACTIVE=(17-NOV-1858,maximum)
X
X  To specify all records with no date set use the date 17-NOV-1858
Xas both a minimum and maximum value. For example:
X.i+5;INTERACTIVE=(17-NOV-1858,17-NOV-1858)
X
X.! This will get cleaned up someday, it really is bogus.
X
X.lm 0
X3 deltatime
X.lm 1
X  Standard VMS deltatime.
X
X.lm 0
X2 Items
X.lm 1
X
X.lm 0
X3 RTYPE
X.lm 1
X  numeric
X
X  Record type. All user records have a record type of 1. The
Xsystem password is stored in the SYSUAF with a record type of 0.
X.lm 0
X3 VERSION
X.lm 1
X  numeric
X.lm 0
X3 USRDATOFF
X.lm 1
X  numeric
X.lm 0
X3 LOGFAILS
X.lm 1
X  numeric
X
X  Number of login failures.
X.lm 0
X3 PWDCHANGE
X.lm 1
X  date
X
X  Date of last (primary) password change.
X.lm 0
X3 PWD2CHANGE
X.lm 1
X  date
X
X  Date of last (secondary) password change.
X.lm 0
X3 INTERACTIVE
X.lm 1
X  date
X
X  Last interactive login date _& time.
X.lm 0
X3 NONINTERACTIVE
X.lm 1
X  date
X
X  Last non-interactive login date _& time.
X.lm 0
X3 ACCESS
X.lm 1
X  access__hours
X
X  Access sets up all the access hours to look the same.
XBatch, Dialup, Local, Network, and Remote. This gets parsed before
Xthe other access keywords, so if you follow ACCESS with (for example)
XDIALUP, the dialup access hours will be set accordingly.
X.lm 0
X3 BATCH
X.lm 1
X  access__hours
X.lm 0
X3 DIALUP
X.lm 1
X  access__hours
X.lm 0
X3 LOCAL
X.lm 1
X  access__hours
X.lm 0
X3 NETWORK
X.lm 1
X  access__hours
X.lm 0
X3 REMOTE
X.lm 1
X  access__hours
X.lm 0
X3 ACCOUNT
X.lm 1
X  text
X.lm 0
X3 CLI
X.lm 1
X  text
X.lm 0
X3 CLITABLES
X.lm 1
X  text
X.lm 0
X3 DEVICE
X.lm 1
X  text
X.lm 0
X3 DIRECTORY
X.lm 1
X  text
X.lm 0
X3 LGICMD
X.lm 1
X  text
X.lm 0
X3 OWNER
X.lm 1
X  text
X.lm 0
X3 ASTLM
X.lm 1
X  numeric
X.lm 0
X3 BIOLM
X.lm 1
X  numeric
X.lm 0
X3 BYTLM
X.lm 1
X  numeric
X.lm 0
X3 DIOLM
X.lm 1
X  numeric
X.lm 0
X3 ENQLM
X.lm 1
X  numeric
X.lm 0
X3 FILLM
X.lm 1
X  numeric
X.lm 0
X3 JTQUOTA
X.lm 1
X  numeric
X.lm 0
X3 MAXACCTJOBS
X.lm 1
X  numeric
X.lm 0
X3 MAXDETACH
X.lm 1
X  numeric
X.lm 0
X3 MAXJOBS
X.lm 1
X  numeric
X.!
X.!Remove the following comments if you want folks to know about this
X.!
X.!3 PASSWORD
X.!  text
X.!
X.!  specify the primary password, optionally followed by a seconday password
X.lm 0
X3 PGFLQUOTA
X.lm 1
X  numeric
X.lm 0
X3 PRCLM
X.lm 1
X  numeric
X.lm 0
X3 PRIORITY
X.lm 1
X  numeric
X.lm 0
X3 PWDMINIMUM
X.lm 1
X  numeric
X.lm 0
X3 SHRFILLM
X.lm 1
X  numeric
X.lm 0
X3 TQELM
X.lm 1
X  numeric
X.lm 0
X3 WSDEFAULT
X.lm 1
X  numeric
X.lm 0
X3 WSEXTENT
X.lm 1
X  numeric
X.lm 0
X3 WSQUOTA
X.lm 1
X  numeric
X.lm 0
X3 CPUTIME
X.lm 1
X  deltatime
X
X  Hmm, not currently implemented I think..
X.lm 0
X3 PWDLIFETIME
X.lm 1
X  deltatime
X.lm 0
X3 EXPIRATION
X.lm 1
X  date
X.lm 0
X3 USERNAME
X.lm 1
X  text
X.lm 0
X3 UIC
X.lm 1
X  uic
X
X  Uic in numeric or ID format. Wildcarded group or member is allowed.
XThe same restrictions apply to wildcarding UICs as in the Authorize
Xand Diskquota programs.
X.lm 0
X3 DEFPRIVILEGES
X.lm 1
X  privilege
X.lm 0
X3 PRIVILEGES
X.lm 1
X  privilege
X.lm 0
X3 FLAGS
X.lm 1
X  login__flags
X.lm 0
X3 PRIMEDAYS
X.lm 1
X  weekday
X.lm 0
$ GOSUB UNPACK_FILE

$ FILE_IS = "UAFCLD.CLD"
$ CHECKSUM_IS = 1430361727
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
Xdefine type priv_class
X  keyword ALL, negatable
X  ! bypass, cmexec, cmkrnl, detach, log_io,
X  ! pfnmap, phy_io, setprv, share, sysnam, sysprv, readall
X  keyword FILES, negatable
X  ! diagnose, sysgbl, volpro, upgrade, downgrade, security
X  keyword SYSTEM, negatable
X  ! altpri, oper, pswapm, world
X  keyword DEVOUR, negatable
X  ! acnt, allspool, bugchk, exquota, grpnam,
X  ! prmceb, prmgbl, prmmbx, shmem, syslck
X  keyword GROUP, negatable
X  ! group, grpprv
X  keyword NORMAL, negatable
X  ! mount, netmbx, tmpmbx
X
Xdefine type PRIVILEGES
X   keyword CLASS, value(type=priv_class)
X   keyword ACNT, negatable
X   keyword ALL, negatable
X   keyword ALLSPOOL, negatable
X   keyword ALTPRI, negatable
X   keyword BUGCHK, negatable
X   keyword BYPASS, negatable
X   keyword CMEXEC, negatable
X   keyword CMKRNL, negatable
X   keyword DETACH, negatable
X   keyword DIAGNOSE, negatable
X   keyword DOWNGRADE, negatable
X   keyword EXQUOTA, negatable
X   keyword GROUP, negatable
X   keyword GRPNAM, negatable
X   keyword GRPPRV, negatable
X   keyword LOG_IO, negatable
X   keyword MOUNT, negatable
X   keyword NETMBX, negatable
X   keyword OPER, negatable
X   keyword PFNMAP, negatable
X   keyword PHY_IO, negatable
X   keyword PRMCEB, negatable
X   keyword PRMGBL, negatable
X   keyword PRMMBX, negatable
X   keyword PSWAPM, negatable
X   keyword READALL, negatable
X   keyword SECURITY, negatable
X   keyword SETPRV, negatable
X   keyword SHARE, negatable
X   keyword SHMEM, negatable
X   keyword SYSLCK, negatable
X   keyword SYSGBL, negatable
X   keyword SYSNAM, negatable
X   keyword SYSPRV, negatable
X   keyword TMPMBX, negatable
X   keyword UPGRADE, negatable
X   keyword VOLPRO, negatable
X   keyword WORLD, negatable
X
Xdefine type weekdays
X  keyword SUNDAY, negatable
X  keyword MONDAY, negatable
X  keyword TUESDAY, negatable
X  keyword WEDNESDAY, negatable
X  keyword THURSDAY, negatable
X  keyword FRIDAY, negatable
X  keyword SATURDAY, negatable
X
Xdefine type login_flags
X  keyword AUDIT, negatable
X  keyword AUTOLOGIN, negatable
X  keyword CAPTIVE, negatable
X  keyword DEFCLI, negatable
X  keyword DISCTLY, negatable
X  keyword DISFORCE_PWD_CHANGE, negatable
X  keyword DISMAIL, negatable
X  keyword DISNEWMAIL, negatable
X  keyword DISRECONNECT, negatable
X  keyword DISREPORT, negatable
X  keyword DISUSER, negatable
X  keyword DISWELCOME, negatable
X  keyword GENPWD, negatable
X  keyword LOCKPWD, negatable
X  keyword PWD_EXPIRED, negatable
X  keyword PWD2_EXPIRED, negatable
X
X
Xdefine type selection_types
X  keyword RTYPE, value(required,type=$number,list)
X  keyword VERSION, value(required, type=$number,list)
X  keyword USRDATOFF, value(required, type=$number,list)
X  keyword LOGFAILS, value(required, type=$number, list)
X  keyword PWDCHANGE, value(type=$datetime,required,list)
X  keyword PWD2CHANGE, value(type=$datetime,required,list)
X  keyword INTERACTIVE, value(type=$datetime,required,list)
X  keyword NONINTERACTIVE, value(type=$datetime,required,list)
X
X  !access values look like:
X  ! [NO]thing=([PRIMARY], [n-m], [n] [,...] [SECONDARY], [n-m], [n] [,...])
X  ! [NO]thing="[PRIMARY][:] [n-m][,] [n][,...][;] [SECONDARY][:] [n-m][,...]"
X  keyword ACCESS, value(list), negatable
X  keyword BATCH, value(list), negatable
X  keyword DIALUP, value(list), negatable
X  !keyword INTERACTIVE, value(list), negatable
X  keyword LOCAL, value(list), negatable
X  keyword NETWORK, value(list), negatable
X  keyword REMOTE, value(list), negatable
X  !
X  !string values
X  keyword ACCOUNT, value(required)
X  keyword CLI, value(required)
X  keyword CLITABLES, value(required)
X  keyword DEVICE, value(required)
X  keyword DIRECTORY, value(required)
X  keyword LGICMD, value(required)
X  keyword OWNER, value(required)
X  keyword PASSWORD, value(required, list)
X  !
X  ! numeric values
X  keyword ASTLM, value(type=$number,required,list)
X  keyword BIOLM, value(type=$number,required,list)
X  keyword BYTLM, value(type=$number,required,list)
X  keyword DIOLM, value(type=$number,required,list)
X  keyword ENQLM, value(type=$number,required,list)
X  keyword FILLM, value(type=$number,required,list)
X  keyword JTQUOTA, value(type=$number,required,list)
X  keyword MAXACCTJOBS, value(type=$number,required,list)
X  keyword MAXDETACH, value(type=$number,required,list)
X  keyword MAXJOBS, value(type=$number,required,list)
X  !  keyword PBYTLM, value(type=$number,required,list)
X  keyword PGFLQUOTA, value(type=$number,required,list)
X  keyword PRCLM, value(type=$number,required,list)
X  keyword PRIORITY, value(type=$number,required,list)
X  keyword PWDMINIMUM, value(type=$number,required,list)
X  keyword SHRFILLM, value(type=$number,required,list)
X  keyword TQELM, value(type=$number,required,list)
X  keyword WSDEFAULT, value(type=$number,required,list)
X  keyword WSEXTENT, value(type=$number,required,list)
X  keyword WSQUOTA, value(type=$number,required,list)
X  !
X  !various values
X  keyword CPUTIME, value(type=$deltatime,required,list)
X  keyword PWDLIFETIME, value(type=$deltatime,required,list)
X  keyword EXPIRATION, value(type=$datetime,required,list)
X  keyword USERNAME, value(required)
X  keyword UIC, value(type=$uic,required)
X  keyword DEFPRIVILEGES, value(type=privileges,list,required)
X  keyword PRIVILEGES, value(type=privileges,list,required)
X  keyword FLAGS, value(type=login_flags,list,required)
X  keyword PRIMEDAYS, value(type=weekdays,list), negatable
X  keyword PWDEXPIRED, negatable
X
Xdefine type display_types
X  keyword RTYPE
X  keyword VERSION
X  keyword USRDATOFF
X  keyword LOGFAILS
X  keyword PWDCHANGE
X  keyword PWD2CHANGE
X  keyword INTERACTIVE
X  keyword NONINTERACTIVE
X  keyword ACCESS
X  keyword BATCH
X  keyword DIALUP
X  keyword LOCAL
X  keyword NETWORK
X  keyword REMOTE
X  keyword ACCOUNT
X  keyword CLI
X  keyword CLITABLES
X  keyword DEVICE
X  keyword DIRECTORY
X  keyword LGICMD
X  keyword OWNER
X  keyword PASSWORD
X  keyword ASTLM
X  keyword BIOLM
X  keyword BYTLM
X  keyword DIOLM
X  keyword ENQLM
X  keyword FILLM
X  keyword JTQUOTA
X  keyword MAXACCTJOBS
X  keyword MAXDETACH
X  keyword MAXJOBS
X  !  keyword PBYTLM
X  keyword PGFLQUOTA
X  keyword PRCLM
X  keyword PRIORITY
X  keyword PWDMINIMUM
X  keyword SHRFILLM
X  keyword TQELM
X  keyword USERNAME
X  keyword WSDEFAULT
X  keyword WSEXTENT
X  keyword WSQUOTA
X  keyword CPUTIME
X  keyword PWDLIFETIME
X  keyword EXPIRATION
X  keyword UIC
X  keyword DEFPRIVILEGES
X  keyword PRIVILEGES
X  keyword FLAGS
X  keyword PRIMEDAYS
X  keyword PWDEXPIRED
X
Xdefine type match_types
X  keyword AND
X  keyword OR
X
Xdefine verb uaf
X
X  qualifier select, value(list,type=selection_types)
X  qualifier display, value(list,type=display_types)
X  qualifier match, value(type=match_types)
X  qualifier wrap, value(type=$number)
X  qualifier output, value
X  qualifier uic_order
$ GOSUB UNPACK_FILE

$ FILE_IS = "UAF_CLD.H"
$ CHECKSUM_IS = 743997230
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
Xstruct UAF_FIELDS
X`123
X  unsigned rtype:1;
X  unsigned version:1;
X  unsigned usrdatoff:1;
X  unsigned username:1;
X  unsigned uic:1;
X  unsigned account:1;
X  unsigned owner:1;
X  unsigned defdev:1;
X  unsigned defdir:1;
X  unsigned lgicmd:1;
X  unsigned defcli:1;
X  unsigned clitables:1;
X  unsigned pwd:1;`032
X  unsigned pwd2:1;
X  unsigned logfails:1;
X  unsigned salt:1;
X  unsigned encrypt:1;
X  unsigned encrypt2:1;
X  unsigned pwd_length:1;
X  unsigned expiration:1;
X  unsigned pwd_lifetime:1;
X  unsigned pwd_date:1;
X  unsigned pwd2_date:1;
X  unsigned lastlogin_i:1;
X  unsigned lastlogin_n:1;
X  unsigned priv:1;
X  unsigned def_priv:1;
X  unsigned min_class:1;
X  unsigned max_class:1;
X  unsigned flags:1;
X  unsigned network_access:1;
X  unsigned batch_access:1;
X  unsigned local_access:1;
X  unsigned dialup_access:1;
X  unsigned remote_access:1;
X  unsigned primedays:1;
X  unsigned pri:1;
X  unsigned quepri:1;
X  unsigned maxjobs:1;
X  unsigned maxacctjobs:1;
X  unsigned maxdetach:1;
X  unsigned prccnt:1;
X  unsigned biolm:1;
X  unsigned diolm:1;
X  unsigned tqcnt:1;
X  unsigned astlm:1;
X  unsigned enqlm:1;
X  unsigned fillm:1;
X  unsigned shrfillm:1;
X  unsigned wsquota:1;
X  unsigned dfwscnt:1;
X  unsigned wsextent:1;
X  unsigned pgflquota:1;
X  unsigned cputim:1;
X  unsigned bytlm:1;
X  unsigned pbytlm:1;
X  unsigned jtquota:1;
X  unsigned proxy_lim:1;
X  unsigned proxies:1;
X  unsigned account_lim:1;
X  unsigned accounts:1;
X  unsigned password:1;
X`125;
Xstatic char *priv_txt[] = `123
X  "CMKRNL","CMEXEC","SYSNAM","GRPNAM","ALLSPOOL","DETACH","DIAGNOSE",
X  "LOG_IO","GROUP","ACNT","PRMCEB","PRMMBX","PSWAPM","ALTPRI","SETPRV",
X  "TMPMBX","WORLD","MOUNT","OPER","EXQUOTA","NETMBX","VOLPRO","PHY_IO",
X  "BUGCHK","PRMGBL","SYSGBL","PFNMAP","SHMEM","SYSPRV","BYPASS","SYSLCK",
X  "SHARE","UPGRADE","DOWNGRADE","GRPPRV","READALL","TMPJNL","PRMJNL",
X  "SECURITY"`125;
Xstatic char *flag_txt[] = `123
X  "DISCTLY","DEFCLI","LOCKPWD","CAPTIVE","DISUSER","DISWELCOME","DISNEWMAIL",
X  "DISMAIL","GENPWD","PWD_EXPIRED","PWD2_EXPIRED","AUDIT","DISREPORT",
X  "DISRECONNECT","AUTOLOGIN","DISFORCE_PWD_CHANGE"`125;
Xstatic char *primeday_txt[] = `123
X  "MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"`125;
$ GOSUB UNPACK_FILE

$ FILE_IS = "WORDLIST.H"
$ CHECKSUM_IS = 188170084
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
Xchar *words[] = `123
X"AAA",
X"ACADEMIA",
X"AEROBICS",
X"AIRPLANE",
X"ALBANY",
X"ALBATROSS",
X"ALBERT",
X"ALEX",
X"ALEXANDER",
X"ALGEBRA",
X"ALIASES",
X"ALPHABET",
X"AMA",
X"AMORPHOUS",
X"ANALOG",
X"ANCHOR",
X"ANDROMACHE",
X"ANIMALS",
X"ANSWER",
X"ANTHROPOGENIC",
X"ANVILS",
X"ANYTHING",
X"ARIA",
X"ARIADNE",
X"ARROW",
X"ARTHUR",
X"ATHENA",
X"ATMOSPHERE",
X"AZTECS",
X"AZURE",
X"BACCHUS",
X"BAILEY",
X"BANANA",
X"BANANAS",
X"BANDIT",
X"BANKS",
X"BARBER",
X"BARITONE",
X"BASS",
X"BASSOON",
X"BATMAN",
X"BEATER",
X"BEAUTY",
X"BEETHOVEN",
X"BELOVED",
X"BENZ",
X"BEOWULF",
X"BERKELEY",
X"BERLINER",
X"BERYL",
X"BEVERLY",
X"BICAMERAL",
X"BOB",
X"BRENDA",
X"BRIAN",
X"BRIDGET",
X"BROADWAY",
X"BUMBLING",
X"BURGESS",
X"CAMPANILE",
X"CANTOR",
X"CARDINAL",
X"CARMEN",
X"CAROLINA",
X"CAROLINE",
X"CASCADES",
X"CASTLE",
X"CAT",
X"CAYUGA",
X"CELTICS",
X"CERULEAN",
X"CHANGE",
X"CHARLES",
X"CHARMING",
X"CHARON",
X"CHESTER",
X"CIGAR",
X"CLASSIC",
X"CLUSTERS",
X"COFFEE",
X"COKE",
X"COLLINS",
X"COMMRADES",
X"COMPUTER",
X"CONDO",
X"COOKIE",
X"COOPER",
X"CORNELIUS",
X"COUSCOUS",
X"CREATION",
X"CREOSOTE",
X"CRETIN",
X"DAEMON",
X"DANCER",
X"DANIEL",
X"DANNY",
X"DAVE",
X"DECEMBER",
X"DEFOE",
X"DELUGE",
X"DESPERATE",
X"DEVELOP",
X"DIETER",
X"DIGITAL",
X"DISCOVERY",
X"DISNEY",
X"DOG",
X"DROUGHT",
X"DUNCAN",
X"EAGER",
X"EASIER",
X"EDGES",
X"EDINBURGH",
X"EDWIN",
X"EDWINA",
X"EGGHEAD",
X"EIDERDOWN",
X"EILEEN",
X"EINSTEIN",
X"ELEPHANT",
X"ELIZABETH",
X"ELLEN",
X"EMERALD",
X"ENGINE",
X"ENGINEER",
X"ENTERPRISE",
X"ENZYME",
X"ERSATZ",
X"ESTABLISH",
X"ESTATE",
X"EUCLID",
X"EVELYN",
X"EXTENSION",
X"FAIRWAY",
X"FELICIA",
X"FENDER",
X"FERMAT",
X"FIDELITY",
X"FINITE",
X"FISHERS",
X"FLAKES",
X"FLOAT",
X"FLOWER",
X"FLOWERS",
X"FOOLPROOF",
X"FOOTBALL",
X"FORESIGHT",
X"FORMAT",
X"FORSYTHE",
X"FOURIER",
X"FRED",
X"FRIEND",
X"FRIGHTEN",
X"FUN",
X"FUNGIBLE",
X"GABRIEL",
X"GARDNER",
X"GARFIELD",
X"GAUSS",
X"GEORGE",
X"GERTRUDE",
X"GINGER",
X"GLACIER",
X"GNU",
X"GOLFER",
X"GORGEOUS",
X"GORGES",
X"GOSLING",
X"GOUGE",
X"GRAHAM",
X"GRYPHON",
X"GUEST",
X"GUITAR",
X"GUMPTION",
X"GUNTIS",
X"HACKER",
X"HAMLET",
X"HANDILY",
X"HAPPENING",
X"HARMONY",
X"HAROLD",
X"HARVEY",
X"HEBRIDES",
X"HEINLEIN",
X"HELLO",
X"HELP",
X"HERBERT",
X"HIAWATHA",
X"HIBERNIA",
X"HONEY",
X"HORSE",
X"HORUS",
X"HUTCHINS",
X"IMBROGLIO",
X"IMPERIAL",
X"INCLUDE",
X"INGRES",
X"INNA",
X"INNOCUOUS",
X"IRISHMAN",
X"ISIS",
X"JAPAN",
X"JESSICA",
X"JESTER",
X"JIXIAN",
X"JOHNNY",
X"JOSEPH",
X"JOSHUA",
X"JUDITH",
X"JUGGLE",
X"JULIA",
X"KATHLEEN",
X"KERMIT",
X"KERNEL",
X"KIRKLAND",
X"KNIGHT",
X"LADLE",
X"LAMBDA",
X"LAMINATION",
X"LARKIN",
X"LARRY",
X"LAZARUS",
X"LEBESGUE",
X"LEE",
X"LELAND",
X"LEROY",
X"LEWIS",
X"LIGHT",
X"LISA",
X"LOUIS",
X"LYNNE",
X"MACINTOSH",
X"MACK",
X"MAGGOT",
X"MAGIC",
X"MALCOLM",
X"MARK",
X"MARKUS",
X"MARTY",
X"MARVIN",
X"MASTER",
X"MAURICE",
X"MELLON",
X"MERLIN",
X"METS",
X"MICHAEL",
X"MICHELLE",
X"MIKE",
X"MINIMUM",
X"MINSKY",
X"MOGULS",
X"MOOSE",
X"MORLEY",
X"MOZART",
X"NANCY",
X"NAPOLEON",
X"NEPENTHE",
X"NESS",
X"NETWORK",
X"NEWTON",
X"NEXT",
X"NOXIOUS",
X"NUTRITION",
X"NYQUIST",
X"OCEANOGRAPHY",
X"OCELOT",
X"OLIVETTI",
X"OLIVIA",
X"ORACLE",
X"ORCA",
X"ORWELL",
X"OSIRIS",
X"OUTLAW",
X"OXFORD",
X"PACIFIC",
X"PAINLESS",
X"PAKISTAN",
X"PAM",
X"PAPERS",
X"PASSWORD",
X"PATRICIA",
X"PENGUIN",
X"PEORIA",
X"PERCOLATE",
X"PERSIMMON",
X"PERSONA",
X"PETE",
X"PETER",
X"PHILIP",
X"PHOENIX",
X"PIERRE",
X"PIZZA",
X"PLOVER",
X"PLYMOUTH",
X"POLYNOMIAL",
X"PONDERING",
X"PORK",
X"POSTER",
X"PRAISE",
X"PRECIOUS",
X"PRELUDE",
X"PRINCE",
X"PRINCETON",
X"PROTECT",
X"PROTOZOA",
X"PUMPKIN",
X"PUNEET",
X"PUPPET",
X"RABBIT",
X"RACHMANINOFF",
X"RAINBOW",
X"RAINDROP",
X"RALEIGH",
X"RANDOM",
X"RASCAL",
X"REALLY",
X"REBECCA",
X"REMOTE",
X"RICK",
X"RIPPLE",
X"ROBOTICS",
X"ROCHESTER",
X"ROLEX",
X"ROMANO",
X"RONALD",
X"ROSEBUD",
X"ROSEMARY",
X"ROSES",
X"RUBEN",
X"RULES",
X"RUTH",
X"SAL",
X"SAXON",
X"SCAMPER",
X"SCHEME",
X"SCOTT",
X"SCOTTY",
X"SECRET",
X"SENSOR",
X"SERENITY",
X"SHARKS",
X"SHARON",
X"SHEFFIELD",
X"SHELDON",
X"SHIVA",
X"SHIVERS",
X"SHUTTLE",
X"SIGNATURE",
X"SIMON",
X"SIMPLE",
X"SINGER",
X"SINGLE",
X"SMILE",
X"SMILES",
X"SMOOCH",
X"SMOTHER",
X"SNATCH",
X"SNOOPY",
X"SOAP",
X"SOCRATES",
X"SOSSINA",
X"SPARROWS",
X"SPIT",
X"SPRING",
X"SPRINGER",
X"SQUIRES",
X"STRANGLE",
X"STRATFORD",
X"STUTTGART",
X"SUBWAY",
X"SUCCESS",
X"SUMMER",
X"SUPER",
X"SUPERSTAGE",
X"SUPPORT",
X"SUPPORTED",
X"SURFER",
X"SUZANNE",
X"SWEARER",
X"SYMMETRY",
X"TANGERINE",
X"TAPE",
X"TARGET",
X"TARRAGON",
X"TAYLOR",
X"TELEPHONE",
X"TEMPTATION",
X"THAILAND",
X"TIGER",
X"TOGGLE",
X"TOMATO",
X"TOPOGRAPHY",
X"TORTOISE",
X"TOYOTA",
X"TRAILS",
X"TRIVIAL",
X"TROMBONE",
X"TUBAS",
X"TUTTLE",
X"UMESH",
X"UNHAPPY",
X"UNICORN",
X"UNKNOWN",
X"URCHIN",
X"UTILITY",
X"VASANT",
X"VERTIGO",
X"VICKY",
X"VILLAGE",
X"VIRGINIA",
X"WARREN",
X"WATER",
X"WEENIE",
X"WHATNOT",
X"WHITING",
X"WHITNEY",
X"WILL",
X"WILLIAM",
X"WILLIAMSBURG",
X"WILLIE",
X"WINSTON",
X"WISCONSIN",
X"WIZARD",
X"WOMBAT",
X"WOODWIND",
X"WORMWOOD",
X"YACOV",
X"YANG",
X"YELLOWSTONE",
X"YOSEMITE",
X"ZAP",
X"ZIMMERMAN",
X0
X`125;
$ GOSUB UNPACK_FILE
$ EXIT
-+-+-+-+-+ End of part 3 +-+-+-+-+-
