[comp.sources.unix] v24i078: SystemVr4/386 SLIP driver and utilities, Part01/04

rsalz@uunet.uu.net (Rich Salz) (03/23/91)

Submitted-by: sudji@indo.intel.com (Sudji Husodo)
Posting-number: Volume 24, Issue 78
Archive-name: sysVr4386slip/part01

[ I repacked this, but have not tested it.  It might run on other SysVr4
  systems without too many changes.  --r$ ]

This package contains a SLIP driver and related utilities for Unix System
V/386 Release 4.0.  SLIP is a protocol that lets you run the IP (and
related) network protocols over a standard serial line.

The utility programs include:
	+slattach, to link the SLIP streams driver to the serial port, and the
	 IP driver to the SLIP driver.
	+slhangup and slhangupd, to process hangup messages.
	+dialslip, to allow hosts to dial in and start SLIP sessions.

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# Contents:  PACKNOTES README MANIFEST dialslip driver driver/ID
#   driver/io driver/io/slip.c driver/sys driver/v2.ip.fix
#   driver/v2.ip.fix/Driver.UU.02 man man/man1 man/man7 utils
# Wrapped by rsalz@litchi.bbn.com on Fri Mar 22 11:57:10 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
echo If this archive is complete, you will see the following message:
echo '          "shar: End of archive 1 (of 4)."'
if test -f 'PACKNOTES' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'PACKNOTES'\"
else
  echo shar: Extracting \"'PACKNOTES'\" \(242 characters\)
  sed "s/^X//" >'PACKNOTES' <<'END_OF_FILE'
X
X# "driver/v2.ip.fix//Driver.o.UU" was split into 2 parts; to create it, do
X	cat driver/v2.ip.fix//Driver.UU.0[1-9] >driver/v2.ip.fix//Driver.o.UU
X# Run uudecode to create "driver/v2.ip.fix//Driver.o":
X	uudecode driver/v2.ip.fix//Driver.o.UU
END_OF_FILE
  if test 242 -ne `wc -c <'PACKNOTES'`; then
    echo shar: \"'PACKNOTES'\" unpacked with wrong size!
  fi
  # end of 'PACKNOTES'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
  echo shar: Extracting \"'README'\" \(3558 characters\)
  sed "s/^X//" >'README' <<'END_OF_FILE'
X
XSLIP (Serial Link Internet Protocol)
X
XTo build and install the slip driver, the slip utilities, and the slip login
X(dialslip) utilities, type the following command:
X
X	make
X
X
XSLIP DRIVER
X
XIf you are using Unix System V Release 4.0.2 or below, you will need to copy
Xv2.ip.fix/Driver.o to /etc/conf/pack.d/ip/Driver.o  before you build the
Xkernel. The ip driver of Unix System V R 4.0.2 has a bug for a point to point
Xconnection which panics the system. The v2.ip.fix/Driver.o fixes the problem.
XSLIP (Serial Link Internet Protocol)
X
XIf you need to configure the second serial port, because your first serial
Xport is used by other device, refer to Intel's Unix System V.4.0 Administra-
Xtors Guide.
X	
XOnce the new ip driver and the slip have been installed, and your serial port
Xhas been set up, you can build the kernel using the idbuild command. Don't
Xforget to reboot your system after the idbuild command completes succesfully
Xfor the new kernel to take into effect.
X
X
XSLIP UTILITIES
X
Xslattach
X
XThe slattach command links the slip streams driver to the serial port and links
Xthe ip driver to the slip driver.
X
XThe syntax of slattach is as following:
X
X	slattach [-i] nodename interface_name 
XOR  slattach -d [-i] devname interface_name [ baudrate ]
XOR  slattach - interface_name
X
XThe first option uses the Basic Networking Utilities (Advanced System
XAdministration Volume 1 Chapter 7-15). Once the administration files
Xare set up, you can use the remote node name to attach slip directly
Xor through your modem. Example:
X	slattach venus sl0
X
XThe "-d" does not use BNU but directly open the next argument which is
Xthe serial device and link it to the slip driver. The baudrate sets up
Xthe line speed of the serial line; the default baudrate is 9600.
X
XTo start the slip interface using the first serial port at 1200 baud
Xexecute the below command:
X
X	slattach -d /dev/tty00 sl0 1200
X
XIf the slip hangup daemon (slhangupd) is run, slattach by default is set
Xto receive hangup signal (SIGHUP) sent by the slip driver through slhangupd.
XThe -i option ignores any hangup signal.
X
X
Xifconfig
X
XThis utility is included in the standard base Unix System V Release 4.0
Xproduct. Ifconfig is used to configure your system to the remote slip node.
X
X	ifconfig interface_name source destination up
X
X
Xslhangupd
X
XSlhangup (slip hangup daemon) is a daemon used to receive messages sent by
Xthe slip driver. Whenever the slip driver receives a M_HANGUP message from
Xa particular line, the driver sends sends the process id of the controlling
Xslattach process to slhangupd. Slhangup then will send a SIGHUP (hangup
Xsignal) to the pid received from the slip driver.
X
XThere is no restriction of the execution order of slattach and slhangupd.
X
X
Xsldetach
X
Xsldetach removes the serial line that is being used for slip connection.
X
X	sldetach interface_name
X	
X
XDIALSLIP (slip login utilities)
X
XTo install dialslip:
X
X1.  Set up the /etc/slip.hosts file.  This file maps login names to IP
X    addresses, which # comments, as usual.
X
X2.  Set up the /etc/slip.config file.  This file defines the IP address
X    of the local system on each interface.  Set them all the same.  There
X    can be as many simultaneous logins as lines in this file (not counting
X    comments).
X
X3.  Run "mkslipuser".  This builds a file similar in nature to utmp that
X    keeps track of who's logged in and what interface they're using.
X    This command should also be run at boot time to clean things up.
X
X4.  Set up accounts for each system dialing in with "slip" as the shell
X    with its setuid bit set to root.
X
END_OF_FILE
  if test 3558 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
  fi
  # end of 'README'
fi
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
  echo shar: Extracting \"'MANIFEST'\" \(1363 characters\)
  sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X   File Name		Archive #	Description
X----------------------------------------------------------
XPACKNOTES                  1	
XREADME                     1	
XMANIFEST                   1	
XMakefile                   4	
Xdialslip                   1	
Xdialslip/Makefile          4	
Xdialslip/README.dialslip   4	
Xdialslip/dslipuser.c       4	
Xdialslip/mkslipuser.c      3	
Xdialslip/slip.c            3	
Xdialslip/slip.config       4	
Xdialslip/slip.h            3	
Xdialslip/slip.hosts        4	
Xdriver                     1	
Xdriver/ID                  1	
Xdriver/ID/Master           2	
Xdriver/ID/Node             4	
Xdriver/ID/Space.c          2	
Xdriver/ID/System           4	
Xdriver/io                  1	
Xdriver/io/slip.c           1	
Xdriver/io/slip.mk          4	
Xdriver/sys                 1	
Xdriver/sys/slip.h          4	
Xdriver/v2.ip.fix           1	
Xdriver/v2.ip.fix/Driver.UU.01  2	
Xdriver/v2.ip.fix/Driver.UU.02  1	
Xman                        1	
Xman/man1                   1	
Xman/man1/dslipuser.1       3	
Xman/man1/mkslipuser.1      3	
Xman/man1/slattach.1        3	
Xman/man1/sldetach.1        3	
Xman/man1/slhangupd.1       4	
Xman/man1/slip.1            3	
Xman/man7                   1	
Xman/man7/slip.7            3	
Xutils                      1	
Xutils/Makefile             4	
Xutils/slattach.c           3	
Xutils/sldetach             4	
Xutils/slhangupd.c          3	
END_OF_FILE
  if test 1363 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
  fi
  # end of 'MANIFEST'
fi
if test ! -d 'dialslip' ; then
    echo shar: Creating directory \"'dialslip'\"
    mkdir 'dialslip'
fi
if test ! -d 'driver' ; then
    echo shar: Creating directory \"'driver'\"
    mkdir 'driver'
fi
if test ! -d 'driver/ID' ; then
    echo shar: Creating directory \"'driver/ID'\"
    mkdir 'driver/ID'
fi
if test ! -d 'driver/io' ; then
    echo shar: Creating directory \"'driver/io'\"
    mkdir 'driver/io'
fi
if test -f 'driver/io/slip.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'driver/io/slip.c'\"
else
  echo shar: Extracting \"'driver/io/slip.c'\" \(21755 characters\)
  sed "s/^X//" >'driver/io/slip.c' <<'END_OF_FILE'
X/*
X *            Copyright 1991, Intel Corporation
X *                  All rights reserved.
X *
X * Permission to use, copy, modify, and distribute this software and
X * its documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and
X * that both the copyright notice appear in all copies and that both
X * the copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Intel Corporation
X * not be used in advertising or publicity pertaining to distribution
X * of the software without specific, written prior premission.
X * 
X * COMPANY AND/OR INTEL DISCLAIM ALL WARRANTIES WITH REGARD TO
X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
X * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO
X * EVENT SHALL COMPANY NOR INTEL BE LIABLE FOR ANY SPECIAL,
X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
X * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X */
X
X/*
X * Serial Line Internet Protocol (SLIP) streams multiplexor driver for
X * Intel Unix System V/386 Release 4.0.
X *
X * The upper streams is supposed to be linked to the ip driver (/dev/ip)
X * and optionally linked to the slip hangup daemon. The lower streams can
X * linked to any number of serial driver.
X *
X * The slattach command builds the ip to slip to serial device links and
X * The slhangupd command is a daemon for receiving M_HANGUP message from
X * the serial driver.
X *
X * The packet framing protocol code, in the upper write and the lower
X * read service routine (slip_uwsrv and slip_lrsrv) is based from
X * tty_slip.c written by Rayan Zachariassen <rayan@ai.toronto.edu> and
X * Doug Kingston <dpk@morgan.com>.
X *
X * Author:
X *     Sudji Husodo <sudji@indo.intel.com> 1/9/91
X */
X
X#include <sys/types.h>
X#include <sys/kmem.h>
X#include <sys/stream.h>
X#include <sys/stropts.h>
X#include <sys/dlpi.h>
X#include <sys/syslog.h>
X#include <sys/strlog.h>
X#include <sys/socket.h>
X#include <sys/sockio.h>
X#include <sys/log.h>
X#include <sys/errno.h>
X#include <sys/ioctl.h>
X#include <sys/param.h>
X#include <sys/ddi.h>
X
X#include <net/if.h>
X#include <netinet/in.h>
X#include <netinet/in_systm.h>
X#include <netinet/ip.h>
X#include <sys/slip.h>
X
X#define DL_PRIM_SIZE	sizeof (union DL_primitives)
X
Xint slip_devflag = 0;		/* V4.0 style driver */
X
X#ifndef DEBUG
Xstatic
X#endif
Xint slip_open(),  slip_close(), slip_uwput(), slip_uwsrv(),
X    slip_lwput(), slip_lwsrv(), slip_lrput(), slip_lrsrv();
X
Xstatic struct module_info minfo[5] = {
X	SLIPM_ID, "slip", 0, 8192, 16384, 4096,
X	SLIPM_ID, "slip", 0, 8192, 16384, 4096,
X	SLIPM_ID, "slip", 0, 8192, 16384, 4096,
X	SLIPM_ID, "slip", 0, 8192, 16384, 4096,
X	SLIPM_ID, "slip", 0, 8192, 16384, 4096,
X};
X
Xstatic struct qinit urinit = {
X	NULL,       NULL,       slip_open, slip_close, NULL, &minfo[0], NULL };
X
Xstatic struct qinit uwinit = {
X	slip_uwput, slip_uwsrv, slip_open, slip_close, NULL, &minfo[1], NULL };
X
Xstatic struct qinit lrinit = {
X	slip_lrput, slip_lrsrv, slip_open, slip_close, NULL, &minfo[3], NULL };
X
Xstatic struct qinit lwinit = {
X	slip_lwput, slip_lwsrv, slip_open, slip_close, NULL, &minfo[4], NULL };
X
Xstruct streamtab slip_info = {
X	&urinit, &uwinit, &lrinit, &lwinit };
X
Xslip_t *slip_hup = (slip_t *) 0;
X
Xextern	struct	ifstats	*ifstats;
Xextern	u_int	slip_num;
Xextern	slip_t	slip_data[];
X
X/*
X * slip_open
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_open (q, devp, flag, sflag, credp)
Xqueue_t	*q;
Xdev_t	*devp;
Xint		flag;
Xint		sflag;
Xstruct	cred	*credp;
X{
X	register slip_t *p_slip;
X	dev_t	 dev;
X	int		 oldpri;
X	mblk_t	 *bp;
X	major_t  major = getmajor (*devp);
X	minor_t  minor = getminor (*devp);
X
X	STRLOG (SLIPM_ID,0,0,SL_TRACE,"slip_open: major %d minor %d",major,minor);
X
X	/* find an unused entry in slip_data */
X
X	if (sflag == CLONEOPEN) {
X		for (dev=0, p_slip=&slip_data[0]; dev<slip_num; dev++, p_slip++)
X			if (!p_slip->buf)
X				break;
X		minor = (minor_t) dev;
X	}
X
X	/* if there's no more free entry, return No Space error code */
X
X	if (minor >= slip_num) {
X		STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip open: can't allocate device");
X		return ENXIO;
X	}
X
X	/* initialized slip information */
X
X	oldpri = splstr ();
X	p_slip->state    = DL_UNBOUND;
X	p_slip->qtop     = q;
X	p_slip->qbot     = NULL;
X	p_slip->buf      = (u_char *) kmem_alloc (SLIPMTU, KM_SLEEP);
X	p_slip->qt_blocked = 0;
X	drv_getparm (PPID, &p_slip->pid);		/* keep process id */
X
X	p_slip->escape   = p_slip->overrun = p_slip->inlen = 0;
X	p_slip->flags    = IFF_UP | IFF_POINTOPOINT;
X	p_slip->uname[0] = '\0';
X
X	/* initialized interface and its statistics */
X
X	p_slip->stats.ifs_name       = (char *) p_slip->uname;
X	p_slip->stats.ifs_unit       = 0;
X	p_slip->stats.ifs_active     = 0;
X	p_slip->stats.ifs_mtu        = SLIPMTU;
X	p_slip->stats.ifs_ipackets   = p_slip->stats.ifs_opackets = 0;
X	p_slip->stats.ifs_ierrors    = p_slip->stats.ifs_oerrors  = 0;
X	p_slip->stats.ifs_collisions = 0;
X	splx (oldpri);
X
X	/* initialize read and write queue pointers to private data */
X
X	q->q_ptr = (caddr_t) p_slip;
X	WR(q)->q_ptr = (caddr_t) p_slip;
X
X	/* set up the correct stream head flow control parameters */
X
X	if (bp = allocb (sizeof (struct stroptions), BPRI_MED)) {
X		struct stroptions *sop = (struct stroptions *) bp->b_rptr;
X		bp->b_datap->db_type = M_SETOPTS;
X		bp->b_wptr += sizeof (struct stroptions);
X		sop->so_flags = SO_HIWAT | SO_LOWAT;
X		sop->so_hiwat = minfo [2].mi_hiwat;
X		sop->so_lowat = minfo [2].mi_lowat;
X		putnext (q, bp);
X	}
X	*devp = makedevice (major, minor);
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip open: device %d coming up", minor);
X	return (0);
X}
X
X/*
X * slip_close ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_close (q)
Xqueue_t	*q;
X{
X	slip_t	*p_slip;
X	dev_t	 dev;
X	int		oldpri;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_close: going down ...");
X	p_slip = (slip_t *) q->q_ptr;
X	oldpri = splstr ();
X
X	if (p_slip->buf)
X		kmem_free (p_slip->buf, SLIPMTU);
X
X	p_slip->state = DL_UNATTACHED;
X	p_slip->buf   = 0;
X	p_slip->inlen = 0;
X	p_slip->qtop  = 0;
X	p_slip->pid   = 0;
X
X	ifstats = p_slip->stats.ifs_next; 		/* reset ifstats pointers */
X	splx (oldpri);
X}
X
X/*
X *	slip_ioctl ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_ioctl (q, mp)
Xqueue_t	*q;
Xmblk_t	*mp;
X{
X	struct iocblk *iocp;
X	struct ifreq  *ifr;
X	slip_t *p_slip;
X	int		oldpri;
X	struct	linkblk	*lp;
X	slip_t *pp;
X	u_char *p;
X	int n;
X
X	p_slip  = (slip_t *) q->q_ptr;
X	iocp = (struct iocblk *) mp->b_rptr;
X
X	STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: enter: case ('%c',%d)", 0x00FF&(iocp->ioc_cmd>>8), 0x00FF&iocp->ioc_cmd);
X	oldpri = splstr ();
X
X	switch (iocp->ioc_cmd) {
X
X	case REG_SLHUP:
X		STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: REG_SLHUP");
X		if (slip_hup) {
X			splx (oldpri);
X			mp->b_datap->db_type = M_IOCNAK;
X			qreply (q, mp);
X			return (0);
X		}
X		else
X			slip_hup = p_slip;
X		break;
X
X	case UNREG_SLHUP:
X		STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: UNREG_SLHUP");
X		slip_hup = 0;
X		break;
X
X	case I_LINK:
X		iocp->ioc_error = iocp->ioc_rval = iocp->ioc_count = 0;
X
X		lp = (struct linkblk *) mp->b_cont->b_rptr;
X		p_slip->qbot = lp->l_qbot;
X		p_slip->qbot->q_ptr = (char *) p_slip;
X		OTHERQ (p_slip->qbot)->q_ptr = (char *) p_slip;
X		break;
X
X	case I_UNLINK:
X		iocp->ioc_error = iocp->ioc_rval = iocp->ioc_count = 0;
X		p_slip->qbot = NULL;
X		break;
X
X	case SIOCSIFNAME:
X		ifr = (struct ifreq *) mp->b_cont->b_rptr;
X
X		/* copy interface name to local slip structure */
X
X		/*
X		 * interface name (ifr->ifr_name) contains the name and unit, e.g.
X		 * "sl0", "sl12", "emd0", "wd1", etc. Store the name in slip->uname
X		 * and unit in slip->unit. If unit is not supplied, e.g. "slip",
X		 * then unit number is assumed to be zero.
X		 */
X
X		strncpy (p_slip->uname, ifr->ifr_name, IFNAMSIZ);	/* copy name */
X		n = 0;
X
X		/* starting from the last char, find the first non-digit char */
X
X		p = p_slip->uname + strlen(p_slip->uname) - 1;
X		while ('0' <= *p && *p <= '9')
X			p--;
X
X		/* calculate integer, replace them with nulls */
X
X		while (*++p) {
X			n = 10*n + (*p-'0');
X			*p = '\0';
X		}
X		p_slip->stats.ifs_unit = n;				/* set ifs unit number  */
X
X		/* search for matching interface name and unit */
X
X		for (n=0, pp=&slip_data[0]; n<slip_num; n++, pp++)
X			if (pp != p_slip && pp->buf && !strcmp (pp->uname,p_slip->uname) &&
X				pp->stats.ifs_unit == p_slip->stats.ifs_unit)
X				break;
X
X		if (n < slip_num) {							/* found matching ifname */
X			splx (oldpri);
X			mp->b_datap->db_type = M_IOCNAK;		/* Negative Ack reply */
X			qreply (q, mp);
X			return (0);
X		}
X		else {										/* ifname is unique */
X			p_slip->stats.ifs_next = ifstats;		/* set ifstats pointers */
X			ifstats = &p_slip->stats;				/* used for statistics */
X		}											/* by netstat command */
X		break;
X
X	case SIOCGIFFLAGS:
X		((struct iocblk_in *)iocp)->ioc_ifflags = p_slip->flags;
X		break;
X
X	case SIOCSIFFLAGS:
X		p_slip->flags = ((struct iocblk_in *)iocp)->ioc_ifflags;
X		break;
X
X	case SIOCSIFADDR:
X		p_slip->flags |= IFF_RUNNING;
X		((struct iocblk_in *)iocp)->ioc_ifflags |= IFF_RUNNING;
X		break;
X
X	default:
X		break;
X	}
X	splx (oldpri);
X	mp->b_datap->db_type = M_IOCACK;
X	qreply (q, mp);
X}
X
X/*
X * slip_uwput ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_uwput (q, mp)
Xqueue_t	*q;
Xmblk_t	*mp;
X{
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_uwput: case 0x%2.2x", mp->b_datap->db_type);
X
X	switch (mp->b_datap->db_type) {
X
X	case M_FLUSH:
X		if (*mp->b_rptr & FLUSHW) {
X			flushq(q, FLUSHALL);
X			*mp->b_rptr &= ~FLUSHW;
X		}
X		if (*mp->b_rptr & FLUSHR)
X			qreply(q, mp);
X		else
X			freemsg(mp);
X		break;
X
X	case M_IOCTL:
X		slip_ioctl (q, mp);
X		break;
X
X	case M_PROTO:
X	case M_PCPROTO:
X		slip_dl_cmds (q, mp);
X		break;
X
X	default:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwput: unknown message type, passing message to the next queue");
X		putnext (((slip_t *)q->q_ptr)->qbot, mp);
X		break;
X	} 
X}
X
X/*
X * slip_uwsrv ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_uwsrv (q)
Xregister queue_t *q;
X{
X	register mblk_t	*mp, *mpd, *mp2;
X	register u_char	*cp;
X	register int	pktlen, num;
X	register slip_t *p_slip;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_uwsrv: enter");
X
X	while ((mp = getq(q)) != NULL) {
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: got message from q");
X		p_slip = (slip_t *) q->q_ptr;
X
X
X		if (!canput (p_slip->qbot)) {
X			STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: can't put message to qbot");
X			putbq (q, mp);
X			p_slip->qt_blocked = 1;
X			return;
X		}
X		pktlen = 0;
X
X		/*
X		 * count the number of special characters (END & ESC)
X		 */
X
X		num = 2;		/* END char is put at the start and end of packet */
X
X		for (mpd = mp->b_cont; mpd != 0; mpd = mpd->b_cont) {
X			pktlen += (mpd->b_wptr - mpd->b_rptr);
X
X			for (cp = mpd->b_rptr; cp < mpd->b_wptr; cp++) {
X				if (*cp == END || *cp == ESC)
X					num++;
X			}
X		}
X		STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_uwsrv: # of bytes in packet = %d; # of special character in packet: %d", pktlen, num);
X
X		/*
X		 * allocate message block to be sent down stream
X		 */
X
X		if ((mp2 = allocb (pktlen + num, BPRI_MED)) == NULL) {
X			STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: can't allocate message block - dropping outgoing message");
X			p_slip->stats.ifs_oerrors++;
X			freemsg (mp);
X			return;
X		}
X		/*
X		 * frame packet, escape special characters ESC and END
X		 */
X
X		*mp2->b_wptr++ = END;
X
X		for (mpd = mp->b_cont; mpd != 0; mpd = mpd->b_cont) {
X			for (cp = mpd->b_rptr; cp < mpd->b_wptr; cp++) {
X				if (*cp == END) {
X					*mp2->b_wptr++ = ESC;
X					*mp2->b_wptr++ = ESC_END;
X				}
X				else if (*cp == ESC) {
X					*mp2->b_wptr++ = ESC;
X					*mp2->b_wptr++ = ESC_ESC;
X				}
X				else
X					*mp2->b_wptr++ = *cp;
X			}
X		}
X		*mp2->b_wptr++ = END;
X
X		mp2->b_datap->db_type = M_DATA;
X		p_slip->stats.ifs_opackets++;
X		freemsg (mp);
X		slip_lwput (p_slip->qbot, mp2);
X	}
X}
X
X/*
X * slip_lwput
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_lwput (q, mp)
Xqueue_t *q;
Xmblk_t  *mp;
X{
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: enter %x, %x",q , mp);
X
X	if (canput(q->q_next)) {
X		STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: putnext");
X		putnext(q, mp);
X	}
X	else {
X		STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: putq");
X		putq(q, mp);
X	}
X}
X
X/*
X * slip_lwsrv (q)
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_lwsrv (q)
Xqueue_t *q;
X{
X	mblk_t  *mp;
X	slip_t *p_slip;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: enter");
X
X	while (mp = getq(q)) {
X		STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: getq (%x) = %x",q, mp);
X		if (canput(q->q_next)) {
X			STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: putnext");
X			putnext(q, mp);
X		}
X		else {
X			STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: putbq");
X			putbq(q, mp);
X			return;
X		}
X	}
X	p_slip = (slip_t *) q->q_ptr;
X
X	if (p_slip->qt_blocked) {
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_lwsrv: slip_uwsrv is blocked, enable it");
X		/*
X		 * qtop is the upper read q and
X		 * we want to enable the upper write q
X		 */
X		qenable (WR(p_slip->qtop));
X		p_slip->qt_blocked = 0;
X	}
X}
X
X/*
X * slip_lrput ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_lrput (q, mp)
Xqueue_t	*q;
Xmblk_t	*mp;
X{
X	slip_t 	*p_slip;
X	mblk_t	*resp;
X	int		device;
X	int		oldpri;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrput: enter: case 0x%2.2x", mp->b_datap->db_type);
X	p_slip = (slip_t *) q->q_ptr;
X
X	switch (mp->b_datap->db_type) {
X
X	case M_DATA:
X		STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_lrput: putq (%x, %x)", q, mp);
X		putq (q, mp);
X		break;
X
X	case M_FLUSH:
X		STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_lrput: M_FLUSH type = %x",*mp->b_rptr);
X		if (*mp->b_rptr & FLUSHR)
X			flushq(q, FLUSHALL);
X		if (*mp->b_rptr & FLUSHW) {
X			*mp->b_rptr &= ~FLUSHR;
X			flushq(WR(q), FLUSHALL);
X			qreply(q, mp);
X		} else
X			freemsg(mp);
X		return;
X
X	case M_HANGUP:
X		oldpri = splstr ();
X		/*
X		 * if pid is set, ignore message
X		 */
X		if (p_slip->pid == 0)
X			freemsg (mp);
X		/*
X		 * else if slip hangup daemon exists send pid to the daemon
X		 */
X		else if (slip_hup && (resp = allocb (sizeof(pid_t),BPRI_MED))) {
X			STRLOG (SLIPM_ID,1,0,SL_TRACE,
X				"slip_lrput: sending pid %d to hangup daemon", p_slip->pid);
X			*(pid_t *) resp->b_wptr = p_slip->pid;
X			resp->b_wptr += sizeof (pid_t);
X			resp->b_datap->db_type = M_PCPROTO;
X			putnext (slip_hup->qtop, resp);
X			freemsg (mp);
X		}
X		/*
X		 * else pass the message upstream
X		 */
X		else
X			putnext (p_slip->qtop, mp);
X
X		splx (oldpri);
X		break;
X			
X	default:
X		putnext (p_slip->qtop, mp);
X		break;
X	}
X}
X
X/*
X * slip_lrsrv ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_lrsrv (q)
Xqueue_t	*q;
X{
X	register	u_char 	*cp;
X	register	slip_t 	*p_slip;
X	mblk_t		*bp, *mp, *mp1, *mp2;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrsrv: enter");
X
X	while ((mp = getq(q)) != NULL) {
X		p_slip = (slip_t *) q->q_ptr;
X
XSTRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrsrv: q=%x, mp=%x;", q, mp);
X		if (!canput (p_slip->qtop->q_next)) {
X			putbq (q, mp);
X			return;
X		}
X		p_slip = (slip_t *) q->q_ptr;
X
X		for (bp = mp; bp != 0; bp = bp->b_cont) {
X			for (cp = bp->b_rptr; cp < bp->b_wptr; cp++) {
X				if (*cp == END) {
X					if (p_slip->inlen < sizeof (struct ip))
X						;						/* ignore packet */
X
X					else if (p_slip->overrun)
X						p_slip->stats.ifs_ierrors++;
X
X					else if ((mp1=allocb (DL_UNITDATA_IND_SIZE,BPRI_MED))==NULL)
X						p_slip->stats.ifs_ierrors++;
X
X					else if ((mp2 = allocb (p_slip->inlen, BPRI_MED)) == NULL) {
X						p_slip->stats.ifs_ierrors++;
X						freemsg (mp1);
X					}
X					else {
X						p_slip->stats.ifs_ipackets++;	/* send unit data */
X						linkb (mp1, mp2);				/* indication up */
X						slip_dl_unitdata_ind (q, mp1);	/* stream */
X						putnext (p_slip->qtop, mp1);
X					}
X					p_slip->inlen = 0;					/* reset info for */
X					p_slip->overrun = 0;				/* receiving data */
X					p_slip->escape = 0;
X				}
X				else if (p_slip->inlen >= SLIPMTU)
X					p_slip->overrun = 1;
X
X				else if (*cp == ESC)					/* if data is ESC */
X					p_slip->escape = 1;
X
X				else if (p_slip->escape) {
X					p_slip->escape = 0;
X
X					if (*cp == ESC_END)
X						*(p_slip->buf + p_slip->inlen++) = END;
X					else if (*cp == ESC_ESC)
X						*(p_slip->buf + p_slip->inlen++) = ESC;
X					else
X						*(p_slip->buf + p_slip->inlen++) = *cp;
X				}
X				else
X					*(p_slip->buf + p_slip->inlen++) = *cp;
X			}
X			bp->b_rptr = cp;
X		}
X		freemsg (mp);
X	}
X}
X
X/*
X * slip_dl_cmds ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_cmds (q, mp)
Xqueue_t	*q;
Xmblk_t	*mp;
X{
X	union DL_primitives	*p_dl;
X	mblk_t				*response;
X	slip_t				*p_slip;
X	int		oldpri;
X
X	if ((response = allocb (DL_PRIM_SIZE, BPRI_MED)) == NULL) {
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: can't allocate response buffer");
X		freemsg (mp);
X		return;
X	}
X
X	p_slip = (slip_t *) q->q_ptr;
X	p_dl = (union DL_primitives *) mp->b_datap->db_base;
X
X	switch (p_dl->dl_primitive) {
X
X	case DL_INFO_REQ:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_INFO_REQ");
X		slip_dl_info_ack (q, mp, response);
X		break;
X
X	case DL_BIND_REQ:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_BIND_REQ");
X		if (p_slip->state == DL_UNBOUND) {
X			oldpri = splstr ();
X			p_slip->sap   = ((dl_bind_req_t *)p_dl)->dl_sap;
X			p_slip->state = DL_IDLE;
X			p_slip->stats.ifs_active = 1;
X			splx (oldpri);
X
X			slip_dl_bind_ack (q, mp, response);
X		}
X		else
X			slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
X		break;
X
X	case DL_UNBIND_REQ:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_UNBIND_REQ");
X		if (p_slip->state == DL_IDLE) {
X			oldpri = splstr ();
X			p_slip->state = DL_UNBOUND;
X			p_slip->stats.ifs_active = 0;
X			splx (oldpri);
X
X			flushq (q, FLUSHDATA);						/* Flush both q's */
X			flushq (RD(q), FLUSHDATA);
X
X			slip_dl_ok_ack (q, mp, response);
X		}
X		else
X			slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
X
X		break;
X
X	case DL_UNITDATA_REQ:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_UNITDATA_REQ");
X		if (p_slip->state == DL_IDLE) {
X			STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_dl_cmd: putq (%x, %x)", q, mp);
X			putq (q, mp);
X			return;
X		}
X		else
X			slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
X
X		break;
X
X	default:
X		STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: default 0x%2.2x",p_dl->dl_primitive);
X		slip_dl_error_ack (q, mp, response, DL_UNSUPPORTED);
X		break;
X	}
X	freemsg (mp);
X	putnext (RD(q), response);
X}
X
X/*
X *  slip_dl_info_ack ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_info_ack (q, mp, response)
Xqueue_t *q;
Xmblk_t	*mp;
Xmblk_t	*response;
X{
X	dl_info_ack_t	*p_info_ack;
X	slip_t			*p_slip;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_info_ack: enter");
X
X	p_slip = (slip_t *) q->q_ptr;
X
X	p_info_ack = (dl_info_ack_t *) response->b_wptr;
X	p_info_ack->dl_primitive     = DL_INFO_ACK;
X	p_info_ack->dl_max_sdu       = SLIPMTU;
X
X	p_info_ack->dl_min_sdu       = 46;                  /* ????? */
X	p_info_ack->dl_addr_length   = 0;					/* ????? MAC_ADD_SIZE*/
X	p_info_ack->dl_mac_type      = DL_CHAR;				/* ????? */
X
X	p_info_ack->dl_current_state = p_slip->state;
X	p_info_ack->dl_service_mode  = DL_CLDLS;			/* connecionless DL */
X
X	p_info_ack->dl_qos_length       = 0;				/* ???? */
X	p_info_ack->dl_qos_offset       = 0;				/* ???? */
X	p_info_ack->dl_qos_range_length = 0;				/* ???? */
X	p_info_ack->dl_qos_range_offset = 0;				/* ???? */
X
X	p_info_ack->dl_provider_style = DL_STYLE1;
X
X	p_info_ack->dl_addr_offset = 0;						/* ???? */
X	p_info_ack->dl_growth = 0;
X
X	response->b_datap->db_type = M_PCPROTO;
X	response->b_wptr           += DL_INFO_ACK_SIZE;
X}
X
X/*
X *  slip_dl_bind_ack ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_bind_ack (q, mp, response)
Xqueue_t *q;
Xmblk_t	*mp;
Xmblk_t	*response;
X{
X	dl_bind_req_t	*p_dl;
X	dl_bind_ack_t	*p_bind;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_bind_ack: enter");
X
X	p_dl = (dl_bind_req_t *) mp->b_datap->db_base;
X
X	p_bind = (dl_bind_ack_t *) response->b_wptr;
X	p_bind->dl_primitive   = DL_BIND_ACK;
X	p_bind->dl_sap         = p_dl->dl_sap;
X	p_bind->dl_addr_length = 0;
X	p_bind->dl_addr_offset = 0;
X
X	response->b_wptr           += DL_BIND_ACK_SIZE;
X	response->b_datap->db_type = M_PCPROTO;
X}
X
X/*
X *  slip_dl_ok_ack ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_ok_ack (q, mp, response)
Xqueue_t *q;
Xmblk_t	*mp;
Xmblk_t	*response;
X{
X	union DL_primitives	*p_dl;
X	dl_ok_ack_t			*p_ok_ack;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_ok_ack: enter");
X
X	p_dl = (union DL_primitives *) mp->b_datap->db_base;
X
X	p_ok_ack = (dl_ok_ack_t *)(response->b_wptr);
X	p_ok_ack->dl_primitive         = DL_OK_ACK;
X	p_ok_ack->dl_correct_primitive = p_dl->dl_primitive;
X
X	response->b_wptr           += DL_OK_ACK_SIZE;
X	response->b_datap->db_type = M_PCPROTO;
X}
X
X/*
X * slip_dl_error_ack
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_error_ack (q, mp, response, dl_errno)
Xqueue_t *q;
Xmblk_t	*mp;
Xmblk_t	*response;
Xulong	dl_errno;
X{
X	union DL_primitives	*p_dl;
X	dl_error_ack_t		*p_error;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_error_ack: enter");
X
X	p_dl = (union DL_primitives *) mp->b_datap->db_base;
X
X	p_error = (dl_error_ack_t *) response->b_wptr;
X	p_error->dl_primitive       = DL_ERROR_ACK;
X	p_error->dl_error_primitive = p_dl->dl_primitive;
X	p_error->dl_errno           = dl_errno;
X	p_error->dl_unix_errno      = 0;
X
X	response->b_wptr           += DL_ERROR_ACK_SIZE;
X	response->b_datap->db_type = M_PCPROTO;
X}
X
X/*
X * slip_dl_unitdata_ind ()
X */
X
X#ifndef DEBUG
Xstatic
X#endif
Xslip_dl_unitdata_ind (q, mp)
Xqueue_t *q;
Xmblk_t	*mp;
X{
X	dl_unitdata_ind_t	*p_dl;
X	slip_t				*p_slip;
X
X	STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_unitdata_ind: enter");
X
X	p_dl = (dl_unitdata_ind_t *) mp->b_wptr;
X	p_dl->dl_primitive = DL_UNITDATA_IND;
X	p_dl->dl_dest_addr_length = 0;
X	p_dl->dl_dest_addr_offset = DL_UNITDATA_IND_SIZE;
X	p_dl->dl_src_addr_length = 0;
X	p_dl->dl_src_addr_offset = p_dl->dl_dest_addr_offset + p_dl->dl_dest_addr_length;
X
X	mp->b_wptr += DL_UNITDATA_IND_SIZE;
X	mp->b_datap->db_type = M_PROTO;
X
X	/* copy packet received to the next message block */
X
X	p_slip = (slip_t *) q->q_ptr;
X
X	bcopy ((caddr_t)p_slip->buf, (caddr_t)mp->b_cont->b_wptr, p_slip->inlen);
X
X	mp->b_cont->b_wptr += p_slip->inlen;
X}
END_OF_FILE
  if test 21755 -ne `wc -c <'driver/io/slip.c'`; then
    echo shar: \"'driver/io/slip.c'\" unpacked with wrong size!
  fi
  # end of 'driver/io/slip.c'
fi
if test ! -d 'driver/sys' ; then
    echo shar: Creating directory \"'driver/sys'\"
    mkdir 'driver/sys'
fi
if test ! -d 'driver/v2.ip.fix' ; then
    echo shar: Creating directory \"'driver/v2.ip.fix'\"
    mkdir 'driver/v2.ip.fix'
fi
if test -f 'driver/v2.ip.fix/Driver.UU.02' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'driver/v2.ip.fix/Driver.UU.02'\"
else
  echo shar: Extracting \"'driver/v2.ip.fix/Driver.UU.02'\" \(20206 characters\)
  sed "s/^X//" >'driver/v2.ip.fix/Driver.UU.02' <<'END_OF_FILE'
XM[B\```)A``#^+P```:````HP```!!0``#S````+&``!D,````J@``&\P```!
XMH```=S````$%``!\,````L8``(4P```"M```CC````&@``"6,````04``)LP
XM```"Q@``MS````)````",0```5,``$PQ```!TP``SC$```+$``#B,0```5,`
XM`.<Q```!4P``[C$```%3``#W,0```5,``(0R```"P```GC(```'3``"F,@``
XM`K0``.,R```"P````#,```*T``"/,P```DL``/8S```"X0``&S0```*T``!'
XM-````N$``($T```"8```AS0```%3``"4-````3```)DT```"<P``H30```%V
XM``"Y-````=,``,@T```!4P``TS0```%3``#>-````=,``.PT```!4P``O34`
XM``)'```F-@```KX``$$V```"+P``2#8```+?``"+-@```KX``-DV```"O@``
XM'#<```*^``#2-P```KX``.0W```"1P``'3@```*^```I.````JT``$`X```"
XMO@``7S@```)J``!J.````K0``)\X```!O0``IC@```&]``#*.````HL``.TX
XM```!O0``\C@```)(```1.0```HL``%,Y```"BP``BSD```%#``"4.0```04`
XM`)DY```"Q@``ICD```$8``"L.0```KX``+HY```!3P``OSD```%/``#%.0``
XM`4\``,PY```!&```X#D```%/``#J.0```4\``/XY```"80``%3H```%/```D
XM.@```4\``"LZ```!&```.#H```$8``!*.@```1@``$\Z```"O@``;CH```$8
XM``#(.@```KX```,[```"O@``/CL```*^``"\.P```4,``.T[```!!0``\CL`
XM``+&```,/````<<``!4\```!I0``'CP```&@```F/````04``"L\```"Q@``
XM,CP```'3```Z/````K0``%$\```"P0``7#P```&@``!D/````04``&D\```"
XMQ@``<CP```*T``"C/````E@``*X\```!O0``M#P```&]``#+/````;T``-,\
XM```!O0``XSP```&]``#H/````HL``/$\```!O0``_CP```&]```1/0```;T`
XM`!8]```"2```*#T```&]```X/0```;T``#T]```"BP``13T```&]``!2/0``
XM`;T``&(]```!O0``;CT```&]``!_/0```;T``)L]```!O0``KCT```'4```#
XM/@```;T``!8^```!O0``.SX```&]``!./@```;T``&T^```!:```G3X```%]
XM``"E/@```4,``+H^```!!0``OSX```+&``#+/@```F$``-T^```"M```[#X`
XM``*T```Q/P```;T``&P_```!LP``>C\```&)``""/P```8D``(P_```"M```
XMFS\```*T``"N/P```;T``+8_```!O0``QS\```&S``#0/P```N```.$_```!
XMO0``\3\```&]``#V/P```HL```%````!O0``#D````&]```>0````=,``#!`
XM```!TP``J$````)J``"]0````K0``-)````"M```V4````'3``#]0````J<`
XM`&A!```"0```@D$```)A``#!00```KX``-%!```"O```6D(```%Q``!A0@``
XM`7$``+%"```"6@``O4(```%H```L0P```HL``'!#```";0``BT,```(O``"2
XM0P```M\``,-#```"2```YD,```*+```,1````>```!%$```"7P``1$0```*G
XM``"E1````J@``+E$```":@``YD0```)0``"R10```E4``,M%```"J```Z$4`
XM``*V```\1@```H(``&)&```"80``7T<```)5``"G1P```IP``+5'```"M```
XMV$<```*H``#U1P```K8``$1(```"M```;4@```*+``"?2````7T``*E(```!
XM?0``ZT@```*H```)20```K8``"1)```"J```/4D```)```!/20```FL``*9)
XM```"80``Q4D```*^``#<20```KX``/I)```"C```EDH```*^```22P```04`
XM`!E+```"N```34L```)9``!<2P```K0``)]+```!!0``IDL```*X```'3```
XM`F$``"Q,```!(```-$P```+:```Z3````2```$1,```!70``4DP```%=``!P
XM3````;,``'Y,```!B0``BDP```&)``"33````C8``*E,```"S```Q4P```)A
XM``#53````;,```%-```"C```"4T```(V```T30```1L``#U-```!&P``:$T`
XM``$%``!O30```K@``)%-```"8P```TX```)C```L3@```KP``&).```!`P``
XMB$X```*\``#,3@```6\``-).```!;P``\4X```*\```%3P```K8``"A/```"
XMM```.$\```*T``!(3P```;,``%=/```!LP``>4\```*\``"'3P```8D``+5/
XM```"O```W$\```&S``#M3P```6\``!10```"O```)%````&S```S4````6\`
XM`#Q0```!B0``0E````%O``!;4````6\``&%0```!B0``:U````&S``!Y4```
XM`6\``)=0```!?0``W5````*\``#X4````BH``"U1```"O```F%$```%H``#;
XM40```1L``.-1```"-P``&U(```*\```O4@```IT``$%2```!:```35(```%H
XM``!74@```7```%]2```!<```@E(```%H``"(4@```K4``+A2```"80``#U,`
XM``*\``!34P```KP``&53```"80``CE,```*\```T5````KP``(Y4```!:```
XMGU0```*^``#-5````7T```I5```"O```'E4```%=```G50```7T``"M5```!
XM:```,%4```&S```Y50```6@``$15```"-@``3E4```%P``!550```6@``%I5
XM```"M0``8E4```'"``!M50```7$``'E5```!B0``?U4```%O``"-50```I\`
XM`))5```",```F%4```%=``"A50```G0```Y6```!!0``%58```*X```>5@``
XM`K0``"M6```">P``4%8```$#``!H5@```K0``(U6```"O```GU8```*V``"]
XM5@```F,``-Y6```"8P``Z%8```*\``#V5@```K0```)7```"M```,E<```%O
XM```X5P```8D``$17```!;P``2U<```&S``!65P```J@``'Q7```!LP``B5<`
XM``)8``"85P```;,``*)7```!LP``LU<```&)``"[5P```K0``,I7```!W```
XMTE<```'<``"06````K0``,98```"O````%D```*T``!"60```KP``'99```"
XM80``A5D```*,``"D60```KX``,A9```"C```Z%D```)A``#W60```3H```5:
XM```"FP``6%H```*U``"I6@```4X``.E:```!!```05L```*Q``!*6P```F$`
XM`(5;```"M0``G5L```*^``#Z6P```F$``"%<```"80``AUP```*T```F70``
XM`K0``#I=```"@@``2%T```*\``#;7@```I0``.5>```!>@``\EX```%<```0
XM7P```58``!E?```!<@``(U\```%R``!+7P```:(``'%?```!!0``=E\```+&
XM``#)7P```7(``-5?```!H@``ZU\```(U```O8````04``#1@```";```4V``
XM``(N``!I8````5X``'%@```"C```DV````(_``"?8````:(``.!@```"1P``
XM[&````&B```180```7(``!]A```">@``:&$```&B``"_80```:(``-EA```!
XMH@``XV$```&B``!.8@```I0``&YB```!7```@F(```%6``#)8@```GH``$-C
XM```!I0``8&,```%>``!V8P```HP``*1C```!)P``K6,```&E``#:8P```FT`
XM``!D```"1P``&V0```(_```]9````F$``.ID```"80```F4```*U```O90``
XM`HP``$UE```!7```I64```%6``"]90```;\``,)E```!!0``R64```*X``#1
XM90```04``-AE```"N```X&4```$%``#G90```K@``.]E```!!0``]F4```*X
XM``#^90```04```5F```"N`````````$"```$`````0(```@````!`@``#```
XM``$"```0`````0(``!0````!`@``&`````$"```<`````0(``"`````!`@``
XM)`````$"```H`````0(``"P````!`@``,`````$"```T`````0(``#@````!
XM`@``&`````$3```D`````1(``#`````!$@``/`````$2``!(`````1(``%0`
XM```!$@``8`````$2``!L`````1(``'@````!$@``$`$```$%```H`0```04`
XM`$`!```!!0``6`$```$%``!P`0```04``(P!```!D@``D`$```&(``"8`0``
XM`1L``*`!```!E0``I`$```%2``"H`0```9(``*P!```!B```M`$```$;``"\
XM`0```50``,`!```!U@``Q`$```&2``#(`0```8@``-`!```!&P``V`$```&&
XM``#<`0```3L``.`!```!D@``Y`$```&(``#L`0```1L``/0!```!'```^`$`
XM``$=``#\`0```1X````"```!'P``0"@C*6ME<FXM:6YE=#II;BYC"3$N,P!`
XM*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIT>7!E
XM<RYH"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C
XM*6AE860N<WES.F9S+W,U<&%R86TN:`DQ+C,N,BXQ`$`H(REH96%D+G-Y<SIS
XM;V-K:6\N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SII;V-C;VTN:`DQ+C$N,2XQ
XM`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.G-T
XM<F]P=',N:`DQ+C0N-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`
XM*",I:&5A9"YS>7,Z979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')E
XM86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N-RXQ`$`H
XM(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z<&]L;"YH
XM"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ`$`H(REH
XM96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@)
XM,2XQ+C0N,0!`*",I:&5A9"YS>7,Z<V]C:V5T=F%R+F@),2XQ+C$N,0!`*",I
XM:&5A9"YS>7,Z<')O=&]S=RYH"3$N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N
XM-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H(RDO=7-R+W-R8R]U
XM=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N,"`P-2\R,B\Y,"`W
XM,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?<WES=&TN:`DQ+C$N,RXQ
XM`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N,0!`*",I:V5R;BUN970Z
XM868N:`DQ+C$N,RXQ`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C
XM*6ME<FXM:6YE=#II<%]S='(N:`DQ+C$N,RXQ`&%C;VUP.B`H4T-$12D@-2XP
XM("`P-"\Q.2\Y,`!O<'1I;3H@*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A3
XM0T1%*2`U+C`@(#`T+S$Y+SDP`$`H(REK97)N+6EN970Z:6Y?8VMS=6TN8PDQ
XM+C,`0"@C*6AE860N<WES.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z
XM<V5L96-T+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT+C$S
XM+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS>7,Z
XM=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ`$`H
XM(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z8W)E
XM9"YH"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C*2]U
XM<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP(#`U
XM+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6AE860N<WES.F-M;E]E<G(N:`DQ
XM+C,N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O<'1I;3H@*%-#
XM1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`$`H
XM(REK97)N+6EN970Z:6Y?<&-B+F,),2XS`$`H(REH96%D+G-Y<SIT>7!E<RYH
XM"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C*6AE
XM860N<WES.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O<S5P87)A
XM;2YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-Y<W1M+F@),2XS+C$P+C$`0"@C
XM*6AE860N<WES.G-T<F5A;2YH"3$N-"XQ,RXQ`$`H(REH96%D+G-Y<SIV;F]D
XM92YH"3$N,2XW+C$`0"@C*6AE860N<WES.G1I;64N:`DQ+C$N,RXQ`$`H(REH
XM96%D+G-Y<SIP;VQL+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R;61E<"YH
XM"3$N,2XQ+C$`0"@C*6AE860N<WES.F-R960N:`DQ+C$N,BXQ`$`H(REH96%D
XM+G-Y<SIS=')L;V<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIL;V<N:`DQ+C,N
XM-"XQ`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES
XM.G1I:&1R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z=&EU<V5R+F@),2XS+C0N
XM,@!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:&5A9"YS>7,Z
XM<V]C:V5T=F%R+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z<V]C:VEO+F@),2XQ
XM+C$N,0!`*",I:&5A9"YS>7,Z:6]C8V]M+F@),2XQ+C$N,0!`*",I:V5R;BUN
XM970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H
XM(RDO=7-R+W-R8R]U=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N
XM,"`P-2\R,B\Y,"`W,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?<WES
XM=&TN:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N,0!`
XM*",I:V5R;BUN970Z<F]U=&4N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?
XM<&-B+F@),2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP+F@),2XQ+C(N,0!`*",I
XM:V5R;BUI;F5T.FEP7W9A<BYH"3$N,2XS+C$`0"@C*6AE860N<WES.G!R;W1O
XM<W<N:`DQ+C$`0"@C*6ME<FXM:6YE=#II<%]S='(N:`DQ+C$N,RXQ`$`H(REK
XM97)N+6EN970Z:6YS<F5M+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z:VUE;2YH
XM"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H
XM4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``
XM0"@C*6ME<FXM:6YE=#II;E]S=VET8V@N8PDQ+C,`0"@C*6AE860N<WES.G1Y
XM<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ+C$N,0!`
XM*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIF<R]S
XM-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<WES=&TN:`DQ+C,N,3`N
XM,0!`*",I:&5A9"YS>7,Z<VEG;F%L+F@),2XS+C@N,0!`*",I:&5A9"YS>7,Z
XM8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.G!R;V,N:`DQ+C,N,3,N,0!`
XM*",I:&5A9"YS>7,Z:6UM=2YH"3$N-BXY+C$`0"@C*6AE860N<WES.G5S97(N
XM:`DQ+C4N,34N,@!`*",I:&5A9"YS>7,Z<VEG:6YF;RYH"3$N,2XT+C$`0"@C
XM*6AE860N<WES.G1S<RYH"3$N-"XQ+C$`0"@C*6AE860N<WES.G-E9RYH"3$N
XM-2XS+C$`0"@C*6AE860N<WES.G)E<V]U<F-E+F@),2XQ+C0N,0!`*",I:&5A
XM9"YS>7,Z97AE8RYH"3$N,2XY+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ
XM+C<N,0!`*",I:&5A9"YS>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES
XM.FEO8W1L+F@),2XS+C<N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ
XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
XM<W1R96%M+F@),2XT+C$S+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ
XM`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z
XM<W1R;W!T<RYH"3$N-"XU+C$`0"@C*6AE860N<WES.F-O;F8N:`DQ+C,N-RXR
XM`$`H(REH96%D+G-Y<SIE=F5C8BYH"3$N,2XQ+C$`0"@C*6AE860N<WES.G-T
XM<FQO9RYH"3$N,RXT+C$`0"@C*6AE860N<WES.FQO9RYH"3$N,RXT+C$`0"@C
XM*6AE860N<WES.F1E8G5G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z<')O=&]S
XM=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:V5R
XM;BUI;F5T.FEN+F@),2XQ+C0N,0!`*",I+W5S<B]S<F,O=71S+VDS.#8O<WES
XM+V)Y=&5O<F1E<BYH+G-L(#$N,2`T+C`@,#4O,C(O.3`@-S$P,2!!5"94+553
XM3`!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE=#IA9BYH
XM"3$N,2XS+C$`0"@C*6ME<FXM;F5T.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R
XM;BUI;F5T.FEN7W9A<BYH"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II<%]S='(N
XM:`DQ+C$N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O<'1I;3H@
XM*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T+S$Y+SDP
XM`$`H(REK97)N+6EN970Z:6Y?=')A;G-P+F,),2XS`$`H(REH96%D+G-Y<SIT
XM>7!E<RYH"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`
XM0"@C*6AE860N<WES.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O
XM<S5P87)A;2YH"3$N,RXR+C$`0"@C*6AE860N<WES.G1I;64N:`DQ+C$N,RXQ
XM`$`H(REH96%D+G-Y<SIS>7-M86-R;W,N:`DQ+C,N-BXQ`$`H(REH96%D+G-Y
XM<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.G-T<F]P=',N:`DQ+C0N
XM-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`*",I:&5A9"YS>7,Z
XM979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')E86TN:`DQ+C0N,3,N
XM,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N-RXQ`$`H(REH96%D+G-Y<SIP
XM;VQL+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R;61E<"YH"3$N,2XQ+C$`
XM0"@C*6AE860N<WES.F-R960N:`DQ+C$N,BXQ`$`H(REH96%D+G-Y<SIS=')L
XM;V<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIL;V<N:`DQ+C,N-"XQ`$`H(REK
XM97)N+6EN970Z;FEH9'(N:`DQ+C$N,BXQ`$`H(REH96%D+G-Y<SID;'!I+F@)
XM,2XQ+C,N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:&5A
XM9"YS>7,Z<V]C:VEO+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z:6]C8V]M+F@)
XM,2XQ+C$N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE
XM=#IS=')I;V,N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ
XM`$`H(RDO=7-R+W-R8R]U=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ
XM(#0N,"`P-2\R,B\Y,"`W,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?
XM=F%R+F@),2XQ+C(N,0!`*",I:V5R;BUN970Z<F]U=&4N:`DQ+C$N,RXQ`$`H
XM(REK97)N+6EN970Z:7!?<W1R+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEP
XM7W9A<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ
XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
XM:VUE;2YH"3$N,2XS+C$`0"@C*6AE860N<WES.G1I;6]D+F@),2XS+C0N,0!A
XM8V]M<#H@*%-#1$4I(#4N,"`@,#0O,3DO.3``;W!T:6TZ("A30T1%*2`U+C`@
XM(#`T+S$Y+SDP`&%S.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!`*",I:V5R;BUI
XM;F5T.FEP7VEN<'5T+F,),2XS`$`H(REH96%D+G-Y<SIT>7!E<RYH"3$N-2XX
XM+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C*6AE860N<WES
XM.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O<S5P87)A;2YH"3$N
XM,RXR+C$`0"@C*6AE860N<WES.G-Y<W1M+F@),2XS+C$P+C$`0"@C*6AE860N
XM<WES.G-T<F]P=',N:`DQ+C0N-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS
XM+C<N,@!`*",I:&5A9"YS>7,Z979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
XM<SIS=')E86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N
XM-RXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z
XM<&]L;"YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ
XM`$`H(REH96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<W1R
XM;&]G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z;&]G+F@),2XS+C0N,0!`*",I
XM:&5A9"YS>7,Z<')O=&]S=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@)
XM,2XQ+C0N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ`$`H(REH96%D
XM+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N
XM-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H(RDO=7-R+W-R8R]U
XM=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N,"`P-2\R,B\Y,"`W
XM,3`Q($%4)E0M55-,`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C
XM*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ`$`H(REK97)N+6EN970Z:6Y?
XM<WES=&TN:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N
XM,0!`*",I:V5R;BUI;F5T.FEP+F@),2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP
XM7W9A<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<%]I8VUP+F@),2XQ+C(N
XM,0!`*",I:V5R;BUI;F5T.FEP7W-T<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE
XM=#IT8W`N:`DQ+C$N,BXQ`$`H(REK97)N+6EN970Z:6YS<F5M+F@),2XQ+C,N
XM,0!`*",I:V5R;BUI;F5T.FYI:&1R+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z
XM:VUE;2YH"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P
XM=&EM.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O
XM,3DO.3``0"@C*6ME<FXM:6YE=#II<%]O=71P=70N8PDQ+C,`0"@C*6AE860N
XM<WES.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ
XM+C$N,0!`*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y
XM<SIF<R]S-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@)
XM,2XT+C$S+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A
XM9"YS>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N
XM,BXQ`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS
XM>7,Z8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.G-T<F]P=',N:`DQ+C0N
XM-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`*",I:&5A9"YS>7,Z
XM979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')L;V<N:`DQ+C,N-"XQ
XM`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.F-M
XM;E]E<G(N:`DQ+C,N,RXQ`$`H(REH96%D+G-Y<SIS;V-K970N:`DQ+C$N-"XQ
XM`$`H(REH96%D+G-Y<SIS;V-K971V87(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
XM<SIP<F]T;W-W+F@),2XQ`$`H(REK97)N+6YE=#II9BYH"3$N,2XT+C$`0"@C
XM*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C*2]U<W(O<W)C+W5T<R]I,S@V
XM+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP(#`U+S(R+SDP(#<Q,#$@050F
XM5"U54TP`0"@C*6ME<FXM:6YE=#II;E]V87(N:`DQ+C$N,BXQ`$`H(REK97)N
XM+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;E]S>7-T;2YH
XM"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<"YH"3$N,2XR+C$`0"@C*6ME<FXM
XM:6YE=#II<%]V87(N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:7!?:6-M<"YH
XM"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ`$`H(REH
XM96%D+G-Y<SID;'!I+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FYI:&1R+F@)
XM,2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP7W-T<BYH"3$N,2XS+C$`86-O;7`Z
XM("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H4T-$12D@-2XP("`P-"\Q
XM.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``0"@C*6ME<FXM:6YE=#II
XM<%]M86EN+F,),2XS+C$N,0!`*",I:&5A9"YS>7,Z='EP97,N:`DQ+C4N."XQ
XM`$`H(REH96%D+G-Y<SIS96QE8W0N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIP
XM87)A;2YH"3$N,RXX+C(`0"@C*6AE860N<WES.F9S+W,U<&%R86TN:`DQ+C,N
XM,BXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z
XM<WES;6%C<F]S+F@),2XS+C8N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N
XM."XQ`$`H(REH96%D+G-Y<SIS=')O<'1S+F@),2XT+C4N,0!`*",I:&5A9"YS
XM>7,Z8V]N9BYH"3$N,RXW+C(`0"@C*6AE860N<WES.F5V96-B+F@),2XQ+C$N
XM,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT+C$S+C$`0"@C*6AE860N<WES
XM.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS>7,Z<&]L;"YH"3$N,RXR+C$`
XM0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIC
XM<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<W1R;&]G+F@),2XS+C0N,0!`
XM*",I:&5A9"YS>7,Z;&]G+F@),2XS+C0N,0!`*",I:V5R;BUI;F5T.FYI:&1R
XM+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z9&QP:2YH"3$N,2XS+C$`0"@C*6AE
XM860N<WES.G-O8VME="YH"3$N,2XT+C$`0"@C*6AE860N<WES.G-O8VMI;RYH
XM"3$N,2XQ+C$`0"@C*6AE860N<WES.FEO8V-O;2YH"3$N,2XQ+C$`0"@C*6ME
XM<FXM;F5T.FEF+F@),2XQ+C0N,0!`*",I:V5R;BUN970Z<W1R:6]C+F@),2XQ
XM+C,N,0!`*",I:V5R;BUI;F5T.FEN+F@),2XQ+C0N,0!`*",I+W5S<B]S<F,O
XM=71S+VDS.#8O<WES+V)Y=&5O<F1E<BYH+G-L(#$N,2`T+C`@,#4O,C(O.3`@
XM-S$P,2!!5"94+5533`!`*",I:V5R;BUI;F5T.FEN7W9A<BYH"3$N,2XR+C$`
XM0"@C*6ME<FXM;F5T.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEP
XM7W-T<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<%]V87(N:`DQ+C$N,RXQ
XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
XM:VUE;2YH"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P
XM=&EM.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O
XM,3DO.3``0"@C*6ME<FXM:6YE=#IN971L:6(N8PDQ+C,`0"@C*6AE860N<WES
XM.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ+C$N
XM,0!`*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIF
XM<R]S-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT
XM+C$S+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS
XM>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ
XM`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z
XM8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.F5R<FYO+F@),2XS+C@N,0!`
XM*",I:&5A9"YS>7,Z<WES;6%C<F]S+F@),2XS+C8N,0!`*",I:&5A9"YS>7,Z
XM9&5B=6<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIS:6=N86PN:`DQ+C,N."XQ
XM`$`H(REH96%D+G-Y<SIP<F]C+F@),2XS+C$S+C$`0"@C*6AE860N<WES.FEM
XM;74N:`DQ+C8N.2XQ`$`H(REH96%D+G-Y<SIU<V5R+F@),2XU+C$U+C(`0"@C
XM*6AE860N<WES.G-I9VEN9F\N:`DQ+C$N-"XQ`$`H(REH96%D+G-Y<SIT<W,N
XM:`DQ+C0N,2XQ`$`H(REH96%D+G-Y<SIS96<N:`DQ+C4N,RXQ`$`H(REH96%D
XM+G-Y<SIR97-O=7)C92YH"3$N,2XT+C$`0"@C*6AE860N<WES.F5X96,N:`DQ
XM+C$N.2XQ`$`H(REH96%D+G-Y<SIT:6AD<BYH"3$N,RXS+C$`0"@C*6AE860N
XM<WES.G1I=7-E<BYH"3$N,RXT+C(`0"@C*6AE860N<WES.G-O8VME="YH"3$N
XM,2XT+C$`0"@C*6ME<FXM;F5T.G-T<FEO8RYH"3$N,2XS+C$`0"@C*6AE860N
XM<WES.G-O8VME='9A<BYH"3$N,2XQ+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N
XM,2XT+C$`0"@C*2]U<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS
XM;"`Q+C$@-"XP(#`U+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6ME<FXM;F5T
XM.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEN7W!C8BYH"3$N,2XR
XM+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H4T-$12D@
XM-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``0"@C*6ME
XM<FXM:6YE=#IR;W5T92YC"3$N,P!`*",I:&5A9"YS>7,Z='EP97,N:`DQ+C4N
XM."XQ`$`H(REH96%D+G-Y<SIS96QE8W0N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
XM<SIP87)A;2YH"3$N,RXX+C(`0"@C*6AE860N<WES.F9S+W,U<&%R86TN:`DQ
XM+C,N,BXQ`$`H(REH96%D+G-Y<SIS>7-T;2YH"3$N,RXQ,"XQ`$`H(REH96%D
XM+G-Y<SIS=')E86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ
XM+C$N-RXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS
XM>7,Z<&]L;"YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N
XM,2XQ`$`H(REH96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z
XM<')O=&]S=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`
XM*",I:&5A9"YS>7,Z<V]C:VEO+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z:6]C
XM8V]M+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ`$`H
XM(REH96%D+G-Y<SIS=')O<'1S+F@),2XT+C4N,0!`*",I:&5A9"YS>7,Z8V]N
XM9BYH"3$N,RXW+C(`0"@C*6AE860N<WES.F5V96-B+F@),2XQ+C$N,0!`*",I
XM:&5A9"YS>7,Z<W1R;&]G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z;&]G+F@)
XM,2XS+C0N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE
XM=#IA9BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C
XM*2]U<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP
XM(#`U+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6ME<FXM:6YE=#II;E]V87(N
XM:`DQ+C$N,BXQ`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C*6AE
XM860N<WES.F-M;E]E<G(N:`DQ+C,N,RXQ`$`H(REK97)N+6EN970Z:7!?<W1R
XM+F@),2XQ+C,N,0!A8V]M<#H@*%-#1$4I(#4N,"`@,#0O,3DO.3``;W!T:6TZ
XM("A30T1%*2`U+C`@(#`T+S$Y+SDP`&%S.B`H4T-$12D@-2XP("`P-"\Q.2\Y
XM,`!`*",I:V5R;BUI;F5T.FEP7W9E<G,N8PDQ+C,`0"@C*6AE860N<WES.F-M
XM;E]E<G(N:`DQ+C,N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O
XM<'1I;3H@*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T
XM+S$Y+SDP````````````````````````````````````````````````````
XM```````!`````0````8`````````-````!!F``````````````0`````````
XM!P````$````"`````````$1F```\```````````````$``````````\````!
XM`````P````````"`9@``*`(`````````````!``````````5`````0````,`
XM````````J&@``.P$``````````````0`````````'`````@````#````````
XM`)1M``"H```````````````$`````````"$````"``````````````"4;0``
XM,`X```<````E````!````!`````I`````P``````````````Q'L``"((````
XM``````````$`````````,0````,``````````````.:#``!D````````````
XM```!`````````#L````)``````````````!,A```:!4```8````!````!```
XM``@```!%````"0``````````````M)D``'@````&`````@````0````(````
XM40````D``````````````"R:```@`0``!@````,````$````"````%L````!
XC``````````````!,FP``02D``````````````0``````````
X`
Xend
END_OF_FILE
  if test 20206 -ne `wc -c <'driver/v2.ip.fix/Driver.UU.02'`; then
    echo shar: \"'driver/v2.ip.fix/Driver.UU.02'\" unpacked with wrong size!
  fi
  # end of 'driver/v2.ip.fix/Driver.UU.02'
fi
if test ! -d 'man' ; then
    echo shar: Creating directory \"'man'\"
    mkdir 'man'
fi
if test ! -d 'man/man1' ; then
    echo shar: Creating directory \"'man/man1'\"
    mkdir 'man/man1'
fi
if test ! -d 'man/man7' ; then
    echo shar: Creating directory \"'man/man7'\"
    mkdir 'man/man7'
fi
if test ! -d 'utils' ; then
    echo shar: Creating directory \"'utils'\"
    mkdir 'utils'
fi
echo shar: End of archive 1 \(of 4\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still must unpack the following archives:
    echo "        " ${MISSING}
fi
exit 0
exit 0 # Just in case...
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.