DragonFly BSD
DragonFly submit List (threaded) for 2005-11
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

802.11 patch


From: "Andrew Atrens" <atrens@xxxxxxxxxx>
Date: Thu, 24 Nov 2005 13:01:36 -0500


brings in new 802.11 stack from FreeBSD-current



diff -N -u -r src.preview/sbin/ifconfig/Makefile src/sbin/ifconfig/Makefile
--- src.preview/sbin/ifconfig/Makefile	2005-03-03 21:29:19.000000000 -0500
+++ src/sbin/ifconfig/Makefile	2005-09-27 15:02:10.000000000 -0400
@@ -1,25 +1,31 @@
 #	From: @(#)Makefile	8.1 (Berkeley) 6/5/93
-# $FreeBSD: src/sbin/ifconfig/Makefile,v 1.14.2.7 2002/02/15 03:58:37 luigi Exp $
-# $DragonFly: src/sbin/ifconfig/Makefile,v 1.3 2005/03/04 02:29:19 cpressey Exp $
+# $FreeBSD$
 
 PROG=	ifconfig
 WARNS?=	6
-SRCS=	ifconfig.c
-
-#comment out to exclude SIOC[GS]IFMEDIA support
-SRCS+=	ifmedia.c
-CFLAGS+=-DUSE_IF_MEDIA
-CFLAGS+=-DINET6
-
-#comment out to exclude SIOC[GS]ETVLAN support
-SRCS+=	ifvlan.c
-CFLAGS+=-DUSE_VLANS
-
-#comment out to exclude SIOC[GS]IEEE80211 support
-SRCS+=	ifieee80211.c
-CFLAGS+=-DUSE_IEEE80211
+SRCS=	ifconfig.c		# base support
 
 MAN=	ifconfig.8
+#
+# NB: The order here defines the order in which the constructors
+#     are called.  This in turn defines the default order in which
+#     status is displayed.  Probably should add a priority mechanism
+#     to the registration process so we don't depend on this aspect
+#     of the toolchain.
+#
+SRCS+=	af_link.c		# LLC support
+SRCS+=	af_inet.c		# IPv4 support
+SRCS+=	af_inet6.c		# IPv6 support
+SRCS+=	af_atalk.c		# AppleTalk support
+
+SRCS+=	ifclone.c		# clone device support
+# SRCS+=	ifmac.c			# MAC support
+SRCS+=	ifmedia.c		# SIOC[GS]IFMEDIA support
+SRCS+=	ifvlan.c		# SIOC[GS]ETVLAN support
+SRCS+=	ifieee80211.c		# SIOC[GS]IEEE80211 support
+
+#SRCS+=	ifcarp.c		# SIOC[GS]VH support
+#SRCS+=	ifpfsync.c		# pfsync(4) support
 
 .if defined(RELEASE_CRUNCH)
 CFLAGS+=-DNO_IPX
diff -N -u -r src.preview/sbin/ifconfig/af_atalk.c src/sbin/ifconfig/af_atalk.c
--- src.preview/sbin/ifconfig/af_atalk.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_atalk.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>		/* for RTX_IFA */
+
+#include <netatalk/at.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+
+#include "ifconfig.h"
+
+static struct netrange at_nr;		/* AppleTalk net range */
+static struct ifaliasreq at_addreq;
+
+/* XXX  FIXME -- should use strtoul for better parsing. */
+static void
+setatrange(const char *range, int dummy __unused, int s, 
+    const struct afswtch *afp)
+{
+	u_int	first = 123, last = 123;
+
+	if (sscanf(range, "%u-%u", &first, &last) != 2
+	    || first == 0 || first > 0xffff
+	    || last == 0 || last > 0xffff || first > last)
+		errx(1, "%s: illegal net range: %u-%u", range, first, last);
+	at_nr.nr_firstnet = htons(first);
+	at_nr.nr_lastnet = htons(last);
+}
+
+static void
+setatphase(const char *phase, int dummy __unused, int s, 
+    const struct afswtch *afp)
+{
+	if (!strcmp(phase, "1"))
+		at_nr.nr_phase = 1;
+	else if (!strcmp(phase, "2"))
+		at_nr.nr_phase = 2;
+	else
+		errx(1, "%s: illegal phase", phase);
+}
+
+static void
+at_status(int s __unused, const struct rt_addrinfo * info)
+{
+	struct sockaddr_at *sat, null_sat;
+	struct netrange *nr;
+
+	memset(&null_sat, 0, sizeof(null_sat));
+
+	sat = (struct sockaddr_at *)info->rti_info[RTAX_IFA];
+	if (sat == NULL)
+		return;
+	nr = &sat->sat_range.r_netrange;
+	printf("\tatalk %d.%d range %d-%d phase %d",
+		ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
+		ntohs(nr->nr_firstnet), ntohs(nr->nr_lastnet), nr->nr_phase);
+	if (flags & IFF_POINTOPOINT) {
+		/* note RTAX_BRD overlap with IFF_BROADCAST */
+		sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
+		if (!sat)
+			sat = &null_sat;
+		printf("--> %d.%d",
+			ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
+	}
+	if (flags & IFF_BROADCAST) {
+		/* note RTAX_BRD overlap with IFF_POINTOPOINT */
+		sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
+		if (sat)
+			printf(" broadcast %d.%d",
+				ntohs(sat->sat_addr.s_net),
+				sat->sat_addr.s_node);
+	}
+
+	putchar('\n');
+}
+
+static void
+at_getaddr(const char *addr, int which)
+{
+	struct sockaddr_at *sat = (struct sockaddr_at *) &at_addreq.ifra_addr;
+	u_int net, node;
+
+	sat->sat_family = AF_APPLETALK;
+	sat->sat_len = sizeof(*sat);
+	if (which == MASK)
+		errx(1, "AppleTalk does not use netmasks");
+	if (sscanf(addr, "%u.%u", &net, &node) != 2
+	    || net > 0xffff || node > 0xfe)
+		errx(1, "%s: illegal address", addr);
+	sat->sat_addr.s_net = htons(net);
+	sat->sat_addr.s_node = node;
+}
+
+static void
+at_postproc(int s, const struct afswtch *afp)
+{
+	struct sockaddr_at *sat = (struct sockaddr_at *) &at_addreq.ifra_addr;
+
+	if (at_nr.nr_phase == 0)
+		at_nr.nr_phase = 2;	/* Default phase 2 */
+	if (at_nr.nr_firstnet == 0)
+		at_nr.nr_firstnet =	/* Default range of one */
+		at_nr.nr_lastnet = sat->sat_addr.s_net;
+	printf("\tatalk %d.%d range %d-%d phase %d\n",
+		ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
+		ntohs(at_nr.nr_firstnet), ntohs(at_nr.nr_lastnet),
+		at_nr.nr_phase);
+	if ((u_short) ntohs(at_nr.nr_firstnet) >
+			(u_short) ntohs(sat->sat_addr.s_net)
+		    || (u_short) ntohs(at_nr.nr_lastnet) <
+			(u_short) ntohs(sat->sat_addr.s_net))
+		errx(1, "AppleTalk address is not in range");
+	sat->sat_range.r_netrange = at_nr;
+}
+
+static struct cmd atalk_cmds[] = {
+	DEF_CMD_ARG("range",	setatrange),
+	DEF_CMD_ARG("phase",	setatphase),
+};
+
+static struct afswtch af_atalk = {
+	.af_name	= "atalk",
+	.af_af		= AF_APPLETALK,
+	.af_status	= at_status,
+	.af_getaddr	= at_getaddr,
+	.af_postproc	= at_postproc,
+	.af_difaddr	= SIOCDIFADDR,
+	.af_aifaddr	= SIOCAIFADDR,
+	.af_ridreq	= &at_addreq,
+	.af_addreq	= &at_addreq,
+};
+
+static __constructor void
+atalk_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(atalk_cmds);  i++)
+		cmd_register(&atalk_cmds[i]);
+	af_register(&af_atalk);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/af_inet.c src/sbin/ifconfig/af_inet.c
--- src.preview/sbin/ifconfig/af_inet.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_inet.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>		/* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <netinet/in.h>
+#include <net/if_var.h>		/* for struct ifaddr */
+#include <netinet/in_var.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include "ifconfig.h"
+
+static struct ifaliasreq in_addreq;
+static struct ifreq in_ridreq;
+
+static void
+in_status(int s __unused, const struct rt_addrinfo * info)
+{
+	struct sockaddr_in *sin, null_sin;
+	
+	memset(&null_sin, 0, sizeof(null_sin));
+
+	sin = (struct sockaddr_in *)info->rti_info[RTAX_IFA];
+	if (sin == NULL)
+		return;
+
+	printf("\tinet %s ", inet_ntoa(sin->sin_addr));
+
+	if (flags & IFF_POINTOPOINT) {
+		/* note RTAX_BRD overlap with IFF_BROADCAST */
+		sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
+		if (!sin)
+			sin = &null_sin;
+		printf("--> %s ", inet_ntoa(sin->sin_addr));
+	}
+
+	sin = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK];
+	if (!sin)
+		sin = &null_sin;
+	printf("netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr));
+
+	if (flags & IFF_BROADCAST) {
+		/* note RTAX_BRD overlap with IFF_POINTOPOINT */
+		sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
+		if (sin && sin->sin_addr.s_addr != 0)
+			printf("broadcast %s", inet_ntoa(sin->sin_addr));
+	}
+	putchar('\n');
+}
+
+#define SIN(x) ((struct sockaddr_in *) &(x))
+static struct sockaddr_in *sintab[] = {
+	SIN(in_ridreq.ifr_addr), SIN(in_addreq.ifra_addr),
+	SIN(in_addreq.ifra_mask), SIN(in_addreq.ifra_broadaddr)
+};
+
+static void
+in_getaddr(const char *s, int which)
+{
+#define	MIN(a,b)	((a)<(b)?(a):(b))
+	struct sockaddr_in *sin = sintab[which];
+	struct hostent *hp;
+	struct netent *np;
+
+	sin->sin_len = sizeof(*sin);
+	if (which != MASK)
+		sin->sin_family = AF_INET;
+
+	if (which == ADDR) {
+		char *p = NULL;
+
+		if((p = strrchr(s, '/')) != NULL) {
+			/* address is `name/masklen' */
+			int masklen;
+			int ret;
+			struct sockaddr_in *min = sintab[MASK];
+			*p = '\0';
+			ret = sscanf(p+1, "%u", &masklen);
+			if(ret != 1 || (masklen < 0 || masklen > 32)) {
+				*p = '/';
+				errx(1, "%s: bad value", s);
+			}
+			min->sin_len = sizeof(*min);
+			min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) & 
+				              0xffffffff);
+		}
+	}
+
+	if (inet_aton(s, &sin->sin_addr))
+		return;
+	if ((hp = gethostbyname(s)) != 0)
+		bcopy(hp->h_addr, (char *)&sin->sin_addr, 
+		    MIN(hp->h_length, sizeof(sin->sin_addr)));
+	else if ((np = getnetbyname(s)) != 0)
+		sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
+	else
+		errx(1, "%s: bad value", s);
+#undef MIN
+}
+
+static void
+in_status_tunnel(int s)
+{
+	char src[NI_MAXHOST];
+	char dst[NI_MAXHOST];
+	struct ifreq ifr;
+	const struct sockaddr *sa = (const struct sockaddr *) &ifr.ifr_addr;
+
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, name, IFNAMSIZ);
+
+	if (ioctl(s, SIOCGIFPSRCADDR, (caddr_t)&ifr) < 0)
+		return;
+	if (getnameinfo(sa, sa->sa_len, src, sizeof(src), 0, 0, NI_NUMERICHOST) != 0)
+		src[0] = '\0';
+
+	if (ioctl(s, SIOCGIFPDSTADDR, (caddr_t)&ifr) < 0)
+		return;
+	if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, NI_NUMERICHOST) != 0)
+		dst[0] = '\0';
+
+	printf("\ttunnel inet %s --> %s\n", src, dst);
+}
+
+static void
+in_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres)
+{
+	struct ifaliasreq addreq;
+
+	memset(&addreq, 0, sizeof(addreq));
+	strncpy(addreq.ifra_name, name, IFNAMSIZ);
+	memcpy(&addreq.ifra_addr, srcres->ai_addr, srcres->ai_addr->sa_len);
+	memcpy(&addreq.ifra_dstaddr, dstres->ai_addr, dstres->ai_addr->sa_len);
+
+	if (ioctl(s, SIOCSIFPHYADDR, &addreq) < 0)
+		warn("SIOCSIFPHYADDR");
+}
+
+static struct afswtch af_inet = {
+	.af_name	= "inet",
+	.af_af		= AF_INET,
+	.af_status	= in_status,
+	.af_getaddr	= in_getaddr,
+	.af_status_tunnel = in_status_tunnel,
+	.af_settunnel	= in_set_tunnel,
+	.af_difaddr	= SIOCDIFADDR,
+	.af_aifaddr	= SIOCAIFADDR,
+	.af_ridreq	= &in_ridreq,
+	.af_addreq	= &in_addreq,
+};
+
+static __constructor void
+inet_ctor(void)
+{
+	af_register(&af_inet);
+}
diff -N -u -r src.preview/sbin/ifconfig/af_inet6.c src/sbin/ifconfig/af_inet6.c
--- src.preview/sbin/ifconfig/af_inet6.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_inet6.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,547 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>		/* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ifaddrs.h>
+
+#include <arpa/inet.h>
+
+#include <netinet/in.h>
+#include <net/if_var.h>		/* for struct ifaddr */
+#include <netinet/in_var.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <netinet6/nd6.h>	/* Define ND6_INFINITE_LIFETIME */
+
+#include "ifconfig.h"
+
+/* wrapper for KAME-special getnameinfo() */
+#ifndef NI_WITHSCOPEID
+#define	NI_WITHSCOPEID	0
+#endif
+
+static	struct in6_ifreq in6_ridreq;
+static	struct in6_aliasreq in6_addreq = 
+  { { 0 }, 
+    { 0 }, 
+    { 0 }, 
+    { 0 }, 
+    0, 
+    { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME } };
+static	int ip6lifetime;
+
+static	void in6_fillscopeid(struct sockaddr_in6 *sin6);
+static	int prefix(void *, int);
+static	char *sec2str(time_t);
+static	int explicit_prefix = 0;
+
+static	char addr_buf[MAXHOSTNAMELEN *2 + 1];	/*for getnameinfo()*/
+
+static void
+setifprefixlen(const char *addr, int dummy __unused, int s,
+    const struct afswtch *afp)
+{
+        if (afp->af_getprefix != NULL)
+                afp->af_getprefix(addr, MASK);
+	explicit_prefix = 1;
+}
+
+static void
+setip6flags(const char *dummyaddr __unused, int flag, int dummysoc __unused,
+    const struct afswtch *afp)
+{
+	if (afp->af_af != AF_INET6)
+		err(1, "address flags can be set only for inet6 addresses");
+
+	if (flag < 0)
+		in6_addreq.ifra_flags &= ~(-flag);
+	else
+		in6_addreq.ifra_flags |= flag;
+}
+
+static void
+setip6lifetime(const char *cmd, const char *val, int s, 
+    const struct afswtch *afp)
+{
+	time_t newval, t;
+	char *ep;
+
+	t = time(NULL);
+	newval = (time_t)strtoul(val, &ep, 0);
+	if (val == ep)
+		errx(1, "invalid %s", cmd);
+	if (afp->af_af != AF_INET6)
+		errx(1, "%s not allowed for the AF", cmd);
+	if (strcmp(cmd, "vltime") == 0) {
+		in6_addreq.ifra_lifetime.ia6t_expire = t + newval;
+		in6_addreq.ifra_lifetime.ia6t_vltime = newval;
+	} else if (strcmp(cmd, "pltime") == 0) {
+		in6_addreq.ifra_lifetime.ia6t_preferred = t + newval;
+		in6_addreq.ifra_lifetime.ia6t_pltime = newval;
+	}
+}
+
+static void
+setip6pltime(const char *seconds, int dummy __unused, int s, 
+    const struct afswtch *afp)
+{
+	setip6lifetime("pltime", seconds, s, afp);
+}
+
+static void
+setip6vltime(const char *seconds, int dummy __unused, int s, 
+    const struct afswtch *afp)
+{
+	setip6lifetime("vltime", seconds, s, afp);
+}
+
+static void
+setip6eui64(const char *cmd, int dummy __unused, int s,
+    const struct afswtch *afp)
+{
+	struct ifaddrs *ifap, *ifa;
+	const struct sockaddr_in6 *sin6 = NULL;
+	const struct in6_addr *lladdr = NULL;
+	struct in6_addr *in6;
+
+	if (afp->af_af != AF_INET6)
+		errx(EXIT_FAILURE, "%s not allowed for the AF", cmd);
+ 	in6 = (struct in6_addr *)&in6_addreq.ifra_addr.sin6_addr;
+	if (memcmp(&in6addr_any.s6_addr[8], &in6->s6_addr[8], 8) != 0)
+		errx(EXIT_FAILURE, "interface index is already filled");
+	if (getifaddrs(&ifap) != 0)
+		err(EXIT_FAILURE, "getifaddrs");
+	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+		if (ifa->ifa_addr->sa_family == AF_INET6 &&
+		    strcmp(ifa->ifa_name, name) == 0) {
+			sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
+			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+				lladdr = &sin6->sin6_addr;
+				break;
+			}
+		}
+	}
+	if (!lladdr)
+		errx(EXIT_FAILURE, "could not determine link local address"); 
+
+ 	memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8);
+
+	freeifaddrs(ifap);
+}
+
+static void
+in6_fillscopeid(struct sockaddr_in6 *sin6)
+{
+#if defined(__KAME__) && defined(KAME_SCOPEID)
+	if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+		sin6->sin6_scope_id =
+			ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
+		sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
+	}
+#endif
+}
+
+static void
+in6_status(int s __unused, const struct rt_addrinfo * info)
+{
+	struct sockaddr_in6 *sin, null_sin;
+	struct in6_ifreq ifr6;
+	int s6;
+	u_int32_t flags6;
+	struct in6_addrlifetime lifetime;
+	time_t t = time(NULL);
+	int error;
+	u_int32_t scopeid;
+
+	memset(&null_sin, 0, sizeof(null_sin));
+
+	sin = (struct sockaddr_in6 *)info->rti_info[RTAX_IFA];
+	if (sin == NULL)
+		return;
+
+	strncpy(ifr6.ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name));
+	if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+		warn("socket(AF_INET6,SOCK_DGRAM)");
+		return;
+	}
+	ifr6.ifr_addr = *sin;
+	if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
+		warn("ioctl(SIOCGIFAFLAG_IN6)");
+		close(s6);
+		return;
+	}
+	flags6 = ifr6.ifr_ifru.ifru_flags6;
+	memset(&lifetime, 0, sizeof(lifetime));
+	ifr6.ifr_addr = *sin;
+	if (ioctl(s6, SIOCGIFALIFETIME_IN6, &ifr6) < 0) {
+		warn("ioctl(SIOCGIFALIFETIME_IN6)");
+		close(s6);
+		return;
+	}
+	lifetime = ifr6.ifr_ifru.ifru_lifetime;
+	close(s6);
+
+	/* XXX: embedded link local addr check */
+	if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) &&
+	    *(u_short *)&sin->sin6_addr.s6_addr[2] != 0) {
+		u_short index;
+
+		index = *(u_short *)&sin->sin6_addr.s6_addr[2];
+		*(u_short *)&sin->sin6_addr.s6_addr[2] = 0;
+		if (sin->sin6_scope_id == 0)
+			sin->sin6_scope_id = ntohs(index);
+	}
+	scopeid = sin->sin6_scope_id;
+
+	error = getnameinfo((struct sockaddr *)sin, sin->sin6_len, addr_buf,
+			    sizeof(addr_buf), NULL, 0,
+			    NI_NUMERICHOST|NI_WITHSCOPEID);
+	if (error != 0)
+		inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
+			  sizeof(addr_buf));
+	printf("\tinet6 %s ", addr_buf);
+
+	if (flags & IFF_POINTOPOINT) {
+		/* note RTAX_BRD overlap with IFF_BROADCAST */
+		sin = (struct sockaddr_in6 *)info->rti_info[RTAX_BRD];
+		/*
+		 * some of the interfaces do not have valid destination
+		 * address.
+		 */
+		if (sin && sin->sin6_family == AF_INET6) {
+			int error;
+
+			/* XXX: embedded link local addr check */
+			if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) &&
+			    *(u_short *)&sin->sin6_addr.s6_addr[2] != 0) {
+				u_short index;
+
+				index = *(u_short *)&sin->sin6_addr.s6_addr[2];
+				*(u_short *)&sin->sin6_addr.s6_addr[2] = 0;
+				if (sin->sin6_scope_id == 0)
+					sin->sin6_scope_id = ntohs(index);
+			}
+
+			error = getnameinfo((struct sockaddr *)sin,
+					    sin->sin6_len, addr_buf,
+					    sizeof(addr_buf), NULL, 0,
+					    NI_NUMERICHOST|NI_WITHSCOPEID);
+			if (error != 0)
+				inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
+					  sizeof(addr_buf));
+			printf("--> %s ", addr_buf);
+		}
+	}
+
+	sin = (struct sockaddr_in6 *)info->rti_info[RTAX_NETMASK];
+	if (!sin)
+		sin = &null_sin;
+	printf("prefixlen %d ", prefix(&sin->sin6_addr,
+		sizeof(struct in6_addr)));
+
+	if ((flags6 & IN6_IFF_ANYCAST) != 0)
+		printf("anycast ");
+	if ((flags6 & IN6_IFF_TENTATIVE) != 0)
+		printf("tentative ");
+	if ((flags6 & IN6_IFF_DUPLICATED) != 0)
+		printf("duplicated ");
+	if ((flags6 & IN6_IFF_DETACHED) != 0)
+		printf("detached ");
+	if ((flags6 & IN6_IFF_DEPRECATED) != 0)
+		printf("deprecated ");
+	if ((flags6 & IN6_IFF_AUTOCONF) != 0)
+		printf("autoconf ");
+	if ((flags6 & IN6_IFF_TEMPORARY) != 0)
+		printf("temporary ");
+
+        if (scopeid)
+		printf("scopeid 0x%x ", scopeid);
+
+	if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
+		printf("pltime ");
+		if (lifetime.ia6t_preferred) {
+			printf("%s ", lifetime.ia6t_preferred < t
+				? "0" : sec2str(lifetime.ia6t_preferred - t));
+		} else
+			printf("infty ");
+
+		printf("vltime ");
+		if (lifetime.ia6t_expire) {
+			printf("%s ", lifetime.ia6t_expire < t
+				? "0" : sec2str(lifetime.ia6t_expire - t));
+		} else
+			printf("infty ");
+	}
+
+	putchar('\n');
+}
+
+#define	SIN6(x) ((struct sockaddr_in6 *) &(x))
+static struct	sockaddr_in6 *sin6tab[] = {
+	SIN6(in6_ridreq.ifr_addr), SIN6(in6_addreq.ifra_addr),
+	SIN6(in6_addreq.ifra_prefixmask), SIN6(in6_addreq.ifra_dstaddr)
+};
+
+static void
+in6_getprefix(const char *plen, int which)
+{
+	struct sockaddr_in6 *sin = sin6tab[which];
+	u_char *cp;
+	int len = atoi(plen);
+
+	if ((len < 0) || (len > 128))
+		errx(1, "%s: bad value", plen);
+	sin->sin6_len = sizeof(*sin);
+	if (which != MASK)
+		sin->sin6_family = AF_INET6;
+	if ((len == 0) || (len == 128)) {
+		memset(&sin->sin6_addr, 0xff, sizeof(struct in6_addr));
+		return;
+	}
+	memset((void *)&sin->sin6_addr, 0x00, sizeof(sin->sin6_addr));
+	for (cp = (u_char *)&sin->sin6_addr; len > 7; len -= 8)
+		*cp++ = 0xff;
+	*cp = 0xff << (8 - len);
+}
+
+static void
+in6_getaddr(const char *s, int which)
+{
+	struct sockaddr_in6 *sin = sin6tab[which];
+	struct addrinfo hints, *res;
+	int error = -1;
+
+	newaddr &= 1;
+
+	sin->sin6_len = sizeof(*sin);
+	if (which != MASK)
+		sin->sin6_family = AF_INET6;
+
+	if (which == ADDR) {
+		char *p = NULL;
+		if((p = strrchr(s, '/')) != NULL) {
+			*p = '\0';
+			in6_getprefix(p + 1, MASK);
+			explicit_prefix = 1;
+		}
+	}
+
+	if (sin->sin6_family == AF_INET6) {
+		bzero(&hints, sizeof(struct addrinfo));
+		hints.ai_family = AF_INET6;
+		error = getaddrinfo(s, NULL, &hints, &res);
+	}
+	if (error != 0) {
+		if (inet_pton(AF_INET6, s, &sin->sin6_addr) != 1)
+			errx(1, "%s: bad value", s);
+	} else
+		bcopy(res->ai_addr, sin, res->ai_addrlen);
+}
+
+static int
+prefix(void *val, int size)
+{
+        u_char *name = (u_char *)val;
+        int byte, bit, plen = 0;
+
+        for (byte = 0; byte < size; byte++, plen += 8)
+                if (name[byte] != 0xff)
+                        break;
+	if (byte == size)
+		return (plen);
+	for (bit = 7; bit != 0; bit--, plen++)
+                if (!(name[byte] & (1 << bit)))
+                        break;
+        for (; bit != 0; bit--)
+                if (name[byte] & (1 << bit))
+                        return(0);
+        byte++;
+        for (; byte < size; byte++)
+                if (name[byte])
+                        return(0);
+        return (plen);
+}
+
+static char *
+sec2str(time_t total)
+{
+	static char result[256];
+	int days, hours, mins, secs;
+	int first = 1;
+	char *p = result;
+
+	if (0) {
+		days = total / 3600 / 24;
+		hours = (total / 3600) % 24;
+		mins = (total / 60) % 60;
+		secs = total % 60;
+
+		if (days) {
+			first = 0;
+			p += sprintf(p, "%dd", days);
+		}
+		if (!first || hours) {
+			first = 0;
+			p += sprintf(p, "%dh", hours);
+		}
+		if (!first || mins) {
+			first = 0;
+			p += sprintf(p, "%dm", mins);
+		}
+		sprintf(p, "%ds", secs);
+	} else
+		sprintf(result, "%lu", (unsigned long)total);
+
+	return(result);
+}
+
+static void
+in6_postproc(int s, const struct afswtch *afp)
+{
+	if (explicit_prefix == 0) {
+		/* Aggregatable address architecture defines all prefixes
+		   are 64. So, it is convenient to set prefixlen to 64 if
+		   it is not specified. */
+		setifprefixlen("64", 0, s, afp);
+		/* in6_getprefix("64", MASK) if MASK is available here... */
+	}
+}
+
+static void
+in6_status_tunnel(int s)
+{
+	char src[NI_MAXHOST];
+	char dst[NI_MAXHOST];
+#ifdef NI_WITHSCOPEID
+	const int niflag = NI_NUMERICHOST | NI_WITHSCOPEID;
+#else
+	const int niflag = NI_NUMERICHOST;
+#endif
+	struct in6_ifreq in6_ifr;
+	const struct sockaddr *sa = (const struct sockaddr *) &in6_ifr.ifr_addr;
+
+	memset(&in6_ifr, 0, sizeof(in6_ifr));
+	strncpy(in6_ifr.ifr_name, name, IFNAMSIZ);
+
+	if (ioctl(s, SIOCGIFPSRCADDR_IN6, (caddr_t)&in6_ifr) < 0)
+		return;
+	if (sa->sa_family == AF_INET6)
+		in6_fillscopeid(&in6_ifr.ifr_addr);
+	if (getnameinfo(sa, sa->sa_len, src, sizeof(src), 0, 0, niflag) != 0)
+		src[0] = '\0';
+
+	if (ioctl(s, SIOCGIFPDSTADDR_IN6, (caddr_t)&in6_ifr) < 0)
+		return;
+	if (sa->sa_family == AF_INET6)
+		in6_fillscopeid(&in6_ifr.ifr_addr);
+	if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, niflag) != 0)
+		dst[0] = '\0';
+
+	printf("\ttunnel inet6 %s --> %s\n", src, dst);
+}
+
+static void
+in6_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres)
+{
+	struct in6_aliasreq in6_addreq; 
+
+	memset(&in6_addreq, 0, sizeof(in6_addreq));
+	strncpy(in6_addreq.ifra_name, name, IFNAMSIZ);
+	memcpy(&in6_addreq.ifra_addr, srcres->ai_addr, srcres->ai_addr->sa_len);
+	memcpy(&in6_addreq.ifra_dstaddr, dstres->ai_addr,
+	    dstres->ai_addr->sa_len);
+
+	if (ioctl(s, SIOCSIFPHYADDR_IN6, &in6_addreq) < 0)
+		warn("SIOCSIFPHYADDR_IN6");
+}
+
+static struct cmd inet6_cmds[] = {
+	DEF_CMD_ARG("prefixlen",			setifprefixlen),
+	DEF_CMD("tentative",	IN6_IFF_TENTATIVE,	setip6flags),
+	DEF_CMD("-tentative",	-IN6_IFF_TENTATIVE,	setip6flags),
+	DEF_CMD("deprecated",	IN6_IFF_DEPRECATED,	setip6flags),
+	DEF_CMD("-deprecated", -IN6_IFF_DEPRECATED,	setip6flags),
+	DEF_CMD("autoconf",	IN6_IFF_AUTOCONF,	setip6flags),
+	DEF_CMD("-autoconf",	-IN6_IFF_AUTOCONF,	setip6flags),
+	DEF_CMD_ARG("pltime",        			setip6pltime),
+	DEF_CMD_ARG("vltime",        			setip6vltime),
+	DEF_CMD("eui64",	0,			setip6eui64),
+};
+
+static struct afswtch af_inet6 = {
+	.af_name	= "inet6",
+	.af_af		= AF_INET6,
+	.af_status	= in6_status,
+	.af_getaddr	= in6_getaddr,
+	.af_getprefix	= in6_getprefix,
+	.af_postproc	= in6_postproc,
+	.af_status_tunnel = in6_status_tunnel,
+	.af_settunnel	= in6_set_tunnel,
+	.af_difaddr	= SIOCDIFADDR_IN6,
+	.af_aifaddr	= SIOCAIFADDR_IN6,
+	.af_ridreq	= &in6_addreq,
+	.af_addreq	= &in6_addreq,
+};
+
+static void
+in6_Lopt_cb(const char *optarg __unused)
+{
+	ip6lifetime++;	/* print IPv6 address lifetime */
+}
+static struct option in6_Lopt = { "L", "[-L]", in6_Lopt_cb };
+
+static __constructor void
+inet6_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(inet6_cmds);  i++)
+		cmd_register(&inet6_cmds[i]);
+	af_register(&af_inet6);
+	opt_register(&in6_Lopt);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/af_ipx.c src/sbin/ifconfig/af_ipx.c
--- src.preview/sbin/ifconfig/af_ipx.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_ipx.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <net/if_var.h>
+#define	IPXIP
+#define IPTUNNEL
+#include <netipx/ipx.h>
+#include <netipx/ipx_if.h>
+
+#include "ifconfig.h"
+
+static struct ifaliasreq ipx_addreq;
+static struct ifreq ipx_ridreq;
+
+static void
+ipx_status(int s __unused, const struct rt_addrinfo * info)
+{
+	struct sockaddr_ipx *sipx, null_sipx;
+
+	sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_IFA];
+	if (sipx == NULL)
+		return;
+
+	printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr));
+
+	if (flags & IFF_POINTOPOINT) {
+		sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_BRD];
+		if (!sipx) {
+			memset(&null_sipx, 0, sizeof(null_sipx));
+			sipx = &null_sipx;
+		}
+		printf("--> %s ", ipx_ntoa(sipx->sipx_addr));
+	}
+	putchar('\n');
+}
+
+#define SIPX(x) ((struct sockaddr_ipx *) &(x))
+struct sockaddr_ipx *sipxtab[] = {
+	SIPX(ipx_ridreq.ifr_addr), SIPX(ipx_addreq.ifra_addr),
+	SIPX(ipx_addreq.ifra_mask), SIPX(ipx_addreq.ifra_broadaddr)
+};
+
+static void
+ipx_getaddr(const char *addr, int which)
+{
+	struct sockaddr_ipx *sipx = sipxtab[which];
+
+	sipx->sipx_family = AF_IPX;
+	sipx->sipx_len = sizeof(*sipx);
+	sipx->sipx_addr = ipx_addr(addr);
+	if (which == MASK)
+		printf("Attempt to set IPX netmask will be ineffectual\n");
+}
+
+static void
+ipx_postproc(int s, const struct afswtch *afp)
+{
+	if (setipdst) {
+		struct ipxip_req rq;
+		int size = sizeof(rq);
+
+		rq.rq_ipx = ipx_addreq.ifra_addr;
+		rq.rq_ip = ipx_addreq.ifra_dstaddr;
+
+		if (setsockopt(s, 0, SO_IPXIP_ROUTE, &rq, size) < 0)
+			Perror("Encapsulation Routing");
+	}
+}
+
+static struct afswtch af_ipx = {
+	.af_name	= "ipx",
+	.af_af		= AF_IPX,
+	.af_status	= ipx_status,
+	.af_getaddr	= ipx_getaddr,
+	.af_postproc	= ipx_postproc,
+	.af_difaddr	= SIOCDIFADDR,
+	.af_aifaddr	= SIOCAIFADDR,
+	.af_ridreq	= &ipx_ridreq,
+	.af_addreq	= &ipx_addreq,
+};
+
+static __constructor void
+ipx_ctor(void)
+{
+	af_register(&af_ipx);
+}
diff -N -u -r src.preview/sbin/ifconfig/af_link.c src/sbin/ifconfig/af_link.c
--- src.preview/sbin/ifconfig/af_link.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_link.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>		/* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/ethernet.h>
+
+#include "ifconfig.h"
+
+static struct ifreq link_ridreq;
+
+static void
+link_status(int s __unused, const struct rt_addrinfo *info)
+{
+	const struct sockaddr_dl *sdl =
+		(const struct sockaddr_dl *) info->rti_info[RTAX_IFA];
+
+	if (sdl != NULL && sdl->sdl_alen > 0) {
+		if (sdl->sdl_type == IFT_ETHER &&
+		    sdl->sdl_alen == ETHER_ADDR_LEN)
+			printf("\tether %s\n",
+			    ether_ntoa((const struct ether_addr *)LLADDR(sdl)));
+		else {
+			int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
+
+			printf("\tlladdr %s\n", link_ntoa(sdl) + n);
+		}
+	}
+}
+
+static void
+link_getaddr(const char *addr, int which)
+{
+	char *temp;
+	struct sockaddr_dl sdl;
+	struct sockaddr *sa = &link_ridreq.ifr_addr;
+
+	if (which != ADDR)
+		errx(1, "can't set link-level netmask or broadcast");
+	if ((temp = malloc(strlen(addr) + 1)) == NULL)
+		errx(1, "malloc failed");
+	temp[0] = ':';
+	strcpy(temp + 1, addr);
+	sdl.sdl_len = sizeof(sdl);
+	link_addr(temp, &sdl);
+	free(temp);
+	if (sdl.sdl_alen > sizeof(sa->sa_data))
+		errx(1, "malformed link-level address");
+	sa->sa_family = AF_LINK;
+	sa->sa_len = sdl.sdl_alen;
+	bcopy(LLADDR(&sdl), sa->sa_data, sdl.sdl_alen);
+}
+
+static struct afswtch af_link = {
+	.af_name	= "link",
+	.af_af		= AF_LINK,
+	.af_status	= link_status,
+	.af_getaddr	= link_getaddr,
+	.af_aifaddr	= SIOCSIFLLADDR,
+	.af_addreq	= &link_ridreq,
+};
+static struct afswtch af_ether = {
+	.af_name	= "ether",
+	.af_af		= AF_LINK,
+	.af_status	= link_status,
+	.af_getaddr	= link_getaddr,
+	.af_aifaddr	= SIOCSIFLLADDR,
+	.af_addreq	= &link_ridreq,
+};
+static struct afswtch af_lladdr = {
+	.af_name	= "lladdr",
+	.af_af		= AF_LINK,
+	.af_status	= link_status,
+	.af_getaddr	= link_getaddr,
+	.af_aifaddr	= SIOCSIFLLADDR,
+	.af_addreq	= &link_ridreq,
+};
+
+static __constructor void
+link_ctor(void)
+{
+	af_register(&af_link);
+	af_register(&af_ether);
+	af_register(&af_lladdr);
+}
diff -N -u -r src.preview/sbin/ifconfig/ifcarp.c src/sbin/ifconfig/ifcarp.c
--- src.preview/sbin/ifconfig/ifcarp.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifcarp.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,199 @@
+/*	$FreeBSD$ */
+/*	from $OpenBSD: ifconfig.c,v 1.82 2003/10/19 05:43:35 mcbride Exp $ */
+
+/*
+ * Copyright (c) 2002 Michael Shalayeff. All rights reserved.
+ * Copyright (c) 2003 Ryan McBride. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <netinet/ip_carp.h>
+#include <net/route.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <err.h>
+#include <errno.h>
+
+#include "ifconfig.h"
+
+static const char *carp_states[] = { CARP_STATES };
+
+void carp_status(int s);
+void setcarp_advbase(const char *,int, int, const struct afswtch *rafp);
+void setcarp_advskew(const char *, int, int, const struct afswtch *rafp);
+void setcarp_passwd(const char *, int, int, const struct afswtch *rafp);
+void setcarp_vhid(const char *, int, int, const struct afswtch *rafp);
+
+void
+carp_status(int s)
+{
+	const char *state;
+	struct carpreq carpr;
+
+	memset((char *)&carpr, 0, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		return;
+
+	if (carpr.carpr_vhid > 0) {
+		if (carpr.carpr_state > CARP_MAXSTATE)
+			state = "<UNKNOWN>";
+		else
+			state = carp_states[carpr.carpr_state];
+
+		printf("\tcarp: %s vhid %d advbase %d advskew %d\n",
+		    state, carpr.carpr_vhid, carpr.carpr_advbase,
+		    carpr.carpr_advskew);
+	}
+
+	return;
+
+}
+
+void
+setcarp_passwd(const char *val, int d, int s, const struct afswtch *afp)
+{
+	struct carpreq carpr;
+
+	memset((char *)&carpr, 0, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGVH");
+
+	/* XXX Should hash the password into the key here, perhaps? */
+	strlcpy(carpr.carpr_key, val, CARP_KEY_LEN);
+
+	if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSVH");
+
+	return;
+}
+
+void
+setcarp_vhid(const char *val, int d, int s, const struct afswtch *afp)
+{
+	int vhid;
+	struct carpreq carpr;
+
+	vhid = atoi(val);
+
+	if (vhid <= 0)
+		errx(1, "vhid must be greater than 0");
+
+	memset((char *)&carpr, 0, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGVH");
+
+	carpr.carpr_vhid = vhid;
+
+	if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSVH");
+
+	return;
+}
+
+void
+setcarp_advskew(const char *val, int d, int s, const struct afswtch *afp)
+{
+	int advskew;
+	struct carpreq carpr;
+
+	advskew = atoi(val);
+
+	memset((char *)&carpr, 0, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGVH");
+
+	carpr.carpr_advskew = advskew;
+
+	if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSVH");
+
+	return;
+}
+
+void
+setcarp_advbase(const char *val, int d, int s, const struct afswtch *afp)
+{
+	int advbase;
+	struct carpreq carpr;
+
+	advbase = atoi(val);
+
+	memset((char *)&carpr, 0, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGVH");
+
+	carpr.carpr_advbase = advbase;
+
+	if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSVH");
+
+	return;
+}
+
+static struct cmd carp_cmds[] = {
+	DEF_CMD_ARG("advbase",	setcarp_advbase),
+	DEF_CMD_ARG("advskew",	setcarp_advskew),
+	DEF_CMD_ARG("pass",	setcarp_passwd),
+	DEF_CMD_ARG("vhid",	setcarp_vhid),
+};
+static struct afswtch af_carp = {
+	.af_name	= "af_carp",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = carp_status,
+};
+
+static __constructor void
+carp_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(carp_cmds);  i++)
+		cmd_register(&carp_cmds[i]);
+	af_register(&af_carp);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifclone.c src/sbin/ifconfig/ifclone.c
--- src.preview/sbin/ifconfig/ifclone.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifclone.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ifconfig.h"
+
+static void
+list_cloners(void)
+{
+	struct if_clonereq ifcr;
+	char *cp, *buf;
+	int idx;
+	int s;
+
+	s = socket(AF_INET, SOCK_DGRAM, 0);
+	if (s == -1)
+		err(1, "socket(AF_INET,SOCK_DGRAM)");
+
+	memset(&ifcr, 0, sizeof(ifcr));
+
+	if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
+		err(1, "SIOCIFGCLONERS for count");
+
+	buf = malloc(ifcr.ifcr_total * IFNAMSIZ);
+	if (buf == NULL)
+		err(1, "unable to allocate cloner name buffer");
+
+	ifcr.ifcr_count = ifcr.ifcr_total;
+	ifcr.ifcr_buffer = buf;
+
+	if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
+		err(1, "SIOCIFGCLONERS for names");
+
+	/*
+	 * In case some disappeared in the mean time, clamp it down.
+	 */
+	if (ifcr.ifcr_count > ifcr.ifcr_total)
+		ifcr.ifcr_count = ifcr.ifcr_total;
+
+	for (cp = buf, idx = 0; idx < ifcr.ifcr_count; idx++, cp += IFNAMSIZ) {
+		if (idx > 0)
+			putchar(' ');
+		printf("%s", cp);
+	}
+
+	putchar('\n');
+	free(buf);
+}
+
+void
+clone_create(void)
+{
+	int s;
+
+	s = socket(AF_INET, SOCK_DGRAM, 0);
+	if (s == -1)
+		err(1, "socket(AF_INET,SOCK_DGRAM)");
+
+	memset(&ifr, 0, sizeof(ifr));
+	(void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+	if (ioctl(s, SIOCIFCREATE, &ifr) < 0)
+		err(1, "SIOCIFCREATE");
+
+	/*
+	 * If we get a different name back then we put in, we probably
+	 * want to print it out, but we might change our mind later so
+	 * we just signal our intrest and leave the printout for later.
+	 */
+	if (strcmp(name, ifr.ifr_name) != 0) {
+		printname = 1;
+		strlcpy(name, ifr.ifr_name, sizeof(name));
+	}
+
+	close(s);
+}
+
+static void
+clone_destroy(const char *val, int d, int s, const struct afswtch *rafp)
+{
+
+	(void) strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+	if (ioctl(s, SIOCIFDESTROY, &ifr) < 0)
+		err(1, "SIOCIFDESTROY");
+	/*
+	 * If we create and destroy an interface in the same command,
+	 * there isn't any reason to print it's name.
+	 */
+	printname = 0;
+}
+
+static struct cmd clone_cmds[] = {
+	DEF_CMD("destroy",	0,	clone_destroy),
+	DEF_CMD("unplumb",	0,	clone_destroy),
+};
+
+static void
+clone_Copt_cb(const char *optarg __unused)
+{
+	list_cloners();
+	exit(0);
+}
+static struct option clone_Copt = { "C", "[-C]", clone_Copt_cb };
+
+static __constructor void
+clone_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(clone_cmds);  i++)
+		cmd_register(&clone_cmds[i]);
+	opt_register(&clone_Copt);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.8 src/sbin/ifconfig/ifconfig.8
--- src.preview/sbin/ifconfig/ifconfig.8	2005-04-25 13:33:26.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.8	2005-09-27 15:02:10.000000000 -0400
@@ -26,10 +26,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     From: @(#)ifconfig.8	8.3 (Berkeley) 1/5/94
-.\" $FreeBSD: src/sbin/ifconfig/ifconfig.8,v 1.85 2004/07/27 09:51:49 yar Exp $
-.\" $DragonFly: src/sbin/ifconfig/ifconfig.8,v 1.7 2005/04/25 17:33:26 swildner Exp $
+.\" $FreeBSD$
 .\"
-.Dd July 26, 2004
+.Dd November 2, 2004
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -56,6 +55,7 @@
 .Op Fl d
 .Op Fl m
 .Op Fl u
+.Op Fl v
 .Op Ar address_family
 .Nm
 .Fl l
@@ -67,6 +67,7 @@
 .Op Fl d
 .Op Fl m
 .Op Fl u
+.Op Fl v
 .Op Fl C
 .Sh DESCRIPTION
 The
@@ -224,6 +225,14 @@
 .It Fl arp
 Disable the use of the Address Resolution Protocol
 .Pq Xr arp 4 .
+.It Cm staticarp
+If the Address Resolution Protocol is enabled,
+the host will only reply to requests for its addresses,
+and will never send any requests.
+.It Fl staticarp
+If the Address Resolution Protocol is enabled,
+the host will perform normally,
+sending out requests and listening for replies.
 .It Cm broadcast
 (Inet only.)
 Specify the address to use to represent broadcasts to the
@@ -256,15 +265,18 @@
 Fill interface index
 (lowermost 64bit of an IPv6 address)
 automatically.
-.\" .It Cm ipdst
-.\" This is used to specify an Internet host who is willing to receive
-.\" ip packets encapsulating NS packets bound for a remote network.
-.\" An apparent point to point link is constructed, and
-.\" the address specified will be taken as the NS address and network
-.\" of the destination.
-.\" IP encapsulation of
-.\" .Tn CLNP
-.\" packets is done differently.
+.It Cm ipdst
+This is used to specify an Internet host who is willing to receive
+IP packets encapsulating IPX packets bound for a remote network.
+An apparent point to point link is constructed, and
+the address specified will be taken as the IPX address and network
+of the destination.
+.\".It Cm maclabel Ar label
+.\"If Mandatory Access Control support is enabled in the kernel,
+.\"set the MAC label to
+.\".Ar label .
+.\" (see
+.\" .Xr maclabel 7 ) .
 .It Cm media Ar type
 If the driver supports the media selection system, set the media type
 of the interface to
@@ -318,18 +330,18 @@
 of each other, so setting one may also set the other.
 The driver will offload as much checksum work as it can reliably
 support, the exact level of offloading varies between drivers.
-.\".It Fl rxcsum , Fl txcsum
-.\"If the driver supports user-configurable checksum offloading,
-.\"disable receive (or transmit) checksum offloading on the interface.
-.\"These settings may not always be independent of each other.
-.\".It Cm polling
-.\"If the driver has user-configurable
-.\".Xr polling 4
-.\"support, select the polling mode on the interface.
-.\".It Fl polling
-.\"If the driver has user-configurable
-.\".Xr polling 4
-.\"support, select the interrupt mode on the interface.
+.It Fl rxcsum , txcsum
+If the driver supports user-configurable checksum offloading,
+disable receive (or transmit) checksum offloading on the interface.
+These settings may not always be independent of each other.
+.It Cm polling
+If the driver has user-configurable
+.Xr polling 4
+support, select the polling mode on the interface.
+.It Fl polling
+If the driver has user-configurable
+.Xr polling 4
+support, select the interrupt mode on the interface.
 .It Cm tunnel Ar src_addr dest_addr
 (IP tunnel devices only.)
 Configure the physical source and destination address for IP tunnel
@@ -350,7 +362,10 @@
 If the interface is given without a unit number, try to create a new
 device with an arbitrary unit number.
 If creation of an arbitrary device is successful, the new device name is
-printed to standard output.
+printed to standard output unless the interface is renamed or destroyed
+in the same
+.Nm
+invocation.
 .It Cm destroy
 Destroy the specified network pseudo-device.
 .It Cm plumb
@@ -446,7 +461,7 @@
 not on a
 .Xr vlan 4
 interface itself.
-.It Fl vlanmtu , Fl vlanhwtag
+.It Fl vlanmtu , vlanhwtag
 If the driver offers user-configurable VLAN support, disable
 reception of extended frames or tag processing in hardware,
 respectively.
@@ -568,13 +583,13 @@
 .It Fl link Op Cm 0 No - Cm 2
 .Sm on
 Disable special processing at the link level with the specified interface.
-.\".It Cm monitor
-.\"Put the interface in monitor mode.
-.\"No packets are transmitted, and received packets are discarded after
-.\".Xr bpf 4
-.\"processing.
-.\".It Fl monitor
-.\"Take the interface out of monitor mode.
+.It Cm monitor
+Put the interface in monitor mode.
+No packets are transmitted, and received packets are discarded after
+.Xr bpf 4
+processing.
+.It Fl monitor
+Take the interface out of monitor mode.
 .It Cm up
 Mark an interface
 .Dq up .
@@ -583,64 +598,104 @@
 It happens automatically when setting the first address on an interface.
 If the interface was reset when previously marked down,
 the hardware will be re-initialized.
-.It Cm ssid Ar ssid
-For IEEE 802.11 wireless interfaces, set the desired Service Set
-Identifier (aka network name).
-The SSID is a string up to 32 characters
-in length and may be specified as either a normal string or in
-hexadecimal when proceeded by
-.Ql 0x .
-Additionally, the SSID may be cleared by setting it to
-.Ql - .
-.It Cm nwid Ar ssid
-Another name for the
-.Cm ssid
-parameter.
-Included for
-.Nx
-compatibility.
-.It Cm stationname Ar name
-For IEEE 802.11 wireless interfaces, set the name of this station.
-It appears that the station name is not really part of the IEEE 802.11
-protocol though all interfaces seem to support it.
-As such it only
-seems to be meaningful to identical or virtually identical equipment.
-Setting the station name is identical in syntax to setting the SSID.
-.It Cm station Ar name
-Another name for the
-.Cm stationname
-parameter.
-Included for
-.Bsx
-compatibility.
-.It Cm channel Ar number
-For IEEE 802.11 wireless interfaces, set the desired channel.
-Channels range from 1 to 14, but the exact selection available
-depends on the region your adaptor was manufactured for.
-Setting
-the channel to 0 will give you the default for your adaptor.
-Many
-adaptors ignore this setting unless you are in ad-hoc mode.
+.El
+.Pp
+The following parameters are specific to IEEE 802.11 wireless interfaces:
+.Bl -tag -width indent
+.It Cm apbridge
+When operating as an access point, pass packets between
+wireless clients directly (default).
+To instead let them pass up through the
+system and be forwarded using some other mechanism, use
+.Fl apbridge .
+Disabling the internal bridging
+is useful when traffic is to be processed with
+packet filtering.
 .It Cm authmode Ar mode
-For IEEE 802.11 wireless interfaces, set the desired authentication mode
-in infrastructure mode.
+Set the desired authentication mode in infrastructure mode.
 Not all adaptors support all modes.
 The set of
 valid modes is
 .Dq Li none ,
 .Dq Li open ,
+.Dq Li shared
+(shared key),
+.Dq Li 8021x
+(IEEE 802.1x),
+or
+.Dq Li wpa
+(IEEE WPA/WPA2/802.11i).
+The
+.Dq Li 8021x
 and
-.Dq Li shared .
+.Dq Li wpa
+modes are only useful when used an authentication service
+(a supplicant for client operation or an authenticator when
+operating as an access point).
 Modes are case insensitive.
+.It Cm bssid Ar address
+Specify the MAC address of the access point to use when operating
+as a station in a BSS network.
+This overrides any automatic selection done by the system.
+To disable a previously selected access point, supply
+.Dq Li any ,
+.Dq Li none ,
+or
+.Dq Li -
+for the address.
+This option is useful when more than one access points have the same SSID.
+Another name for the
+.Cm bssid
+parameter is
+.Cm ap .
+.It Cm chanlist Ar channels
+Set the desired channels to use when scanning for access
+points, neighbors in an IBSS network, or looking for unoccupied
+channels when operating as an access point.
+The set of channels is specified as a comma-separated list with
+each element in the list representing either a single channel number or a range
+of the form
+.Dq Li a-b .
+Channel numbers must be in the range 1 to 255 and be permissible
+according to the operating characteristics of the device.
+.It Cm channel Ar number
+Set a single desired channel.
+Channels range from 1 to 255, but the exact selection available
+depends on the region your adaptor was manufactured for.
+Setting
+the channel to
+.Dq Li 0 ,
+.Dq Li any ,
+or
+.Dq Li -
+will give you the default for your adaptor.
+Many
+adaptors ignore this setting unless you are in ad-hoc mode.
+Alternatively the frequency, in megahertz, may be specified
+instead of the channel number.
+.It Cm hidessid
+When operating as an access point, do not broadcast the SSID
+in beacon frames.
+By default, the SSID is included in beacon frames.
+To re-enable the broadcast of the SSID, use
+.Fl hidessid .
 .It Cm powersave
-For IEEE 802.11 wireless interfaces, enable powersave mode.
-.It Fl powersave
-For IEEE 802.11 wireless interfaces, disable powersave mode.
+Enable powersave operation.
+When operating as a client, the station will conserve power by
+periodically turning off the radio and listening for
+messages from the access point telling it there are packets waiting.
+The station must then retrieve the packets.
+When operating as an access point, the station must honor power
+save operation of associated clients.
+Not all devices support power save operation, either as a client
+or as an access point.
+Use
+.Fl powersave
+to disable powersave operation.
 .It Cm powersavesleep Ar sleep
-For IEEE 802.11 wireless interfaces, set the desired max powersave sleep
-time in milliseconds.
+Set the desired max powersave sleep time in milliseconds.
 .It Cm protmode Ar technique
-For IEEE 802.11 wireless interfaces operating in 11g, use the specified
+For interfaces operating in 802.11g, use the specified
 .Ar technique
 for protecting OFDM frames in a mixed 11b/11g network.
 The set of valid techniques is
@@ -651,8 +706,26 @@
 .Dq Li rtscts
 (RTS/CTS).
 Technique names are case insensitive.
+.It Cm roaming Ar mode
+When operating as a station, control how the system will
+behave when communication with the current access point
+is broken.
+The
+.Ar mode
+argument may be one of
+.Dq Li device
+(leave it to the hardware device to decide),
+.Dq Li auto
+(handle either in the device or the operating system\[em]as appropriate),
+.Dq Li manual
+(do nothing until explicitly instructed).
+By default, the device is left to handle this if it is
+capable; otherwise, the operating system will automatically
+attempt to reestablish communication.
+Manual mode is mostly useful when an application wants to
+control the selection of an access point.
 .It Cm rtsthreshold Ar length
-For IEEE 802.11 wireless interfaces, set the threshold for which
+Set the threshold for which
 transmitted frames are preceded by transmission of an
 RTS
 control frame.
@@ -661,8 +734,26 @@
 argument
 is the frame size in bytes and must be in the range 1 to 2312.
 Not all adaptors support setting the RTS threshold.
+.It Cm ssid Ar ssid
+Set the desired Service Set Identifier (aka network name).
+The SSID is a string up to 32 characters
+in length and may be specified as either a normal string or in
+hexadecimal when proceeded by
+.Ql 0x .
+Additionally, the SSID may be cleared by setting it to
+.Ql - .
+.It Cm scan
+Display the current set of scanned neighbors and/or trigger a new scan.
+Only the super-user can trigger a scan.
+.It Cm stationname Ar name
+Set the name of this station.
+It appears that the station name is not really part of the IEEE 802.11
+protocol though all interfaces seem to support it.
+As such it only
+seems to be meaningful to identical or virtually identical equipment.
+Setting the station name is identical in syntax to setting the SSID.
 .It Cm txpower Ar power
-For IEEE 802.11 wireless interfaces, set the power used to transmit frames.
+Set the power used to transmit frames.
 The
 .Ar power
 argument
@@ -673,7 +764,7 @@
 the driver will use the setting closest to the specified value.
 Not all adaptors support changing the transmit power.
 .It Cm wepmode Ar mode
-For IEEE 802.11 wireless interfaces, set the desired WEP mode.
+Set the desired WEP mode.
 Not all adaptors support all modes.
 The set of valid modes is
 .Dq Li off ,
@@ -693,10 +784,9 @@
 .Dq Li mixed .
 Modes are case insensitive.
 .It Cm weptxkey Ar index
-For IEEE 802.11 wireless interfaces, set the WEP key to be used for
-transmission.
+Set the WEP key to be used for transmission.
 .It Cm wepkey Ar key Ns | Ns Ar index : Ns Ar key
-For IEEE 802.11 wireless interfaces, set the selected WEP key.
+Set the selected WEP key.
 If an
 .Ar index
 is not given, key 1 is set.
@@ -719,6 +809,31 @@
 If that is the case, then the first four keys
 (1-4) will be the standard temporary keys and any others will be adaptor
 specific keys such as permanent keys stored in NVRAM.
+.It Cm wme
+Enable Wireless Media Extensions (WME) support, if available,
+for the specified interface.
+WME is a subset of the IEEE 802.11e standard to support the
+efficient communication of realtime and multimedia data.
+To disable WME support, use
+.Fl wme .
+.El
+.Pp
+The following parameters are support for compatibility with other systems:
+.Bl -tag -width indent
+.It Cm nwid Ar ssid
+Another name for the
+.Cm ssid
+parameter.
+Included for
+.Nx
+compatibility.
+.It Cm station Ar name
+Another name for the
+.Cm stationname
+parameter.
+Included for
+.Bsx
+compatibility.
 .It Cm wep
 Another way of saying
 .Cm wepmode on .
@@ -733,9 +848,7 @@
 compatibility.
 .It Cm nwkey key
 Another way of saying:
-.Pp
 .Dq Li "wepmode on weptxkey 1 wepkey 1:key wepkey 2:- wepkey 3:- wepkey 4:-" .
-.Pp
 Included for
 .Nx
 compatibility.
@@ -745,16 +858,13 @@
 .Sm on
 .Xc
 Another way of saying
-.Pp
 .Dq Li "wepmode on weptxkey n wepkey 1:k1 wepkey 2:k2 wepkey 3:k3 wepkey 4:k4" .
-.Pp
 Included for
 .Nx
 compatibility.
 .It Fl nwkey
 Another way of saying
 .Cm wepmode off .
-.Pp
 Included for
 .Nx
 compatibility.
@@ -768,9 +878,6 @@
 .Nm
 will report only the details specific to that protocol family.
 .Pp
-If the driver does supports the media selection system, the supported
-media list will be included in the output.
-.Pp
 If the
 .Fl m
 flag is passed before an interface name,
@@ -810,6 +917,10 @@
 (only list interfaces that are up).
 .Pp
 The
+.Fl v
+flag may be used to get more verbose status for an interface.
+.Pp
+The
 .Fl C
 flag may be used to list all of the interface cloners available on
 the system, with no additional information.
@@ -823,22 +934,10 @@
 Messages indicating the specified interface does not exist, the
 requested address is unknown, or the user is not privileged and
 tried to alter an interface's configuration.
-.Sh BUGS
-Basic IPv6 node operation requires a link-local address on each
-interface configured for IPv6.
-Normally, such an address is automatically configured by the
-kernel on each interface added to the system; this behaviour may
-be disabled by setting the sysctl MIB variable
-.Va net.inet6.ip6.auto_linklocal
-to 0.
-.Pp
-If you delete such an address using
-.Nm ,
-the kernel may act very oddly.
-Do this at your own risk.
 .Sh SEE ALSO
 .Xr netstat 1 ,
 .Xr netintro 4 ,
+.Xr polling 4 ,
 .Xr vlan 4 ,
 .\" .Xr eon 5 ,
 .Xr rc 8 ,
@@ -849,3 +948,16 @@
 .Nm
 utility appeared in
 .Bx 4.2 .
+.Sh BUGS
+Basic IPv6 node operation requires a link-local address on each
+interface configured for IPv6.
+Normally, such an address is automatically configured by the
+kernel on each interface added to the system; this behaviour may
+be disabled by setting the sysctl MIB variable
+.Va net.inet6.ip6.auto_linklocal
+to 0.
+.Pp
+If you delete such an address using
+.Nm ,
+the kernel may act very oddly.
+Do this at your own risk.
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.c src/sbin/ifconfig/ifconfig.c
--- src.preview/sbin/ifconfig/ifconfig.c	2005-05-26 05:06:40.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.c	2005-09-27 15:03:42.000000000 -0400
@@ -25,17 +25,25 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * @(#) Copyright (c) 1983, 1993 The Regents of the University of California.  All rights reserved.
- * @(#)ifconfig.c	8.2 (Berkeley) 2/16/94
- * $FreeBSD: src/sbin/ifconfig/ifconfig.c,v 1.96 2004/02/27 06:43:14 kan Exp $
- * $DragonFly: src/sbin/ifconfig/ifconfig.c,v 1.24 2005/05/26 09:06:40 dillon Exp $
  */
 
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1983, 1993\n\
+	The Regents of the University of California.  All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ifconfig.c	8.2 (Berkeley) 2/16/94";
+#endif
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
-#include <sys/sockio.h>
 #include <sys/sysctl.h>
 #include <sys/time.h>
 #include <sys/module.h>
@@ -54,30 +62,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 
-#ifdef INET6
-#include <netinet6/nd6.h>	/* Define ND6_INFINITE_LIFETIME */
-#endif
-
-#ifndef NO_IPX
-/* IPX */
-#define	IPXIP
-#define IPTUNNEL
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#endif
-
-/* Appletalk */
-#include <netatalk/at.h>
-
-/* XNS */
-#ifdef NS
-#define	NSIP
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-/* OSI */
-
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
@@ -86,34 +70,15 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <ifaddrs.h>
 
 #include "ifconfig.h"
 
-/* wrapper for KAME-special getnameinfo() */
-#ifndef NI_WITHSCOPEID
-#define	NI_WITHSCOPEID	0
-#endif
-
 /*
  * Since "struct ifreq" is composed of various union members, callers
  * should pay special attention to interprete the value.
  * (.e.g. little/big endian difference in the structure.)
  */
-struct	ifreq		ifr, ridreq;
-struct	ifaliasreq	addreq;
-#ifdef INET6
-struct	in6_ifreq	in6_ridreq;
-struct	in6_aliasreq	in6_addreq = 
-  { { 0 }, 
-    { 0, 0, 0, 0, { { { 0 } } }, 0 }, 
-    { 0, 0, 0, 0, { { { 0 } } }, 0 }, 
-    { 0, 0, 0, 0, { { { 0 } } }, 0 }, 
-    0, 
-    { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME } };
-#endif
-struct	sockaddr_in	netmask;
-struct	netrange	at_nr;		/* AppleTalk net range */
+struct	ifreq ifr;
 
 char	name[IFNAMSIZ];
 int	flags;
@@ -123,326 +88,78 @@
 int	doalias;
 int	clearaddr;
 int	newaddr = 1;
-#ifdef INET6
-static	int ip6lifetime;
-#endif
+int	verbose;
 
-struct	afswtch;
+int	supmedia = 0;
+int	printname = 0;		/* Print the name of the created interface. */
 
-int supmedia = 0;
-int listcloners = 0;
-int printname = 0;		/* Print the name of the created interface. */
-
-#ifdef INET6
-char	addr_buf[MAXHOSTNAMELEN *2 + 1];	/*for getnameinfo()*/
-#endif
-
-void	Perror(const char *cmd);
-void	checkatrange(struct sockaddr_at *);
-int	ifconfig(int argc, char *const *argv, const struct afswtch *afp);
-void	notealias(const char *, int, int, const struct afswtch *afp);
-void	list_cloners(void);
-void	printb(const char *s, unsigned value, const char *bits);
-void	rt_xaddrs(caddr_t, caddr_t, struct rt_addrinfo *);
-void	status(const struct afswtch *afp, int addrcount,
+static	int ifconfig(int argc, char *const *argv, const struct afswtch *afp);
+static	void status(const struct afswtch *afp, int addrcount,
 		    struct sockaddr_dl *sdl, struct if_msghdr *ifm,
 		    struct ifa_msghdr *ifam);
-void	tunnel_status(int s);
-void	usage(void);
-void	ifmaybeload(char *if_nm);
-
-#ifdef INET6
-void	in6_fillscopeid(struct sockaddr_in6 *sin6);
-int	prefix(void *, int);
-static	char *sec2str(time_t);
-int	explicit_prefix = 0;
-#endif
-
-typedef	void c_func(const char *cmd, int arg, int s, const struct afswtch *afp);
-typedef	void c_func2(const char *arg, const char *arg2, int s, const struct afswtch *afp);
-c_func	setatphase, setatrange;
-c_func	setifaddr, setifbroadaddr, setifdstaddr, setifnetmask;
-c_func2	settunnel;
-c_func	deletetunnel;
-#ifdef INET6
-c_func	setifprefixlen;
-c_func	setip6flags;
-c_func  setip6pltime;
-c_func  setip6vltime;
-c_func2	setip6lifetime;
-c_func	setip6eui64;
-#endif
-c_func	setifipdst;
-c_func	setifflags, setifmetric, setifmtu, setifcap;
-c_func	clone_destroy;
-c_func	setifname;
-
-void clone_create(void);
-
-
-#define	NEXTARG		0xffffff
-#define	NEXTARG2	0xfffffe
-
-const
-struct	cmd {
-	const	char *c_name;
-	int	c_parameter;		/* NEXTARG means next argv */
-	void	(*c_func)(const char *, int, int, const struct afswtch *afp);
-	void	(*c_func2)(const char *, const char *, int, const struct afswtch *afp);
-} cmds[] = {
-	{ "up",		IFF_UP,		setifflags,	NULL },
-	{ "down",	-IFF_UP,	setifflags,	NULL },
-	{ "polling",	IFF_POLLING,	setifflags,	NULL },
-	{ "-polling",	-IFF_POLLING,	setifflags,	NULL },
-	{ "arp",	-IFF_NOARP,	setifflags,	NULL },
-	{ "-arp",	IFF_NOARP,	setifflags,	NULL },
-	{ "debug",	IFF_DEBUG,	setifflags,	NULL },
-	{ "-debug",	-IFF_DEBUG,	setifflags,	NULL },
-	{ "promisc",	IFF_PPROMISC,	setifflags,	NULL },
-	{ "-promisc",	-IFF_PPROMISC,	setifflags,	NULL },
-	{ "add",	IFF_UP,		notealias,	NULL },
-	{ "alias",	IFF_UP,		notealias,	NULL },
-	{ "-alias",	-IFF_UP,	notealias,	NULL },
-	{ "delete",	-IFF_UP,	notealias,	NULL },
-	{ "remove",	-IFF_UP,	notealias,	NULL },
-#ifdef notdef
-#define	EN_SWABIPS	0x1000
-	{ "swabips",	EN_SWABIPS,	setifflags,	NULL },
-	{ "-swabips",	-EN_SWABIPS,	setifflags,	NULL },
-#endif
-	{ "netmask",	NEXTARG,	setifnetmask,	NULL },
-#ifdef INET6
-	{ "prefixlen",	NEXTARG,	setifprefixlen,	NULL },
-	{ "anycast",	IN6_IFF_ANYCAST, setip6flags,	NULL },
-	{ "tentative",	IN6_IFF_TENTATIVE, setip6flags,	NULL },
-	{ "-tentative",	-IN6_IFF_TENTATIVE, setip6flags, NULL },
-	{ "deprecated",	IN6_IFF_DEPRECATED, setip6flags, NULL },
-	{ "-deprecated", -IN6_IFF_DEPRECATED, setip6flags, NULL },
-	{ "autoconf",	IN6_IFF_AUTOCONF, setip6flags,	NULL },
-	{ "-autoconf",	-IN6_IFF_AUTOCONF, setip6flags,	NULL },
-	{ "pltime",     NEXTARG,        setip6pltime,	NULL },
-	{ "vltime",     NEXTARG,        setip6vltime,	NULL },
-	{ "eui64",	0,		setip6eui64,	NULL },
-#endif
-	{ "range",	NEXTARG,	setatrange,	NULL },
-	{ "phase",	NEXTARG,	setatphase,	NULL },
-	{ "metric",	NEXTARG,	setifmetric,	NULL },
-	{ "broadcast",	NEXTARG,	setifbroadaddr,	NULL },
-	{ "ipdst",	NEXTARG,	setifipdst,	NULL },
-	{ "tunnel",	NEXTARG2,	NULL,		settunnel },
-	{ "deletetunnel", 0,		deletetunnel,	NULL },
-	{ "link0",	IFF_LINK0,	setifflags,	NULL },
-	{ "-link0",	-IFF_LINK0,	setifflags,	NULL },
-	{ "link1",	IFF_LINK1,	setifflags,	NULL },
-	{ "-link1",	-IFF_LINK1,	setifflags,	NULL },
-	{ "link2",	IFF_LINK2,	setifflags,	NULL },
-	{ "-link2",	-IFF_LINK2,	setifflags,	NULL },
-#if notyet
-	{ "monitor",	IFF_MONITOR,	setifflags,	NULL },
-	{ "-monitor",	-IFF_MONITOR,	setifflags,	NULL },
-	{ "staticarp",	IFF_STATICARP,	setifflags,	NULL },
-	{ "-staticarp",	-IFF_STATICARP,	setifflags,	NULL },
-#endif
+static	void tunnel_status(int s);
+static	void usage(void);
 
-#ifdef USE_IF_MEDIA
-	{ "media",	NEXTARG,	setmedia,	NULL },
-	{ "mode",	NEXTARG,	setmediamode,	NULL },
-	{ "mediaopt",	NEXTARG,	setmediaopt,	NULL },
-	{ "-mediaopt",	NEXTARG,	unsetmediaopt,	NULL },
-#endif
-#ifdef USE_VLANS
-	{ "vlan",	NEXTARG,	setvlantag,	NULL },
-	{ "vlandev",	NEXTARG,	setvlandev,	NULL },
-	{ "-vlandev",	NEXTARG,	unsetvlandev,	NULL },
-#endif
-#if 0
-	/* XXX `create' special-cased below */
-	{"create",	0,		clone_create,	NULL },
-	{"plumb",	0,		clone_create,	NULL },
-#endif
-	{"destroy",	0,		clone_destroy,	NULL },
-	{"unplumb",	0,		clone_destroy,	NULL },
-#ifdef USE_IEEE80211
-	{ "ssid",	NEXTARG,	set80211ssid,	NULL },
-	{ "nwid",	NEXTARG,	set80211ssid,	NULL },
-	{ "stationname", NEXTARG,	set80211stationname,	NULL },
-	{ "station",	NEXTARG,	set80211stationname,	NULL },	/* BSD/OS */
-	{ "channel",	NEXTARG,	set80211channel,	NULL },
-	{ "authmode",	NEXTARG,	set80211authmode,	NULL },
-	{ "powersavemode", NEXTARG,	set80211powersavemode,	NULL },
-	{ "powersave",	1,		set80211powersave,	NULL },
-	{ "-powersave",	0,		set80211powersave,	NULL },
-	{ "powersavesleep", NEXTARG,	set80211powersavesleep,	NULL },
-	{ "wepmode",	NEXTARG,	set80211wepmode,	NULL },
-	{ "wep",	1,		set80211wep,	NULL },
-	{ "-wep",	0,		set80211wep,	NULL },
-	{ "weptxkey",	NEXTARG,	set80211weptxkey,	NULL },
-	{ "wepkey",	NEXTARG,	set80211wepkey,	NULL },
-	{ "nwkey",	NEXTARG,	set80211nwkey,	NULL },	/* NetBSD */
-	{ "-nwkey",	0,		set80211wep,	NULL },		/* NetBSD */
-	{ "rtsthreshold",NEXTARG,	set80211rtsthreshold,	NULL },
-	{ "protmode",	NEXTARG,	set80211protmode,	NULL },
-	{ "txpower",	NEXTARG,	set80211txpower,	NULL },
-#endif
-	{ "rxcsum",	IFCAP_RXCSUM,	setifcap,	NULL },
-	{ "-rxcsum",	-IFCAP_RXCSUM,	setifcap,	NULL },
-	{ "txcsum",	IFCAP_TXCSUM,	setifcap,	NULL },
-	{ "-txcsum",	-IFCAP_TXCSUM,	setifcap,	NULL },
-	{ "netcons",	IFCAP_NETCONS,	setifcap,	NULL },
-	{ "-netcons",	-IFCAP_NETCONS,	setifcap,	NULL },
-	{ "vlanmtu",	IFCAP_VLAN_MTU,		setifcap,	NULL },
-	{ "-vlanmtu",	-IFCAP_VLAN_MTU,	setifcap,	NULL },
-	{ "vlanhwtag",	IFCAP_VLAN_HWTAGGING,	setifcap,	NULL },
-	{ "-vlanhwtag",	-IFCAP_VLAN_HWTAGGING,	setifcap,	NULL },
-	{ "normal",	-IFF_LINK0,	setifflags,	NULL },
-	{ "compress",	IFF_LINK0,	setifflags,	NULL },
-	{ "noicmp",	IFF_LINK1,	setifflags,	NULL },
-	{ "mtu",	NEXTARG,	setifmtu,	NULL },
-	{ "name",	NEXTARG,	setifname,	NULL },
-	{ NULL,		0,		setifaddr,	NULL },
-	{ NULL,		0,		setifdstaddr,	NULL },
-};
-
-/*
- * XNS support liberally adapted from code written at the University of
- * Maryland principally by James O'Toole and Chris Torek.
- */
-typedef	void af_status(int, struct rt_addrinfo *);
-typedef	void af_getaddr(const char *, int);
-typedef void af_getprefix(const char *, int);
-
-af_status	in_status, at_status, link_status;
-af_getaddr	in_getaddr, at_getaddr, link_getaddr;
-
-#ifndef NO_IPX
-af_status	ipx_status;
-af_getaddr	ipx_getaddr;
-#endif
+static struct afswtch *af_getbyname(const char *name);
+static struct afswtch *af_getbyfamily(int af);
+static void af_other_status(int);
 
-#ifdef INET6
-af_status	in6_status;
-af_getaddr	in6_getaddr;
-af_getprefix	in6_getprefix;
-#endif /*INET6*/
-#ifdef NS
-af_status	xns_status;
-af_getaddr	xns_getaddr;
-#endif
-
-/* Known address families */
-const
-struct	afswtch {
-	const char *af_name;
-	short af_af;
-	af_status *af_status;
-	af_getaddr *af_getaddr;
-	af_getprefix *af_getprefix;
-	u_long af_difaddr;
-	u_long af_aifaddr;
-	caddr_t af_ridreq;
-	caddr_t af_addreq;
-} afs[] = {
-#define C(x) ((caddr_t) &x)
-	{ "inet", AF_INET, in_status, in_getaddr, NULL,
-	     SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#ifdef INET6
-	{ "inet6", AF_INET6, in6_status, in6_getaddr, in6_getprefix,
-	     SIOCDIFADDR_IN6, SIOCAIFADDR_IN6,
-	     C(in6_ridreq), C(in6_addreq) },
-#endif /*INET6*/
-#ifndef NO_IPX
-	{ "ipx", AF_IPX, ipx_status, ipx_getaddr, NULL,
-	     SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#endif
-	{ "atalk", AF_APPLETALK, at_status, at_getaddr, NULL,
-	     SIOCDIFADDR, SIOCAIFADDR, C(addreq), C(addreq) },
-#ifdef NS
-	{ "ns", AF_NS, xns_status, xns_getaddr, NULL,
-	     SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#endif
-	{ "link", AF_LINK, link_status, link_getaddr, NULL,
-	     0, SIOCSIFLLADDR, NULL, C(ridreq) },
-	{ "ether", AF_LINK, link_status, link_getaddr, NULL,
-	     0, SIOCSIFLLADDR, NULL, C(ridreq) },
-	{ "lladdr", AF_LINK, link_status, link_getaddr, NULL,
-	     0, SIOCSIFLLADDR, NULL, C(ridreq) },
-	{ NULL,	0,	NULL, NULL, NULL,	0, 0,	NULL, NULL }
-};
-
-/*
- * Expand the compacted form of addresses as returned via the
- * configuration read via sysctl().
- */
-
-#define ROUNDUP(a) \
-        ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
+static struct option *opts = NULL;
 
 void
-rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
+opt_register(struct option *p)
 {
-        struct sockaddr *sa;
-        int i;
-
-        memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
-        for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
-                if ((rtinfo->rti_addrs & (1 << i)) == 0)
-                        continue;
-                rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
-                ADVANCE(cp, sa);
-        }
+	p->next = opts;
+	opts = p;
 }
 
-
-void
+static void
 usage(void)
 {
-#ifndef INET6
-	fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
-	"usage: ifconfig interface address_family [address [dest_address]]",
-	"                [parameters]",
-	"       ifconfig -C",
-	"       ifconfig interface create",
-	"       ifconfig -a [-d] [-m] [-u] [address_family]",
-	"       ifconfig -l [-d] [-u] [address_family]",
-	"       ifconfig [-d] [-m] [-u]");
-#else
-	fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
-	"usage: ifconfig [-L] interface address_family [address [dest_address]]",
-	"                [parameters]",
-	"       ifconfig -C",
-	"       ifconfig interface create",
-	"       ifconfig -a [-L] [-d] [-m] [-u] [address_family]",
-	"       ifconfig -l [-d] [-u] [address_family]",
-	"       ifconfig [-L] [-d] [-m] [-u]");
-#endif
+	char options[1024];
+	struct option *p;
+
+	/* XXX not right but close enough for now */
+	options[0] = '\0';
+	for (p = opts; p != NULL; p = p->next) {
+		strlcat(options, p->opt_usage, sizeof(options));
+		strlcat(options, " ", sizeof(options));
+	}
+
+	fprintf(stderr,
+	"usage: ifconfig %sinterface address_family [address [dest_address]]\n"
+	"                [parameters]\n"
+	"       ifconfig interface create\n"
+	"       ifconfig -a %s[-d] [-m] [-u] [-v] [address_family]\n"
+	"       ifconfig -l [-d] [-u] [address_family]\n"
+	"       ifconfig %s[-d] [-m] [-u] [-v]\n",
+		options, options, options);
 	exit(1);
 }
 
 int
-main(int argc, char * const *argv)
+main(int argc, char *argv[])
 {
-	int c;
-	int all, namesonly, downonly, uponly;
+	int c, all, namesonly, downonly, uponly;
 	int need_nl = 0, count = 0;
-	const struct afswtch *afp = 0;
+	const struct afswtch *afp = NULL;
 	int addrcount, ifindex;
-	struct	if_msghdr *ifm, *nextifm;
-	struct	ifa_msghdr *ifam;
-	struct	sockaddr_dl *sdl;
-	char	*buf, *lim, *next;
-
+	struct if_msghdr *ifm, *nextifm;
+	struct ifa_msghdr *ifam;
+	struct sockaddr_dl *sdl;
+	char *buf, *lim, *next;
 	size_t needed;
 	int mib[6];
+	char options[1024];
+	struct option *p;
+
+	all = downonly = uponly = namesonly = verbose = 0;
 
 	/* Parse leading line options */
-	all = downonly = uponly = namesonly = 0;
-	while ((c = getopt(argc, argv, "adlmuC"
-#ifdef INET6
-					"L"
-#endif
-			)) != -1) {
+	strlcpy(options, "adlmuv", sizeof(options));
+	for (p = opts; p != NULL; p = p->next)
+		strlcat(options, p->opt, sizeof(options));
+	while ((c = getopt(argc, argv, options)) != -1) {
 		switch (c) {
 		case 'a':	/* scan all interfaces */
 			all++;
@@ -459,32 +176,23 @@
 		case 'u':	/* restrict scan to "up" interfaces */
 			uponly++;
 			break;
-		case 'C':
-			listcloners = 1;
+		case 'v':
+			verbose++;
 			break;
-#ifdef INET6
-		case 'L':
-			ip6lifetime++;	/* print IPv6 address lifetime */
-			break;
-#endif
 		default:
-			usage();
+			for (p = opts; p != NULL; p = p->next)
+				if (p->opt[0] == c) {
+					p->cb(optarg);
+					break;
+				}
+			if (p == NULL)
+				usage();
 			break;
 		}
 	}
 	argc -= optind;
 	argv += optind;
 
-	if (listcloners) {
-		/* -C must be solitary */
-		if (all || supmedia || uponly || downonly || namesonly ||
-		    argc > 0)
-			usage();
-		
-		list_cloners();
-		exit(0);
-	}
-
 	/* -l cannot be used with -a or -m */
 	if (namesonly && (all || supmedia))
 		usage();
@@ -504,13 +212,11 @@
 
 		ifindex = 0;
 		if (argc == 1) {
-			for (afp = afs; afp->af_name; afp++)
-				if (strcmp(afp->af_name, *argv) == 0) {
-					argc--, argv++;
-					break;
-				}
-			if (afp->af_name == NULL)
+			afp = af_getbyname(*argv);
+			if (afp == NULL)
 				usage();
+			if (afp->af_name != NULL)
+				argc--, argv++;
 			/* leave with afp non-zero */
 		}
 	} else {
@@ -543,13 +249,9 @@
 
 	/* Check for address family */
 	if (argc > 0) {
-		for (afp = afs; afp->af_name; afp++)
-			if (strcmp(afp->af_name, *argv) == 0) {
-				argc--, argv++;
-				break;
-			}
-		if (afp->af_name == NULL)
-			afp = NULL;	/* not a family, NULL */
+		afp = af_getbyname(*argv);
+		if (afp != NULL)
+			argc--, argv++;
 	}
 
 retry:
@@ -561,7 +263,7 @@
 	mib[5] = ifindex;		/* interface index */
 
 	/* if particular family specified, only ask about it */
-	if (afp)
+	if (afp != NULL)
 		mib[3] = afp->af_af;
 
 	if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
@@ -586,10 +288,10 @@
 		
 		if (ifm->ifm_type == RTM_IFINFO) {
 #if  notyet
-			if (ifm->ifm_data.ifi_datalen == 0)
-				ifm->ifm_data.ifi_datalen = sizeof(struct if_data);
-			sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) -
-			     sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
+                        if (ifm->ifm_data.ifi_datalen == 0)
+                                ifm->ifm_data.ifi_datalen = sizeof(struct if_data);
+                        sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) -
+                             sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
 #else
                        sdl = (struct sockaddr_dl *)(ifm + 1);
 #endif
@@ -627,14 +329,6 @@
 		    sizeof(name)-1 : sdl->sdl_nlen] = '\0';
 
 		if (all || namesonly) {
-			size_t len;
-
-			/* sdl_data may not be terminated, don't use strlcpy */
-			if ((len = sdl->sdl_nlen) > sizeof(name) - 1)
-				len = sizeof(name) - 1;
-			bcopy(sdl->sdl_data, name, len);
-			name[len] = 0;
-
 			if (uponly)
 				if ((flags & IFF_UP) == 0)
 					continue; /* not up */
@@ -642,9 +336,8 @@
 				if (flags & IFF_UP)
 					continue; /* not down */
 			if (namesonly) {
-				if (afp == NULL ||
-					afp->af_status != link_status ||
-					sdl->sdl_type == IFT_ETHER) {
+				if (afp == NULL || afp->af_af != AF_LINK ||
+				    sdl->sdl_type == IFT_ETHER) {
 					if (need_nl)
 						putchar(' ');
 					fputs(name, stdout);
@@ -670,92 +363,192 @@
 	exit (0);
 }
 
+static struct afswtch *afs = NULL;
 
-int
+void
+af_register(struct afswtch *p)
+{
+	p->af_next = afs;
+	afs = p;
+}
+
+static struct afswtch *
+af_getbyname(const char *name)
+{
+	struct afswtch *afp;
+
+	for (afp = afs; afp !=  NULL; afp = afp->af_next)
+		if (strcmp(afp->af_name, name) == 0)
+			return afp;
+	return NULL;
+}
+
+static struct afswtch *
+af_getbyfamily(int af)
+{
+	struct afswtch *afp;
+
+	for (afp = afs; afp != NULL; afp = afp->af_next)
+		if (afp->af_af == af)
+			return afp;
+	return NULL;
+}
+
+static void
+af_other_status(int s)
+{
+	struct afswtch *afp;
+	uint8_t afmask[howmany(AF_MAX, NBBY)];
+
+	memset(afmask, 0, sizeof(afmask));
+	for (afp = afs; afp != NULL; afp = afp->af_next) {
+		if (afp->af_other_status == NULL)
+			continue;
+		if (afp->af_af != AF_UNSPEC && isset(afmask, afp->af_af))
+			continue;
+		afp->af_other_status(s);
+		setbit(afmask, afp->af_af);
+	}
+}
+
+static void
+af_all_tunnel_status(int s)
+{
+	struct afswtch *afp;
+	uint8_t afmask[howmany(AF_MAX, NBBY)];
+
+	memset(afmask, 0, sizeof(afmask));
+	for (afp = afs; afp != NULL; afp = afp->af_next) {
+		if (afp->af_status_tunnel == NULL)
+			continue;
+		if (afp->af_af != AF_UNSPEC && isset(afmask, afp->af_af))
+			continue;
+		afp->af_status_tunnel(s);
+		setbit(afmask, afp->af_af);
+	}
+}
+
+static struct cmd *cmds = NULL;
+
+void
+cmd_register(struct cmd *p)
+{
+	p->c_next = cmds;
+	cmds = p;
+}
+
+static const struct cmd *
+cmd_lookup(const char *name)
+{
+#define	N(a)	(sizeof(a)/sizeof(a[0]))
+	const struct cmd *p;
+
+	for (p = cmds; p != NULL; p = p->c_next)
+		if (strcmp(name, p->c_name) == 0)
+			return p;
+	return NULL;
+#undef N
+}
+
+struct callback {
+	callback_func *cb_func;
+	void	*cb_arg;
+	struct callback *cb_next;
+};
+static struct callback *callbacks = NULL;
+
+void
+callback_register(callback_func *func, void *arg)
+{
+	struct callback *cb;
+
+	cb = malloc(sizeof(struct callback));
+	if (cb == NULL)
+		errx(1, "unable to allocate memory for callback");
+	cb->cb_func = func;
+	cb->cb_arg = arg;
+	cb->cb_next = callbacks;
+	callbacks = cb;
+}
+
+/* specially-handled commands */
+static void setifaddr(const char *, int, int, const struct afswtch *);
+static const struct cmd setifaddr_cmd = DEF_CMD("ifaddr", 0, setifaddr);
+
+static void setifdstaddr(const char *, int, int, const struct afswtch *);
+static const struct cmd setifdstaddr_cmd =
+	DEF_CMD("ifdstaddr", 0, setifdstaddr);
+
+static int
 ifconfig(int argc, char *const *argv, const struct afswtch *afp)
 {
+	struct callback *cb;
 	int s;
 
 	if (afp == NULL)
-		afp = &afs[0];
-	ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
+		afp = af_getbyname("inet");
+	ifr.ifr_addr.sa_family =
+		afp->af_af == AF_LINK || afp->af_af == AF_UNSPEC ?
+		AF_INET : afp->af_af;
 	strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
 
 	if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-		err(1, "socket");
+		err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
 
 	while (argc > 0) {
 		const struct cmd *p;
 
-		for (p = cmds; p->c_name; p++)
-			if (strcmp(*argv, p->c_name) == 0)
-				break;
-		if (p->c_name == 0 && setaddr)
-			p++;	/* got src, do dst */
-		if (p->c_func || p->c_func2) {
+		p = cmd_lookup(*argv);
+		if (p == NULL) {
+			/*
+			 * Not a recognized command, choose between setting
+			 * the interface address and the dst address.
+			 */
+			p = (setaddr ? &setifdstaddr_cmd : &setifaddr_cmd);
+		}
+		if (p->c_u.c_func || p->c_u.c_func2) {
 			if (p->c_parameter == NEXTARG) {
 				if (argv[1] == NULL)
 					errx(1, "'%s' requires argument",
 					    p->c_name);
-				(*p->c_func)(argv[1], 0, s, afp);
+				p->c_u.c_func(argv[1], 0, s, afp);
 				argc--, argv++;
+			} else if (p->c_parameter == OPTARG) {
+				p->c_u.c_func(argv[1], 0, s, afp);
+				if (argv[1] != NULL)
+					argc--, argv++;
 			} else if (p->c_parameter == NEXTARG2) {
 				if (argc < 3)
 					errx(1, "'%s' requires 2 arguments",
 					    p->c_name);
-				(*p->c_func2)(argv[1], argv[2], s, afp);
+				p->c_u.c_func2(argv[1], argv[2], s, afp);
 				argc -= 2, argv += 2;
 			} else
-				(*p->c_func)(*argv, p->c_parameter, s, afp);
+				p->c_u.c_func(*argv, p->c_parameter, s, afp);
 		}
 		argc--, argv++;
 	}
-#ifdef INET6
-	if (ifr.ifr_addr.sa_family == AF_INET6 && explicit_prefix == 0) {
-		/* Aggregatable address architecture defines all prefixes
-		   are 64. So, it is convenient to set prefixlen to 64 if
-		   it is not specified. */
-		setifprefixlen("64", 0, s, afp);
-		/* in6_getprefix("64", MASK) if MASK is available here... */
-	}
-#endif
-#ifndef NO_IPX
-	if (setipdst && ifr.ifr_addr.sa_family == AF_IPX) {
-		struct ipxip_req rq;
-		int size = sizeof(rq);
-
-		rq.rq_ipx = addreq.ifra_addr;
-		rq.rq_ip = addreq.ifra_dstaddr;
-
-		if (setsockopt(s, 0, SO_IPXIP_ROUTE, &rq, size) < 0)
-			Perror("Encapsulation Routing");
-	}
-#endif
-	if (ifr.ifr_addr.sa_family == AF_APPLETALK)
-		checkatrange((struct sockaddr_at *) &addreq.ifra_addr);
-#ifdef NS
-	if (setipdst && ifr.ifr_addr.sa_family == AF_NS) {
-		struct nsip_req rq;
-		int size = sizeof(rq);
 
-		rq.rq_ns = addreq.ifra_addr;
-		rq.rq_ip = addreq.ifra_dstaddr;
-
-		if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0)
-			Perror("Encapsulation Routing");
-	}
-#endif
+	/*
+	 * Do any post argument processing required by the address family.
+	 */
+	if (afp->af_postproc != NULL)
+		afp->af_postproc(s, afp);
+	/*
+	 * Do deferred operations.
+	 */
 	if (clearaddr) {
 		if (afp->af_ridreq == NULL || afp->af_difaddr == 0) {
 			warnx("interface %s cannot change %s addresses!",
 			      name, afp->af_name);
-			clearaddr = NULL;
+			clearaddr = 0;
 		}
 	}
 	if (clearaddr) {
 		int ret;
 		strncpy(afp->af_ridreq, name, sizeof ifr.ifr_name);
-		if ((ret = ioctl(s, afp->af_difaddr, afp->af_ridreq)) < 0) {
+		ret = ioctl(s, afp->af_difaddr, afp->af_ridreq);
+		if (ret < 0) {
 			if (errno == EADDRNOTAVAIL && (doalias >= 0)) {
 				/* means no previous address for interface */
 			} else
@@ -774,20 +567,23 @@
 		if (ioctl(s, afp->af_aifaddr, afp->af_addreq) < 0)
 			Perror("ioctl (SIOCAIFADDR)");
 	}
+
+	/*
+	 * Do deferred callbacks registered while processing
+	 * command-line arguments.
+	 */
+	for (cb = callbacks; cb != NULL; cb = cb->cb_next)
+		cb->cb_func(s, cb->cb_arg);
+
 	close(s);
 	return(0);
 }
-#define RIDADDR 0
-#define ADDR	1
-#define MASK	2
-#define DSTADDR	3
 
 /*ARGSUSED*/
-void
-setifaddr(const char *addr, int param __unused, int s __unused,
-	  const struct afswtch *afp)
+static void
+setifaddr(const char *addr, int param, int s, const struct afswtch *afp)
 {
-	if (*afp->af_getaddr == NULL)
+	if (afp->af_getaddr == NULL)
 		return;
 	/*
 	 * Delay the ioctl to set the interface addr until flags are all set.
@@ -797,21 +593,20 @@
 	setaddr++;
 	if (doalias == 0 && afp->af_af != AF_LINK)
 		clearaddr = 1;
-	(*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
+	afp->af_getaddr(addr, (doalias >= 0 ? ADDR : RIDADDR));
 }
 
-void
+static void
 settunnel(const char *src, const char *dst, int s, const struct afswtch *afp)
 {
-	struct addrinfo hints, *srcres, *dstres;
-	struct ifaliasreq addr_req;
+	struct addrinfo *srcres, *dstres;
 	int ecode;
-#ifdef INET6
-	struct in6_aliasreq in6_addr_req; 
-#endif
 
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = afp->af_af;
+	if (afp->af_settunnel == NULL) {
+		warn("address family %s does not support tunnel setup",
+			afp->af_name);
+		return;
+	}
 
 	if ((ecode = getaddrinfo(src, NULL, NULL, &srcres)) != 0)
 		errx(1, "error in parsing address string: %s",
@@ -825,178 +620,58 @@
 		errx(1,
 		    "source and destination address families do not match");
 
-	switch (srcres->ai_addr->sa_family) {
-	case AF_INET:
-		memset(&addr_req, 0, sizeof(addr_req));
-		strncpy(addr_req.ifra_name, name, IFNAMSIZ);
-		memcpy(&addr_req.ifra_addr, srcres->ai_addr,
-		    srcres->ai_addr->sa_len);
-		memcpy(&addr_req.ifra_dstaddr, dstres->ai_addr,
-		    dstres->ai_addr->sa_len);
-
-		if (ioctl(s, SIOCSIFPHYADDR, &addr_req) < 0)
-			warn("SIOCSIFPHYADDR");
-		break;
-
-#ifdef INET6
-	case AF_INET6:
-		memset(&in6_addr_req, 0, sizeof(in6_addr_req));
-		strncpy(in6_addr_req.ifra_name, name, IFNAMSIZ);
-		memcpy(&in6_addr_req.ifra_addr, srcres->ai_addr,
-		    srcres->ai_addr->sa_len);
-		memcpy(&in6_addr_req.ifra_dstaddr, dstres->ai_addr,
-		    dstres->ai_addr->sa_len);
-
-		if (ioctl(s, SIOCSIFPHYADDR_IN6, &in6_addr_req) < 0)
-			warn("SIOCSIFPHYADDR_IN6");
-		break;
-#endif /* INET6 */
-
-	default:
-		warn("address family not supported");
-	}
+	afp->af_settunnel(s, srcres, dstres);
 
 	freeaddrinfo(srcres);
 	freeaddrinfo(dstres);
 }
 
 /* ARGSUSED */
-void
-deletetunnel(const char *vname __unused, int param __unused, int s,
-	     const struct afswtch *afp __unused)
+static void
+deletetunnel(const char *vname, int param, int s, const struct afswtch *afp)
 {
+
 	if (ioctl(s, SIOCDIFPHYADDR, &ifr) < 0)
 		err(1, "SIOCDIFPHYADDR");
 }
 
-void
-setifnetmask(const char *addr, int dummy __unused, int s __unused,
-             const struct afswtch *afp)
-{
-	if (*afp->af_getaddr == NULL)
-		return;
-	setmask++;
-	(*afp->af_getaddr)(addr, MASK);
-}
-
-#ifdef INET6
-void
-setifprefixlen(const char *addr, int dummy __unused, int s __unused,
-               const struct afswtch *afp)
-{
-        if (*afp->af_getprefix)
-                (*afp->af_getprefix)(addr, MASK);
-	explicit_prefix = 1;
-}
-
-void
-setip6flags(const char *dummyaddr __unused, int flag, int dummysoc __unused,
-            const struct afswtch *afp)
-{
-	if (afp->af_af != AF_INET6)
-		err(1, "address flags can be set only for inet6 addresses");
-
-	if (flag < 0)
-		in6_addreq.ifra_flags &= ~(-flag);
-	else
-		in6_addreq.ifra_flags |= flag;
-}
-
-void
-setip6pltime(const char *seconds, int dummy __unused, int s,
-             const struct afswtch *afp)
+static void
+setifnetmask(const char *addr, int dummy __unused, int s,
+    const struct afswtch *afp)
 {
-	setip6lifetime("pltime", seconds, s, afp);
-}
-
-void
-setip6vltime(const char *seconds, int dummy __unused, int s,
-             const struct afswtch *afp)
-{
-	setip6lifetime("vltime", seconds, s, afp);
-}
-
-void
-setip6lifetime(const char *cmd, const char *val, int s __unused,
-               const struct afswtch *afp)
-{
-	time_t newval, t;
-	char *ep;
-
-	t = time(NULL);
-	newval = (time_t)strtoul(val, &ep, 0);
-	if (val == ep)
-		errx(1, "invalid %s", cmd);
-	if (afp->af_af != AF_INET6)
-		errx(1, "%s not allowed for the AF", cmd);
-	if (strcmp(cmd, "vltime") == 0) {
-		in6_addreq.ifra_lifetime.ia6t_expire = t + newval;
-		in6_addreq.ifra_lifetime.ia6t_vltime = newval;
-	} else if (strcmp(cmd, "pltime") == 0) {
-		in6_addreq.ifra_lifetime.ia6t_preferred = t + newval;
-		in6_addreq.ifra_lifetime.ia6t_pltime = newval;
+	if (afp->af_getaddr != NULL) {
+		setmask++;
+		afp->af_getaddr(addr, MASK);
 	}
 }
 
-void
-setip6eui64(const char *cmd, int dummy __unused, int s __unused,
-            const struct afswtch *afp)
+static void
+setifbroadaddr(const char *addr, int dummy __unused, int s,
+    const struct afswtch *afp)
 {
-	struct ifaddrs *ifap, *ifa;
-	const struct sockaddr_in6 *sin6 = NULL;
-	const struct in6_addr *lladdr = NULL;
-	struct in6_addr *in6;
-
-	if (afp->af_af != AF_INET6)
-		errx(EXIT_FAILURE, "%s not allowed for the AF", cmd);
- 	in6 = (struct in6_addr *)&in6_addreq.ifra_addr.sin6_addr;
-	if (memcmp(&in6addr_any.s6_addr[8], &in6->s6_addr[8], 8) != 0)
-		errx(EXIT_FAILURE, "interface index is already filled");
-	if (getifaddrs(&ifap) != 0)
-		err(EXIT_FAILURE, "getifaddrs");
-	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
-		if (ifa->ifa_addr->sa_family == AF_INET6 &&
-		    strcmp(ifa->ifa_name, name) == 0) {
-			sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
-			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
-				lladdr = &sin6->sin6_addr;
-				break;
-			}
-		}
-	}
-	if (!lladdr)
-		errx(EXIT_FAILURE, "could not determine link local address"); 
-
- 	memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8);
-
-	freeifaddrs(ifap);
+	if (afp->af_getaddr != NULL)
+		afp->af_getaddr(addr, DSTADDR);
 }
-#endif
 
-void
-setifbroadaddr(const char *addr, int dummy __unused, int s __unused,
-               const struct afswtch *afp)
+static void
+setifipdst(const char *addr, int dummy __unused, int s,
+    const struct afswtch *afp)
 {
-	if (*afp->af_getaddr == NULL)
-		return;
-	(*afp->af_getaddr)(addr, DSTADDR);
-}
+	const struct afswtch *inet;
 
-void
-setifipdst(const char *addr, int dummy __unused, int s __unused,
-           const struct afswtch *afp __unused)
-{
-	in_getaddr(addr, DSTADDR);
+	inet = af_getbyname("inet");
+	if (inet == NULL)
+		return;
+	inet->af_getaddr(addr, DSTADDR);
 	setipdst++;
 	clearaddr = 0;
 	newaddr = 0;
 }
-#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
 
-void
-notealias(const char *addr __unused, int param, int s __unused,
-	  const struct afswtch *afp)
+static void
+notealias(const char *addr, int param, int s, const struct afswtch *afp)
 {
+#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
 	if (setaddr && doalias == 0 && param < 0)
 		if (afp->af_addreq != NULL && afp->af_ridreq != NULL)
 			bcopy((caddr_t)rqtosa(af_addreq),
@@ -1008,16 +683,16 @@
 		newaddr = 0;
 	} else
 		clearaddr = 0;
+#undef rqtosa
 }
 
 /*ARGSUSED*/
-void
-setifdstaddr(const char *addr, int param __unused, int s __unused,
-             const struct afswtch *afp)
+static void
+setifdstaddr(const char *addr, int param __unused, int s, 
+    const struct afswtch *afp)
 {
-	if (*afp->af_getaddr == NULL)
-		return;
-	(*afp->af_getaddr)(addr, DSTADDR);
+	if (afp->af_getaddr != NULL)
+		afp->af_getaddr(addr, DSTADDR);
 }
 
 /*
@@ -1025,9 +700,8 @@
  * of the ifreq structure, which may confuse other parts of ifconfig.
  * Make a private copy so we can avoid that.
  */
-void
-setifflags(const char *vname, int value, int s,
-	   const struct afswtch *afp __unused)
+static void
+setifflags(const char *vname, int value, int s, const struct afswtch *afp)
 {
 	struct ifreq		my_ifr;
 
@@ -1052,8 +726,7 @@
 }
 
 void
-setifcap(const char *vname, int value, int s,
-	 const struct afswtch *afp __unused)
+setifcap(const char *vname, int value, int s, const struct afswtch *afp)
 {
 
  	if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) < 0) {
@@ -1071,9 +744,9 @@
 		Perror(vname);
 }
 
-void
-setifmetric(const char *val, int dummy __unused, int s,
-            const struct afswtch *afp __unused)
+static void
+setifmetric(const char *val, int dummy __unused, int s, 
+    const struct afswtch *afp)
 {
 	strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
 	ifr.ifr_metric = atoi(val);
@@ -1081,9 +754,9 @@
 		warn("ioctl (set metric)");
 }
 
-void
-setifmtu(const char *val, int dummy __unused, int s,
-	 const struct afswtch *afp __unused)
+static void
+setifmtu(const char *val, int dummy __unused, int s, 
+    const struct afswtch *afp)
 {
 	strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
 	ifr.ifr_mtu = atoi(val);
@@ -1091,14 +764,17 @@
 		warn("ioctl (set mtu)");
 }
 
-void
+static void
 setifname(const char *val, int dummy __unused, int s, 
-	  const struct afswtch *afp __unused)
+    const struct afswtch *afp)
 {
-	char	*newname;
+	char *newname;
 
 	newname = strdup(val);
-	
+	if (newname == NULL) {
+		warn("no memory to set ifname");
+		return;
+	}
 	ifr.ifr_data = newname;
 	if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {
 		warn("ioctl (set name)");
@@ -1106,7 +782,6 @@
 		return;
 	}
 	strlcpy(name, newname, sizeof(name));
-
 	free(newname);
 
 	/*
@@ -1116,38 +791,62 @@
 	printname = 0;
 }
 
+/*
+ * Expand the compacted form of addresses as returned via the
+ * configuration read via sysctl().
+ */
+#define SA_SIZE(sa)                                             \
+	(  (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ?      \
+	sizeof(long)            :                               \
+	1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
+
+static void
+rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
+{
+	struct sockaddr *sa;
+	int i;
+
+	memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
+	for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
+		if ((rtinfo->rti_addrs & (1 << i)) == 0)
+			continue;
+		rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
+		cp += SA_SIZE(sa);
+	}
+}
+
 #define	IFFBITS \
 "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \
 "\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
 "\20MULTICAST\21POLLING\23MONITOR\24STATICARP"
 
 #define	IFCAPBITS \
-"\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING"
+"\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU"
 
 /*
  * Print the status of the interface.  If an address family was
- * specified, show it and it only; otherwise, show them all.
+ * specified, show only it; otherwise, show them all.
  */
-void
-status(const struct afswtch *afp, int addrcount, struct sockaddr_dl *sdl,
-       struct if_msghdr *ifm, struct ifa_msghdr *ifam)
+static void
+status(const struct afswtch *afp, int addrcount, struct	sockaddr_dl *sdl,
+    struct if_msghdr *ifm, struct ifa_msghdr *ifam)
 {
-	const struct afswtch *p = NULL;
 	struct	rt_addrinfo info;
 	int allfamilies, s;
 	struct ifstat ifs;
 
 	if (afp == NULL) {
 		allfamilies = 1;
-		afp = &afs[0];
+		afp = af_getbyname("inet");
 	} else
 		allfamilies = 0;
 
 	ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
-	strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
+	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
 
-	if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-		err(1, "socket");
+	s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);
+	if (s < 0)
+		err(1, "socket(family %u,SOCK_DGRAM)", ifr.ifr_addr.sa_family);
 
 	printf("%s: ", name);
 	printb("flags", flags, IFFBITS);
@@ -1163,8 +862,7 @@
 			putchar('\n');
 		}
 		if (supmedia && ifr.ifr_reqcap != 0) {
-			printf("\tcapability list:\n");
-			printb("\t\t", ifr.ifr_reqcap, IFCAPBITS);
+			printb("\tcapabilities", ifr.ifr_reqcap, IFCAPBITS);
 			putchar('\n');
 		}
 	}
@@ -1172,395 +870,53 @@
 	tunnel_status(s);
 
 	while (addrcount > 0) {
-		
 		info.rti_addrs = ifam->ifam_addrs;
-
 		/* Expand the compacted addresses */
 		rt_xaddrs((char *)(ifam + 1), ifam->ifam_msglen + (char *)ifam,
 			  &info);
 
-		if (!allfamilies) {
-			if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family) {
-				p = afp;
-				(*p->af_status)(s, &info);
-			}
-		} else for (p = afs; p->af_name; p++) {
-			if (p->af_af == info.rti_info[RTAX_IFA]->sa_family)
-				(*p->af_status)(s, &info);
-		}
+		if (allfamilies) {
+			const struct afswtch *p;
+			p = af_getbyfamily(info.rti_info[RTAX_IFA]->sa_family);
+			if (p != NULL)
+				p->af_status(s, &info);
+		} else if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family)
+			afp->af_status(s, &info);
 		addrcount--;
 		ifam = (struct ifa_msghdr *)((char *)ifam + ifam->ifam_msglen);
 	}
-	if (allfamilies || afp->af_status == link_status)
-		link_status(s, (struct rt_addrinfo *)sdl);
-#ifdef USE_IF_MEDIA
-	if (allfamilies || afp->af_status == media_status)
-		media_status(s, NULL);
-#endif
-#ifdef USE_VLANS
-	if (allfamilies || afp->af_status == vlan_status)
-		vlan_status(s, NULL);
-#endif
-#ifdef USE_IEEE80211
-	if (allfamilies || afp->af_status == ieee80211_status)
-		ieee80211_status(s, NULL);
-#endif
-	strncpy(ifs.ifs_name, name, sizeof ifs.ifs_name);
-	if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0) 
-		printf("%s", ifs.ascii);
-
-	if (!allfamilies && !p &&
-#ifdef USE_IF_MEDIA
-	    afp->af_status != media_status &&
-#endif
-	    afp->af_status != link_status
-#ifdef USE_VLANS
-	    && afp->af_status != vlan_status
-#endif
-		)
-		warnx("%s has no %s interface address!", name, afp->af_name);
-
-	close(s);
-	return;
-}
-
-void
-tunnel_status(int s)
-{
-	char psrcaddr[NI_MAXHOST];
-	char pdstaddr[NI_MAXHOST];
-	u_long srccmd, dstcmd;
-	struct ifreq *ifrp;
-	const char *ver = "";
-#ifdef NI_WITHSCOPEID
-	const int niflag = NI_NUMERICHOST | NI_WITHSCOPEID;
-#else
-	const int niflag = NI_NUMERICHOST;
-#endif
-#ifdef INET6
-	struct in6_ifreq in6_ifr;
-	int s6;
-#endif /* INET6 */
-
-	psrcaddr[0] = pdstaddr[0] = '\0';
-
-#ifdef INET6
-	memset(&in6_ifr, 0, sizeof(in6_ifr));
-	strncpy(in6_ifr.ifr_name, name, IFNAMSIZ);
-	s6 = socket(AF_INET6, SOCK_DGRAM, 0);
-	if (s6 < 0) {
-		srccmd = SIOCGIFPSRCADDR;
-		dstcmd = SIOCGIFPDSTADDR;
-		ifrp = &ifr;
-	} else {
-		close(s6);
-		srccmd = SIOCGIFPSRCADDR_IN6;
-		dstcmd = SIOCGIFPDSTADDR_IN6;
-		ifrp = (struct ifreq *)&in6_ifr;
-	}
-#else /* INET6 */
-	srccmd = SIOCGIFPSRCADDR;
-	dstcmd = SIOCGIFPDSTADDR;
-	ifrp = &ifr;
-#endif /* INET6 */
-
-	if (ioctl(s, srccmd, (caddr_t)ifrp) < 0)
-		return;
-#if defined(INET6) && defined(__KAME__) && defined(KAME_SCOPEID)
-	if (ifrp->ifr_addr.sa_family == AF_INET6)
-		in6_fillscopeid((struct sockaddr_in6 *)&ifrp->ifr_addr);
-#endif
-	getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
-	    psrcaddr, sizeof(psrcaddr), 0, 0, niflag);
-#ifdef INET6
-	if (ifrp->ifr_addr.sa_family == AF_INET6)
-		ver = "6";
-#endif
-
-	if (ioctl(s, dstcmd, (caddr_t)ifrp) < 0)
-		return;
-#if defined(INET6) && defined(__KAME__) && defined(KAME_SCOPEID)
-	if (ifrp->ifr_addr.sa_family == AF_INET6)
-		in6_fillscopeid((struct sockaddr_in6 *)&ifrp->ifr_addr);
-#endif
-	getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
-	    pdstaddr, sizeof(pdstaddr), 0, 0, niflag);
-
-	printf("\ttunnel inet%s %s --> %s\n", ver,
-	    psrcaddr, pdstaddr);
-}
-
-void
-in_status(int s __unused, struct rt_addrinfo *info)
-{
-	struct sockaddr_in *addr_in, null_in;
-
-	memset(&null_in, 0, sizeof(null_in));
-
-	addr_in = (struct sockaddr_in *)info->rti_info[RTAX_IFA];
-	printf("\tinet %s ", inet_ntoa(addr_in->sin_addr));
-
-	if (flags & IFF_POINTOPOINT) {
-		/* note RTAX_BRD overlap with IFF_BROADCAST */
-		addr_in = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
-		if (!addr_in)
-			addr_in = &null_in;
-		printf("--> %s ", inet_ntoa(addr_in->sin_addr));
-	}
-
-	addr_in = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK];
-	if (!addr_in)
-		addr_in = &null_in;
-	printf("netmask 0x%lx ",
-	       (unsigned long)ntohl(addr_in->sin_addr.s_addr));
-
-	if (flags & IFF_BROADCAST) {
-		/* note RTAX_BRD overlap with IFF_POINTOPOINT */
-		addr_in = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
-		if (addr_in && addr_in->sin_addr.s_addr != 0)
-			printf("broadcast %s", inet_ntoa(addr_in->sin_addr));
-	}
-	putchar('\n');
-}
-
-#ifdef INET6
-#if defined(__KAME__) && defined(KAME_SCOPEID)
-void
-in6_fillscopeid(struct sockaddr_in6 *sin6 __unused)
-{
-	if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
-		sin6->sin6_scope_id =
-			ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
-		sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
-	}
-}
-#endif /* defined(__KAME__) && defined(KAME_SCOPEID) */
-
-void
-in6_status(int s __unused, struct rt_addrinfo *info)
-{
-	struct sockaddr_in6 *addr_in, null_in;
-	struct in6_ifreq ifr6;
-	int s6;
-	u_int32_t flags6;
-	struct in6_addrlifetime lifetime;
-	time_t t = time(NULL);
-	int error;
-	u_int32_t scopeid;
-
-	memset(&null_in, 0, sizeof(null_in));
-
-	addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_IFA];
-	strncpy(ifr6.ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name));
-	if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
-		perror("ifconfig: socket");
-		return;
-	}
-	ifr6.ifr_addr = *addr_in;
-	if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
-		perror("ifconfig: ioctl(SIOCGIFAFLAG_IN6)");
-		close(s6);
-		return;
-	}
-	flags6 = ifr6.ifr_ifru.ifru_flags6;
-	memset(&lifetime, 0, sizeof(lifetime));
-	ifr6.ifr_addr = *addr_in;
-	if (ioctl(s6, SIOCGIFALIFETIME_IN6, &ifr6) < 0) {
-		perror("ifconfig: ioctl(SIOCGIFALIFETIME_IN6)");
-		close(s6);
-		return;
-	}
-	lifetime = ifr6.ifr_ifru.ifru_lifetime;
-	close(s6);
+	if (allfamilies || afp->af_af == AF_LINK) {
+		const struct afswtch *lafp;
 
-	/* XXX: embedded link local addr check */
-	if (IN6_IS_ADDR_LINKLOCAL(&addr_in->sin6_addr) &&
-	    *(u_short *)&addr_in->sin6_addr.s6_addr[2] != 0) {
-		u_short idx;
-
-		idx = *(u_short *)&addr_in->sin6_addr.s6_addr[2];
-		*(u_short *)&addr_in->sin6_addr.s6_addr[2] = 0;
-		if (addr_in->sin6_scope_id == 0)
-			addr_in->sin6_scope_id = ntohs(idx);
-	}
-	scopeid = addr_in->sin6_scope_id;
-
-	error = getnameinfo((struct sockaddr *)addr_in, addr_in->sin6_len, addr_buf,
-			    sizeof(addr_buf), NULL, 0,
-			    NI_NUMERICHOST|NI_WITHSCOPEID);
-	if (error != 0)
-		inet_ntop(AF_INET6, &addr_in->sin6_addr, addr_buf,
-			  sizeof(addr_buf));
-	printf("\tinet6 %s ", addr_buf);
-
-	if (flags & IFF_POINTOPOINT) {
-		/* note RTAX_BRD overlap with IFF_BROADCAST */
-		addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_BRD];
 		/*
-		 * some of the interfaces do not have valid destination
-		 * address.
+		 * Hack; the link level address is received separately
+		 * from the routing information so any address is not
+		 * handled above.  Cobble together an entry and invoke
+		 * the status method specially.
 		 */
-		if (addr_in && addr_in->sin6_family == AF_INET6) {
-			/* XXX: embedded link local addr check */
-			if (IN6_IS_ADDR_LINKLOCAL(&addr_in->sin6_addr) &&
-			    *(u_short *)&addr_in->sin6_addr.s6_addr[2] != 0) {
-				u_short idx;
-
-				idx = *(u_short *)&addr_in->sin6_addr.s6_addr[2];
-				*(u_short *)&addr_in->sin6_addr.s6_addr[2] = 0;
-				if (addr_in->sin6_scope_id == 0)
-					addr_in->sin6_scope_id = ntohs(idx);
-			}
-
-			error = getnameinfo((struct sockaddr *)addr_in,
-					    addr_in->sin6_len, addr_buf,
-					    sizeof(addr_buf), NULL, 0,
-					    NI_NUMERICHOST|NI_WITHSCOPEID);
-			if (error != 0)
-				inet_ntop(AF_INET6, &addr_in->sin6_addr, addr_buf,
-					  sizeof(addr_buf));
-			printf("--> %s ", addr_buf);
+		lafp = af_getbyname("lladdr");
+		if (lafp != NULL) {
+			info.rti_info[RTAX_IFA] = (struct sockaddr *)sdl;
+			lafp->af_status(s, &info);
 		}
 	}
+	if (allfamilies)
+		af_other_status(s);
+		afp->af_other_status(s);
 
-	addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_NETMASK];
-	if (!addr_in)
-		addr_in = &null_in;
-	printf("prefixlen %d ", prefix(&addr_in->sin6_addr,
-		sizeof(struct in6_addr)));
-
-	if ((flags6 & IN6_IFF_ANYCAST) != 0)
-		printf("anycast ");
-	if ((flags6 & IN6_IFF_TENTATIVE) != 0)
-		printf("tentative ");
-	if ((flags6 & IN6_IFF_DUPLICATED) != 0)
-		printf("duplicated ");
-	if ((flags6 & IN6_IFF_DETACHED) != 0)
-		printf("detached ");
-	if ((flags6 & IN6_IFF_DEPRECATED) != 0)
-		printf("deprecated ");
-	if ((flags6 & IN6_IFF_AUTOCONF) != 0)
-		printf("autoconf ");
-	if ((flags6 & IN6_IFF_TEMPORARY) != 0)
-		printf("temporary ");
-
-        if (scopeid)
-		printf("scopeid 0x%x ", scopeid);
-
-	if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
-		printf("pltime ");
-		if (lifetime.ia6t_preferred) {
-			printf("%s ", lifetime.ia6t_preferred < t
-				? "0" : sec2str(lifetime.ia6t_preferred - t));
-		} else
-			printf("infty ");
-
-		printf("vltime ");
-		if (lifetime.ia6t_expire) {
-			printf("%s ", lifetime.ia6t_expire < t
-				? "0" : sec2str(lifetime.ia6t_expire - t));
-		} else
-			printf("infty ");
-	}
-
-	putchar('\n');
-}
-#endif /*INET6*/
-
-#ifndef NO_IPX
-void
-ipx_status(int s __unused, struct rt_addrinfo *info)
-{
-	struct sockaddr_ipx *sipx, null_sipx;
-
-	memset(&null_sipx, 0, sizeof(null_sipx));
-
-	sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_IFA];
-	printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr));
-
-	if (flags & IFF_POINTOPOINT) {
-		sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_BRD];
-		if (!sipx)
-			sipx = &null_sipx;
-		printf("--> %s ", ipx_ntoa(sipx->sipx_addr));
-	}
-	putchar('\n');
-}
-#endif
-
-void
-at_status(int s __unused, struct rt_addrinfo *info)
-{
-	struct sockaddr_at *sat, null_sat;
-	struct netrange *nr;
-
-	memset(&null_sat, 0, sizeof(null_sat));
-
-	sat = (struct sockaddr_at *)info->rti_info[RTAX_IFA];
-	nr = &sat->sat_range.r_netrange;
-	printf("\tatalk %d.%d range %d-%d phase %d",
-		ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
-		ntohs(nr->nr_firstnet), ntohs(nr->nr_lastnet), nr->nr_phase);
-	if (flags & IFF_POINTOPOINT) {
-		/* note RTAX_BRD overlap with IFF_BROADCAST */
-		sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
-		if (!sat)
-			sat = &null_sat;
-		printf("--> %d.%d",
-			ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
-	}
-	if (flags & IFF_BROADCAST) {
-		/* note RTAX_BRD overlap with IFF_POINTOPOINT */
-		sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
-		if (sat)
-			printf(" broadcast %d.%d",
-				ntohs(sat->sat_addr.s_net),
-				sat->sat_addr.s_node);
-	}
-
-	putchar('\n');
-}
-
-#ifdef NS
-void
-xns_status(int s __unused, struct rt_addrinfo *info)
-{
-	struct sockaddr_ns *sns, null_sns;
-
-	memset(&null_sns, 0, sizeof(null_sns));
-
-	sns = (struct sockaddr_ns *)info->rti_info[RTAX_IFA];
-	printf("\tns %s ", ns_ntoa(sns->sns_addr));
-
-	if (flags & IFF_POINTOPOINT) {
-		sns = (struct sockaddr_ns *)info->rti_info[RTAX_BRD];
-		if (!sns)
-			sns = &null_sns;
-		printf("--> %s ", ns_ntoa(sns->sns_addr));
-	}
+	strncpy(ifs.ifs_name, name, sizeof ifs.ifs_name);
+	if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0) 
+		printf("%s", ifs.ascii);
 
-	putchar('\n');
 	close(s);
+	return;
 }
-#endif
-
 
-void
-link_status(int s __unused, struct rt_addrinfo *info)
+static void
+tunnel_status(int s)
 {
-	struct sockaddr_dl *sdl = (struct sockaddr_dl *)info;
-
-	if (sdl->sdl_alen > 0) {
-		if (sdl->sdl_type == IFT_ETHER &&
-		    sdl->sdl_alen == ETHER_ADDR_LEN)
-			printf("\tether %s\n",
-			    ether_ntoa((struct ether_addr *)LLADDR(sdl)));
-		else {
-			int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
-
-			printf("\tlladdr %s\n", link_ntoa(sdl) + n);
-		}
-	}
+	af_all_tunnel_status(s);
 }
 
 void
@@ -1581,116 +937,6 @@
 	}
 }
 
-#define SIN(x) ((struct sockaddr_in *) &(x))
-struct sockaddr_in *sintab[] = {
-SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
-SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
-
-void
-in_getaddr(const char *s, int which)
-{
-	struct sockaddr_in *addr_in = sintab[which];
-	struct hostent *hp;
-	struct netent *np;
-
-	addr_in->sin_len = sizeof(*addr_in);
-	if (which != MASK)
-		addr_in->sin_family = AF_INET;
-
-	if (which == ADDR) {
-		char *p = NULL;
-
-		if((p = strrchr(s, '/')) != NULL) {
-			/* address is `name/masklen' */
-			int masklen;
-			int ret;
-			struct sockaddr_in *min = sintab[MASK];
-			*p = '\0';
-			ret = sscanf(p+1, "%u", &masklen);
-			if(ret != 1 || (masklen < 0 || masklen > 32)) {
-				*p = '/';
-				errx(1, "%s: bad value", s);
-			}
-			min->sin_len = sizeof(*min);
-			min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) & 
-				              0xffffffff);
-		}
-	}
-
-	if (inet_aton(s, &addr_in->sin_addr))
-		return;
-	if ((hp = gethostbyname(s)) != 0)
-		bcopy(hp->h_addr, (char *)&addr_in->sin_addr, 
-		    MIN((size_t)hp->h_length, sizeof(addr_in->sin_addr)));
-	else if ((np = getnetbyname(s)) != 0)
-		addr_in->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
-	else
-		errx(1, "%s: bad value", s);
-}
-
-#ifdef INET6
-#define	SIN6(x) ((struct sockaddr_in6 *) &(x))
-struct	sockaddr_in6 *sin6tab[] = {
-SIN6(in6_ridreq.ifr_addr), SIN6(in6_addreq.ifra_addr),
-SIN6(in6_addreq.ifra_prefixmask), SIN6(in6_addreq.ifra_dstaddr)};
-
-void
-in6_getaddr(const char *s, int which)
-{
-	struct sockaddr_in6 *addr_in = sin6tab[which];
-	struct addrinfo hints, *res;
-	int error = -1;
-
-	newaddr &= 1;
-
-	addr_in->sin6_len = sizeof(*addr_in);
-	if (which != MASK)
-		addr_in->sin6_family = AF_INET6;
-
-	if (which == ADDR) {
-		char *p = NULL;
-		if((p = strrchr(s, '/')) != NULL) {
-			*p = '\0';
-			in6_getprefix(p + 1, MASK);
-			explicit_prefix = 1;
-		}
-	}
-
-	if (addr_in->sin6_family == AF_INET6) {
-		bzero(&hints, sizeof(struct addrinfo));
-		hints.ai_family = AF_INET6;
-		error = getaddrinfo(s, NULL, &hints, &res);
-	}
-	if (error != 0) {
-		if (inet_pton(AF_INET6, s, &addr_in->sin6_addr) != 1)
-			errx(1, "%s: bad value", s);
-	} else
-		bcopy(res->ai_addr, addr_in, res->ai_addrlen);
-}
-
-void
-in6_getprefix(const char *plen, int which)
-{
-	struct sockaddr_in6 *addr_in = sin6tab[which];
-	u_char *cp;
-	int len = atoi(plen);
-
-	if ((len < 0) || (len > 128))
-		errx(1, "%s: bad value", plen);
-	addr_in->sin6_len = sizeof(*addr_in);
-	if (which != MASK)
-		addr_in->sin6_family = AF_INET6;
-	if ((len == 0) || (len == 128)) {
-		memset(&addr_in->sin6_addr, 0xff, sizeof(struct in6_addr));
-		return;
-	}
-	memset((void *)&addr_in->sin6_addr, 0x00, sizeof(addr_in->sin6_addr));
-	for (cp = (u_char *)&addr_in->sin6_addr; len > 7; len -= 8)
-		*cp++ = 0xff;
-	*cp = 0xff << (8 - len);
-}
-#endif
-
 /*
  * Print a value a la the %b format of the kernel's printf
  */
@@ -1722,200 +968,16 @@
 	}
 }
 
-#ifndef NO_IPX
-#define SIPX(x) ((struct sockaddr_ipx *) &(x))
-struct sockaddr_ipx *sipxtab[] = {
-SIPX(ridreq.ifr_addr), SIPX(addreq.ifra_addr),
-SIPX(addreq.ifra_mask), SIPX(addreq.ifra_broadaddr)};
-
-void
-ipx_getaddr(const char *addr, int which)
-{
-	struct sockaddr_ipx *sipx = sipxtab[which];
-
-	sipx->sipx_family = AF_IPX;
-	sipx->sipx_len = sizeof(*sipx);
-	sipx->sipx_addr = ipx_addr(addr);
-	if (which == MASK)
-		printf("Attempt to set IPX netmask will be ineffectual\n");
-}
-#endif
-
-void
-at_getaddr(const char *addr, int which)
-{
-	struct sockaddr_at *sat = (struct sockaddr_at *) &addreq.ifra_addr;
-	u_int net, node;
-
-	sat->sat_family = AF_APPLETALK;
-	sat->sat_len = sizeof(*sat);
-	if (which == MASK)
-		errx(1, "AppleTalk does not use netmasks");
-	if (sscanf(addr, "%u.%u", &net, &node) != 2
-	    || net > 0xffff || node > 0xfe)
-		errx(1, "%s: illegal address", addr);
-	sat->sat_addr.s_net = htons(net);
-	sat->sat_addr.s_node = node;
-}
-
-void
-link_getaddr(const char *addr, int which)
-{
-	char *temp;
-	struct sockaddr_dl sdl;
-	struct sockaddr *sa = &ridreq.ifr_addr;
-
-	if (which != ADDR)
-		errx(1, "can't set link-level netmask or broadcast");
-	if ((temp = malloc(strlen(addr) + 1)) == NULL)
-		errx(1, "malloc failed");
-	temp[0] = ':';
-	strcpy(temp + 1, addr);
-	sdl.sdl_len = sizeof(sdl);
-	link_addr(temp, &sdl);
-	free(temp);
-	if (sdl.sdl_alen > sizeof(sa->sa_data))
-		errx(1, "malformed link-level address");
-	sa->sa_family = AF_LINK;
-	sa->sa_len = sdl.sdl_alen;
-	bcopy(LLADDR(&sdl), sa->sa_data, sdl.sdl_alen);
-}
-
-/* XXX  FIXME -- should use strtoul for better parsing. */
-void
-setatrange(const char *range, int dummy __unused, int s __unused,
-           const struct afswtch *afp __unused)
-{
-	u_int	first = 123, last = 123;
-
-	if (sscanf(range, "%u-%u", &first, &last) != 2
-	    || first == 0 || first > 0xffff
-	    || last == 0 || last > 0xffff || first > last)
-		errx(1, "%s: illegal net range: %u-%u", range, first, last);
-	at_nr.nr_firstnet = htons(first);
-	at_nr.nr_lastnet = htons(last);
-}
-
-void
-setatphase(const char *phase, int dummy __unused, int s __unused,
-           const struct afswtch *afp __unused)
-{
-	if (!strcmp(phase, "1"))
-		at_nr.nr_phase = 1;
-	else if (!strcmp(phase, "2"))
-		at_nr.nr_phase = 2;
-	else
-		errx(1, "%s: illegal phase", phase);
-}
-
-void
-checkatrange(struct sockaddr_at *sat)
-{
-	if (at_nr.nr_phase == 0)
-		at_nr.nr_phase = 2;	/* Default phase 2 */
-	if (at_nr.nr_firstnet == 0)
-		at_nr.nr_firstnet =	/* Default range of one */
-		at_nr.nr_lastnet = sat->sat_addr.s_net;
-printf("\tatalk %d.%d range %d-%d phase %d\n",
-	ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
-	ntohs(at_nr.nr_firstnet), ntohs(at_nr.nr_lastnet), at_nr.nr_phase);
-	if ((u_short) ntohs(at_nr.nr_firstnet) >
-			(u_short) ntohs(sat->sat_addr.s_net)
-		    || (u_short) ntohs(at_nr.nr_lastnet) <
-			(u_short) ntohs(sat->sat_addr.s_net))
-		errx(1, "AppleTalk address is not in range");
-	sat->sat_range.r_netrange = at_nr;
-}
-
-#ifdef NS
-#define SNS(x) ((struct sockaddr_ns *) &(x))
-struct sockaddr_ns *snstab[] = {
-SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
-SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
-
-void
-xns_getaddr(const char *addr, int which)
-{
-	struct sockaddr_ns *sns = snstab[which];
-
-	sns->sns_family = AF_NS;
-	sns->sns_len = sizeof(*sns);
-	sns->sns_addr = ns_addr(addr);
-	if (which == MASK)
-		printf("Attempt to set XNS netmask will be ineffectual\n");
-}
-#endif
-
-#ifdef INET6
-int
-prefix(void *val, int size)
-{
-	u_char *addr = (u_char *)val;
-	int byte, bit, plen = 0;
-
-        for (byte = 0; byte < size; byte++, plen += 8)
-		if (addr[byte] != 0xff)
-                        break;
-	if (byte == size)
-		return (plen);
-	for (bit = 7; bit != 0; bit--, plen++)
-                if (!(addr[byte] & (1 << bit)))
-                        break;
-        for (; bit != 0; bit--)
-                if (addr[byte] & (1 << bit))
-                        return(0);
-        byte++;
-        for (; byte < size; byte++)
-                if (addr[byte])
-                        return(0);
-        return (plen);
-}
-
-static char *
-sec2str(time_t total)
-{
-	static char result[256];
-	int days, hours, mins, secs;
-	int first = 1;
-	char *p = result;
-
-	if (0) {
-		days = total / 3600 / 24;
-		hours = (total / 3600) % 24;
-		mins = (total / 60) % 60;
-		secs = total % 60;
-
-		if (days) {
-			first = 0;
-			p += sprintf(p, "%dd", days);
-		}
-		if (!first || hours) {
-			first = 0;
-			p += sprintf(p, "%dh", hours);
-		}
-		if (!first || mins) {
-			first = 0;
-			p += sprintf(p, "%dm", mins);
-		}
-		sprintf(p, "%ds", secs);
-	} else
-		sprintf(result, "%lu", (unsigned long)total);
-
-	return(result);
-}
-#endif /*INET6*/
-
 void
-ifmaybeload(char *if_nm)
+ifmaybeload(char *name)
 {
 	struct module_stat mstat;
 	int fileid, modid;
 	char ifkind[35], *cp, *dp;
 
-
 	/* turn interface and unit into module name */
 	strcpy(ifkind, "if_");
-	for (cp = if_nm, dp = ifkind + 3;
+	for (cp = name, dp = ifkind + 3;
 	    (*cp != 0) && !isdigit(*cp); cp++, dp++)
 		*dp = *cp;
 	*dp = 0;
@@ -1935,8 +997,8 @@
 				cp = mstat.name;
 			}
 			/* already loaded? */
-			if (strncmp(if_nm, cp, strlen(cp)) == 0 ||
-				strncmp(ifkind, cp, strlen(cp)) == 0)
+			if (strncmp(name, cp, strlen(cp)) == 0 ||
+			    strncmp(ifkind, cp, strlen(cp)) == 0)
 				return;
 		}
 	}
@@ -1945,87 +1007,61 @@
 	kldload(ifkind);
 }
 
-void
-list_cloners(void)
-{
-	struct if_clonereq ifcr;
-	char *cp, *buf;
-	int idx;
-	int s;
-
-	s = socket(AF_INET, SOCK_DGRAM, 0);
-	if (s == -1)
-		err(1, "socket");
-
-	memset(&ifcr, 0, sizeof(ifcr));
-
-	if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
-		err(1, "SIOCIFGCLONERS for count");
-
-	buf = malloc(ifcr.ifcr_total * IFNAMSIZ);
-	if (buf == NULL)
-		err(1, "unable to allocate cloner name buffer");
-
-	ifcr.ifcr_count = ifcr.ifcr_total;
-	ifcr.ifcr_buffer = buf;
-
-	if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
-		err(1, "SIOCIFGCLONERS for names");
-
-	/*
-	 * In case some disappeared in the mean time, clamp it down.
-	 */
-	if (ifcr.ifcr_count > ifcr.ifcr_total)
-		ifcr.ifcr_count = ifcr.ifcr_total;
-
-	for (cp = buf, idx = 0; idx < ifcr.ifcr_count; idx++, cp += IFNAMSIZ) {
-		if (idx > 0)
-			putchar(' ');
-		printf("%s", cp);
-	}
-
-	putchar('\n');
-	free(buf);
-}
-
-void
-clone_create(void)
-{
-	int s;
-
-	s = socket(AF_INET, SOCK_DGRAM, 0);
-	if (s == -1)
-		err(1, "socket");
-
-	memset(&ifr, 0, sizeof(ifr));
-	(void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-	if (ioctl(s, SIOCIFCREATE, &ifr) < 0)
-		err(1, "SIOCIFCREATE");
-
-	/*
-	 * If we get a different name back then we put in, we probably
-	 * want to print it out, but we might change our mind later so
-	 * we just signal our intrest and leave the printout for later.
-	 */
-	if (strcmp(name, ifr.ifr_name) != 0) {
-		printname = 1;
-		strlcpy(name, ifr.ifr_name, sizeof(name));
-	}
-
-	close(s);
-}
+static struct cmd basic_cmds[] = {
+	DEF_CMD("up",		IFF_UP,		setifflags),
+	DEF_CMD("down",		-IFF_UP,	setifflags),
+	DEF_CMD("arp",		-IFF_NOARP,	setifflags),
+	DEF_CMD("-arp",		IFF_NOARP,	setifflags),
+	DEF_CMD("debug",	IFF_DEBUG,	setifflags),
+	DEF_CMD("-debug",	-IFF_DEBUG,	setifflags),
+	DEF_CMD("promisc",	IFF_PPROMISC,	setifflags),
+	DEF_CMD("-promisc",	-IFF_PPROMISC,	setifflags),
+	DEF_CMD("add",		IFF_UP,		notealias),
+	DEF_CMD("alias",	IFF_UP,		notealias),
+	DEF_CMD("-alias",	-IFF_UP,	notealias),
+	DEF_CMD("delete",	-IFF_UP,	notealias),
+	DEF_CMD("remove",	-IFF_UP,	notealias),
+#ifdef notdef
+#define	EN_SWABIPS	0x1000
+	DEF_CMD("swabips",	EN_SWABIPS,	setifflags),
+	DEF_CMD("-swabips",	-EN_SWABIPS,	setifflags),
+#endif
+	DEF_CMD_ARG("netmask",			setifnetmask),
+	DEF_CMD_ARG("metric",			setifmetric),
+	DEF_CMD_ARG("broadcast",		setifbroadaddr),
+	DEF_CMD_ARG("ipdst",			setifipdst),
+	DEF_CMD_ARG2("tunnel",			settunnel),
+	DEF_CMD("deletetunnel", 0,		deletetunnel),
+	DEF_CMD("link0",	IFF_LINK0,	setifflags),
+	DEF_CMD("-link0",	-IFF_LINK0,	setifflags),
+	DEF_CMD("link1",	IFF_LINK1,	setifflags),
+	DEF_CMD("-link1",	-IFF_LINK1,	setifflags),
+	DEF_CMD("link2",	IFF_LINK2,	setifflags),
+	DEF_CMD("-link2",	-IFF_LINK2,	setifflags),
+	DEF_CMD("monitor",	IFF_MONITOR,	setifflags),
+	DEF_CMD("-monitor",	-IFF_MONITOR,	setifflags),
+	DEF_CMD("staticarp",	IFF_STATICARP,	setifflags),
+	DEF_CMD("-staticarp",	-IFF_STATICARP,	setifflags),
+	DEF_CMD("rxcsum",	IFCAP_RXCSUM,	setifcap),
+	DEF_CMD("-rxcsum",	-IFCAP_RXCSUM,	setifcap),
+	DEF_CMD("txcsum",	IFCAP_TXCSUM,	setifcap),
+	DEF_CMD("-txcsum",	-IFCAP_TXCSUM,	setifcap),
+	DEF_CMD("netcons",	IFCAP_NETCONS,	setifcap),
+	DEF_CMD("-netcons",	-IFCAP_NETCONS,	setifcap),
+	DEF_CMD("normal",	-IFF_LINK0,	setifflags),
+	DEF_CMD("compress",	IFF_LINK0,	setifflags),
+	DEF_CMD("noicmp",	IFF_LINK1,	setifflags),
+	DEF_CMD_ARG("mtu",			setifmtu),
+	DEF_CMD_ARG("name",			setifname),
+};
 
-void
-clone_destroy(const char *val __unused, int d __unused, int s,
-	      const struct afswtch *rafp __unused)
+static __constructor void
+ifconfig_ctor(void)
 {
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
 
-	(void) strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-	if (ioctl(s, SIOCIFDESTROY, &ifr) < 0)
-		err(1, "SIOCIFDESTROY");
-	/*
-	 * If we create and destroy an interface in the same command,
-	 * there isn't any reason to print it's name.
-	 */
-	printname = 0;
+	for (i = 0; i < N(basic_cmds);  i++)
+		cmd_register(&basic_cmds[i]);
+#undef N
 }
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.h src/sbin/ifconfig/ifconfig.h
--- src.preview/sbin/ifconfig/ifconfig.h	2005-04-25 13:33:26.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.h	2005-09-27 15:02:10.000000000 -0400
@@ -31,41 +31,112 @@
  *
  * so there!
  *
- * $FreeBSD: src/sbin/ifconfig/ifconfig.h,v 1.12 2004/03/30 22:59:22 sam Exp $
- * $DragonFly: src/sbin/ifconfig/ifconfig.h,v 1.5 2005/04/25 17:33:26 swildner Exp $
+ * $FreeBSD$
  */
 
-extern struct ifreq ifr;
+#define	__constructor	__attribute__((constructor))
 
-extern char name[IFNAMSIZ];	/* name of interface */
-extern int allmedia;
-extern int supmedia;
 struct afswtch;
+struct cmd;
 
-extern void setmedia(const char *, int, int, const struct afswtch *rafp);
-extern void setmediamode(const char *, int, int, const struct afswtch *rafp);
-extern void setmediaopt(const char *, int, int, const struct afswtch *rafp);
-extern void unsetmediaopt(const char *, int, int, const struct afswtch *rafp);
-extern void media_status(int s, struct rt_addrinfo *);
-
-extern void setvlantag(const char *, int, int, const struct afswtch *rafp);
-extern void setvlandev(const char *, int, int, const struct afswtch *rafp);
-extern void unsetvlandev(const char *, int, int, const struct afswtch *rafp);
-extern void vlan_status(int s, struct rt_addrinfo *);
-
-extern void set80211ssid(const char *, int, int, const struct afswtch *rafp);
-extern void set80211stationname(const char *, int, int, const struct afswtch *rafp);
-extern void set80211channel(const char *, int, int, const struct afswtch *rafp);
-extern void set80211authmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersave(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersavemode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersavesleep(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wepmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wep(const char *, int, int, const struct afswtch *rafp);
-extern void set80211weptxkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wepkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211nwkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211rtsthreshold(const char *, int, int, const struct afswtch *rafp);
-extern void set80211protmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211txpower(const char *, int, int, const struct afswtch *rafp);
-extern void ieee80211_status(int s, struct rt_addrinfo *);
+typedef	void c_func(const char *cmd, int arg, int s, const struct afswtch *afp);
+typedef	void c_func2(const char *arg1, const char *arg2, int s, const struct afswtch *afp);
+
+struct cmd {
+	const char *c_name;
+	int	c_parameter;
+#define	NEXTARG		0xffffff	/* has following arg */
+#define	NEXTARG2	0xfffffe	/* has 2 following args */
+#define	OPTARG		0xfffffd	/* has optional following arg */
+	union {
+		c_func	*c_func;
+		c_func2	*c_func2;
+	} c_u;
+	struct cmd *c_next;
+};
+void	cmd_register(struct cmd *);
+
+typedef	void callback_func(int s, void *);
+void	callback_register(callback_func *, void *);
+
+/*
+ * Macros for declaring command functions and initializing entries.
+ */
+#define	DECL_CMD_FUNC(name, cmd, arg) \
+	void name(const char *cmd, int arg, int s, const struct afswtch *afp)
+#define	DECL_CMD_FUNC2(name, arg1, arg2) \
+	void name(const char *arg1, const char *arg2, int s, const struct afswtch *afp)
+
+#define	DEF_CMD(name, param, func)	{ name, param, { .c_func = func } }
+#define	DEF_CMD_ARG(name, func)		{ name, NEXTARG, { .c_func = func } }
+#define	DEF_CMD_OPTARG(name, func)	{ name, OPTARG, { .c_func = func } }
+#define	DEF_CMD_ARG2(name, func)	{ name, NEXTARG2, { .c_func2 = func } }
+
+struct rt_addrinfo;
+struct addrinfo;
+
+enum {
+	RIDADDR,
+	ADDR,
+	MASK,
+	DSTADDR,
+};
+
+struct afswtch {
+	const char	*af_name;	/* as given on cmd line, e.g. "inet" */
+	short		af_af;		/* AF_* */
+	/*
+	 * Status is handled one of two ways; if there is an
+	 * address associated with the interface then the
+	 * associated address family af_status method is invoked
+	 * with the appropriate addressin info.  Otherwise, if
+	 * all possible info is to be displayed and af_other_status
+	 * is defined then it is invoked after all address status
+	 * is presented.
+	 */
+	void		(*af_status)(int, const struct rt_addrinfo *);
+	void		(*af_other_status)(int);
+					/* parse address method */
+	void		(*af_getaddr)(const char *, int);
+					/* parse prefix method (IPv6) */
+	void		(*af_getprefix)(const char *, int);
+	void		(*af_postproc)(int s, const struct afswtch *);
+	u_long		af_difaddr;	/* set dst if address ioctl */
+	u_long		af_aifaddr;	/* set if address ioctl */
+	void		*af_ridreq;	/* */
+	void		*af_addreq;	/* */
+	struct afswtch	*af_next;
+
+	/* XXX doesn't fit model */
+	void		(*af_status_tunnel)(int);
+	void		(*af_settunnel)(int s, struct addrinfo *srcres,
+				struct addrinfo *dstres);
+};
+void	af_register(struct afswtch *);
+
+struct option {
+	const char *opt;
+	const char *opt_usage;
+	void	(*cb)(const char *arg);
+	struct option *next;
+};
+void	opt_register(struct option *);
+
+extern	struct ifreq ifr;
+extern	char name[IFNAMSIZ];	/* name of interface */
+extern	int allmedia;
+extern	int supmedia;
+extern	int printname;
+extern	int flags;
+extern	int newaddr;
+extern	int verbose;
+extern	int setipdst;
+
+void	setifcap(const char *, int value, int s, const struct afswtch *);
+
+void	Perror(const char *cmd);
+void	printb(const char *s, unsigned value, const char *bits);
+
+void	ifmaybeload(char *name);
+
+void	clone_create(void);
diff -N -u -r src.preview/sbin/ifconfig/ifieee80211.c src/sbin/ifconfig/ifieee80211.c
--- src.preview/sbin/ifconfig/ifieee80211.c	2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifieee80211.c	2005-09-27 15:02:10.000000000 -0400
@@ -24,8 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sbin/ifconfig/ifieee80211.c,v 1.1.2.3 2002/02/07 15:12:37 ambrisko Exp $
- * $DragonFly: src/sbin/ifconfig/ifieee80211.c,v 1.8 2005/03/06 05:01:59 dillon Exp $
+ * $FreeBSD$
  */
 
 /*-
@@ -75,7 +74,10 @@
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
+#include <net/if_media.h>
 #include <net/route.h>
+
+#include <netproto/802_11/ieee80211_dragonfly.h>
 #include <netproto/802_11/ieee80211.h>
 #include <netproto/802_11/ieee80211_crypto.h>
 #include <netproto/802_11/ieee80211_ioctl.h>
@@ -96,9 +98,15 @@
     u_int8_t *buf, int *lenp);
 static void print_string(const u_int8_t *buf, int len);
 
-void
-set80211ssid(const char *val, int d __unused, int s,
-	     const struct afswtch *rafp __unused)
+static int
+isanyarg(const char *arg)
+{
+	return (strcmp(arg, "-") == 0 ||
+	    strcasecmp(arg, "any") == 0 || strcasecmp(arg, "off") == 0);
+}
+
+static void
+set80211ssid(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int		ssid;
 	int		len;
@@ -118,9 +126,8 @@
 	set80211(s, IEEE80211_IOC_SSID, ssid, len, data);
 }
 
-void
-set80211stationname(const char *val, int d __unused, int s,
-		    const struct afswtch *rafp __unused)
+static void
+set80211stationname(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int			len;
 	u_int8_t		data[33];
@@ -132,19 +139,50 @@
 	set80211(s, IEEE80211_IOC_STATIONNAME, 0, len, data);
 }
 
-void
-set80211channel(const char *val, int d __unused, int s,
-		const struct afswtch *rafp __unused)
+/*
+ * Convert IEEE channel number to MHz frequency.
+ */
+static u_int
+ieee80211_ieee2mhz(u_int chan)
+{
+	if (chan == 14)
+		return 2484;
+	if (chan < 14)			/* 0-13 */
+		return 2407 + chan*5;
+	if (chan < 27)			/* 15-26 */
+		return 2512 + ((chan-15)*20);
+	return 5000 + (chan*5);
+}
+
+/*
+ * Convert MHz frequency to IEEE channel number.
+ */
+static u_int
+ieee80211_mhz2ieee(u_int freq)
+{
+	if (freq == 2484)
+		return 14;
+	if (freq < 2484)
+		return (freq - 2407) / 5;
+	if (freq < 5000)
+		return 15 + ((freq - 2512) / 20);
+	return (freq - 5000) / 5;
+}
+
+static void
+set80211channel(const char *val, int d, int s, const struct afswtch *rafp)
 {
-	if (strcmp(val, "-") == 0)
+	if (!isanyarg(val)) {
+		int v = atoi(val);
+		if (v > 255)		/* treat as frequency */
+			v = ieee80211_mhz2ieee(v);
+		set80211(s, IEEE80211_IOC_CHANNEL, v, 0, NULL);
+	} else
 		set80211(s, IEEE80211_IOC_CHANNEL, IEEE80211_CHAN_ANY, 0, NULL);
-	else
-		set80211(s, IEEE80211_IOC_CHANNEL, atoi(val), 0, NULL);
 }
 
-void
-set80211authmode(const char *val, int d __unused, int s,
-		 const struct afswtch *rafp __unused)
+static void
+set80211authmode(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int	mode;
 
@@ -154,6 +192,10 @@
 		mode = IEEE80211_AUTH_OPEN;
 	} else if (strcasecmp(val, "shared") == 0) {
 		mode = IEEE80211_AUTH_SHARED;
+	} else if (strcasecmp(val, "8021x") == 0) {
+		mode = IEEE80211_AUTH_8021X;
+	} else if (strcasecmp(val, "wpa") == 0) {
+		mode = IEEE80211_AUTH_WPA;
 	} else {
 		err(1, "unknown authmode");
 	}
@@ -161,9 +203,8 @@
 	set80211(s, IEEE80211_IOC_AUTHMODE, mode, 0, NULL);
 }
 
-void
-set80211powersavemode(const char *val, int d __unused, int s,
-		      const struct afswtch *rafp __unused)
+static void
+set80211powersavemode(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int	mode;
 
@@ -184,9 +225,8 @@
 	set80211(s, IEEE80211_IOC_POWERSAVE, mode, 0, NULL);
 }
 
-void
-set80211powersave(const char *val __unused, int d, int s,
-		  const struct afswtch *rafp __unused)
+static void
+set80211powersave(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	if (d == 0)
 		set80211(s, IEEE80211_IOC_POWERSAVE, IEEE80211_POWERSAVE_OFF,
@@ -196,16 +236,14 @@
 		    0, NULL);
 }
 
-void
-set80211powersavesleep(const char *val, int d __unused, int s,
-		       const struct afswtch *rafp __unused)
+static void
+set80211powersavesleep(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	set80211(s, IEEE80211_IOC_POWERSAVESLEEP, atoi(val), 0, NULL);
 }
 
-void
-set80211wepmode(const char *val, int d __unused, int s,
-		const struct afswtch *rafp __unused)
+static void
+set80211wepmode(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int	mode;
 
@@ -222,23 +260,29 @@
 	set80211(s, IEEE80211_IOC_WEP, mode, 0, NULL);
 }
 
-void
-set80211wep(const char *val __unused, int d, int s,
-	    const struct afswtch *rafp __unused)
+static void
+set80211wep(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	set80211(s, IEEE80211_IOC_WEP, d, 0, NULL);
 }
 
-void
-set80211weptxkey(const char *val, int d __unused, int s,
-		 const struct afswtch *rafp __unused)
+static int
+isundefarg(const char *arg)
 {
-	set80211(s, IEEE80211_IOC_WEPTXKEY, atoi(val)-1, 0, NULL);
+	return (strcmp(arg, "-") == 0 || strncasecmp(arg, "undef", 5) == 0);
 }
 
-void
-set80211wepkey(const char *val, int d __unused, int s,
-	       const struct afswtch *rafp __unused)
+static void
+set80211weptxkey(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	if (isundefarg(val))
+		set80211(s, IEEE80211_IOC_WEPTXKEY, IEEE80211_KEYIX_NONE, 0, NULL);
+	else
+		set80211(s, IEEE80211_IOC_WEPTXKEY, atoi(val)-1, 0, NULL);
+}
+
+static void
+set80211wepkey(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int		key = 0;
 	int		len;
@@ -261,9 +305,8 @@
  * iterface is too inflexable, but it's there so we'll support it since
  * it's not all that hard.
  */
-void
-set80211nwkey(const char *val, int d __unused, int s,
-	      const struct afswtch *rafp __unused)
+static void
+set80211nwkey(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int		txkey;
 	int		i, len;
@@ -298,16 +341,14 @@
 	set80211(s, IEEE80211_IOC_WEPTXKEY, txkey, 0, NULL);
 }
 
-void
-set80211rtsthreshold(const char *val, int d __unused, int s,
-	const struct afswtch *rafp __unused)
+static void
+set80211rtsthreshold(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	set80211(s, IEEE80211_IOC_RTSTHRESHOLD, atoi(val), 0, NULL);
 }
 
-void
-set80211protmode(const char *val, int d __unused, int s,
-	const struct afswtch *rafp __unused)
+static void
+set80211protmode(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	int	mode;
 
@@ -324,160 +365,1049 @@
 	set80211(s, IEEE80211_IOC_PROTMODE, mode, 0, NULL);
 }
 
-void
-set80211txpower(const char *val, int d __unused, int s,
-	const struct afswtch *rafp __unused)
+static void
+set80211txpower(const char *val, int d, int s, const struct afswtch *rafp)
 {
 	set80211(s, IEEE80211_IOC_TXPOWER, atoi(val), 0, NULL);
 }
 
-void
-ieee80211_status (int s, struct rt_addrinfo *info __unused)
+#define	IEEE80211_ROAMING_DEVICE	0
+#define	IEEE80211_ROAMING_AUTO		1
+#define	IEEE80211_ROAMING_MANUAL	2
+
+static void
+set80211roaming(const char *val, int d, int s, const struct afswtch *rafp)
 {
-	int			i;
-	int			num;
-	struct ieee80211req	ireq;
-	u_int8_t		data[32];
-	char			spacer;
+	int mode;
+
+	if (strcasecmp(val, "device") == 0) {
+		mode = IEEE80211_ROAMING_DEVICE;
+	} else if (strcasecmp(val, "auto") == 0) {
+		mode = IEEE80211_ROAMING_AUTO;
+	} else if (strcasecmp(val, "manual") == 0) {
+		mode = IEEE80211_ROAMING_MANUAL;
+	} else {
+		err(1, "unknown roaming mode");
+	}
+	set80211(s, IEEE80211_IOC_ROAMING, mode, 0, NULL);
+}
+
+static void
+set80211wme(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	set80211(s, IEEE80211_IOC_WME, d, 0, NULL);
+}
+
+static void
+set80211hidessid(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	set80211(s, IEEE80211_IOC_HIDESSID, d, 0, NULL);
+}
+
+static void
+set80211apbridge(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	set80211(s, IEEE80211_IOC_APBRIDGE, d, 0, NULL);
+}
+
+static void
+set80211chanlist(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	struct ieee80211req_chanlist chanlist;
+#define	MAXCHAN	(sizeof(chanlist.ic_channels)*NBBY)
+	char *temp, *cp, *tp;
+
+	temp = malloc(strlen(val) + 1);
+	if (temp == NULL)
+		errx(1, "malloc failed");
+	strcpy(temp, val);
+	memset(&chanlist, 0, sizeof(chanlist));
+	cp = temp;
+	for (;;) {
+		int first, last, f;
+
+		tp = strchr(cp, ',');
+		if (tp != NULL)
+			*tp++ = '\0';
+		switch (sscanf(cp, "%u-%u", &first, &last)) {
+		case 1:
+			if (first > MAXCHAN)
+				errx(-1, "channel %u out of range, max %u",
+					first, MAXCHAN);
+			setbit(chanlist.ic_channels, first);
+			break;
+		case 2:
+			if (first > MAXCHAN)
+				errx(-1, "channel %u out of range, max %u",
+					first, MAXCHAN);
+			if (last > MAXCHAN)
+				errx(-1, "channel %u out of range, max %u",
+					last, MAXCHAN);
+			if (first > last)
+				errx(-1, "void channel range, %u > %u",
+					first, last);
+			for (f = first; f <= last; f++)
+				setbit(chanlist.ic_channels, f);
+			break;
+		}
+		if (tp == NULL)
+			break;
+		while (isspace(*tp))
+			tp++;
+		if (!isdigit(*tp))
+			break;
+		cp = tp;
+	}
+	set80211(s, IEEE80211_IOC_CHANLIST, 0,
+		sizeof(chanlist), (uint8_t *) &chanlist);
+#undef MAXCHAN
+}
+
+static void
+set80211bssid(const char *val, int d, int s, const struct afswtch *rafp)
+{
+
+	if (!isanyarg(val)) {
+		char *temp;
+		struct sockaddr_dl sdl;
+
+		temp = malloc(strlen(val) + 1);
+		if (temp == NULL)
+			errx(1, "malloc failed");
+		temp[0] = ':';
+		strcpy(temp + 1, val);
+		sdl.sdl_len = sizeof(sdl);
+		link_addr(temp, &sdl);
+		free(temp);
+		if (sdl.sdl_alen != IEEE80211_ADDR_LEN)
+			errx(1, "malformed link-level address");
+		set80211(s, IEEE80211_IOC_BSSID, 0,
+			IEEE80211_ADDR_LEN, LLADDR(&sdl));
+	} else {
+		uint8_t zerobssid[IEEE80211_ADDR_LEN];
+		memset(zerobssid, 0, sizeof(zerobssid));
+		set80211(s, IEEE80211_IOC_BSSID, 0,
+			IEEE80211_ADDR_LEN, zerobssid);
+	}
+}
+
+static int
+getac(const char *ac)
+{
+	if (strcasecmp(ac, "ac_be") == 0 || strcasecmp(ac, "be") == 0)
+		return WME_AC_BE;
+	if (strcasecmp(ac, "ac_bk") == 0 || strcasecmp(ac, "bk") == 0)
+		return WME_AC_BK;
+	if (strcasecmp(ac, "ac_vi") == 0 || strcasecmp(ac, "vi") == 0)
+		return WME_AC_VI;
+	if (strcasecmp(ac, "ac_vo") == 0 || strcasecmp(ac, "vo") == 0)
+		return WME_AC_VO;
+	errx(1, "unknown wme access class %s", ac);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmin, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmax, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211aifs, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211txoplimit, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211acm, val, d)
+{
+	set80211(s, IEEE80211_IOC_WME_ACM, d, WME_AC_BE, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211ackpolicy, val, d)
+{
+	set80211(s, IEEE80211_IOC_WME_ACKPOLICY, d, WME_AC_BE, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsscwmin, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val),
+		getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsscwmax, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val),
+		getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bssaifs, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val),
+		getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsstxoplimit, ac, val)
+{
+	set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val),
+		getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211dtimperiod, val, d)
+{
+	set80211(s, IEEE80211_IOC_DTIM_PERIOD, atoi(val), 0, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211bintval, val, d)
+{
+	set80211(s, IEEE80211_IOC_BEACON_INTERVAL, atoi(val), 0, NULL);
+}
+
+static void
+set80211macmac(int s, int op, const char *val)
+{
+	char *temp;
+	struct sockaddr_dl sdl;
+
+	temp = malloc(strlen(val) + 1);
+	if (temp == NULL)
+		errx(1, "malloc failed");
+	temp[0] = ':';
+	strcpy(temp + 1, val);
+	sdl.sdl_len = sizeof(sdl);
+	link_addr(temp, &sdl);
+	free(temp);
+	if (sdl.sdl_alen != IEEE80211_ADDR_LEN)
+		errx(1, "malformed link-level address");
+	set80211(s, op, 0, IEEE80211_ADDR_LEN, LLADDR(&sdl));
+}
+
+static
+DECL_CMD_FUNC(set80211addmac, val, d)
+{
+	set80211macmac(s, IEEE80211_IOC_ADDMAC, val);
+}
+
+static
+DECL_CMD_FUNC(set80211delmac, val, d)
+{
+	set80211macmac(s, IEEE80211_IOC_DELMAC, val);
+}
+
+static
+DECL_CMD_FUNC(set80211maccmd, val, d)
+{
+	set80211(s, IEEE80211_IOC_MACCMD, d, 0, NULL);
+}
+
+static int
+getmaxrate(uint8_t rates[15], uint8_t nrates)
+{
+	int i, maxrate = -1;
+
+	for (i = 0; i < nrates; i++) {
+		int rate = rates[i] & IEEE80211_RATE_VAL;
+		if (rate > maxrate)
+			maxrate = rate;
+	}
+	return maxrate / 2;
+}
+
+static const char *
+getcaps(int capinfo)
+{
+	static char capstring[32];
+	char *cp = capstring;
+
+	if (capinfo & IEEE80211_CAPINFO_ESS)
+		*cp++ = 'E';
+	if (capinfo & IEEE80211_CAPINFO_IBSS)
+		*cp++ = 'I';
+	if (capinfo & IEEE80211_CAPINFO_CF_POLLABLE)
+		*cp++ = 'c';
+	if (capinfo & IEEE80211_CAPINFO_CF_POLLREQ)
+		*cp++ = 'C';
+	if (capinfo & IEEE80211_CAPINFO_PRIVACY)
+		*cp++ = 'P';
+	if (capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE)
+		*cp++ = 'S';
+	if (capinfo & IEEE80211_CAPINFO_PBCC)
+		*cp++ = 'B';
+	if (capinfo & IEEE80211_CAPINFO_CHNL_AGILITY)
+		*cp++ = 'A';
+	if (capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME)
+		*cp++ = 's';
+	if (capinfo & IEEE80211_CAPINFO_RSN)
+		*cp++ = 'R';
+	if (capinfo & IEEE80211_CAPINFO_DSSSOFDM)
+		*cp++ = 'D';
+	*cp = '\0';
+	return capstring;
+}
+
+static void
+printie(const char* tag, const uint8_t *ie, size_t ielen, int maxlen)
+{
+	printf("%s", tag);
+	if (verbose) {
+		maxlen -= strlen(tag)+2;
+		if (2*ielen > maxlen)
+			maxlen--;
+		printf("<");
+		for (; ielen > 0; ie++, ielen--) {
+			if (maxlen-- <= 0)
+				break;
+			printf("%02x", *ie);
+		}
+		if (ielen != 0)
+			printf("-");
+		printf(">");
+	}
+}
+
+/*
+ * Copy the ssid string contents into buf, truncating to fit.  If the
+ * ssid is entirely printable then just copy intact.  Otherwise convert
+ * to hexadecimal.  If the result is truncated then replace the last
+ * three characters with "...".
+ */
+static size_t
+copy_essid(char buf[], size_t bufsize, const u_int8_t *essid, size_t essid_len)
+{
+	const u_int8_t *p; 
+	size_t maxlen;
+	int i;
+
+	if (essid_len > bufsize)
+		maxlen = bufsize;
+	else
+		maxlen = essid_len;
+	/* determine printable or not */
+	for (i = 0, p = essid; i < maxlen; i++, p++) {
+		if (*p < ' ' || *p > 0x7e)
+			break;
+	}
+	if (i != maxlen) {		/* not printable, print as hex */
+		if (bufsize < 3)
+			return 0;
+		strlcpy(buf, "0x", bufsize);
+		bufsize -= 2;
+		p = essid;
+		for (i = 0; i < maxlen && bufsize >= 2; i++) {
+			sprintf(&buf[2+2*i], "%02x", *p++);
+			bufsize -= 2;
+		}
+		maxlen = 2+2*i;
+	} else {			/* printable, truncate as needed */
+		memcpy(buf, essid, maxlen);
+	}
+	if (maxlen != essid_len)
+		memcpy(buf+maxlen-3, "...", 3);
+	return maxlen;
+}
+
+/* unalligned little endian access */     
+#define LE_READ_4(p)					\
+	((u_int32_t)					\
+	 ((((const u_int8_t *)(p))[0]      ) |		\
+	  (((const u_int8_t *)(p))[1] <<  8) |		\
+	  (((const u_int8_t *)(p))[2] << 16) |		\
+	  (((const u_int8_t *)(p))[3] << 24)))
+
+static int __inline
+iswpaoui(const u_int8_t *frm)
+{
+	return frm[1] > 3 && LE_READ_4(frm+2) == ((WPA_OUI_TYPE<<24)|WPA_OUI);
+}
+
+static int __inline
+iswmeoui(const u_int8_t *frm)
+{
+	return frm[1] > 3 && LE_READ_4(frm+2) == ((WME_OUI_TYPE<<24)|WME_OUI);
+}
+
+static int __inline
+isatherosoui(const u_int8_t *frm)
+{
+	return frm[1] > 3 && LE_READ_4(frm+2) == ((ATH_OUI_TYPE<<24)|ATH_OUI);
+}
+
+static void
+printies(const u_int8_t *vp, int ielen, int maxcols)
+{
+	while (ielen > 0) {
+		switch (vp[0]) {
+		case IEEE80211_ELEMID_VENDOR:
+			if (iswpaoui(vp))
+				printie(" WPA", vp, 2+vp[1], maxcols);
+			else if (iswmeoui(vp))
+				printie(" WME", vp, 2+vp[1], maxcols);
+			else if (isatherosoui(vp))
+				printie(" ATH", vp, 2+vp[1], maxcols);
+			else
+				printie(" VEN", vp, 2+vp[1], maxcols);
+			break;
+		case IEEE80211_ELEMID_RSN:
+			printie(" RSN", vp, 2+vp[1], maxcols);
+			break;
+		default:
+			printie(" ???", vp, 2+vp[1], maxcols);
+			break;
+		}
+		ielen -= 2+vp[1];
+		vp += 2+vp[1];
+	}
+}
+
+static void
+list_scan(int s)
+{
+	uint8_t buf[24*1024];
+	struct ieee80211req ireq;
+	char ssid[14];
+	uint8_t *cp;
+	int len;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_SCAN_RESULTS;
+	ireq.i_data = buf;
+	ireq.i_len = sizeof(buf);
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get scan results");
+	len = ireq.i_len;
+	if (len < sizeof(struct ieee80211req_scan_result))
+		return;
+
+	printf("%-14.14s  %-17.17s  %4s %4s  %-5s %3s %4s\n"
+		, "SSID"
+		, "BSSID"
+		, "CHAN"
+		, "RATE"
+		, "S:N"
+		, "INT"
+		, "CAPS"
+	);
+	cp = buf;
+	do {
+		struct ieee80211req_scan_result *sr;
+		uint8_t *vp;
+
+		sr = (struct ieee80211req_scan_result *) cp;
+		vp = (u_int8_t *)(sr+1);
+		printf("%-14.*s  %s  %3d  %3dM %2d:%-2d  %3d %-4.4s"
+			, copy_essid(ssid, sizeof(ssid), vp, sr->isr_ssid_len)
+				, ssid
+			, ether_ntoa((const struct ether_addr *) sr->isr_bssid)
+			, ieee80211_mhz2ieee(sr->isr_freq)
+			, getmaxrate(sr->isr_rates, sr->isr_nrates)
+			, sr->isr_rssi, sr->isr_noise
+			, sr->isr_intval
+			, getcaps(sr->isr_capinfo)
+		);
+		printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24);;
+		printf("\n");
+		cp += sr->isr_len, len -= sr->isr_len;
+	} while (len >= sizeof(struct ieee80211req_scan_result));
+}
+
+static void
+scan_and_wait(int s)
+{
+	struct ieee80211req ireq;
+	int sroute;
+
+	sroute = socket(PF_ROUTE, SOCK_RAW, 0);
+	if (sroute < 0) {
+		perror("socket(PF_ROUTE,SOCK_RAW)");
+		return;
+	}
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_SCAN_REQ;
+	/* NB: only root can trigger a scan so ignore errors */
+	if (ioctl(s, SIOCS80211, &ireq) >= 0) {
+		char buf[2048];
+		struct if_announcemsghdr *ifan;
+		struct rt_msghdr *rtm;
+
+		do {
+			if (read(sroute, buf, sizeof(buf)) < 0) {
+				perror("read(PF_ROUTE)");
+				break;
+			}
+			rtm = (struct rt_msghdr *) buf;
+			if (rtm->rtm_version != RTM_VERSION)
+				break;
+			ifan = (struct if_announcemsghdr *) rtm;
+		} while (rtm->rtm_type != RTM_IEEE80211 ||
+		    ifan->ifan_what != RTM_IEEE80211_SCAN);
+	}
+	close(sroute);
+}
+
+static
+DECL_CMD_FUNC(set80211scan, val, d)
+{
+	scan_and_wait(s);
+	list_scan(s);
+}
+
+static void
+list_stations(int s)
+{
+	uint8_t buf[24*1024];
+	struct ieee80211req ireq;
+	uint8_t *cp;
+	int len;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_STA_INFO;
+	ireq.i_data = buf;
+	ireq.i_len = sizeof(buf);
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get station information");
+	len = ireq.i_len;
+	if (len < sizeof(struct ieee80211req_sta_info))
+		return;
+
+	printf("%-17.17s %4s %4s %4s %4s %4s %6s %6s %4s %3s\n"
+		, "ADDR"
+		, "AID"
+		, "CHAN"
+		, "RATE"
+		, "RSSI"
+		, "IDLE"
+		, "TXSEQ"
+		, "RXSEQ"
+		, "CAPS"
+		, "ERP"
+	cp = buf;
+	do {
+		struct ieee80211req_sta_info *si;
+		uint8_t *vp;
+
+		si = (struct ieee80211req_sta_info *) cp;
+		vp = (u_int8_t *)(si+1);
+		printf("%s %4u %4d %3dM %4d %4d %6d %6d %-4.4s %3x"
+			, ether_ntoa((const struct ether_addr*) si->isi_macaddr)
+			, IEEE80211_AID(si->isi_associd)
+			, ieee80211_mhz2ieee(si->isi_freq)
+			, (si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL)/2
+			, si->isi_rssi
+			, si->isi_inact
+			, si->isi_txseqs[0]
+			, si->isi_rxseqs[0]
+			, getcaps(si->isi_capinfo)
+			, si->isi_erp
+		);
+		printies(vp, si->isi_ie_len, 24);
+		printf("\n");
+		cp += si->isi_len, len -= si->isi_len;
+	} while (len >= sizeof(struct ieee80211req_sta_info));
+}
+
+static void
+print_chaninfo(const struct ieee80211_channel *c)
+{
+#define	IEEE80211_IS_CHAN_PASSIVE(_c) \
+	(((_c)->ic_flags & IEEE80211_CHAN_PASSIVE))
+	char buf[14];
+
+	buf[0] = '\0';
+	if (IEEE80211_IS_CHAN_FHSS(c))
+		strlcat(buf, " FHSS", sizeof(buf));
+	if (IEEE80211_IS_CHAN_A(c))
+		strlcat(buf, " 11a", sizeof(buf));
+	/* XXX 11g schizophrenia */
+	if (IEEE80211_IS_CHAN_G(c) ||
+	    IEEE80211_IS_CHAN_PUREG(c))
+		strlcat(buf, " 11g", sizeof(buf));
+	else if (IEEE80211_IS_CHAN_B(c))
+		strlcat(buf, " 11b", sizeof(buf));
+	if (IEEE80211_IS_CHAN_T(c))
+		strlcat(buf, " Turbo", sizeof(buf));
+	printf("Channel %3u : %u%c Mhz%-14.14s",
+		ieee80211_mhz2ieee(c->ic_freq), c->ic_freq,
+		IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', buf);
+#undef IEEE80211_IS_CHAN_PASSIVE
+}
+
+static void
+list_channels(int s, int allchans)
+{
+	struct ieee80211req ireq;
+	struct ieee80211req_chaninfo chans;
+	struct ieee80211req_chaninfo achans;
+	const struct ieee80211_channel *c;
+	int i, half;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_CHANINFO;
+	ireq.i_data = &chans;
+	ireq.i_len = sizeof(chans);
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get channel information");
+	if (!allchans) {
+		struct ieee80211req_chanlist active;
+
+		ireq.i_type = IEEE80211_IOC_CHANLIST;
+		ireq.i_data = &active;
+		ireq.i_len = sizeof(active);
+		if (ioctl(s, SIOCG80211, &ireq) < 0)
+			errx(1, "unable to get active channel list");
+		memset(&achans, 0, sizeof(achans));
+		for (i = 0; i < chans.ic_nchans; i++) {
+			c = &chans.ic_chans[i];
+			if (isset(active.ic_channels, ieee80211_mhz2ieee(c->ic_freq)) || allchans)
+				achans.ic_chans[achans.ic_nchans++] = *c;
+		}
+	} else
+		achans = chans;
+	half = achans.ic_nchans / 2;
+	if (achans.ic_nchans % 2)
+		half++;
+	for (i = 0; i < achans.ic_nchans / 2; i++) {
+		print_chaninfo(&achans.ic_chans[i]);
+		print_chaninfo(&achans.ic_chans[half+i]);
+		printf("\n");
+	}
+	if (achans.ic_nchans % 2) {
+		print_chaninfo(&achans.ic_chans[i]);
+		printf("\n");
+	}
+}
+
+static void
+list_keys(int s)
+{
+}
+
+#define	IEEE80211_C_BITS \
+"\020\1WEP\2TKIP\3AES\4AES_CCM\6CKIP\11IBSS\12PMGT\13HOSTAP\14AHDEMO" \
+"\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE\21MONITOR\22TKIPMIC\30WPA1" \
+"\31WPA2\32BURST\33WME"
+
+static void
+list_capabilities(int s)
+{
+	struct ieee80211req ireq;
+	u_int32_t caps;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_DRIVER_CAPS;
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get driver capabilities");
+	caps = (((u_int16_t) ireq.i_val) << 16) | ((u_int16_t) ireq.i_len);
+	printb(name, caps, IEEE80211_C_BITS);
+	putchar('\n');
+}
+
+static void
+list_wme(int s)
+{
+	static const char *acnames[] = { "AC_BE", "AC_BK", "AC_VI", "AC_VO" };
+	struct ieee80211req ireq;
+	int ac;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_len = 0;
+	for (ac = WME_AC_BE; ac <= WME_AC_VO; ac++) {
+again:
+		if (ireq.i_len & IEEE80211_WMEPARAM_BSS)
+			printf("\t%s", "     ");
+		else
+			printf("\t%s", acnames[ac]);
+
+		ireq.i_len = (ireq.i_len & IEEE80211_WMEPARAM_BSS) | ac;
+
+		/* show WME BSS parameters */
+		ireq.i_type = IEEE80211_IOC_WME_CWMIN;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			printf(" cwmin %2u", ireq.i_val);
+		ireq.i_type = IEEE80211_IOC_WME_CWMAX;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			printf(" cwmax %2u", ireq.i_val);
+		ireq.i_type = IEEE80211_IOC_WME_AIFS;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			printf(" aifs %2u", ireq.i_val);
+		ireq.i_type = IEEE80211_IOC_WME_TXOPLIMIT;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			printf(" txopLimit %3u", ireq.i_val);
+		ireq.i_type = IEEE80211_IOC_WME_ACM;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			if (ireq.i_val)
+				printf(" acm");
+			else if (verbose)
+				printf(" -acm");
+		}
+		/* !BSS only */
+		if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+			ireq.i_type = IEEE80211_IOC_WME_ACKPOLICY;
+			if (ioctl(s, SIOCG80211, &ireq) != -1) {
+				if (!ireq.i_val)
+					printf(" -ack");
+				else if (verbose)
+					printf(" ack");
+			}
+		}
+		printf("\n");
+		if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+			ireq.i_len |= IEEE80211_WMEPARAM_BSS;
+			goto again;
+		} else
+			ireq.i_len &= ~IEEE80211_WMEPARAM_BSS;
+	}
+}
+
+static
+DECL_CMD_FUNC(set80211list, arg, d)
+{
+#define	iseq(a,b)	(strncasecmp(a,b,sizeof(b)-1) == 0)
+
+	if (iseq(arg, "sta"))
+		list_stations(s);
+	else if (iseq(arg, "scan") || iseq(arg, "ap"))
+		list_scan(s);
+	else if (iseq(arg, "chan") || iseq(arg, "freq"))
+		list_channels(s, 1);
+	else if (iseq(arg, "active"))
+		list_channels(s, 0);
+	else if (iseq(arg, "keys"))
+		list_keys(s);
+	else if (iseq(arg, "caps"))
+		list_capabilities(s);
+	else if (iseq(arg, "wme"))
+		list_wme(s);
+	else
+		errx(1, "Don't know how to list %s for %s", arg, name);
+#undef iseq
+}
+
+static enum ieee80211_opmode
+get80211opmode(int s)
+{
+	struct ifmediareq ifmr;
+
+	(void) memset(&ifmr, 0, sizeof(ifmr));
+	(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+
+	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) >= 0) {
+		if (ifmr.ifm_current & IFM_IEEE80211_ADHOC)
+			return IEEE80211_M_IBSS;	/* XXX ahdemo */
+		if (ifmr.ifm_current & IFM_IEEE80211_HOSTAP)
+			return IEEE80211_M_HOSTAP;
+		if (ifmr.ifm_current & IFM_IEEE80211_MONITOR)
+			return IEEE80211_M_MONITOR;
+	}
+	return IEEE80211_M_STA;
+}
+
+static const struct ieee80211_channel *
+getchaninfo(int s, int chan)
+{
+	struct ieee80211req ireq;
+	static struct ieee80211req_chaninfo chans;
+	static struct ieee80211_channel undef;
+	const struct ieee80211_channel *c;
+	int i, freq;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_CHANINFO;
+	ireq.i_data = &chans;
+	ireq.i_len = sizeof(chans);
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get channel information");
+	freq = ieee80211_ieee2mhz(chan);
+	for (i = 0; i < chans.ic_nchans; i++) {
+		c = &chans.ic_chans[i];
+		if (c->ic_freq == freq)
+			return c;
+	}
+	return &undef;
+}
+
+#if 0
+static void
+printcipher(int s, struct ieee80211req *ireq, int keylenop)
+{
+	switch (ireq->i_val) {
+	case IEEE80211_CIPHER_WEP:
+		ireq->i_type = keylenop;
+		if (ioctl(s, SIOCG80211, ireq) != -1)
+			printf("WEP-%s", 
+			    ireq->i_len <= 5 ? "40" :
+			    ireq->i_len <= 13 ? "104" : "128");
+		else
+			printf("WEP");
+		break;
+	case IEEE80211_CIPHER_TKIP:
+		printf("TKIP");
+		break;
+	case IEEE80211_CIPHER_AES_OCB:
+		printf("AES-OCB");
+		break;
+	case IEEE80211_CIPHER_AES_CCM:
+		printf("AES-CCM");
+		break;
+	case IEEE80211_CIPHER_CKIP:
+		printf("CKIP");
+		break;
+	case IEEE80211_CIPHER_NONE:
+		printf("NONE");
+		break;
+	default:
+		printf("UNKNOWN (0x%x)", ireq->i_val);
+		break;
+	}
+}
+#endif
+
+#define	MAXCOL	78
+int	col;
+char	spacer;
+
+#define	LINE_BREAK() do {			\
+	if (spacer != '\t') {			\
+		printf("\n");			\
+		spacer = '\t';			\
+	}					\
+	col = 8;	/* 8-col tab */		\
+} while (0)
+#define	LINE_CHECK(fmt, ...) do {		\
+	col += sizeof(fmt)-2;			\
+	if (col > MAXCOL) {			\
+		LINE_BREAK();			\
+		col += sizeof(fmt)-2;		\
+	}					\
+	printf(fmt, __VA_ARGS__);		\
+	spacer = ' ';				\
+} while (0)
+
+static void
+printkey(const struct ieee80211req_key *ik)
+{
+	static const uint8_t zerodata[IEEE80211_KEYBUF_SIZE];
+	int keylen = ik->ik_keylen;
+	int printcontents;
+
+	printcontents =
+		(memcmp(ik->ik_keydata, zerodata, keylen) != 0 || verbose);
+	if (printcontents)
+		LINE_BREAK();
+	switch (ik->ik_type) {
+	case IEEE80211_CIPHER_WEP:
+		/* compatibility */
+		LINE_CHECK("%cwepkey %u:%s", spacer, ik->ik_keyix+1,
+		    keylen <= 5 ? "40-bit" :
+		    keylen <= 13 ? "104-bit" : "128-bit");
+		break;
+	case IEEE80211_CIPHER_TKIP:
+		if (keylen > 128/8)
+			keylen -= 128/8;	/* ignore MIC for now */
+		LINE_CHECK("%cTKIP %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
+		break;
+	case IEEE80211_CIPHER_AES_OCB:
+		LINE_CHECK("%cAES-OCB %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
+		break;
+	case IEEE80211_CIPHER_AES_CCM:
+		LINE_CHECK("%cAES-CCM %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
+		break;
+	case IEEE80211_CIPHER_CKIP:
+		LINE_CHECK("%cCKIP %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
+		break;
+	case IEEE80211_CIPHER_NONE:
+		LINE_CHECK("%cNULL %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
+		break;
+	default:
+		LINE_CHECK("%cUNKNOWN (0x%x) %u:%u-bit", spacer,
+			ik->ik_type, ik->ik_keyix+1, 8*keylen);
+		break;
+	}
+	if (printcontents) {
+		int i;
+
+		printf(" <");
+		for (i = 0; i < keylen; i++)
+			printf("%02x", ik->ik_keydata[i]);
+		printf(">");
+		if (ik->ik_type != IEEE80211_CIPHER_WEP &&
+		    (ik->ik_keyrsc != 0 || verbose))
+			printf(" rsc %llu", ik->ik_keyrsc);
+		if (ik->ik_type != IEEE80211_CIPHER_WEP &&
+		    (ik->ik_keytsc != 0 || verbose))
+			printf(" tsc %llu", ik->ik_keytsc);
+		if (ik->ik_flags != 0 && verbose) {
+			const char *sep = " ";
+
+			if (ik->ik_flags & IEEE80211_KEY_XMIT)
+				printf("%stx", sep), sep = "+";
+			if (ik->ik_flags & IEEE80211_KEY_RECV)
+				printf("%srx", sep), sep = "+";
+			if (ik->ik_flags & IEEE80211_KEY_DEFAULT)
+				printf("%sdef", sep), sep = "+";
+		}
+		LINE_BREAK();
+	}
+}
+
+static void
+ieee80211_status(int s)
+{
+	static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
+	enum ieee80211_opmode opmode = get80211opmode(s);
+	int i, num, wpa, wme;
+	struct ieee80211req ireq;
+	u_int8_t data[32];
+	const struct ieee80211_channel *c;
 
 	(void) memset(&ireq, 0, sizeof(ireq));
 	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
 	ireq.i_data = &data;
 
+	wpa = 0;		/* unknown/not set */
+
 	ireq.i_type = IEEE80211_IOC_SSID;
 	ireq.i_val = -1;
 	if (ioctl(s, SIOCG80211, &ireq) < 0) {
 		/* If we can't get the SSID, the this isn't an 802.11 device. */
 		return;
 	}
-	printf("\tssid ");
-	print_string(data, ireq.i_len);
 	num = 0;
 	ireq.i_type = IEEE80211_IOC_NUMSSIDS;
-	if (ioctl(s, SIOCG80211, &ireq) >= 0) {
+	if (ioctl(s, SIOCG80211, &ireq) >= 0)
 		num = ireq.i_val;
-	}
-	ireq.i_type = IEEE80211_IOC_SSID;
-	for (ireq.i_val = 0; ireq.i_val < num; ireq.i_val++) {
-		if (ioctl(s, SIOCG80211, &ireq) >= 0 && ireq.i_len > 0) {
-			printf(" %d:", ireq.i_val + 1);
-			print_string(data, ireq.i_len);
+	printf("\tssid ");
+	if (num > 1) {
+		ireq.i_type = IEEE80211_IOC_SSID;
+		for (ireq.i_val = 0; ireq.i_val < num; ireq.i_val++) {
+			if (ioctl(s, SIOCG80211, &ireq) >= 0 && ireq.i_len > 0) {
+				printf(" %d:", ireq.i_val + 1);
+				print_string(data, ireq.i_len);
+			}
 		}
-	}
-	printf("\n");
+	} else
+		print_string(data, ireq.i_len);
+
+	ireq.i_type = IEEE80211_IOC_CHANNEL;
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		goto end;
+	c = getchaninfo(s, ireq.i_val);
+	if (ireq.i_val != -1) {
+		printf(" channel %d", ireq.i_val);
+		if (verbose)
+			printf(" (%u)", c->ic_freq);
+	} else if (verbose)
+		printf(" channel UNDEF");
+
+	ireq.i_type = IEEE80211_IOC_BSSID;
+	ireq.i_len = IEEE80211_ADDR_LEN;
+	if (ioctl(s, SIOCG80211, &ireq) >= 0 &&
+	    memcmp(ireq.i_data, zerobssid, sizeof(zerobssid)) != 0)
+		printf(" bssid %s", ether_ntoa(ireq.i_data));
 
 	ireq.i_type = IEEE80211_IOC_STATIONNAME;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("\tstationname ");
+		printf("\n\tstationname ");
 		print_string(data, ireq.i_len);
-		printf("\n");
 	}
 
-	ireq.i_type = IEEE80211_IOC_CHANNEL;
-	if (ioctl(s, SIOCG80211, &ireq) < 0) {
-		goto end;
-	}
-	printf("\tchannel %d", ireq.i_val);
+	spacer = ' ';		/* force first break */
+	LINE_BREAK();
 
 	ireq.i_type = IEEE80211_IOC_AUTHMODE;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf(" authmode");
 		switch (ireq.i_val) {
 			case IEEE80211_AUTH_NONE:
-				printf(" NONE");
+				LINE_CHECK("%cauthmode NONE", spacer);
 				break;
 			case IEEE80211_AUTH_OPEN:
-				printf(" OPEN");
+				LINE_CHECK("%cauthmode OPEN", spacer);
 				break;
 			case IEEE80211_AUTH_SHARED:
-				printf(" SHARED");
+				LINE_CHECK("%cauthmode SHARED", spacer);
 				break;
-			default:
-				printf(" UNKNOWN");
+			case IEEE80211_AUTH_8021X:
+				LINE_CHECK("%cauthmode 802.1x", spacer);
 				break;
-		}
-	}
-
-	ireq.i_type = IEEE80211_IOC_POWERSAVE;
-	if (ioctl(s, SIOCG80211, &ireq) != -1 &&
-	    ireq.i_val != IEEE80211_POWERSAVE_NOSUP ) {
-		printf(" powersavemode");
-		switch (ireq.i_val) {
-			case IEEE80211_POWERSAVE_OFF:
-				printf(" OFF");
+			case IEEE80211_AUTH_WPA:
+				ireq.i_type = IEEE80211_IOC_WPA;
+				if (ioctl(s, SIOCG80211, &ireq) != -1)
+					wpa = ireq.i_val;
+				if (!wpa)
+					wpa = 1;	/* default to WPA1 */
+				switch (wpa) {
+				case 2:
+					LINE_CHECK("%cauthmode WPA2/802.11i",
+						spacer);
+					break;
+				case 3:
+					LINE_CHECK("%cauthmode WPA1+WPA2/802.11i",
+						spacer);
+					break;
+				default:
+					LINE_CHECK("%cauthmode WPA", spacer);
+					break;
+				}
 				break;
-			case IEEE80211_POWERSAVE_CAM:
-				printf(" CAM");
-				break;
-			case IEEE80211_POWERSAVE_PSP:
-				printf(" PSP");
-				break;
-			case IEEE80211_POWERSAVE_PSP_CAM:
-				printf(" PSP-CAM");
-				break;
-		}
-
-		ireq.i_type = IEEE80211_IOC_POWERSAVESLEEP;
-		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			if (ireq.i_val)
-				printf(" powersavesleep %d", ireq.i_val);
-		}
-	}
-
-	printf("\n");
-
-	spacer = '\t';
-	ireq.i_type = IEEE80211_IOC_RTSTHRESHOLD;
-	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%crtsthreshold %d", spacer, ireq.i_val);
-		spacer = ' ';
-	}
-
-	ireq.i_type = IEEE80211_IOC_PROTMODE;
-	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%cprotmode", spacer);
-		switch (ireq.i_val) {
-			case IEEE80211_PROTMODE_OFF:
-				printf(" OFF");
-				break;
-			case IEEE80211_PROTMODE_CTS:
-				printf(" CTS");
-				break;
-			case IEEE80211_PROTMODE_RTSCTS:
-				printf(" RTSCTS");
+			case IEEE80211_AUTH_AUTO:
+				LINE_CHECK("%cauthmode AUTO", spacer);
 				break;
 			default:
-				printf(" UNKNOWN");
+				LINE_CHECK("%cauthmode UNKNOWN (0x%x)",
+					spacer, ireq.i_val);
 				break;
 		}
-		spacer = ' ';
 	}
 
-	ireq.i_type = IEEE80211_IOC_TXPOWER;
-	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%ctxpower %d", spacer, ireq.i_val);
-		spacer = ' ';
-	}
-
-	if (spacer != '\t')
-		printf("\n");
-
 	ireq.i_type = IEEE80211_IOC_WEP;
 	if (ioctl(s, SIOCG80211, &ireq) != -1 &&
 	    ireq.i_val != IEEE80211_WEP_NOSUP) {
-		printf("\twepmode");
-		switch (ireq.i_val) {
+		int firstkey, wepmode;
+
+		wepmode = ireq.i_val;
+		switch (wepmode) {
 			case IEEE80211_WEP_OFF:
-				printf(" OFF");
+				LINE_CHECK("%cprivacy OFF", spacer);
 				break;
 			case IEEE80211_WEP_ON:
-				printf(" ON");
+				LINE_CHECK("%cprivacy ON", spacer);
 				break;
 			case IEEE80211_WEP_MIXED:
-				printf(" MIXED");
+				LINE_CHECK("%cprivacy MIXED", spacer);
 				break;
 			default:
-				printf(" UNKNOWN");
+				LINE_CHECK("%cprivacy UNKNOWN (0x%x)",
+					spacer, wepmode);
 				break;
 		}
 
@@ -491,7 +1421,10 @@
 			warn("WEP support, but no tx key!");
 			goto end;
 		}
-		printf(" weptxkey %d", ireq.i_val+1);
+		if (ireq.i_val != -1)
+			LINE_CHECK("%cdeftxkey %d", spacer, ireq.i_val+1);
+		else if (wepmode != IEEE80211_WEP_OFF || verbose)
+			LINE_CHECK("%cdeftxkey UNDEF", spacer);
 
 		ireq.i_type = IEEE80211_IOC_NUMWEPKEYS;
 		if (ioctl(s, SIOCG80211, &ireq) < 0) {
@@ -500,28 +1433,201 @@
 		}
 		num = ireq.i_val;
 
-		printf("\n");
-
-		ireq.i_type = IEEE80211_IOC_WEPKEY;
-		spacer = '\t';
+		firstkey = 1;
 		for (i = 0; i < num; i++) {
-			ireq.i_val = i;
+			struct ieee80211req_key ik;
+
+			memset(&ik, 0, sizeof(ik));
+			ik.ik_keyix = i;
+			ireq.i_type = IEEE80211_IOC_WPAKEY;
+			ireq.i_data = &ik;
+			ireq.i_len = sizeof(ik);
 			if (ioctl(s, SIOCG80211, &ireq) < 0) {
 				warn("WEP support, but can get keys!");
 				goto end;
 			}
-			if (ireq.i_len == 0 ||
-			    ireq.i_len > IEEE80211_KEYBUF_SIZE)
-				continue;
-			printf("%cwepkey %d:%s", spacer, i+1,
-			    ireq.i_len <= 5 ? "40-bit" :
-			    ireq.i_len <= 13 ? "104-bit" : "128-bit");
-			if (spacer == '\t')
+			if (ik.ik_keylen != 0) {
+				if (verbose)
+					LINE_BREAK();
+				printkey(&ik);
+				firstkey = 0;
+			}
+		}
+	}
+
+	ireq.i_type = IEEE80211_IOC_POWERSAVE;
+	if (ioctl(s, SIOCG80211, &ireq) != -1 &&
+	    ireq.i_val != IEEE80211_POWERSAVE_NOSUP ) {
+		if (ireq.i_val != IEEE80211_POWERSAVE_OFF || verbose) {
+			switch (ireq.i_val) {
+				case IEEE80211_POWERSAVE_OFF:
+					LINE_CHECK("%cpowersavemode OFF",
+						spacer);
+					break;
+				case IEEE80211_POWERSAVE_CAM:
+					LINE_CHECK("%cpowersavemode CAM",
+						spacer);
+					break;
+				case IEEE80211_POWERSAVE_PSP:
+					LINE_CHECK("%cpowersavemode PSP",
+						spacer);
+					break;
+				case IEEE80211_POWERSAVE_PSP_CAM:
+					LINE_CHECK("%cpowersavemode PSP-CAM",
+						spacer);
+					break;
+			}
+			ireq.i_type = IEEE80211_IOC_POWERSAVESLEEP;
+			if (ioctl(s, SIOCG80211, &ireq) != -1)
+				LINE_CHECK("%cpowersavesleep %d",
+					spacer, ireq.i_val);
+		}
+	}
+
+	ireq.i_type = IEEE80211_IOC_TXPOWMAX;
+	if (ioctl(s, SIOCG80211, &ireq) != -1)
+		LINE_CHECK("%ctxpowmax %d", spacer, ireq.i_val);
+
+	if (verbose) {
+		ireq.i_type = IEEE80211_IOC_TXPOWER;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			LINE_CHECK("%ctxpower %d", spacer, ireq.i_val);
+	}
+
+	ireq.i_type = IEEE80211_IOC_RTSTHRESHOLD;
+	if (ioctl(s, SIOCG80211, &ireq) != -1) {
+		if (ireq.i_val != IEEE80211_RTS_MAX || verbose)
+			LINE_CHECK("%crtsthreshold %d", spacer, ireq.i_val);
+	}
+
+	if (IEEE80211_IS_CHAN_G(c) || IEEE80211_IS_CHAN_PUREG(c) || verbose) {
+		ireq.i_type = IEEE80211_IOC_PROTMODE;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			switch (ireq.i_val) {
+				case IEEE80211_PROTMODE_OFF:
+					LINE_CHECK("%cprotmode OFF", spacer);
+					break;
+				case IEEE80211_PROTMODE_CTS:
+					LINE_CHECK("%cprotmode CTS", spacer);
+					break;
+				case IEEE80211_PROTMODE_RTSCTS:
+					LINE_CHECK("%cprotmode RTSCTS", spacer);
+					break;
+				default:
+					LINE_CHECK("%cprotmode UNKNOWN (0x%x)",
+						spacer, ireq.i_val);
+					break;
+			}
+		}
+	}
+
+	ireq.i_type = IEEE80211_IOC_WME;
+	if (ioctl(s, SIOCG80211, &ireq) != -1) {
+		wme = ireq.i_val;
+		if (wme)
+			LINE_CHECK("%cwme", spacer);
+		else if (verbose)
+			LINE_CHECK("%c-wme", spacer);
+	} else
+		wme = 0;
+
+	if (opmode == IEEE80211_M_HOSTAP) {
+		ireq.i_type = IEEE80211_IOC_HIDESSID;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			if (ireq.i_val)
+				LINE_CHECK("%cssid HIDE", spacer);
+			else if (verbose)
+				LINE_CHECK("%cssid SHOW", spacer);
+		}
+
+		ireq.i_type = IEEE80211_IOC_APBRIDGE;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			if (!ireq.i_val)
+				LINE_CHECK("%c-apbridge", spacer);
+			else if (verbose)
+				LINE_CHECK("%capbridge", spacer);
+		}
+
+		ireq.i_type = IEEE80211_IOC_DTIM_PERIOD;
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			LINE_CHECK("%cdtimperiod %u", spacer, ireq.i_val);
+	} else {
+		ireq.i_type = IEEE80211_IOC_ROAMING;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			if (ireq.i_val != IEEE80211_ROAMING_AUTO || verbose) {
+				switch (ireq.i_val) {
+				case IEEE80211_ROAMING_DEVICE:
+					LINE_CHECK("%croaming DEVICE", spacer);
+					break;
+				case IEEE80211_ROAMING_AUTO:
+					LINE_CHECK("%croaming AUTO", spacer);
+					break;
+				case IEEE80211_ROAMING_MANUAL:
+					LINE_CHECK("%croaming MANUAL", spacer);
+					break;
+				default:
+					LINE_CHECK("%croaming UNKNOWN (0x%x)",
+						spacer, ireq.i_val);
+					break;
+				}
+			}
+		}
+	}
+	ireq.i_type = IEEE80211_IOC_BEACON_INTERVAL;
+	if (ioctl(s, SIOCG80211, &ireq) != -1) {
+		if (ireq.i_val)
+			LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
+		else if (verbose)
+			LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
+	}
+
+	if (wme && verbose) {
+		LINE_BREAK();
+		list_wme(s);
+	}
+
+	if (wpa) {
+		ireq.i_type = IEEE80211_IOC_COUNTERMEASURES;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			if (ireq.i_val)
+				LINE_CHECK("%ccountermeasures", spacer);
+			else if (verbose)
+				LINE_CHECK("%c-countermeasures", spacer);
+		}
+#if 0
+		/* XXX not interesting with WPA done in user space */
+		ireq.i_type = IEEE80211_IOC_KEYMGTALGS;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+		}
+
+		ireq.i_type = IEEE80211_IOC_MCASTCIPHER;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			printf("%cmcastcipher ", spacer);
+			printcipher(s, &ireq, IEEE80211_IOC_MCASTKEYLEN);
+			spacer = ' ';
+		}
+
+		ireq.i_type = IEEE80211_IOC_UCASTCIPHER;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
+			printf("%cucastcipher ", spacer);
+			printcipher(s, &ireq, IEEE80211_IOC_UCASTKEYLEN);
+		}
+
+		if (wpa & 2) {
+			ireq.i_type = IEEE80211_IOC_RSNCAPS;
+			if (ioctl(s, SIOCG80211, &ireq) != -1) {
+				printf("%cRSN caps 0x%x", spacer, ireq.i_val);
 				spacer = ' ';
+			}
+		}
+
+		ireq.i_type = IEEE80211_IOC_UCASTCIPHERS;
+		if (ioctl(s, SIOCG80211, &ireq) != -1) {
 		}
-		if (spacer == ' ')
-			printf("\n");
+#endif
+		LINE_BREAK();
 	}
+	LINE_BREAK();
 
 end:
 	return;
@@ -623,3 +1729,79 @@
 	}
 }
 
+static struct cmd ieee80211_cmds[] = {
+	DEF_CMD_ARG("ssid",		set80211ssid),
+	DEF_CMD_ARG("nwid",		set80211ssid),
+	DEF_CMD_ARG("stationname",	set80211stationname),
+	DEF_CMD_ARG("station",		set80211stationname),	/* BSD/OS */
+	DEF_CMD_ARG("channel",		set80211channel),
+	DEF_CMD_ARG("authmode",		set80211authmode),
+	DEF_CMD_ARG("powersavemode",	set80211powersavemode),
+	DEF_CMD("powersave",	1,	set80211powersave),
+	DEF_CMD("-powersave",	0,	set80211powersave),
+	DEF_CMD_ARG("powersavesleep", 	set80211powersavesleep),
+	DEF_CMD_ARG("wepmode",		set80211wepmode),
+	DEF_CMD("wep",		1,	set80211wep),
+	DEF_CMD("-wep",		0,	set80211wep),
+	DEF_CMD_ARG("deftxkey",		set80211weptxkey),
+	DEF_CMD_ARG("weptxkey",		set80211weptxkey),
+	DEF_CMD_ARG("wepkey",		set80211wepkey),
+	DEF_CMD_ARG("nwkey",		set80211nwkey),		/* NetBSD */
+	DEF_CMD("-nwkey",	0,	set80211wep),		/* NetBSD */
+	DEF_CMD_ARG("rtsthreshold",	set80211rtsthreshold),
+	DEF_CMD_ARG("protmode",		set80211protmode),
+	DEF_CMD_ARG("txpower",		set80211txpower),
+	DEF_CMD_ARG("roaming",		set80211roaming),
+	DEF_CMD("wme",		1,	set80211wme),
+	DEF_CMD("-wme",		0,	set80211wme),
+	DEF_CMD("hidessid",	1,	set80211hidessid),
+	DEF_CMD("-hidessid",	0,	set80211hidessid),
+	DEF_CMD("apbridge",	1,	set80211apbridge),
+	DEF_CMD("-apbridge",	0,	set80211apbridge),
+	DEF_CMD_ARG("chanlist",		set80211chanlist),
+	DEF_CMD_ARG("bssid",		set80211bssid),
+	DEF_CMD_ARG("ap",		set80211bssid),
+	DEF_CMD("scan",	0,		set80211scan),
+	DEF_CMD_ARG("list",		set80211list),
+	DEF_CMD_ARG2("cwmin",		set80211cwmin),
+	DEF_CMD_ARG2("cwmax",		set80211cwmax),
+	DEF_CMD_ARG2("aifs",		set80211aifs),
+	DEF_CMD_ARG2("txoplimit",	set80211txoplimit),
+	DEF_CMD("acm",		1,	set80211acm),
+	DEF_CMD("-acm",		0,	set80211acm),
+	DEF_CMD("ack",		1,	set80211ackpolicy),
+	DEF_CMD("-ack",		0,	set80211ackpolicy),
+	DEF_CMD_ARG2("bss:cwmin",	set80211bsscwmin),
+	DEF_CMD_ARG2("bss:cwmax",	set80211bsscwmax),
+	DEF_CMD_ARG2("bss:aifs",	set80211bssaifs),
+	DEF_CMD_ARG2("bss:txoplimit",	set80211bsstxoplimit),
+	DEF_CMD_ARG("dtimperiod",	set80211dtimperiod),
+	DEF_CMD_ARG("bintval",		set80211bintval),
+	DEF_CMD("mac:open",	IEEE80211_MACCMD_POLICY_OPEN,	set80211maccmd),
+	DEF_CMD("mac:allow",	IEEE80211_MACCMD_POLICY_ALLOW,	set80211maccmd),
+	DEF_CMD("mac:deny",	IEEE80211_MACCMD_POLICY_DENY,	set80211maccmd),
+	DEF_CMD("mac:flush",	IEEE80211_MACCMD_FLUSH,		set80211maccmd),
+	DEF_CMD("mac:detach",	IEEE80211_MACCMD_DETACH,	set80211maccmd),
+	DEF_CMD_ARG("mac:add",		set80211addmac),
+	DEF_CMD_ARG("mac:del",		set80211delmac),
+#if 0
+	DEF_CMD_ARG("mac:kick",		set80211kickmac),
+#endif
+};
+static struct afswtch af_ieee80211 = {
+	.af_name	= "af_ieee80211",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = ieee80211_status,
+};
+
+static __constructor void
+ieee80211_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(ieee80211_cmds);  i++)
+		cmd_register(&ieee80211_cmds[i]);
+	af_register(&af_ieee80211);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifmac.c src/sbin/ifconfig/ifmac.c
--- src.preview/sbin/ifconfig/ifmac.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifmac.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 2001 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by NAI Labs, the
+ * Security Research Division of Network Associates, Inc. under
+ * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
+ * CHATS research program.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ifconfig.h"
+
+static void
+maclabel_status(int s)
+{
+	struct ifreq ifr;
+	mac_t label;
+	char *label_text;
+
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+	if (mac_prepare_ifnet_label(&label) == -1)
+		return;
+	ifr.ifr_ifru.ifru_data = (void *)label;
+	if (ioctl(s, SIOCGIFMAC, &ifr) == -1)
+		goto mac_free;
+
+	
+	if (mac_to_text(label, &label_text) == -1)
+		goto mac_free;
+
+	if (strlen(label_text) != 0)
+		printf("\tmaclabel %s\n", label_text);
+	free(label_text);
+
+mac_free:
+	mac_free(label);
+}
+
+static void
+setifmaclabel(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	struct ifreq ifr;
+	mac_t label;
+	int error;
+
+	if (mac_from_text(&label, val) == -1) {
+		perror(val);
+		return;
+	}
+
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+	ifr.ifr_ifru.ifru_data = (void *)label;
+
+	error = ioctl(s, SIOCSIFMAC, &ifr);
+	mac_free(label);
+	if (error == -1)
+		perror("setifmac");
+}
+
+static struct cmd mac_cmds[] = {
+	DEF_CMD_ARG("maclabel",	setifmaclabel),
+};
+static struct afswtch af_mac = {
+	.af_name	= "af_maclabel",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = maclabel_status,
+};
+
+static __constructor void
+mac_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(mac_cmds);  i++)
+		cmd_register(&mac_cmds[i]);
+	af_register(&af_mac);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifmedia.c src/sbin/ifconfig/ifmedia.c
--- src.preview/sbin/ifconfig/ifmedia.c	2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifmedia.c	2005-09-27 15:02:10.000000000 -0400
@@ -1,6 +1,5 @@
 /*	$NetBSD: ifconfig.c,v 1.34 1997/04/21 01:17:58 lukem Exp $	*/
-/* $FreeBSD: src/sbin/ifconfig/ifmedia.c,v 1.6.2.3 2001/11/14 04:35:07 yar Exp $ */
-/* $DragonFly: src/sbin/ifconfig/ifmedia.c,v 1.8 2005/03/06 05:01:59 dillon Exp $ */
+/* $FreeBSD$ */
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
@@ -90,24 +89,6 @@
 
 #include "ifconfig.h"
 
-#ifndef IFM_SUBTYPE_IEEE80211_MODE_DESCRIPTIONS
-  #define IFM_SUBTYPE_IEEE80211_MODE_DESCRIPTIONS {                       \
-        { IFM_AUTO, "autoselect" },                                     \
-        { IFM_IEEE80211_11A, "11a" },                                   \
-        { IFM_IEEE80211_11B, "11b" },                                   \
-        { IFM_IEEE80211_11G, "11g" },                                   \
-        { IFM_IEEE80211_FH, "fh" },                                     \
-        { 0, NULL },                                                    \
-}
-#endif
-
-#ifndef IFM_SUBTYPE_IEEE80211_MODE_ALIASES
-  #define IFM_SUBTYPE_IEEE80211_MODE_ALIASES {                            \
-        { IFM_AUTO, "auto" },                                           \
-        { 0, NULL },                                                    \
-}
-#endif
-
 static void	domediaopt(const char *, int, int);
 static int	get_media_subtype(int, const char *);
 static int	get_media_mode(int, const char *);
@@ -121,8 +102,8 @@
 static struct ifmedia_description *get_subtype_desc(int,
     struct ifmedia_type_to_subtype *ttos);
 
-void
-media_status(int s, struct rt_addrinfo *info __unused)
+static void
+media_status(int s)
 {
 	struct ifmediareq ifmr;
 	int *media_list, i;
@@ -179,14 +160,12 @@
 				printf("no ring");
 			break;
 
-#if notyet
 		case IFM_ATM:
 			if (ifmr.ifm_status & IFM_ACTIVE)
 				printf("active");
 			else
 				printf("no carrier");
 			break;
-#endif
 
 		case IFM_IEEE80211:
 			/* XXX: Different value for adhoc? */
@@ -211,29 +190,72 @@
 	free(media_list);
 }
 
-void
-setmedia(const char *val, int d __unused, int s,
-	 const struct afswtch *afp __unused)
+static struct ifmediareq *
+getifmediastate(int s)
 {
-	struct ifmediareq ifmr;
-	int first_type, subtype;
+	static struct ifmediareq *ifmr = NULL;
+	int *mwords;
 
-	(void) memset(&ifmr, 0, sizeof(ifmr));
-	(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+	if (ifmr == NULL) {
+		ifmr = (struct ifmediareq *)malloc(sizeof(struct ifmediareq));
+		if (ifmr == NULL)
+			err(1, "malloc");
+
+		(void) memset(ifmr, 0, sizeof(struct ifmediareq));
+		(void) strncpy(ifmr->ifm_name, name,
+		    sizeof(ifmr->ifm_name));
+
+		ifmr->ifm_count = 0;
+		ifmr->ifm_ulist = NULL;
 
-	ifmr.ifm_count = 1;
-	ifmr.ifm_ulist = &first_type;
-	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
 		/*
-		 * If we get E2BIG, the kernel is telling us
-		 * that there are more, so we can ignore it.
+		 * We must go through the motions of reading all
+		 * supported media because we need to know both
+		 * the current media type and the top-level type.
 		 */
-		if (errno != E2BIG)
+
+		if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0) {
+			err(1, "SIOCGIFMEDIA");
+		}
+
+		if (ifmr->ifm_count == 0)
+			errx(1, "%s: no media types?", name);
+
+		mwords = (int *)malloc(ifmr->ifm_count * sizeof(int));
+		if (mwords == NULL)
+			err(1, "malloc");
+  
+		ifmr->ifm_ulist = mwords;
+		if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0)
 			err(1, "SIOCGIFMEDIA");
 	}
 
-	if (ifmr.ifm_count == 0)
-		errx(1, "%s: no media types?", name);
+	return ifmr;
+}
+
+static void
+setifmediacallback(int s, void *arg)
+{
+	struct ifmediareq *ifmr = (struct ifmediareq *)arg;
+	static int did_it = 0;
+
+	if (!did_it) {
+		if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
+			err(1, "SIOCSIFMEDIA (media)");
+		free(ifmr->ifm_ulist);
+		free(ifmr);
+		did_it = 1;
+	}
+}
+
+static void
+setmedia(const char *val, int d, int s, const struct afswtch *afp)
+{
+	struct ifmediareq *ifmr;
+	int subtype;
+	
+
+	ifmr = getifmediastate(s);
 
 	/*
 	 * We are primarily concerned with the top-level type.
@@ -244,27 +266,29 @@
 	 * (I'm assuming that all supported media types for a given
 	 * interface will be the same top-level type..)
 	 */
-	subtype = get_media_subtype(IFM_TYPE(first_type), val);
+	subtype = get_media_subtype(IFM_TYPE(ifmr->ifm_ulist[0]), val);
 
 	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-	ifr.ifr_media = (ifmr.ifm_current & ~(IFM_NMASK|IFM_TMASK)) |
-	    IFM_TYPE(first_type) | subtype;
+	ifr.ifr_media = (ifmr->ifm_current & ~(IFM_NMASK|IFM_TMASK)) |
+	    IFM_TYPE(ifmr->ifm_ulist[0]) | subtype;
+
+	if ((ifr.ifr_media & IFM_TMASK) == 0) {
+		ifr.ifr_media &= ~IFM_GMASK;
+	}
 
-	if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
-		err(1, "SIOCSIFMEDIA (media)");
+	ifmr->ifm_current = ifr.ifr_media;
+	callback_register(setifmediacallback, (void *)ifmr);
 }
 
-void
-setmediaopt(const char *val, int d __unused, int s,
-	    const struct afswtch *afp __unused)
+static void
+setmediaopt(const char *val, int d, int s, const struct afswtch *afp)
 {
 
 	domediaopt(val, 0, s);
 }
 
-void
-unsetmediaopt(const char *val, int d __unused, int s,
-	      const struct afswtch *afp __unused)
+static void
+unsetmediaopt(const char *val, int d, int s, const struct afswtch *afp)
 {
 
 	domediaopt(val, 1, s);
@@ -273,87 +297,40 @@
 static void
 domediaopt(const char *val, int clear, int s)
 {
-	struct ifmediareq ifmr;
-	int *mwords, options;
+	struct ifmediareq *ifmr;
+	int options;
 
-	(void) memset(&ifmr, 0, sizeof(ifmr));
-	(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+	ifmr = getifmediastate(s);
 
-	/*
-	 * We must go through the motions of reading all
-	 * supported media because we need to know both
-	 * the current media type and the top-level type.
-	 */
-
-	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
-		err(1, "SIOCGIFMEDIA");
-
-	if (ifmr.ifm_count == 0)
-		errx(1, "%s: no media types?", name);
-
-	mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
-	if (mwords == NULL)
-		err(1, "malloc");
-
-	ifmr.ifm_ulist = mwords;
-	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
-		err(1, "SIOCGIFMEDIA");
-
-	options = get_media_options(IFM_TYPE(mwords[0]), val);
-
-	free(mwords);
+	options = get_media_options(IFM_TYPE(ifmr->ifm_ulist[0]), val);
 
 	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-	ifr.ifr_media = ifmr.ifm_current;
+	ifr.ifr_media = ifmr->ifm_current;
 	if (clear)
 		ifr.ifr_media &= ~options;
 	else
 		ifr.ifr_media |= options;
 
-	if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
-		err(1, "SIOCSIFMEDIA (mediaopt)");
+	ifmr->ifm_current = ifr.ifr_media;
+	callback_register(setifmediacallback, (void *)ifmr);
 }
 
 
-void
-setmediamode(const char *val, int d __unused, int s,
-	const struct afswtch *afp __unused)
+static void
+setmediamode(const char *val, int d, int s, const struct afswtch *afp)
 {
-	struct ifmediareq ifmr;
-	int *mwords, mode;
-
-	(void) memset(&ifmr, 0, sizeof(ifmr));
-	(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
-
-	/*
-	 * We must go through the motions of reading all
-	 * supported media because we need to know both
-	 * the current media type and the top-level type.
-	 */
+	struct ifmediareq *ifmr;
+	int mode;
 
-	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
-		err(1, "SIOCGIFMEDIA");
-
-	if (ifmr.ifm_count == 0)
-		errx(1, "%s: no media types?", name);
-
-	mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
-	if (mwords == NULL)
-		err(1, "malloc");
-
-	ifmr.ifm_ulist = mwords;
-	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
-		err(1, "SIOCGIFMEDIA");
-
-	mode = get_media_mode(IFM_TYPE(mwords[0]), val);
+	ifmr = getifmediastate(s);
 
-	free(mwords);
+	mode = get_media_mode(IFM_TYPE(ifmr->ifm_ulist[0]), val);
 
 	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-	ifr.ifr_media = (ifmr.ifm_current & ~IFM_MMASK) | mode;
+	ifr.ifr_media = (ifmr->ifm_current & ~IFM_MMASK) | mode;
 
-	if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
-		err(1, "SIOCSIFMEDIA (mode)");
+	ifmr->ifm_current = ifr.ifr_media;
+	callback_register(setifmediacallback, (void *)ifmr);
 }
 
 /**********************************************************************
@@ -405,7 +382,6 @@
 struct ifmedia_description ifm_subtype_ieee80211_mode_aliases[] =
     IFM_SUBTYPE_IEEE80211_MODE_ALIASES;
 
-#if notyet
 static struct ifmedia_description ifm_subtype_atm_descriptions[] =
     IFM_SUBTYPE_ATM_DESCRIPTIONS;
 
@@ -414,7 +390,6 @@
 
 static struct ifmedia_description ifm_subtype_atm_option_descriptions[] =
     IFM_SUBTYPE_ATM_OPTION_DESCRIPTIONS;
-#endif
 
 static struct ifmedia_description ifm_subtype_shared_descriptions[] =
     IFM_SUBTYPE_SHARED_DESCRIPTIONS;
@@ -516,17 +491,13 @@
 		{
 			{ &ifm_subtype_shared_descriptions[0], 0 },
 			{ &ifm_subtype_shared_aliases[0], 1 },
-#if notyet
 			{ &ifm_subtype_atm_descriptions[0], 0 },
 			{ &ifm_subtype_atm_aliases[0], 1 },
-#endif
 			{ NULL, 0 },
 		},
 		{
 			{ &ifm_shared_option_descriptions[0], 0 },
-#if notyet
 			{ &ifm_subtype_atm_option_descriptions[0], 0 },
-#endif
 			{ NULL, 0 },
 		},
 		{
@@ -808,3 +779,27 @@
 /**********************************************************************
  * ...until here.
  **********************************************************************/
+
+static struct cmd media_cmds[] = {
+	DEF_CMD_ARG("media",	setmedia),
+	DEF_CMD_ARG("mode",	setmediamode),
+	DEF_CMD_ARG("mediaopt",	setmediaopt),
+	DEF_CMD_ARG("-mediaopt",unsetmediaopt),
+};
+static struct afswtch af_media = {
+	.af_name	= "af_media",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = media_status,
+};
+
+static __constructor void
+ifmedia_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(media_cmds);  i++)
+		cmd_register(&media_cmds[i]);
+	af_register(&af_media);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifpfsync.c src/sbin/ifconfig/ifpfsync.c
--- src.preview/sbin/ifconfig/ifpfsync.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifpfsync.c	2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2003 Ryan McBride. All rights reserved.
+ * Copyright (c) 2004 Max Laier. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <netinet/in.h>
+#include <net/pfvar.h>
+#include <net/if_pfsync.h>
+#include <net/route.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ifconfig.h"
+
+void setpfsync_syncif(const char *, int, int, const struct afswtch *rafp);
+void unsetpfsync_syncif(const char *, int, int, const struct afswtch *rafp);
+void setpfsync_maxupd(const char *, int, int, const struct afswtch *rafp);
+void pfsync_status(int);
+
+void
+setpfsync_syncif(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	struct pfsyncreq preq;
+
+	bzero((char *)&preq, sizeof(struct pfsyncreq));
+	ifr.ifr_data = (caddr_t)&preq;
+
+	if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGETPFSYNC");
+
+	strlcpy(preq.pfsyncr_syncif, val, sizeof(preq.pfsyncr_syncif));
+
+	if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSETPFSYNC");
+}
+
+void
+unsetpfsync_syncif(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	struct pfsyncreq preq;
+
+	bzero((char *)&preq, sizeof(struct pfsyncreq));
+	ifr.ifr_data = (caddr_t)&preq;
+
+	if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGETPFSYNC");
+
+	bzero((char *)&preq.pfsyncr_syncif, sizeof(preq.pfsyncr_syncif));
+
+	if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSETPFSYNC");
+}
+
+void
+setpfsync_maxupd(const char *val, int d, int s, const struct afswtch *rafp)
+{
+	int maxupdates;
+	struct pfsyncreq preq;
+
+	maxupdates = atoi(val);
+
+	memset((char *)&preq, 0, sizeof(struct pfsyncreq));
+	ifr.ifr_data = (caddr_t)&preq;
+
+	if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGETPFSYNC");
+
+	preq.pfsyncr_maxupdates = maxupdates;
+
+	if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSETPFSYNC");
+}
+
+void
+pfsync_status(int s)
+{
+	struct pfsyncreq preq;
+
+	bzero((char *)&preq, sizeof(struct pfsyncreq));
+	ifr.ifr_data = (caddr_t)&preq;
+
+	if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+		return;
+
+	if (preq.pfsyncr_syncif[0] != '\0') {
+		printf("\tpfsync: syncif: %s maxupd: %d\n",
+		    preq.pfsyncr_syncif, preq.pfsyncr_maxupdates);
+	}
+}
+
+static struct cmd pfsync_cmds[] = {
+	DEF_CMD_ARG("syncif",		setpfsync_syncif),
+	DEF_CMD_ARG("maxupd",		setpfsync_maxupd),
+	DEF_CMD("-syncif",	1,	unsetpfsync_syncif),
+};
+static struct afswtch af_pfsync = {
+	.af_name	= "af_pfsync",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = pfsync_status,
+};
+
+static __constructor void
+pfsync_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(pfsync_cmds);  i++)
+	af_register(&af_pfsync);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifvlan.c src/sbin/ifconfig/ifvlan.c
--- src.preview/sbin/ifconfig/ifvlan.c	2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifvlan.c	2005-09-27 15:02:10.000000000 -0400
@@ -28,9 +28,6 @@
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD: src/sbin/ifconfig/ifvlan.c,v 1.2 1999/08/28 00:13:09 peter Exp $
- * $DragonFly: src/sbin/ifconfig/ifvlan.c,v 1.6 2005/03/06 05:01:59 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -61,7 +58,8 @@
 static int			__tag = 0;
 static int			__have_tag = 0;
 
-void vlan_status(int s, struct rt_addrinfo *info __unused)
+static void
+vlan_status(int s)
 {
 	struct vlanreq		vreq;
 
@@ -78,8 +76,8 @@
 	return;
 }
 
-void setvlantag(const char *val, int d __unused, int s,
-		const struct afswtch *afp __unused)
+static void
+setvlantag(const char *val, int d, int s, const struct afswtch	*afp)
 {
 	u_int16_t		tag;
 	struct vlanreq		vreq;
@@ -101,8 +99,8 @@
 	return;
 }
 
-void setvlandev(const char *val, int d __unused, int s,
-		const struct afswtch *afp __unused)
+static void
+setvlandev(const char *val, int d, int s, const struct afswtch	*afp)
 {
 	struct vlanreq		vreq;
 
@@ -124,8 +122,8 @@
 	return;
 }
 
-void unsetvlandev(const char *val __unused, int d __unused, int s,
-		  const struct afswtch *afp __unused)
+static void
+unsetvlandev(const char *val, int d, int s, const struct afswtch *afp)
 {
 	struct vlanreq		vreq;
 
@@ -143,3 +141,30 @@
 
 	return;
 }
+
+static struct cmd vlan_cmds[] = {
+	DEF_CMD_ARG("vlan",				setvlantag),
+	DEF_CMD_ARG("vlandev",				setvlandev),
+	DEF_CMD_ARG("-vlandev",				unsetvlandev),
+	DEF_CMD("vlanmtu",	IFCAP_VLAN_MTU,		setifcap),
+	DEF_CMD("-vlanmtu",	-IFCAP_VLAN_MTU,	setifcap),
+	DEF_CMD("vlanhwtag",	IFCAP_VLAN_HWTAGGING,	setifcap),
+	DEF_CMD("-vlanhwtag",	-IFCAP_VLAN_HWTAGGING,	setifcap),
+};
+static struct afswtch af_vlan = {
+	.af_name	= "af_vlan",
+	.af_af		= AF_UNSPEC,
+	.af_other_status = vlan_status,
+};
+
+static __constructor void
+vlan_ctor(void)
+{
+#define	N(a)	(sizeof(a) / sizeof(a[0]))
+	int i;
+
+	for (i = 0; i < N(vlan_cmds);  i++)
+		cmd_register(&vlan_cmds[i]);
+	af_register(&af_vlan);
+#undef N
+}
diff -N -u -r src.preview/sys/bus/cam/scsi/scsi_da.c src/sys/bus/cam/scsi/scsi_da.c
--- src.preview/sys/bus/cam/scsi/scsi_da.c	2005-06-02 17:12:45.000000000 -0400
+++ src/sys/bus/cam/scsi/scsi_da.c	2005-09-23 11:24:22.000000000 -0400
@@ -345,14 +345,6 @@
  	},
 	{
 		/*
-		 * iRiver iFP MP3 player (with UMS Firmware)
-		 * PR: kern/54881, i386/63941, kern/66124
-		 */
-		{T_DIRECT, SIP_MEDIA_REMOVABLE, "iRiver", "iFP*", "*"},
-		/*quirks*/ DA_Q_NO_SYNC_CACHE
- 	},
-	{
-		/*
 		 * Frontier Labs NEX IA+ Digital Audio Player, rev 1.10/0.01
 		 * PR: kern/70158
 		 */
@@ -401,6 +393,14 @@
 #endif /* DA_OLD_QUIRKS */
 	{
 		/*
+		 * iRiver iFP MP3 player (with UMS Firmware)
+		 * PR: kern/54881, i386/63941, kern/66124
+		 */
+		{T_DIRECT, SIP_MEDIA_REMOVABLE, "iRiver", "iFP*", "*"},
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
+ 	},
+	{
+		/*
 		 * EXATELECOM (Sigmatel) i-Bead 100/105 USB Flash MP3 Player
 		 * PR: kern/51675
 		 */
diff -N -u -r src.preview/sys/conf/Makefile.i386 src/sys/conf/Makefile.i386
--- src.preview/sys/conf/Makefile.i386	2005-08-16 22:51:45.000000000 -0400
+++ src/sys/conf/Makefile.i386	2005-09-23 11:24:22.000000000 -0400
@@ -68,6 +68,10 @@
 # include path into 100+ source files.
 INCLUDES+= -I$S/contrib/ipfilter
 
+# This hack lets us use the ath_hal code without spamming a new
+# include path into source files.
+INCLUDES+= -I$S/contrib/dev/ath -I$S/contrib/dev/ath/freebsd
+
 COPTS=	${INCLUDES} ${IDENT} -D_KERNEL -include opt_global.h
 CFLAGS=	${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
 
diff -N -u -r src.preview/sys/conf/files src/sys/conf/files
--- src.preview/sys/conf/files	2005-09-03 21:28:57.000000000 -0400
+++ src/sys/conf/files	2005-09-23 11:24:22.000000000 -0400
@@ -65,6 +65,7 @@
 bus/cam/scsi/scsi_target.c		optional targ
 bus/cam/scsi/scsi_targ_bh.c		optional targbh
 
+contrib/dev/ath/freebsd/ah_osdep.c      optional ath_hal
 contrib/ipfilter/netinet/fil.c		optional ipfilter inet
 contrib/ipfilter/netinet/ip_auth.c	optional ipfilter inet
 contrib/ipfilter/netinet/ip_fil.c	optional ipfilter inet
@@ -144,6 +145,11 @@
 dev/disk/ata/atapi-fd.c			optional atapifd
 dev/disk/ata/atapi-tape.c		optional atapist
 dev/disk/ata/atapi-cam.c		optional atapicam
+dev/netif/ath/if_ath.c                  optional ath
+dev/netif/ath/if_ath_pci.c              optional ath pci
+dev/netif/ath/ath_rate/amrr/amrr.c	optional ath_rate_amrr
+dev/netif/ath/ath_rate/onoe/onoe.c	optional ath_rate_onoe
+dev/netif/ath/ath_rate/sample/sample.c	optional ath_rate_sample
 dev/raid/amr/amr_cam.c			optional amr
 dev/raid/amr/amr_disk.c			optional amr
 dev/raid/amr/amr_pci.c			optional amr
@@ -700,12 +706,18 @@
 net/zlib.c		optional ppp_deflate
 net/zlib.c		optional ipsec
 netproto/802_11/ieee80211.c		optional wlan
+netproto/802_11/ieee80211_acl.c		optional wlan
 netproto/802_11/ieee80211_crypto.c	optional wlan
+netproto/802_11/ieee80211_crypto_none.c	optional wlan
+netproto/802_11/ieee80211_crypto_tkip.c	optional wlan
+netproto/802_11/ieee80211_crypto_wep.c	optional wlan
+netproto/802_11/ieee80211_dragonfly.c	optional wlan
 netproto/802_11/ieee80211_input.c	optional wlan
 netproto/802_11/ieee80211_ioctl.c	optional wlan
 netproto/802_11/ieee80211_node.c	optional wlan
 netproto/802_11/ieee80211_output.c	optional wlan
 netproto/802_11/ieee80211_proto.c	optional wlan
+netproto/802_11/ieee80211_xauth.c	optional wlan
 netproto/atalk/aarp.c		optional netatalk
 netproto/atalk/at_control.c	optional netatalk
 netproto/atalk/at_proto.c	optional netatalk
diff -N -u -r src.preview/sys/conf/files.i386 src/sys/conf/files.i386
--- src.preview/sys/conf/files.i386	2005-08-16 06:31:35.000000000 -0400
+++ src/sys/conf/files.i386	2005-09-23 11:24:22.000000000 -0400
@@ -47,6 +47,16 @@
 	no-obj no-implicit-rule before-depend				\
 	clean		"ukbdmap.h"
 #
+hal.o                           optional        ath_hal                 \
+        dependency      "$S/contrib/dev/ath/public/i386-elf.hal.o.uu"   \
+        compile-with    "uudecode < $S/contrib/dev/ath/public/i386-elf.hal.o.uu" \
+        no-implicit-rule
+opt_ah.h                        optional        ath_hal                 \
+        dependency      "$S/contrib/dev/ath/public/i386-elf.opt_ah.h"   \
+        compile-with    "cp $S/contrib/dev/ath/public/i386-elf.opt_ah.h opt_ah.h" \
+        no-obj no-implicit-rule before-depend                           \
+        clean           "opt_ah.h"
+#
 emulation/linux/linux_file.c	optional	compat_linux
 emulation/linux/linux_getcwd.c	optional	compat_linux
 emulation/linux/linux_ioctl.c	optional	compat_linux
diff -N -u -r src.preview/sys/contrib/dev/ath/COPYRIGHT src/sys/contrib/dev/ath/COPYRIGHT
--- src.preview/sys/contrib/dev/ath/COPYRIGHT	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/COPYRIGHT	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,42 @@
+All files contained in this distribution are covered by the following
+copyright unless explicitly identified otherwise.  Note that this
+copyright does _NOT_ contain a "or GPL" clause and does _NOT_ permit
+redistribution with changes.
+
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: COPYRIGHT,v 1.3 2004/01/07 23:09:27 sam Exp $
+ */
diff -N -u -r src.preview/sys/contrib/dev/ath/README src/sys/contrib/dev/ath/README
--- src.preview/sys/contrib/dev/ath/README	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/README	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,64 @@
+$Id: README,v 1.3 2004/01/07 23:09:27 sam Exp $
+
+
+WARNING: THIS IS A BETA DISTRIBUTION.  THIS SOFTWARE HAS KNOWN PROBLEMS AND
+WARNING: LIMITATIONS THAT WILL BE CORRECTED BEFORE A PRODUCTION RELEASE.
+WARNING: USE AT YOUR OWN RISK!
+
+
+Atheros Hardware Access Layer (HAL)
+===================================
+
+* Copyright (c) 2002-2004 Sam Leffler.
+* Copyright (c) 2002-2004 Atheros Communications, Inc.
+* All rights reserved.
+
+Read the file COPYRIGHT for the complete copyright.
+
+This code manages much of the chip-specific operation of the Atheros driver.
+The HAL is provided in a binary-only form in order to comply with FCC
+regulations.  In particular, a radio transmitter can only be operated at
+power levels and on frequency channels for which it is approved.  The FCC
+requires that a software-defined radio cannot be configured by a user
+to operate outside the approved power levels and frequency channels.
+This makes it difficult to open-source code that enforces limits on
+the power levels, frequency channels and other parameters of the radio
+transmitter.  See
+
+http://ftp.fcc.gov/Bureaus/Engineering_Technology/Orders/2001/fcc01264.pdf
+
+for the specific FCC regulation.  Because the module is provided in a
+binary-only form it is marked "Proprietary"; this means when you load
+it you will see messages that your system is now "tainted".
+
+If you wish to use this driver on a platform for which an ath_hal
+module is not already provided please contact the author.  Note that
+this is only necessary for new _architectures_; the HAL is not tied to
+any specific version of your operating system.
+
+
+Atheros Hardware
+================
+There are currently 3 generations of Atheros 802.11 wireless devices:
+
+5210	supports 11a only
+5211	supports both 11a and 11b
+5212	supports 11a, 11b, and 11g
+
+These parts have been incorporated in a variety of retail products
+including cardbus cards from DLink, Linksys, Netgear, and Proxim; and
+mini-pci cards from some of these same vendors.  In addition many
+laptop vendors use Atheros mini-pci cards for their builtin wireless
+support.  An (incomplete) list of products that use Atheros parts is:
+
+Netgear WAG511		D-Link DWL-AG520	Linksys WPC55AG
+Netgear WAB501		D-Link DWL-AG650	Linksys WMP55AG
+			D-Link DWL-AB650	Linksys WPC51AB
+
+In general, if a device is identified as ``11a only'' it is almost
+certain to contain an Atheros 5210 part in it.  All retail a+b
+products use the 5211.  The latest generation of universal a+b+g
+combo products use the 5212.  When in doubt check the PCI vendor
+id with a tool like lspci, the Atheros vendor id is 0x168c; e.g.
+
+   00:13.0 Ethernet controller: Unknown device 168c:0012 (rev 01)
diff -N -u -r src.preview/sys/contrib/dev/ath/ah.h src/sys/contrib/dev/ath/ah.h
--- src.preview/sys/contrib/dev/ath/ah.h	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah.h	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,691 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah.h,v 1.1.1.6 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _ATH_AH_H_
+#define _ATH_AH_H_
+/*
+ * Atheros Hardware Access Layer
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an ath_hal
+ * structure for use with the device.  Hardware-related operations that
+ * follow must call back into the HAL through interface, supplying the
+ * reference as the first parameter.
+ */
+#include "ah_osdep.h"
+
+/*
+ * __ahdecl is analogous to _cdecl; it defines the calling
+ * convention used within the HAL.  For most systems this
+ * can just default to be empty and the compiler will (should)
+ * use _cdecl.  For systems where _cdecl is not compatible this
+ * must be defined.  See linux/ah_osdep.h for an example.
+ */
+#ifndef __ahdecl
+#define __ahdecl
+#endif
+
+/*
+ * Status codes that may be returned by the HAL.  Note that
+ * interfaces that return a status code set it only when an
+ * error occurs--i.e. you cannot check it for success.
+ */
+typedef enum {
+	HAL_OK		= 0,	/* No error */
+	HAL_ENXIO	= 1,	/* No hardware present */
+	HAL_ENOMEM	= 2,	/* Memory allocation failed */
+	HAL_EIO		= 3,	/* Hardware didn't respond as expected */
+	HAL_EEMAGIC	= 4,	/* EEPROM magic number invalid */
+	HAL_EEVERSION	= 5,	/* EEPROM version invalid */
+	HAL_EELOCKED	= 6,	/* EEPROM unreadable */
+	HAL_EEBADSUM	= 7,	/* EEPROM checksum invalid */
+	HAL_EEREAD	= 8,	/* EEPROM read problem */
+	HAL_EEBADMAC	= 9,	/* EEPROM mac address invalid */
+	HAL_EESIZE	= 10,	/* EEPROM size not supported */
+	HAL_EEWRITE	= 11,	/* Attempt to change write-locked EEPROM */
+	HAL_EINVAL	= 12,	/* Invalid parameter to function */
+	HAL_ENOTSUPP	= 13,	/* Hardware revision not supported */
+	HAL_ESELFTEST	= 14,	/* Hardware self-test failed */
+	HAL_EINPROGRESS	= 15,	/* Operation incomplete */
+} HAL_STATUS;
+
+typedef enum {
+	AH_FALSE = 0,		/* NB: lots of code assumes false is zero */
+	AH_TRUE  = 1,
+} HAL_BOOL;
+
+typedef enum {
+	HAL_CAP_REG_DMN		= 0,	/* current regulatory domain */
+	HAL_CAP_CIPHER		= 1,	/* hardware supports cipher */
+	HAL_CAP_TKIP_MIC	= 2,	/* handle TKIP MIC in hardware */
+	HAL_CAP_TKIP_SPLIT	= 3,	/* hardware TKIP uses split keys */
+	HAL_CAP_PHYCOUNTERS	= 4,	/* hardware PHY error counters */
+	HAL_CAP_DIVERSITY	= 5,	/* hardware supports fast diversity */
+	HAL_CAP_KEYCACHE_SIZE	= 6,	/* number of entries in key cache */
+	HAL_CAP_NUM_TXQUEUES	= 7,	/* number of hardware xmit queues */
+	HAL_CAP_VEOL		= 9,	/* hardware supports virtual EOL */
+	HAL_CAP_PSPOLL		= 10,	/* hardware has working PS-Poll support */
+	HAL_CAP_DIAG		= 11,	/* hardware diagnostic support */
+	HAL_CAP_COMPRESSION	= 12,	/* hardware supports compression */
+	HAL_CAP_BURST		= 13,	/* hardware supports packet bursting */
+	HAL_CAP_FASTFRAME	= 14,	/* hardware supoprts fast frames */
+	HAL_CAP_TXPOW		= 15,	/* global tx power limit  */
+	HAL_CAP_TPC		= 16,	/* per-packet tx power control  */
+} HAL_CAPABILITY_TYPE;
+
+/* 
+ * "States" for setting the LED.  These correspond to
+ * the possible 802.11 operational states and there may
+ * be a many-to-one mapping between these states and the
+ * actual hardware states for the LED's (i.e. the hardware
+ * may have fewer states).
+ */
+typedef enum {
+	HAL_LED_INIT	= 0,
+	HAL_LED_SCAN	= 1,
+	HAL_LED_AUTH	= 2,
+	HAL_LED_ASSOC	= 3,
+	HAL_LED_RUN	= 4
+} HAL_LED_STATE;
+
+/*
+ * Transmit queue types/numbers.  These are used to tag
+ * each transmit queue in the hardware and to identify a set
+ * of transmit queues for operations such as start/stop dma.
+ */
+typedef enum {
+	HAL_TX_QUEUE_INACTIVE	= 0,		/* queue is inactive/unused */
+	HAL_TX_QUEUE_DATA	= 1,		/* data xmit q's */
+	HAL_TX_QUEUE_BEACON	= 2,		/* beacon xmit q */
+	HAL_TX_QUEUE_CAB	= 3,		/* "crap after beacon" xmit q */
+	HAL_TX_QUEUE_PSPOLL	= 4,		/* power-save poll xmit q */
+} HAL_TX_QUEUE;
+
+#define	HAL_NUM_TX_QUEUES	10		/* max possible # of queues */
+
+/*
+ * Transmit queue subtype.  These map directly to
+ * WME Access Categories (except for UPSD).  Refer
+ * to Table 5 of the WME spec.
+ */
+typedef enum {
+	HAL_WME_AC_BK	= 0,			/* background access category */
+	HAL_WME_AC_BE	= 1, 			/* best effort access category*/
+	HAL_WME_AC_VI	= 2,			/* video access category */
+	HAL_WME_AC_VO	= 3,			/* voice access category */
+	HAL_WME_UPSD	= 4,			/* uplink power save */
+} HAL_TX_QUEUE_SUBTYPE;
+
+/*
+ * Transmit queue flags that control various
+ * operational parameters.
+ */
+typedef enum {
+	TXQ_FLAG_TXOKINT_ENABLE	    = 0x0001,    /* enable TXOK interrupt */
+	TXQ_FLAG_TXERRINT_ENABLE    = 0x0001,    /* enable TXERR interrupt */
+	TXQ_FLAG_TXDESCINT_ENABLE   = 0x0002,    /* enable TXDESC interrupt */
+	TXQ_FLAG_TXEOLINT_ENABLE    = 0x0004,    /* enable TXEOL interrupt */
+	TXQ_FLAG_TXURNINT_ENABLE    = 0x0008,    /* enable TXURN interrupt */
+	TXQ_FLAG_BACKOFF_DISABLE    = 0x0010,    /* disable Post Backoff  */
+	TXQ_FLAG_COMPRESSION_ENABLE = 0x0020,    /* compression enabled */
+	TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040, /* enable ready time
+							expiry policy */
+	TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080, /* enable backoff while
+							sending fragment burst*/
+} HAL_TX_QUEUE_FLAGS;
+
+typedef struct {
+	u_int32_t	tqi_ver;		/* hal TXQ version */
+	HAL_TX_QUEUE_SUBTYPE tqi_subtype;	/* subtype if applicable */
+	HAL_TX_QUEUE_FLAGS tqi_qflags;		/* flags (see above) */
+	u_int32_t	tqi_priority;		/* (not used) */
+	u_int32_t	tqi_aifs;		/* aifs */
+	u_int32_t	tqi_cwmin;		/* cwMin */
+	u_int32_t	tqi_cwmax;		/* cwMax */
+	u_int16_t	tqi_shretry;		/* rts retry limit */
+	u_int16_t	tqi_lgretry;		/* long retry limit (not used)*/
+	u_int32_t	tqi_cbrPeriod;
+	u_int32_t	tqi_cbrOverflowLimit;
+	u_int32_t	tqi_burstTime;
+	u_int32_t	tqi_readyTime;
+} HAL_TXQ_INFO;
+
+/* token to use for aifs, cwmin, cwmax */
+#define	HAL_TXQ_USEDEFAULT	((u_int32_t) -1)
+
+/*
+ * Transmit packet types.  This belongs in ah_desc.h, but
+ * is here so we can give a proper type to various parameters
+ * (and not require everyone include the file).
+ *
+ * NB: These values are intentionally assigned for
+ *     direct use when setting up h/w descriptors.
+ */
+typedef enum {
+	HAL_PKT_TYPE_NORMAL	= 0,
+	HAL_PKT_TYPE_ATIM	= 1,
+	HAL_PKT_TYPE_PSPOLL	= 2,
+	HAL_PKT_TYPE_BEACON	= 3,
+	HAL_PKT_TYPE_PROBE_RESP	= 4,
+} HAL_PKT_TYPE;
+
+/* Rx Filter Frame Types */
+typedef enum {
+	HAL_RX_FILTER_UCAST	= 0x00000001,	/* Allow unicast frames */
+	HAL_RX_FILTER_MCAST	= 0x00000002,	/* Allow multicast frames */
+	HAL_RX_FILTER_BCAST	= 0x00000004,	/* Allow broadcast frames */
+	HAL_RX_FILTER_CONTROL	= 0x00000008,	/* Allow control frames */
+	HAL_RX_FILTER_BEACON	= 0x00000010,	/* Allow beacon frames */
+	HAL_RX_FILTER_PROM	= 0x00000020,	/* Promiscuous mode */
+	HAL_RX_FILTER_PROBEREQ	= 0x00000080,	/* Allow probe request frames */
+	HAL_RX_FILTER_PHYERR	= 0x00000100,	/* Allow phy errors */
+	HAL_RX_FILTER_PHYRADAR	= 0x00000200,	/* Allow phy radar errors*/
+} HAL_RX_FILTER;
+
+typedef enum {
+	HAL_PM_UNDEFINED	= 0,
+	HAL_PM_AUTO		= 1,
+	HAL_PM_AWAKE		= 2,
+	HAL_PM_FULL_SLEEP	= 3,
+	HAL_PM_NETWORK_SLEEP	= 4
+} HAL_POWER_MODE;
+
+/*
+ * NOTE WELL:
+ * These are mapped to take advantage of the common locations for many of
+ * the bits on all of the currently supported MAC chips. This is to make
+ * the ISR as efficient as possible, while still abstracting HW differences.
+ * When new hardware breaks this commonality this enumerated type, as well
+ * as the HAL functions using it, must be modified. All values are directly
+ * mapped unless commented otherwise.
+ */
+typedef enum {
+	HAL_INT_RX	= 0x00000001,	/* Non-common mapping */
+	HAL_INT_RXDESC	= 0x00000002,
+	HAL_INT_RXNOFRM	= 0x00000008,
+	HAL_INT_RXEOL	= 0x00000010,
+	HAL_INT_RXORN	= 0x00000020,
+	HAL_INT_TX	= 0x00000040,	/* Non-common mapping */
+	HAL_INT_TXDESC	= 0x00000080,
+	HAL_INT_TXURN	= 0x00000800,
+	HAL_INT_MIB	= 0x00001000,
+	HAL_INT_RXPHY	= 0x00004000,
+	HAL_INT_RXKCM	= 0x00008000,
+	HAL_INT_SWBA	= 0x00010000,
+	HAL_INT_BMISS	= 0x00040000,
+	HAL_INT_BNR	= 0x00100000,	/* Non-common mapping */
+	HAL_INT_GPIO	= 0x01000000,
+	HAL_INT_FATAL	= 0x40000000,	/* Non-common mapping */
+	HAL_INT_GLOBAL	= 0x80000000,	/* Set/clear IER */
+
+	/* Interrupt bits that map directly to ISR/IMR bits */
+	HAL_INT_COMMON  = HAL_INT_RXNOFRM
+			| HAL_INT_RXDESC
+			| HAL_INT_RXEOL
+			| HAL_INT_RXORN
+			| HAL_INT_TXURN
+			| HAL_INT_TXDESC
+			| HAL_INT_MIB
+			| HAL_INT_RXPHY
+			| HAL_INT_RXKCM
+			| HAL_INT_SWBA
+			| HAL_INT_BMISS
+			| HAL_INT_GPIO,
+	HAL_INT_NOCARD	= 0xffffffff	/* To signal the card was removed */
+} HAL_INT;
+
+typedef enum {
+	HAL_RFGAIN_INACTIVE		= 0,
+	HAL_RFGAIN_READ_REQUESTED	= 1,
+	HAL_RFGAIN_NEED_CHANGE		= 2
+} HAL_RFGAIN;
+
+/*
+ * Channels are specified by frequency.
+ */
+typedef struct {
+	u_int16_t	channel;	/* setting in Mhz */
+	u_int16_t	channelFlags;	/* see below */
+} HAL_CHANNEL;
+
+#define	CHANNEL_RAD_INT	0x0001	/* Radar interference detected on channel */
+#define	CHANNEL_CW_INT	0x0002	/* CW interference detected on channel */
+#define	CHANNEL_BUSY	0x0004	/* Busy, occupied or overlap with adjoin chan */
+#define	CHANNEL_TURBO	0x0010	/* Turbo Channel */
+#define	CHANNEL_CCK	0x0020	/* CCK channel */
+#define	CHANNEL_OFDM	0x0040	/* OFDM channel */
+#define	CHANNEL_2GHZ	0x0080	/* 2 GHz spectrum channel. */
+#define	CHANNEL_5GHZ	0x0100	/* 5 GHz spectrum channel */
+#define	CHANNEL_PASSIVE	0x0200	/* Only passive scan allowed in the channel */
+#define	CHANNEL_DYN	0x0400	/* dynamic CCK-OFDM channel */
+#define	CHANNEL_XR	0x0800	/* XR channel */
+#define CHANNEL_AR      0x8000  /* Software use: radar detected */ 
+
+
+#define	CHANNEL_A	(CHANNEL_5GHZ|CHANNEL_OFDM)
+#define	CHANNEL_B	(CHANNEL_2GHZ|CHANNEL_CCK)
+#define	CHANNEL_PUREG	(CHANNEL_2GHZ|CHANNEL_OFDM)
+#ifdef notdef
+#define	CHANNEL_G	(CHANNEL_2GHZ|CHANNEL_DYN)
+#else
+#define	CHANNEL_G	(CHANNEL_2GHZ|CHANNEL_OFDM)
+#endif
+#define	CHANNEL_T	(CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define	CHANNEL_108G	(CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define	CHANNEL_X	(CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
+#define	CHANNEL_ALL \
+	(CHANNEL_OFDM|CHANNEL_CCK|CHANNEL_5GHZ|CHANNEL_2GHZ|CHANNEL_TURBO)
+#define	CHANNEL_ALL_NOTURBO 	(CHANNEL_ALL &~ CHANNEL_TURBO)
+
+typedef struct {
+	u_int32_t	ackrcv_bad;
+	u_int32_t	rts_bad;
+	u_int32_t	rts_good;
+	u_int32_t	fcs_bad;
+	u_int32_t	beacons;
+} HAL_MIB_STATS;
+
+typedef u_int16_t HAL_CTRY_CODE;		/* country code */
+typedef u_int16_t HAL_REG_DOMAIN;		/* regulatory domain code */
+
+enum {
+	CTRY_DEBUG	= 0x1ff,		/* debug country code */
+	CTRY_DEFAULT	= 0			/* default country code */
+};
+
+enum {
+	HAL_MODE_11A	= 0x001,
+	HAL_MODE_TURBO	= 0x002,
+	HAL_MODE_11B	= 0x004,
+	HAL_MODE_PUREG	= 0x008,
+#ifdef notdef
+	HAL_MODE_11G	= 0x010,
+#else
+	HAL_MODE_11G	= 0x008,
+#endif
+	HAL_MODE_108G	= 0x020,
+	HAL_MODE_ALL	= 0xfff
+};
+
+typedef struct {
+	int		rateCount;		/* NB: for proper padding */
+	u_int8_t	rateCodeToIndex[32];	/* back mapping */
+	struct {
+		u_int8_t	valid;		/* valid for rate control use */
+		u_int8_t	phy;		/* CCK/OFDM/XR */
+		u_int16_t	rateKbps;	/* transfer rate in kbs */
+		u_int8_t	rateCode;	/* rate for h/w descriptors */
+		u_int8_t	shortPreamble;	/* mask for enabling short
+						 * preamble in CCK rate code */
+		u_int8_t	dot11Rate;	/* value for supported rates
+						 * info element of MLME */
+		u_int8_t	controlRate;	/* index of next lower basic
+						 * rate; used for dur. calcs */
+		u_int16_t	lpAckDuration;	/* long preamble ACK duration */
+		u_int16_t	spAckDuration;	/* short preamble ACK duration*/
+	} info[32];
+} HAL_RATE_TABLE;
+
+typedef struct {
+	u_int		rs_count;		/* number of valid entries */
+	u_int8_t	rs_rates[32];		/* rates */
+} HAL_RATE_SET;
+
+typedef enum {
+	HAL_ANT_VARIABLE = 0,			/* variable by programming */
+	HAL_ANT_FIXED_A	 = 1,			/* fixed to 11a frequencies */
+	HAL_ANT_FIXED_B	 = 2,			/* fixed to 11b frequencies */
+} HAL_ANT_SETTING;
+
+typedef enum {
+	HAL_M_STA	= 1,			/* infrastructure station */
+	HAL_M_IBSS	= 0,			/* IBSS (adhoc) station */
+	HAL_M_HOSTAP	= 6,			/* Software Access Point */
+	HAL_M_MONITOR	= 8			/* Monitor mode */
+} HAL_OPMODE;
+
+typedef struct {
+	u_int8_t	kv_type;		/* one of HAL_CIPHER */
+	u_int8_t	kv_pad;
+	u_int16_t	kv_len;			/* length in bits */
+	u_int8_t	kv_val[16];		/* enough for 128-bit keys */
+	u_int8_t	kv_mic[8];		/* TKIP MIC key */
+} HAL_KEYVAL;
+
+typedef enum {
+	HAL_CIPHER_WEP		= 0,
+	HAL_CIPHER_AES_OCB	= 1,
+	HAL_CIPHER_AES_CCM	= 2,
+	HAL_CIPHER_CKIP		= 3,
+	HAL_CIPHER_TKIP		= 4,
+	HAL_CIPHER_CLR		= 5,		/* no encryption */
+
+	HAL_CIPHER_MIC		= 127		/* TKIP-MIC, not a cipher */
+} HAL_CIPHER;
+
+enum {
+	HAL_SLOT_TIME_9	 = 9,
+	HAL_SLOT_TIME_20 = 20,
+};
+
+/*
+ * Per-station beacon timer state.  Note that the specified
+ * beacon interval (given in TU's) can also include flags
+ * to force a TSF reset and to enable the beacon xmit logic.
+ * If bs_cfpmaxduration is non-zero the hardware is setup to
+ * coexist with a PCF-capable AP.
+ */
+typedef struct {
+	u_int32_t	bs_nexttbtt;		/* next beacon in TU */
+	u_int32_t	bs_nextdtim;		/* next DTIM in TU */
+	u_int32_t	bs_intval;		/* beacon interval+flags */
+#define	HAL_BEACON_PERIOD	0x0000ffff	/* beacon interval period */
+#define	HAL_BEACON_ENA		0x00800000	/* beacon xmit enable */
+#define	HAL_BEACON_RESET_TSF	0x01000000	/* clear TSF */
+	u_int32_t	bs_dtimperiod;
+	u_int16_t	bs_cfpperiod;		/* CFP period in TU */
+	u_int16_t	bs_cfpmaxduration;	/* max CFP duration in TU */
+	u_int32_t	bs_cfpnext;		/* next CFP in TU */
+	u_int16_t	bs_timoffset;		/* byte offset to TIM bitmap */
+	u_int16_t	bs_bmissthreshold;	/* beacon miss threshold */
+	u_int32_t	bs_sleepduration;	/* max sleep duration */
+} HAL_BEACON_STATE;
+
+/*
+ * Per-node statistics maintained by the driver for use in
+ * optimizing signal quality and other operational aspects.
+ */
+typedef struct {
+	u_int32_t	ns_avgbrssi;	/* average beacon rssi */
+	u_int32_t	ns_avgrssi;	/* average data rssi */
+	u_int32_t	ns_avgtxrssi;	/* average tx rssi */
+} HAL_NODE_STATS;
+
+#define	HAL_RSSI_EP_MULTIPLIER	(1<<7)	/* pow2 to optimize out * and / */
+
+struct ath_desc;
+
+/*
+ * Hardware Access Layer (HAL) API.
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an
+ * ath_hal structure for use with the device.  Hardware-related operations
+ * that follow must call back into the HAL through interface, supplying
+ * the reference as the first parameter.  Note that before using the
+ * reference returned by ath_hal_attach the caller should verify the
+ * ABI version number.
+ */
+struct ath_hal {
+	u_int32_t	ah_magic;	/* consistency check magic number */
+	u_int32_t	ah_abi;		/* HAL ABI version */
+#define	HAL_ABI_VERSION	0x04112900	/* YYMMDDnn */
+	u_int16_t	ah_devid;	/* PCI device ID */
+	u_int16_t	ah_subvendorid;	/* PCI subvendor ID */
+	HAL_SOFTC	ah_sc;		/* back pointer to driver/os state */
+	HAL_BUS_TAG	ah_st;		/* params for register r+w */
+	HAL_BUS_HANDLE	ah_sh;
+	HAL_CTRY_CODE	ah_countryCode;
+
+	u_int32_t	ah_macVersion;	/* MAC version id */
+	u_int16_t	ah_macRev;	/* MAC revision */
+	u_int16_t	ah_phyRev;	/* PHY revision */
+	/* NB: when only one radio is present the rev is in 5Ghz */
+	u_int16_t	ah_analog5GhzRev;/* 5GHz radio revision */
+	u_int16_t	ah_analog2GhzRev;/* 2GHz radio revision */
+
+	const HAL_RATE_TABLE *__ahdecl(*ah_getRateTable)(struct ath_hal *,
+				u_int mode);
+	void	  __ahdecl(*ah_detach)(struct ath_hal*);
+
+	/* Reset functions */
+	HAL_BOOL  __ahdecl(*ah_reset)(struct ath_hal *, HAL_OPMODE,
+				HAL_CHANNEL *, HAL_BOOL bChannelChange,
+				HAL_STATUS *status);
+	HAL_BOOL  __ahdecl(*ah_phyDisable)(struct ath_hal *);
+	void	  __ahdecl(*ah_setPCUConfig)(struct ath_hal *);
+	HAL_BOOL  __ahdecl(*ah_perCalibration)(struct ath_hal*, HAL_CHANNEL *);
+	HAL_BOOL  __ahdecl(*ah_setTxPowerLimit)(struct ath_hal *, u_int32_t);
+
+	/* Transmit functions */
+	HAL_BOOL  __ahdecl(*ah_updateTxTrigLevel)(struct ath_hal*,
+				HAL_BOOL incTrigLevel);
+	int	  __ahdecl(*ah_setupTxQueue)(struct ath_hal *, HAL_TX_QUEUE,
+				const HAL_TXQ_INFO *qInfo);
+	HAL_BOOL  __ahdecl(*ah_setTxQueueProps)(struct ath_hal *, int q, 
+				const HAL_TXQ_INFO *qInfo);
+	HAL_BOOL  __ahdecl(*ah_getTxQueueProps)(struct ath_hal *, int q, 
+				HAL_TXQ_INFO *qInfo);
+	HAL_BOOL  __ahdecl(*ah_releaseTxQueue)(struct ath_hal *ah, u_int q);
+	HAL_BOOL  __ahdecl(*ah_resetTxQueue)(struct ath_hal *ah, u_int q);
+	u_int32_t __ahdecl(*ah_getTxDP)(struct ath_hal*, u_int);
+	HAL_BOOL  __ahdecl(*ah_setTxDP)(struct ath_hal*, u_int, u_int32_t txdp);
+	u_int32_t __ahdecl(*ah_numTxPending)(struct ath_hal *, u_int q);
+	HAL_BOOL  __ahdecl(*ah_startTxDma)(struct ath_hal*, u_int);
+	HAL_BOOL  __ahdecl(*ah_stopTxDma)(struct ath_hal*, u_int);
+	HAL_BOOL  __ahdecl(*ah_updateCTSForBursting)(struct ath_hal *,
+				struct ath_desc *, struct ath_desc *,
+				struct ath_desc *, struct ath_desc *,
+				u_int32_t, u_int32_t);
+	HAL_BOOL  __ahdecl(*ah_setupTxDesc)(struct ath_hal *, struct ath_desc *,
+				u_int pktLen, u_int hdrLen,
+				HAL_PKT_TYPE type, u_int txPower,
+				u_int txRate0, u_int txTries0,
+				u_int keyIx, u_int antMode, u_int flags,
+				u_int rtsctsRate, u_int rtsctsDuration);
+	HAL_BOOL  __ahdecl(*ah_setupXTxDesc)(struct ath_hal *, struct ath_desc*,
+				u_int txRate1, u_int txTries1,
+				u_int txRate2, u_int txTries2,
+				u_int txRate3, u_int txTries3);
+	HAL_BOOL  __ahdecl(*ah_fillTxDesc)(struct ath_hal *, struct ath_desc *,
+				u_int segLen, HAL_BOOL firstSeg,
+				HAL_BOOL lastSeg, const struct ath_desc *);
+	HAL_STATUS __ahdecl(*ah_procTxDesc)(struct ath_hal *, struct ath_desc*);
+	void	   __ahdecl(*ah_getTxIntrQueue)(struct ath_hal *, u_int32_t *);
+
+	/* Receive Functions */
+	u_int32_t __ahdecl(*ah_getRxDP)(struct ath_hal*);
+	void	  __ahdecl(*ah_setRxDP)(struct ath_hal*, u_int32_t rxdp);
+	void	  __ahdecl(*ah_enableReceive)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_stopDmaReceive)(struct ath_hal*);
+	void	  __ahdecl(*ah_startPcuReceive)(struct ath_hal*);
+	void	  __ahdecl(*ah_stopPcuReceive)(struct ath_hal*);
+	void	  __ahdecl(*ah_setMulticastFilter)(struct ath_hal*,
+				u_int32_t filter0, u_int32_t filter1);
+	HAL_BOOL  __ahdecl(*ah_setMulticastFilterIndex)(struct ath_hal*,
+				u_int32_t ndx);
+	HAL_BOOL  __ahdecl(*ah_clrMulticastFilterIndex)(struct ath_hal*,
+				u_int32_t ndx);
+	u_int32_t __ahdecl(*ah_getRxFilter)(struct ath_hal*);
+	void	  __ahdecl(*ah_setRxFilter)(struct ath_hal*, u_int32_t);
+	HAL_BOOL  __ahdecl(*ah_setupRxDesc)(struct ath_hal *, struct ath_desc *,
+				u_int32_t size, u_int flags);
+	HAL_STATUS __ahdecl(*ah_procRxDesc)(struct ath_hal *, struct ath_desc *,
+				u_int32_t phyAddr, struct ath_desc *next);
+	void	  __ahdecl(*ah_rxMonitor)(struct ath_hal *,
+				const HAL_NODE_STATS *);
+	void	  __ahdecl(*ah_procMibEvent)(struct ath_hal *,
+				const HAL_NODE_STATS *);
+
+	/* Misc Functions */
+	HAL_STATUS __ahdecl(*ah_getCapability)(struct ath_hal *,
+				HAL_CAPABILITY_TYPE, u_int32_t capability,
+				u_int32_t *result);
+	HAL_BOOL   __ahdecl(*ah_setCapability)(struct ath_hal *,
+				HAL_CAPABILITY_TYPE, u_int32_t capability,
+				u_int32_t setting, HAL_STATUS *);
+	HAL_BOOL   __ahdecl(*ah_getDiagState)(struct ath_hal *, int request,
+				const void *args, u_int32_t argsize,
+				void **result, u_int32_t *resultsize);
+	void	  __ahdecl(*ah_getMacAddress)(struct ath_hal *, u_int8_t *);
+	HAL_BOOL  __ahdecl(*ah_setMacAddress)(struct ath_hal *, const u_int8_t*);
+	HAL_BOOL  __ahdecl(*ah_setRegulatoryDomain)(struct ath_hal*,
+				u_int16_t, HAL_STATUS *);
+	void	  __ahdecl(*ah_setLedState)(struct ath_hal*, HAL_LED_STATE);
+	void	  __ahdecl(*ah_writeAssocid)(struct ath_hal*,
+				const u_int8_t *bssid, u_int16_t assocId);
+	HAL_BOOL  __ahdecl(*ah_gpioCfgOutput)(struct ath_hal *, u_int32_t gpio);
+	HAL_BOOL  __ahdecl(*ah_gpioCfgInput)(struct ath_hal *, u_int32_t gpio);
+	u_int32_t __ahdecl(*ah_gpioGet)(struct ath_hal *, u_int32_t gpio);
+	HAL_BOOL  __ahdecl(*ah_gpioSet)(struct ath_hal *,
+				u_int32_t gpio, u_int32_t val);
+	void	  __ahdecl(*ah_gpioSetIntr)(struct ath_hal*, u_int, u_int32_t);
+	u_int32_t __ahdecl(*ah_getTsf32)(struct ath_hal*);
+	u_int64_t __ahdecl(*ah_getTsf64)(struct ath_hal*);
+	void	  __ahdecl(*ah_resetTsf)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_detectCardPresent)(struct ath_hal*);
+	void	  __ahdecl(*ah_updateMibCounters)(struct ath_hal*,
+				HAL_MIB_STATS*);
+	HAL_RFGAIN __ahdecl(*ah_getRfGain)(struct ath_hal*);
+	u_int	  __ahdecl(*ah_getDefAntenna)(struct ath_hal*);
+	void	  __ahdecl(*ah_setDefAntenna)(struct ath_hal*, u_int);
+	HAL_BOOL  __ahdecl(*ah_setSlotTime)(struct ath_hal*, u_int);
+	u_int	  __ahdecl(*ah_getSlotTime)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_setAckTimeout)(struct ath_hal*, u_int);
+	u_int	  __ahdecl(*ah_getAckTimeout)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_setCTSTimeout)(struct ath_hal*, u_int);
+	u_int	  __ahdecl(*ah_getCTSTimeout)(struct ath_hal*);
+
+	/* Key Cache Functions */
+	u_int32_t __ahdecl(*ah_getKeyCacheSize)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_resetKeyCacheEntry)(struct ath_hal*, u_int16_t);
+	HAL_BOOL  __ahdecl(*ah_isKeyCacheEntryValid)(struct ath_hal *,
+				u_int16_t);
+	HAL_BOOL  __ahdecl(*ah_setKeyCacheEntry)(struct ath_hal*,
+				u_int16_t, const HAL_KEYVAL *,
+				const u_int8_t *, int);
+	HAL_BOOL  __ahdecl(*ah_setKeyCacheEntryMac)(struct ath_hal*,
+				u_int16_t, const u_int8_t *);
+
+	/* Power Management Functions */
+	HAL_BOOL  __ahdecl(*ah_setPowerMode)(struct ath_hal*,
+				HAL_POWER_MODE mode, int setChip,
+				u_int16_t sleepDuration);
+	HAL_POWER_MODE __ahdecl(*ah_getPowerMode)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_initPSPoll)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_enablePSPoll)(struct ath_hal *,
+				u_int8_t *, u_int16_t);
+	HAL_BOOL  __ahdecl(*ah_disablePSPoll)(struct ath_hal *);
+
+	/* Beacon Management Functions */
+	void	  __ahdecl(*ah_beaconInit)(struct ath_hal *,
+				u_int32_t nexttbtt, u_int32_t intval);
+	void	  __ahdecl(*ah_setStationBeaconTimers)(struct ath_hal*,
+				const HAL_BEACON_STATE *);
+	void	  __ahdecl(*ah_resetStationBeaconTimers)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_waitForBeaconDone)(struct ath_hal *,
+				HAL_BUS_ADDR);
+
+	/* Interrupt functions */
+	HAL_BOOL  __ahdecl(*ah_isInterruptPending)(struct ath_hal*);
+	HAL_BOOL  __ahdecl(*ah_getPendingInterrupts)(struct ath_hal*, HAL_INT*);
+	HAL_INT	  __ahdecl(*ah_getInterrupts)(struct ath_hal*);
+	HAL_INT	  __ahdecl(*ah_setInterrupts)(struct ath_hal*, HAL_INT);
+};
+
+/* 
+ * Check the PCI vendor ID and device ID against Atheros' values
+ * and return a printable description for any Atheros hardware.
+ * AH_NULL is returned if the ID's do not describe Atheros hardware.
+ */
+extern	const char *__ahdecl ath_hal_probe(u_int16_t vendorid, u_int16_t devid);
+
+/*
+ * Attach the HAL for use with the specified device.  The device is
+ * defined by the PCI device ID.  The caller provides an opaque pointer
+ * to an upper-layer data structure (HAL_SOFTC) that is stored in the
+ * HAL state block for later use.  Hardware register accesses are done
+ * using the specified bus tag and handle.  On successful return a
+ * reference to a state block is returned that must be supplied in all
+ * subsequent HAL calls.  Storage associated with this reference is
+ * dynamically allocated and must be freed by calling the ah_detach
+ * method when the client is done.  If the attach operation fails a
+ * null (AH_NULL) reference will be returned and a status code will
+ * be returned if the status parameter is non-zero.
+ */
+extern	struct ath_hal * __ahdecl ath_hal_attach(u_int16_t devid, HAL_SOFTC,
+		HAL_BUS_TAG, HAL_BUS_HANDLE, HAL_STATUS* status);
+
+/*
+ * Return a list of channels available for use with the hardware.
+ * The list is based on what the hardware is capable of, the specified
+ * country code, the modeSelect mask, and whether or not outdoor
+ * channels are to be permitted.
+ *
+ * The channel list is returned in the supplied array.  maxchans
+ * defines the maximum size of this array.  nchans contains the actual
+ * number of channels returned.  If a problem occurred or there were
+ * no channels that met the criteria then AH_FALSE is returned.
+ */
+extern	HAL_BOOL __ahdecl ath_hal_init_channels(struct ath_hal *,
+		HAL_CHANNEL *chans, u_int maxchans, u_int *nchans,
+		HAL_CTRY_CODE cc, u_int16_t modeSelect,
+		HAL_BOOL enableOutdoor, HAL_BOOL enableExtendedChannels);
+
+/*
+ * Return bit mask of wireless modes supported by the hardware.
+ */
+extern	u_int __ahdecl ath_hal_getwirelessmodes(struct ath_hal*, HAL_CTRY_CODE);
+
+/*
+ * Return rate table for specified mode (11a, 11b, 11g, etc).
+ */
+extern	const HAL_RATE_TABLE * __ahdecl ath_hal_getratetable(struct ath_hal *,
+		u_int mode);
+
+/*
+ * Calculate the transmit duration of a frame.
+ */
+extern u_int16_t __ahdecl ath_hal_computetxtime(struct ath_hal *,
+		const HAL_RATE_TABLE *rates, u_int32_t frameLen,
+		u_int16_t rateix, HAL_BOOL shortPreamble);
+
+/*
+ * Convert between IEEE channel number and channel frequency
+ * using the specified channel flags; e.g. CHANNEL_2GHZ.
+ */
+extern	u_int __ahdecl ath_hal_mhz2ieee(u_int mhz, u_int flags);
+extern	u_int __ahdecl ath_hal_ieee2mhz(u_int ieee, u_int flags);
+
+/*
+ * Return a version string for the HAL release.
+ */
+extern	char ath_hal_version[];
+/*
+ * Return a NULL-terminated array of build/configuration options.
+ */
+extern	const char* ath_hal_buildopts[];
+#endif /* _ATH_AH_H_ */
diff -N -u -r src.preview/sys/contrib/dev/ath/ah_desc.h src/sys/contrib/dev/ath/ah_desc.h
--- src.preview/sys/contrib/dev/ath/ah_desc.h	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah_desc.h	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,180 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_desc.h,v 1.1.1.2 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _DEV_ATH_DESC_H
+#define _DEV_ATH_DESC_H
+
+/*
+ * Transmit descriptor status.  This structure is filled
+ * in only after the tx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * Note that ts_antenna may not be valid for all h/w.  It
+ * should be used only if non-zero.
+ */
+struct ath_tx_status {
+	u_int16_t	ts_seqnum;	/* h/w assigned sequence number */
+	u_int16_t	ts_tstamp;	/* h/w assigned timestamp */
+	u_int8_t	ts_status;	/* frame status, 0 => xmit ok */
+	u_int8_t	ts_rate;	/* h/w transmit rate index */
+#define	HAL_TXSTAT_ALTRATE	0x80	/* alternate xmit rate used */
+	int8_t		ts_rssi;	/* tx ack RSSI */
+	u_int8_t	ts_shortretry;	/* # short retries */
+	u_int8_t	ts_longretry;	/* # long retries */
+	u_int8_t	ts_virtcol;	/* virtual collision count */
+	u_int8_t	ts_antenna;	/* antenna information */
+};
+
+#define	HAL_TXERR_XRETRY	0x01	/* excessive retries */
+#define	HAL_TXERR_FILT		0x02	/* blocked by tx filtering */
+#define	HAL_TXERR_FIFO		0x04	/* fifo underrun */
+
+/*
+ * Receive descriptor status.  This structure is filled
+ * in only after the rx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * If rx_status is zero, then the frame was received ok;
+ * otherwise the error information is indicated and rs_phyerr
+ * contains a phy error code if HAL_RXERR_PHY is set.  In general
+ * the frame contents is undefined when an error occurred thought
+ * for some errors (e.g. a decryption error), it may be meaningful.
+ *
+ * Note that the receive timestamp is expanded using the TSF to
+ * a full 16 bits (regardless of what the h/w provides directly).
+ *
+ * rx_rssi is in units of dbm above the noise floor.  This value
+ * is measured during the preamble and PLCP; i.e. with the initial
+ * 4us of detection.  The noise floor is typically a consistent
+ * -96dBm absolute power in a 20MHz channel.
+ */
+struct ath_rx_status {
+	u_int16_t	rs_datalen;	/* rx frame length */
+	u_int16_t	rs_tstamp;	/* h/w assigned timestamp */
+	u_int8_t	rs_status;	/* rx status, 0 => recv ok */
+	u_int8_t	rs_phyerr;	/* phy error code */
+	int8_t		rs_rssi;	/* rx frame RSSI */
+	u_int8_t	rs_keyix;	/* key cache index */
+	u_int8_t	rs_rate;	/* h/w receive rate index */
+	u_int8_t	rs_antenna;	/* antenna information */
+	u_int8_t	rs_more;	/* more descriptors follow */
+};
+
+#define	HAL_RXERR_CRC		0x01	/* CRC error on frame */
+#define	HAL_RXERR_PHY		0x02	/* PHY error, rs_phyerr is valid */
+#define	HAL_RXERR_FIFO		0x04	/* fifo overrun */
+#define	HAL_RXERR_DECRYPT	0x08	/* non-Michael decrypt error */
+#define	HAL_RXERR_MIC		0x10	/* Michael MIC decrypt error */
+
+enum {
+	HAL_PHYERR_UNDERRUN		= 0,	/* Transmit underrun */
+	HAL_PHYERR_TIMING		= 1,	/* Timing error */
+	HAL_PHYERR_PARITY		= 2,	/* Illegal parity */
+	HAL_PHYERR_RATE			= 3,	/* Illegal rate */
+	HAL_PHYERR_LENGTH		= 4,	/* Illegal length */
+	HAL_PHYERR_RADAR		= 5,	/* Radar detect */
+	HAL_PHYERR_SERVICE		= 6,	/* Illegal service */
+	HAL_PHYERR_TOR			= 7,	/* Transmit override receive */
+	/* NB: these are specific to the 5212 */
+	HAL_PHYERR_OFDM_TIMING		= 17,	/* */
+	HAL_PHYERR_OFDM_SIGNAL_PARITY	= 18,	/* */
+	HAL_PHYERR_OFDM_RATE_ILLEGAL	= 19,	/* */
+	HAL_PHYERR_OFDM_LENGTH_ILLEGAL	= 20,	/* */
+	HAL_PHYERR_OFDM_POWER_DROP	= 21,	/* */
+	HAL_PHYERR_OFDM_SERVICE		= 22,	/* */
+	HAL_PHYERR_OFDM_RESTART		= 23,	/* */
+	HAL_PHYERR_CCK_TIMING		= 25,	/* */
+	HAL_PHYERR_CCK_HEADER_CRC	= 26,	/* */
+	HAL_PHYERR_CCK_RATE_ILLEGAL	= 27,	/* */
+	HAL_PHYERR_CCK_SERVICE		= 30,	/* */
+	HAL_PHYERR_CCK_RESTART		= 31,	/* */
+};
+
+/* value found in rs_keyix to mark invalid entries */
+#define	HAL_RXKEYIX_INVALID	((u_int8_t) -1)
+/* value used to specify no encryption key for xmit */
+#define	HAL_TXKEYIX_INVALID	((u_int) -1)
+
+/* XXX rs_antenna definitions */
+
+/*
+ * Definitions for the software frame/packet descriptors used by
+ * the Atheros HAL.  This definition obscures hardware-specific
+ * details from the driver.  Drivers are expected to fillin the
+ * portions of a descriptor that are not opaque then use HAL calls
+ * to complete the work.  Status for completed frames is returned
+ * in a device-independent format.
+ */
+struct ath_desc {
+	/*
+	 * The following definitions are passed directly
+	 * the hardware and managed by the HAL.  Drivers
+	 * should not touch those elements marked opaque.
+	 */
+	u_int32_t	ds_link;	/* phys address of next descriptor */
+	u_int32_t	ds_data;	/* phys address of data buffer */
+	u_int32_t	ds_ctl0;	/* opaque DMA control 0 */
+	u_int32_t	ds_ctl1;	/* opaque DMA control 1 */
+	u_int32_t	ds_hw[4];	/* opaque h/w region */
+	/*
+	 * The remaining definitions are managed by software;
+	 * these are valid only after the rx/tx process descriptor
+	 * methods return a non-EINPROGRESS  code.
+	 */
+	union {
+		struct ath_tx_status tx;/* xmit status */
+		struct ath_rx_status rx;/* recv status */
+	} ds_us;
+} __packed;
+
+#define	ds_txstat	ds_us.tx
+#define	ds_rxstat	ds_us.rx
+
+/* flags passed to tx descriptor setup methods */
+#define	HAL_TXDESC_CLRDMASK	0x0001	/* clear destination filter mask */
+#define	HAL_TXDESC_NOACK	0x0002	/* don't wait for ACK */
+#define	HAL_TXDESC_RTSENA	0x0004	/* enable RTS */
+#define	HAL_TXDESC_CTSENA	0x0008	/* enable CTS */
+#define	HAL_TXDESC_INTREQ	0x0010	/* enable per-descriptor interrupt */
+#define	HAL_TXDESC_VEOL		0x0020	/* mark virtual EOL */
+
+/* flags passed to rx descriptor setup methods */
+#define	HAL_RXDESC_INTREQ	0x0020	/* enable per-descriptor interrupt */
+#endif /* _DEV_ATH_AR521XDMA_H */
diff -N -u -r src.preview/sys/contrib/dev/ath/ah_devid.h src/sys/contrib/dev/ath/ah_devid.h
--- src.preview/sys/contrib/dev/ath/ah_devid.h	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah_devid.h	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,87 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_devid.h,v 1.1.1.3 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _DEV_ATH_DEVID_H_
+#define _DEV_ATH_DEVID_H_
+
+#define ATHEROS_VENDOR_ID	0x168c		/* Atheros PCI vendor ID */
+/*
+ * NB: all Atheros-based devices should have a PCI vendor ID
+ *     of 0x168c, but some vendors, in their infinite wisdom
+ *     do not follow this so we must handle them specially.
+ */
+#define	ATHEROS_3COM_VENDOR_ID	0xa727		/* 3Com 3CRPAG175 vendor ID */
+#define	ATHEROS_3COM2_VENDOR_ID	0x10b7		/* 3Com 3CRDAG675 vendor ID */
+
+/* AR5210 (for reference) */
+#define AR5210_DEFAULT          0x1107          /* No eeprom HW default */
+#define AR5210_PROD             0x0007          /* Final device ID */
+#define AR5210_AP               0x0207          /* Early AP11s */
+
+/* AR5211 */
+#define AR5211_DEFAULT          0x1112          /* No eeprom HW default */
+#define AR5311_DEVID            0x0011          /* Final ar5311 devid */
+#define AR5211_DEVID            0x0012          /* Final ar5211 devid */
+#define AR5211_LEGACY           0xff12          /* Original emulation board */
+#define AR5211_FPGA11B          0xf11b          /* 11b emulation board */
+
+/* AR5212 */
+#define AR5212_DEFAULT          0x1113          /* No eeprom HW default */
+#define AR5212_DEVID            0x0013          /* Final ar5212 devid */
+#define AR5212_FPGA             0xf013          /* Emulation board */
+#define	AR5212_DEVID_IBM	0x1014          /* IBM minipci ID */
+#define AR5212_AR5312_REV2      0x0052          /* AR5312 WMAC (AP31) */
+#define AR5212_AR5312_REV7      0x0057          /* AR5312 WMAC (AP30-040) */
+#define AR5212_AR2313_REV8      0x0058          /* AR2313 WMAC (AP43-030) */
+
+/* AR5212 compatible devid's also attach to 5212 */
+#define	AR5212_DEVID_0014	0x0014
+#define	AR5212_DEVID_0015	0x0015
+#define	AR5212_DEVID_0016	0x0016
+#define	AR5212_DEVID_0017	0x0017
+#define	AR5212_DEVID_0018	0x0018
+#define	AR5212_DEVID_0019	0x0019
+#define AR5212_AR2413      	0x001a          /* AR2413 aka Griffin-lite */
+
+/* AR5213 */
+#define	AR5213_SREV_1_0		0x0055
+#define	AR5213_SREV_REG		0x4020
+
+#define	AR_SUBVENDOR_ID_NOG	0x0e11		/* No 11G subvendor ID */
+#define AR_SUBVENDOR_ID_NEW_A	0x7065		/* Update device to new RD */
+#endif /* _DEV_ATH_DEVID_H */
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_if.m src/sys/contrib/dev/ath/freebsd/ah_if.m
--- src.preview/sys/contrib/dev/ath/freebsd/ah_if.m	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_if.m	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,90 @@
+#
+# Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+# Communications, Inc.  All rights reserved.
+#
+# Redistribution and use in source and binary forms are permitted
+# provided that the following conditions are met:
+# 1. The materials contained herein are unmodified and are used
+#    unmodified.
+# 2. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following NO
+#    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+#    modification.
+# 3. Redistributions in binary form must reproduce at minimum a
+#    disclaimer similar to the Disclaimer below and any redistribution
+#    must be conditioned upon including a substantially similar
+#    Disclaimer requirement for further binary redistribution.
+# 4. Neither the names of the above-listed copyright holders nor the
+#    names of any contributors may be used to endorse or promote
+#    product derived from this software without specific prior written
+#    permission.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+# FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGES.
+#
+# $Id: ah_if.m,v 1.1.1.2 2004/12/08 18:04:16 sam Exp $
+#
+
+
+METHOD	const char* ath_hal_probe {
+	u_int16_t	vendorID;
+	u_int16_	deviceID;
+};
+
+METHOD	struct ath_hal* ath_hal_attach {
+	u_int16_t	deviceID;
+	HAL_SOFTC	sc;
+	HAL_BUS_TAG	st;
+	HAL_BUS_HANDLE	sh;
+	HAL_STATUS*	error;
+};
+
+METHOD u_int ath_hal_init_channels {
+	struct ath_hal*	ah;
+	HAL_CHANNEL*	chans;
+	u_int		maxchans;
+	u_int*		nchans;
+	HAL_CTRY_CODE	cc;
+	u_int16_t	modeSelect;
+	int		enableOutdoor;
+};
+
+METHOD u_int ath_hal_getwirelessmodes {
+	struct ath_hal*	ah;
+	HAL_CTRY_CODE	cc;
+};
+
+METHOD const HAL_RATE_TABLE* ath_hal_getratetable {
+	struct ath_hal*	ah;
+	u_int		mode;
+};
+
+METHOD u_int16_t ath_hal_computetxtime {
+	struct ath_hal*	ah;
+	const HAL_RATE_TABLE* rates;
+	u_int32_t	frameLength;
+	u_int16_t	rateIndex;
+	HAL_BOOL	shortPreamble;
+};
+
+METHOD u_int ath_hal_mhz2ieee {
+	u_int		mhz;
+	u_int		flags;
+};
+
+METHOD u_int ath_hal_ieee2mhz {
+	u_int		ieee;
+	u_int		flags;
+};
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.c src/sys/contrib/dev/ath/freebsd/ah_osdep.c
--- src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.c	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_osdep.c	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,419 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * DragonFly Port - Copyright (c) 2005 Andrew Atrens
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_osdep.c,v 1.3 2004/12/08 18:18:39 sam Exp $
+ */
+#include "opt_ah.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/sysctl.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+
+#include <machine/stdarg.h>
+
+#include <net/ethernet.h>		/* XXX for ether_sprintf */
+
+#include <contrib/dev/ath/ah.h>
+
+extern	void ath_hal_printf(struct ath_hal *, const char*, ...)
+		__printflike(2,3);
+extern	void ath_hal_vprintf(struct ath_hal *, const char*, __va_list)
+		__printflike(2, 0);
+extern	const char* ath_hal_ether_sprintf(const u_int8_t *mac);
+extern	void *ath_hal_malloc(size_t);
+extern	void ath_hal_free(void *);
+#ifdef AH_ASSERT
+extern	void ath_hal_assert_failed(const char* filename,
+		int lineno, const char* msg);
+#endif
+#ifdef AH_DEBUG
+extern	void HALDEBUG(struct ath_hal *ah, const char* fmt, ...);
+extern	void HALDEBUGn(struct ath_hal *ah, u_int level, const char* fmt, ...);
+#endif /* AH_DEBUG */
+
+/* NB: put this here instead of the driver to avoid circular references */
+SYSCTL_NODE(_hw, OID_AUTO, ath, CTLFLAG_RD, 0, "Atheros driver parameters");
+SYSCTL_NODE(_hw_ath, OID_AUTO, hal, CTLFLAG_RD, 0, "Atheros HAL parameters");
+
+#ifdef AH_DEBUG
+static	int ath_hal_debug = 0;
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, debug, CTLFLAG_RW, &ath_hal_debug,
+	    0, "Atheros HAL debugging printfs");
+TUNABLE_INT("hw.ath.hal.debug", &ath_hal_debug);
+#endif /* AH_DEBUG */
+
+SYSCTL_STRING(_hw_ath_hal, OID_AUTO, version, CTLFLAG_RD, ath_hal_version, 0,
+	"Atheros HAL version");
+
+int	ath_hal_dma_beacon_response_time = 2;	/* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, dma_brt, CTLFLAG_RW,
+	   &ath_hal_dma_beacon_response_time, 0,
+	   "Atheros HAL DMA beacon response time");
+int	ath_hal_sw_beacon_response_time = 10;	/* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, sw_brt, CTLFLAG_RW,
+	   &ath_hal_sw_beacon_response_time, 0,
+	   "Atheros HAL software beacon response time");
+int	ath_hal_additional_swba_backoff = 0;	/* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, swba_backoff, CTLFLAG_RW,
+	   &ath_hal_additional_swba_backoff, 0,
+	   "Atheros HAL additional SWBA backoff time");
+
+void*
+ath_hal_malloc(size_t size)
+{
+	return malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
+}
+
+void
+ath_hal_free(void* p)
+{
+	return free(p, M_DEVBUF);
+}
+
+void
+ath_hal_vprintf(struct ath_hal *ah, const char* fmt, __va_list ap)
+{
+	vprintf(fmt, ap);
+}
+
+void
+ath_hal_printf(struct ath_hal *ah, const char* fmt, ...)
+{
+	__va_list ap;
+	__va_start(ap, fmt);
+	ath_hal_vprintf(ah, fmt, ap);
+	__va_end(ap);
+}
+
+const char*
+ath_hal_ether_sprintf(const u_int8_t *mac)
+{
+	static char buffer[256];	
+	sprintf(buffer,"%6D",mac,":");
+	return &buffer[0];
+}
+
+#ifdef AH_DEBUG
+void
+HALDEBUG(struct ath_hal *ah, const char* fmt, ...)
+{
+	if (ath_hal_debug) {
+		__va_list ap;
+		__va_start(ap, fmt);
+		ath_hal_vprintf(ah, fmt, ap);
+		__va_end(ap);
+	}
+}
+
+void
+HALDEBUGn(struct ath_hal *ah, u_int level, const char* fmt, ...)
+{
+	if (ath_hal_debug >= level) {
+		__va_list ap;
+		__va_start(ap, fmt);
+		ath_hal_vprintf(ah, fmt, ap);
+		__va_end(ap);
+	}
+}
+#endif /* AH_DEBUG */
+
+#ifdef AH_DEBUG_ALQ
+/*
+ * ALQ register tracing support.
+ *
+ * Setting hw.ath.hal.alq=1 enables tracing of all register reads and
+ * writes to the file /tmp/ath_hal.log.  The file format is a simple
+ * fixed-size array of records.  When done logging set hw.ath.hal.alq=0
+ * and then decode the file with the arcode program (that is part of the
+ * HAL).  If you start+stop tracing the data will be appended to an
+ * existing file.
+ *
+ * NB: doesn't handle multiple devices properly; only one DEVICE record
+ *     is emitted and the different devices are not identified.
+ */
+#include <sys/alq.h>
+#include <sys/pcpu.h>
+#include <contrib/dev/ath/ah_decode.h>
+
+static	struct alq *ath_hal_alq;
+static	int ath_hal_alq_emitdev;	/* need to emit DEVICE record */
+static	u_int ath_hal_alq_lost;		/* count of lost records */
+static	const char *ath_hal_logfile = "/tmp/ath_hal.log";
+static	u_int ath_hal_alq_qsize = 64*1024;
+
+static int
+ath_hal_setlogging(int enable)
+{
+	int error;
+
+	if (enable) {
+		error = suser(curthread);
+		if (error == 0) {
+			error = alq_open(&ath_hal_alq, ath_hal_logfile,
+				curthread->td_ucred,
+				sizeof (struct athregrec), ath_hal_alq_qsize);
+			ath_hal_alq_lost = 0;
+			ath_hal_alq_emitdev = 1;
+			printf("ath_hal: logging to %s enabled\n",
+				ath_hal_logfile);
+		}
+	} else {
+		if (ath_hal_alq)
+			alq_close(ath_hal_alq);
+		ath_hal_alq = NULL;
+		printf("ath_hal: logging disabled\n");
+		error = 0;
+	}
+	return (error);
+}
+
+static int
+sysctl_hw_ath_hal_log(SYSCTL_HANDLER_ARGS)
+{
+	int error, enable;
+
+	enable = (ath_hal_alq != NULL);
+        error = sysctl_handle_int(oidp, &enable, 0, req);
+        if (error || !req->newptr)
+                return (error);
+	else
+		return (ath_hal_setlogging(enable));
+}
+SYSCTL_PROC(_hw_ath_hal, OID_AUTO, alq, CTLTYPE_INT|CTLFLAG_RW,
+	0, 0, sysctl_hw_ath_hal_log, "I", "Enable HAL register logging");
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, alq_size, CTLFLAG_RW,
+	&ath_hal_alq_qsize, 0, "In-memory log size (#records)");
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, alq_lost, CTLFLAG_RW,
+	&ath_hal_alq_lost, 0, "Register operations not logged");
+
+static struct ale *
+ath_hal_alq_get(struct ath_hal *ah)
+{
+	struct ale *ale;
+
+	if (ath_hal_alq_emitdev) {
+		ale = alq_get(ath_hal_alq, ALQ_NOWAIT);
+		if (ale) {
+			struct athregrec *r =
+				(struct athregrec *) ale->ae_data;
+			r->op = OP_DEVICE;
+			r->reg = 0;
+			r->val = ah->ah_devid;
+			alq_post(ath_hal_alq, ale);
+			ath_hal_alq_emitdev = 0;
+		} else
+			ath_hal_alq_lost++;
+	}
+	ale = alq_get(ath_hal_alq, ALQ_NOWAIT);
+	if (!ale)
+		ath_hal_alq_lost++;
+	return ale;
+}
+
+void
+ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
+{
+	if (ath_hal_alq) {
+		struct ale *ale = ath_hal_alq_get(ah);
+		if (ale) {
+			struct athregrec *r = (struct athregrec *) ale->ae_data;
+			r->op = OP_WRITE;
+			r->reg = reg;
+			r->val = val;
+			alq_post(ath_hal_alq, ale);
+		}
+	}
+#if _BYTE_ORDER == _BIG_ENDIAN
+	if (reg >= 0x4000 && reg < 0x5000)
+		bus_space_write_4(ah->ah_st, ah->ah_sh, reg, htole32(val));
+	else
+#endif
+		bus_space_write_4(ah->ah_st, ah->ah_sh, reg, val);
+}
+
+u_int32_t
+ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
+{
+	u_int32_t val;
+
+	val = bus_space_read_4(ah->ah_st, ah->ah_sh, reg);
+#if _BYTE_ORDER == _BIG_ENDIAN
+	if (reg >= 0x4000 && reg < 0x5000)
+		val = le32toh(val);
+#endif
+	if (ath_hal_alq) {
+		struct ale *ale = ath_hal_alq_get(ah);
+		if (ale) {
+			struct athregrec *r = (struct athregrec *) ale->ae_data;
+			r->op = OP_READ;
+			r->reg = reg;
+			r->val = val;
+			alq_post(ath_hal_alq, ale);
+		}
+	}
+	return val;
+}
+
+void
+OS_MARK(struct ath_hal *ah, u_int id, u_int32_t v)
+{
+	if (ath_hal_alq) {
+		struct ale *ale = ath_hal_alq_get(ah);
+		if (ale) {
+			struct athregrec *r = (struct athregrec *) ale->ae_data;
+			r->op = OP_MARK;
+			r->reg = id;
+			r->val = v;
+			alq_post(ath_hal_alq, ale);
+		}
+	}
+}
+#elif defined(AH_DEBUG) || defined(AH_REGOPS_FUNC)
+/*
+ * Memory-mapped device register read/write.  These are here
+ * as routines when debugging support is enabled and/or when
+ * explicitly configured to use function calls.  The latter is
+ * for architectures that might need to do something before
+ * referencing memory (e.g. remap an i/o window).
+ *
+ * NB: see the comments in ah_osdep.h about byte-swapping register
+ *     reads and writes to understand what's going on below.
+ */
+
+void
+ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
+{
+#if _BYTE_ORDER == _BIG_ENDIAN
+	if (reg >= 0x4000 && reg < 0x5000)
+		bus_space_write_4(ah->ah_st, ah->ah_sh, reg, htole32(val));
+	else
+#endif
+		bus_space_write_4(ah->ah_st, ah->ah_sh, reg, val);
+}
+
+u_int32_t
+ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
+{
+	u_int32_t val;
+
+	val = bus_space_read_4(ah->ah_st, ah->ah_sh, reg);
+#if _BYTE_ORDER == _BIG_ENDIAN
+	if (reg >= 0x4000 && reg < 0x5000)
+		val = le32toh(val);
+#endif
+	return val;
+}
+#endif /* AH_DEBUG || AH_REGOPS_FUNC */
+
+#ifdef AH_ASSERT
+void
+ath_hal_assert_failed(const char* filename, int lineno, const char *msg)
+{
+	printf("Atheros HAL assertion failure: %s: line %u: %s\n",
+		filename, lineno, msg);
+	panic("ath_hal_assert");
+}
+#endif /* AH_ASSERT */
+
+/*
+ * Delay n microseconds.
+ */
+void
+ath_hal_delay(int n)
+{
+	DELAY(n);
+}
+
+u_int32_t
+ath_hal_getuptime(struct ath_hal *ah)
+{
+	struct timeval bt;
+	getmicrouptime(&bt);
+	return (bt.tv_sec * 1000) + (bt.tv_usec / 1000);
+}
+
+void
+ath_hal_memzero(void *dst, size_t n)
+{
+	bzero(dst, n);
+}
+
+void *
+ath_hal_memcpy(void *dst, const void *src, size_t n)
+{
+	return memcpy(dst, src, n);
+}
+
+/*
+ * Module glue.
+ */
+
+static int
+ath_hal_modevent(module_t mod, int type, void *unused)
+{
+	const char *sep;
+	int i;
+
+	switch (type) {
+	case MOD_LOAD:
+		printf("ath_hal: %s (", ath_hal_version);
+		sep = "";
+		for (i = 0; ath_hal_buildopts[i] != NULL; i++) {
+			printf("%s%s", sep, ath_hal_buildopts[i]);
+			sep = ", ";
+		}
+		printf(")\n");
+		return 0;
+	case MOD_UNLOAD:
+		return 0;
+	}
+	return EINVAL;
+}
+
+static moduledata_t ath_hal_mod = {
+	"ath_hal",
+	ath_hal_modevent,
+	0
+};
+DECLARE_MODULE(ath_hal, ath_hal_mod, SI_SUB_DRIVERS, SI_ORDER_ANY);
+MODULE_VERSION(ath_hal, 1);
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.h src/sys/contrib/dev/ath/freebsd/ah_osdep.h
--- src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.h	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_osdep.h	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,129 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ * DragonFly Port - Copyright (c) 2005 Andrew Atrens
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_osdep.h,v 1.1.1.4 2004/12/08 18:04:17 sam Exp $
+ */
+#ifndef _ATH_AH_OSDEP_H_
+#define _ATH_AH_OSDEP_H_
+/*
+ * Atheros Hardware Access Layer (HAL) OS Dependent Definitions.
+ */
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/endian.h>
+
+#include <machine/bus.h>
+
+typedef void* HAL_SOFTC;
+typedef bus_space_tag_t HAL_BUS_TAG;
+typedef bus_space_handle_t HAL_BUS_HANDLE;
+typedef bus_addr_t HAL_BUS_ADDR;
+
+/*
+ * Delay n microseconds.
+ */
+extern	void ath_hal_delay(int);
+#define	OS_DELAY(_n)	ath_hal_delay(_n)
+
+#define	OS_INLINE	__inline
+#define	OS_MEMZERO(_a, _n)	ath_hal_memzero((_a), (_n))
+extern void ath_hal_memzero(void *, size_t);
+#define	OS_MEMCPY(_d, _s, _n)	ath_hal_memcpy(_d,_s,_n)
+extern void *ath_hal_memcpy(void *, const void *, size_t);
+
+#define	abs(_a)		__builtin_abs(_a)
+
+struct ath_hal;
+extern	u_int32_t ath_hal_getuptime(struct ath_hal *);
+#define	OS_GETUPTIME(_ah)	ath_hal_getuptime(_ah)
+
+/*
+ * Register read/write; we assume the registers will always
+ * be memory-mapped.  Note that register accesses are done
+ * using target-specific functions when debugging is enabled
+ * (AH_DEBUG) or we are explicitly configured this way.  The
+ * latter is used on some platforms where the full i/o space
+ * cannot be directly mapped.
+ */
+#if defined(AH_DEBUG) || defined(AH_REGOPS_FUNC) || defined(AH_DEBUG_ALQ)
+#define	OS_REG_WRITE(_ah, _reg, _val)	ath_hal_reg_write(_ah, _reg, _val)
+#define	OS_REG_READ(_ah, _reg)		ath_hal_reg_read(_ah, _reg)
+
+extern	void ath_hal_reg_write(struct ath_hal *ah, u_int reg, u_int32_t val);
+extern	u_int32_t ath_hal_reg_read(struct ath_hal *ah, u_int reg);
+#else
+/*
+ * The hardware registers are native little-endian byte order.
+ * Big-endian hosts are handled by enabling hardware byte-swap
+ * of register reads and writes at reset.  But the PCI clock
+ * domain registers are not byte swapped!  Thus, on big-endian
+ * platforms we have to byte-swap thoese registers specifically.
+ * Most of this code is collapsed at compile time because the
+ * register values are constants.
+ */
+#define	AH_LITTLE_ENDIAN	1234
+#define	AH_BIG_ENDIAN		4321
+
+#if _BYTE_ORDER == _BIG_ENDIAN
+#define OS_REG_WRITE(_ah, _reg, _val) do {				\
+	if ( (_reg) >= 0x4000 && (_reg) < 0x5000)			\
+		bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh,		\
+			(_reg), htole32(_val));			\
+	else								\
+		bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh,		\
+			(_reg), (_val));				\
+} while (0)
+#define OS_REG_READ(_ah, _reg)						\
+	(((_reg) >= 0x4000 && (_reg) < 0x5000) ?			\
+		le32toh(bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh,	\
+			(_reg))) :					\
+		bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh, (_reg)))
+#else /* _BYTE_ORDER == _LITTLE_ENDIAN */
+#define	OS_REG_WRITE(_ah, _reg, _val)					\
+	bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh, (_reg), (_val))
+#define	OS_REG_READ(_ah, _reg)						\
+	((u_int32_t) bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh, (_reg)))
+#endif /* _BYTE_ORDER */
+#endif /* AH_DEBUG || AH_REGFUNC || AH_DEBUG_ALQ */
+
+#ifdef AH_DEBUG_ALQ
+extern	void OS_MARK(struct ath_hal *, u_int id, u_int32_t value);
+#else
+#define	OS_MARK(_ah, _id, _v)
+#endif
+
+#endif /* _ATH_AH_OSDEP_H_ */
diff -N -u -r src.preview/sys/contrib/dev/ath/public/i386-elf.hal.o.uu src/sys/contrib/dev/ath/public/i386-elf.hal.o.uu
--- src.preview/sys/contrib/dev/ath/public/i386-elf.hal.o.uu	1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/public/i386-elf.hal.o.uu	2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,3518 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ *    unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following NO
+ *    ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ *    modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ *    disclaimer similar to the Disclaimer below and any redistribution
+ *    must be conditioned upon including a substantially similar
+ *    Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ *    names of any contributors may be used to endorse or promote
+ *    product derived from this software without specific prior written
+ *    permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: i386-elf.hal.o.uu,v 1.1.1.1 2004/12/08 18:04:43 sam Exp $
+ */
+#define	ATH_HAL_VERSION	"0.9.14.9"
+begin 644 hal.o
+M?T5,1@$!`0D```````````$``P`!```````````````4"`(``````#0`````
+M`"@`#@`+``^W5"0$@_I7#X2^````@_I7?T6#^A)_&(/Z$0^-HP```(/Z!P^$
+ME````.FM````D(/Z&@^$FP```(/Z&G\.@_H3#X2-````Z9````"#^E)T>^F&
+M````B?:!^A(1``!T9('Z$A$``'\H@?H4$```=&2!^A00``!_#+@J````@_I8
+M=%_K6('Z!Q$``'0RZTZ)]K@]````@?H3\```=$2!^A/P``!_"H'Z$Q$``'0G
+MZRVX40```('Z&_$``'0EZQZX90```,.X<@```,.)]KA_````PXGVN)(```##
+MB?:X`````,.)]HM4)`2+1"0(9H'ZC!9T$V:!^B>G=`RY`````&:!^K<0=0X/
+MM\!0Z/'^__^#Q`2)P8G(PY!75E.+?"04BW0D&(M<)!R+3"0@BT0D$`^WT('Z
+M!P(```^$L@```('Z!P(``'\N@_H2?QF#^A$/C80```"#^@</A),```#II@``
+M`(GV@_H3=%B#^AIT3NF5````D('Z$A$``'1<@?H2$0``?Q2!^A00``!T,('Z
+M!Q$``'1<ZW*)]H'Z$_```'0A@?H3\```?PJ!^A,1``!T$>M6@?H;\0``=![K
+M3+@3````@^P,45-65P^WP%#H_/___XG"@\0@ZSN#[`Q14U97#[?`4.C\____
+MB<*#Q"#K))"#[`Q14U97#[?`4.C\____B<*#Q"#K#)"Z`````,<!`0```(72
+M=$MFBX*@`0``9HE""&:+@J(!``!FB4(*BX*D`0``B4(<9HN"J`$``&:)0B!F
+MBX*J`0``9HE"(F:+@JP!``!FB4(D9HN"K@$``&:)0B:)T%M>7\-55U93@^P,
+MBVPD)(M\)"B+="0LNP````"+5"0@BT(4BP0H(?@Y\'4(N`$```#K')"#[`QJ
+M"NC\____@\000X'[YP,``'[2N`````"#Q`Q;7E]=PY!64XM,)`R+="00NP``
+M``"X`````#GP<Q&-%`")R(/@`0G0T>E#.?-R[UM>PU=64XM,)!2+="08BU0D
+M'`^WPHT$0(U$@2`/MU@&#[9`!8/X`G1F@_@"?PF%P'09Z>@```"#^`-T?X/X
+M!`^$GP```.G5````D+_`````@WPD(`!T%`^WPHT$0(!\@2D`=`=FOV``C78`
+MC03U`````(T$@(T$@(T$@,'@`[H`````]_.-1#@*Z98```"0C12=`````+C3
+M36(0]^+!Z@:-3/(5B<B)T[H`````]_.-!(4D````ZVR-=@"-%-T`````N---
+M8A#WXL'J!HU,\A6)R(G3N@````#W\XT$A18```#K0(T4G0````"XTTUB$/?B
+MP>H&C4SR%8G(B=:Z`````/?VC02%`````('[YP,``'<'!;T```#K"H/`7.L%
+MN``````/M\!;7E_#BTPD"+H"````]D$"('5)#[=!`B70````N@,````]P```
+M`'0T#[=!`B70````N@0````]T````'0?N@$```#V00(0=10/MT$"P>@+@^`!
+M@_@!&=+WTH/B!8G0PY"+5"0$BT0D"*F`````=$6X#@```('ZM`D```^$I```
+M`('ZLPD``'<4@>IG"0``N,W,S,SWXHG0P>@"PY"!ZM`)``"XS<S,S/?BB=#!
+MZ`2#P`_#B?;VQ`%T$X'JB!,``+C-S,S,]^*)T,'H`L.X#@```('ZM`D``'1+
+M@?JS"0``=Q.!ZF<)``"XS<S,S/?BB=#!Z`+#@?J'$P``=Q:!ZM`)``"XS<S,
+MS/?BB=#!Z`2#P`_#@>J($P``N,W,S,SWXHG0P>@"PXUV`(M4)`2+1"0(J8``
+M``!T);BT"0``@_H.=%N#^@UW"HT$D@5G"0``PY"-!)*-!(6D"```PY#VQ`%T
+M"XT$D@6($P``PXGVN+0)``"#^@YT)H/Z#7<)C022!6<)``##@_H:=PN-!)*-
+M!(6D"```PXT$D@6($P``PXUV`(M,)`B+1"0$BY#\!P``A=)T0O9"`A!T"(T$
+MB<'@!,.0#[="`B5``0``/4`!``!U"(T$B<'@`\.0#[="`B70````/<````!U
+M#(T$B8T$0<'@`L.)]HT$B8T$0='@PXUV`(M,)`B+1"0$BY#\!P``A=)T5O9"
+M`A!T$+C-S,S,]^&)T,'H!L.-=@`/MT(")4`!```]0`$``'40N,W,S,SWX8G0
+MP>@%PXUV``^W0@(ET````#W`````=1"XHXLNNO?AB=#!Z`7#C78`N*.++KKW
+MX8G0P>@$PXUV`%575E.#[`2+?"0<@'\$`'5QNP````")]L9$'P3_0X/['W[U
+MNP````"#/P!^58UV`(T$6XUTAR"*1@B*3@L/MM"(7!<$"D8)#[;`B%P'!`^V
+MZ6H`56H.5_]T)"CH_/___X/$%&:)1@QJ`55J#E?_="0HZ/S___^#Q!1FB48.
+M0SD??ZZ#Q`1;7E]=PXGV5E.+3"0,BU0D$(M<)!2+="08C8&T`0``@_H/#X<?
+M`0``_R25``````^W@=0!``")!K@`````Z0T!``"X#0```.D#`0``N`T```#I
+M^0```+@-````Z>\````/MT`*B0:X`````.G?````#[=`"(D&N`````#ISP``
+M``^V0`*#X`&#^`$9P(/@#>F[````BD`!P.@'#[;`@_@!&<#WT(/@#>FC````
+MB@#`Z`*#X`&#^`$9P(/@#>F.````B@#`Z`.#X`&#^`$9P(/@#>M\B@#`Z`2#
+MX`&#^`$9P(/@#>MJBX'(`0``B0:X`````.M;@_L!=!:X`````(/[`7),@_L"
+M=!>#^P-T(NLO#[^!S`$``(D&N`````#K,`^W@<X!``")!K@`````ZR"+@=`!
+M``")!K@`````ZQ&X#0```.L*B?:X#````(UV`%M>PY"+5"00BT0D%(-\)`@/
+M=1V#?"0,`W46@_H$=Q&+1"0$B9#0`0``N`$```##D(7`=`;'``P```"X````
+M`,-55U93BVPD%(M<)""+3"0<OP````"#^P=V/HGVBT0D&`^W%+@/MW2X`HG0
+MP>`0"?")`8/!!(/K!(M%%(L$$(D!@\$$@\($@^L$.?)W!8/[`W?F1X/[!W?$
+MB<@K1"0<6UY?7<.04XM$)`B+5"0,BTPD&(M<)!R%TG0'@_H-=!;K,`6@`0``
+MB0''`Q````"X`0```.LA_S/_,?]T)!A0Z%[___^)`[@!````@\00ZP>)]K@`
+M````6\.04XM<)`R+3"00N`````"#>P0`#X0M`0``BP&)`XM!!(E#"(M!"(E#
+M#(M!#(E#$(-Y$/]T%(M!$#W_````=@6X_P```(E#%.L(QT,4`@```)"#>13_
+M=#"+412!^@`$``!V!;H`!```QT,8`0```#E3&',:N`$```"0T>"#R`$YT'+W
+MB4,8ZP:+012)0QB#>1C_=#"+41B!^@`$``!V!;H`!```QT,<`0```#E3'',>
+MN`$```"0T>"#R`$YT'+WB4,<ZPK'0QS_`P``C78`9H-Y'`!T%6:+01QF@_@/
+M=@6X#P```&:)0R#K!F;'0R`*`&:#>1X`=!=FBT$>9H/X#W8%N`\```!FB4,B
+MZPB)]F;'0R(*`(M!((E#)(M!)(E#*(M!*(E#+(M!+(E#,(-Y!`1U$(-[!`%U
+M"L=#.`$```"-=@"X`0```%O#D(M,)`B+5"0,N`````"#>@0`=%N+0@R)00B+
+M`HD!BT((B4$$BT(,B4$(BT(0B4$,BT(4B4$0BT(8B4$4BT(<B4$89HM"(&:)
+M01QFBT(B9HE!'HM")(E!((M"*(E!)(M"+(E!*(M",(E!++@!````PY!55U93
+M@^P4BUPD-(M,)"R+5"0PQT0D#$````"+1"0H9H$X`3!V",=$)`Q6````O@``
+M```/M^H/M_F-=@"+5"0,#[<$<HG!#Z_-NF0````IPHG0#Z_'`<&X'X7K4??I
+MB00DB50D!(M$)`3!^`7!^1\IR&:)`X/#`D:#_@I^OX/$%%M>7UW#C78`BU0D
+M"`^WPF:!^O\`=$2+1"0$9H$X`C!W*V:#^CYV$0^WPHT$@`4B%0``#[?`PXGV
+M#[?"C02`C80`[!,```^WP,.-=@`/M\*-!(`%P!(```^WP,.0BU0D"`^WPF:!
+M^O\`=!^+1"0$9H$X`C!W"XV"8`D```^WP,.0C8+\"```#[?`PXGV55=64X/L
+M#(ML)""+="0D9H$^_S]V&F:#?BP`=!.Z`0```&:#?A8`#X13`@``C78`9H$^
+M`C!V9[]0`0``NP````!F@[YV`0````^$+`(``)"#[`2-1"0.4`^WQU!'5?^5
+MA`$``(/$$(7`#X2]`0``9@^V1"0+9HF$7F(!``!F#[9$)`IFB81>9`$``(/#
+M`@^WAG8!```YV'^WZ:4!``"#[`2-1"0.4&@``0``OP$!``!5_Y6$`0``@\00
+MN@````"%P`^$N0$``&:+1"0*B<)FP>H)9HF68@$``&;!Z`*#X']FB89D`0``
+M#[=$)`K!X`6#X']FB89F`0``@^P$C40D#E`/M\=01U7_E80!``"#Q!"Z````
+M`(7`#X1C`0``9HM$)`J)PF;!Z@MF"99F`0``9L'H!(/@?V:)AF@!```/MT0D
+M"L'@`X/@?V:)AFH!``"#[`2-1"0.4`^WQU!'5?^5A`$``(/$$+H`````A<`/
+MA`T!``!FBT0D"HG"9L'J#68)EFH!``!FP>@&@^!_9HF&;`$```^W1"0*T>"#
+MX']FB89N`0``@^P$C40D#E`/M\=01U7_E80!``"#Q!"Z`````(7`#X2X````
+M9HM4)`J)T&;!Z`]F"89N`0``B=!FP>@(@^!_9HF&<`$``&;1ZH/B?V:)EG(!
+M```/MT0D"L'@!H/@?V:)AG0!``"#[`2-1"0.4`^WQU!5_Y6$`0``@\00N@``
+M``"%P'18ZPF)]KH`````ZTUFBT0D"F;!Z`IF"89T`0``NP````!F@[YV`0``
+M`'0I#[>^=@$``(UV``^WA%YB`0``4%;H$?W__X/$"&:)A%YB`0``0SG??^&Z
+M`0```(G0@\0,6UY?7<.)]E575E.#[!B+1"0PBWPD-&:+4!1FB50D$HE$)!0/
+MM\*-%("-%)"-1``#P>@"`<+!X@)2Z/S___^)P8/$$+@`````A<D/A*4```")
+M#P^W5"0&C402`R7\_P<``<B)1PAFBVPD!F:);P2^`````(/Z`'YXC78`BQ^+
+M3PB-!+:-!(:+;"0(9HM4=0!FB12!9HD4<[D`````C02VC02&C1R%`````(GV
+MC02)C02#B<(#5PAFB4H$`T<(9L=`!@``08/Y`W[BBU<(C02VC02&P>`"9L=$
+M$`8$`(M7"&;'1!!"`P!&#[=$)`8Y\'^+N`$```"#Q`Q;7E]=PXGV55=64X/L
+M!(ML)""+5"0<9HM"%F:)109FQP0DK=YFQT0D`JW>N@````"Y``````^WV(GF
+MD(G8T_BH`70*@_H!?REFB0Q60D&#^0-^Z(M4)!QFBT(49HE%!+@`````9H-]
+M!``/A-4!``#K"K@`````Z<D!``"_`````&:#?00`#X2T`0``C11_C127BT0D
+M'(T44(U:&(MU"(T$OXT$A\'@`F:+4AAFB10PBW4(9HM3$F:)5#`"N0````"-
+M!+^-!(>-%(4`````B?:-!(F-!((#10AFQT`&``!!@_D#?NMF@7PD`JW>=68/
+MMPPDC12_C127C02)P>`"C120`U4(@\($9L="`@0`9HM#`F:)0@1F`T,&9HE"
+M!F8#0PIFB4((9@-##F:)0@IFBT,$9HE"#&:+0PAFB4(.9HM##&:)0A!FBT,0
+M9HE"$NGA````B?:-!+^-!(>--(4`````#[<$)(T$@(T$A@-%"&:+4P)FB5`(
+M#[=$)`*-!("-!(8#10AFQT`(%``/MT0D`HT$@(T$A@-%"&;'0`HC``^W1"0"
+MC02`C02&`T4(9L=`##\`#[<,)(T$B8T4A@-5"(/"!&;'0@($`&:+0@1F`T,&
+M9HE"!F8#0PIFB4((9@-##F:)0@IFBT,$9HE"#&:+0PAFB4(.9HM##&:)0A!F
+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
+M)`IFP>@#B(;?````Z>H```")]F:!/@!`#X;=````@^P$C40D#E!30U7_E80!
+M``"#Q!"%P`^$9@(``&:+5"0*B="#X#]FB8;`````9H$^_T\/AJ4```")T&;!
+MZ`:#X']FB8;4````B=!FP>@-9HF&V````(/L!(U$)`Y04T-5_Y6$`0``@\00
+MA<`/A!X"```/MT0D"H/@!\'@`V8)AM@```!FBU0D"HG09L'H`X/@/V:)AN``
+M``!FP>H)B);<````@^P$C40D#E!35?^5A`$``(/$$(7`#X3?`0``#[=$)`J#
+MX`'!X`<(AMP```!FBT0D"F;1Z(B&W@```)!'@_\"#XX']___9H$^`C`/A^,!
+M``"#[`2-1"0.4&CL````5?^5A`$``(/$$,=$)`0`````A<`/A'`"``!FBT0D
+M"HG"@^('9HF6_````&;!Z`.#X`=FB88``0``@^P$C40D#E!H[0```%7_E80!
+M``"#Q!#'1"0$`````(7`#X0J`@``Z5(!``#'1"0$`````.D8`@``QT0D!```
+M``#I"P(``,=$)`0`````Z?X!``#'1"0$`````.GQ`0``QT0D!`````#IY`$`
+M`,=$)`0`````Z=<!``#'1"0$`````.G*`0``QT0D!`````#IO0$``,=$)`0`
+M````Z;`!``#'1"0$`````.FC`0``QT0D!`````#IE@$``,=$)`0`````Z8D!
+M``#'1"0$`````.E\`0``QT0D!`````#I;P$``,=$)`0`````Z6(!``#'1"0$
+M`````.E5`0``QT0D!`````#I2`$``,=$)`0`````Z3L!``#'1"0$`````.DN
+M`0``QT0D!`````#I(0$``,=$)`0`````Z10!``#'1"0$`````.D'`0``QT0D
+M!`````#I^@```,=$)`0`````Z>T```#'1"0$`````.G@````QT0D!`````#I
+MTP```&:+1"0*B<*#X@=FB9;^````9L'H`X/@!V:)A@(!``!FQX9@`0``!`!F
+MQX9>`0```0!FQX9<`0```0!FQX9:`0````"+!"2+6!2_`````&:#O@0!````
+M=$6-=@"#[`2-1"0.4%-#5?^5A`$``(/$$(7`=(!F#[9$)`MFB81^!@$``&8/
+MMD0D"F:)A'X(`0``@\<"#[>&!`$``#GX?[YF@3X",'<F9L=&6LK_9L=&7/__
+M9L=&7O__=Q)FQT9"#P!FQT9$'`!FQT9&'`#'1"0$`0```)"+1"0$@\0,6UY?
+M7<-64X/L#(MT)!B+7"0<4U;H0/+__X/$$+H`````A<!T5(/L"%-6Z(+3__^#
+MQ!"Z`````(7`=#Z#[`A35NA,Z/__@\00N@````"%P'0H@^P(4U;HFNO__X/$
+M$+H`````A<!T$H/L"%-6Z.#M__^)PH/$$(UV`(G0@\0$6U[#BT0D!`^W@-0!
+M```E_[\``,.-=@!3BUPD#+D`````B?8/O]&-!%)F.9P`(`L``'4$B=#K#$%F
+M@_DJ=N6X_____UO#B?93BUPD#+D`````B?8/O]&-!%)F.1S%X````'4$B=#K
+M#$%F@_EL=N6X_____UO#B?975E.+7"00BW0D%(M\)!A3Z'?___^#Q`2)P;@`
+M````9H7)>&B!X?\/``!T-KH`````C78`C035`````"G09CD,Q>`0``!U%87V
+M=`-FB0Z%_W0"B1>X`0```.LQD$*#^@IVTK@`````@[NP`0``!G4<A?9T"6:A
+MX!```&:)!H7_=`;'!P````"X`0```%M>7\-75E.+="00BT0D%(M\)!AFA<!U
+M,&H05NCT_O__B<-6Z-C^__^#Q`QFA<!T.@^WP%!6Z-K^__^#Q`AF@_C_=">)
+MP^LCD`^WP%!6Z/+^__^8C01`#[<$Q>(```!05NBO_O__B<.#Q!#WQX````!T
+M$@^_PXT$0`^WA``D"P``ZQ")]@^_PXT$0`^WA``B"P``6UY?PXGVBU0D"+@H
+M````]L(0=1*X!0```/?"@````'4%N!0```##C78`BU0D"/;&`707B=#!Z`2#
+MX`&#^`$9P(/@#H/``\.-=@"X`````/?"@````'02B=#!Z`2#X`&#^`$9P/?0
+M@\`(PXM4)`CVQ@%T$[A`#@``]L(0=26X0`P``,.-=@"X`````/?"@````'0/
+MN.`.``#VPA!U!;C`#P``PXUV`%575E.#[""+1"0X9HE$)!Z+5"0\9HE4)!S'
+M1"04!!8``(%\)!08%@``#X,P`0``9HM$)!Z+3"049H4!#X0+`0``#[=9`E/_
+M="0XZ'7___^#Q`B)1"084_]T)#CH)/___X/$"(E$)`Q3_W0D..CO_O__@\0(
+M9HE$)!*]`````#ML)`P/C<0```"^`````(U$+0")P@'HC02`BTPD&&:#?$$"
+M``^$E@````^W1"02B40D"(E4)`2)%"2-!"J-!("-%':-!!"+5"08C01"9HM(
+M!F8Y2`AR3HM\)`B+1"0$`>B-!("-%':-!!"+5"08C1Q"D&8[3"0<=0V+3"04
+M#[=!`NMCC78`#[?1C8$P]O__9CW<`'8%C00ZZP.-0A2)P68Y0PASS4:+%"2-
+M!"J-!("+3"08#[=$00(Y\`^/>O___T4[;"0,#XP_____C78`@T0D%`2!?"04
+M&!8```^"T/[__[@`````@\0@6UY?7<.+1"0(@_@@=R?_)(48%@``N$`!``##
+MN*````##N,````##N%`!``##N-````##B?:X`````,.)]E575E.+="04#[=<
+M)!Q35N@,_O__@\0(B<535NC`_?__@\0(B<=3#[=$)!Q05NCV_/__B<&Z````
+M`(/$##GZ?1F-!%*-!(#1X&8Y#"AU!@'HZPR)]D(Y^GSGN+`0``!;7E]=PY`/
+MMT0D#%`/MT0D#%#_="0,Z(?___\/MP"#Q`S#4_]T)`CHFOO__X/$!(G!9H7`
+M>22)PX'C_W\``+H`````C78`C0129CD<Q>````!T0T*#^FQV[9`/M\&#Z$"#
+M^`MW.?\DA9P6``"XB`$``.LPN(@!``#K*;B+`0``ZR*XB@$``.L;N(P!``#K
+M%+B-`0``ZPT/M\/K"(UV`+@`````6\.0:@!J`/]T)`SHA_O__X/$#,.-=@`/
+MMT0D!(/X"'\.@_@'?1&#^`-T#.L2B?8]F`$``'4)D+@!````PXGVN`````##
+MB?:+3"0(N@````"-=@"-!%+!X`-F.8C@````=0F+@.P```##B?9"@_IL=N*X
+M`````,-H0`$```^W1"0,4/]T)`SHG/O__P^WP%#H@____X/$$(7`#Y3`#[;`
+MPXUV`%575E.#[`2+="085NA/____@\0$A<!T=&:+KM0!``"Z`````(T$U0``
+M``")P2G0P>`#9CFHX!```'5!NP````!F@[CL$````'0RO_`0``")SHUV`(G(
+M*="-!$.#/(<`=`B+!(?V``)U:$.)\8GP*=`/MP3%[!```#G8?]A"@_H*=J*X
+M`````.F\````5NCN^?__@\0$B<-FA<!Y2HG!@>'_?P``N@````"-=@"-!%+!
+MX`-F.8C@````=0F#N/``````=11"@_IL=N*X`````.MWN`$```#K<+@!````
+MZVFX`0```.MB:%`!``!6Z(O[__^#Q`B)!"1H4`$``%;H.OO__X/$"(G'#[?#
+M4%;H@_G__YB-!$!FBZP`(@L``+H`````@\0(.?I]%XUV`(T$4HT$@(L,)&8Y
+M+$%TI$(Y^GSLN`````"-=@"#Q`1;7E]=PXM,)`BZ`````&:%R746_W0D!.B9
+M_O__@\0$PXN`\````,.)]HT$4L'@`V8YB.````!TZ$*#^FQVZ[@`````PY!3
+MBUPD#+D`````B?:-!$F-%,4`````9CF:X````'4-N/````"+1`($ZPV)]D&#
+M^6QVVK@`````6\.-=@!55U93@^P$BWPD',<$)`````"+1"0@9HMH`H'E\`$`
+M`+X`````C78`C01VC1R%`````&8YNR`7``!U-?]T)!CH</C__X/$!&8Y@R(7
+M``!T"F:#NR(7````=1:-!'9F.2R%)!<``'4)QP0D`0```.L&1H/^$':R@SPD
+M`'1:C01VP>`"@[@H%P```'1+BX@H%P``QP0D`````+X`````9H-Y`@!T,@^W
+M60*+5+$$9H,Z`'0?B?9FBP*+?"0@9CL'=0BX`0```.L2D(/"`F:#.@!UXT8Y
+M\W_2BP0D@\0$6UY?7<.-=@!75E.+?"04_W0D$.C`]___@\0$B<:Z`````(GV
+MC035`````"G09CDTA0`"``!U,;D`````C035`````"G0C1R%`````(T$RV8Y
+MN`0"``!U"(N`"`(``.L308/Y`G;FB?9"@_H&=K:X`````%M>7\.0BU0D!+@!
+M````]H+5`0``0'4>N`````"#NK`!```&=!!J`&H`4NBJ]___@\0,C78`PXUV
+M`%.+7"0,N`$```!FA=MT;?]T)`CH%/?__X/$!(G!9H7`>14/M\.)RH'B_W\`
+M`#G0#Y3`#[;`ZT5F/?\!=`JZ`````&:%P'41N`$```#K+K@!````ZR>-=@"-
+M!%+!X`-F.9C@````=0EF.8CB````=-Y"@_IL=N*X`````)!;PXGV_W0D!.BC
+M]O__@\0$B<&Z`````&:%P'DL@>'_?P``B?:-!%)F.0S%X````'0(0H/Z;';M
+MZR*X`0```,.X`0```,.-=@"-!%)F.8P`(`L``'3J0H/Z*G;MN`````##C78`
+M55=64X/L/(M$)&!FB40D-(U$)#A0C40D.E#_="18Z)WV__^#Q`RZ`````(7`
+M#X2K`@``BT0D.(T4Q0`````IPL'B`XN"Y!```(M,)%")@=@!``"#?"1D`'4,
+M@<)@$P``B50D,.L8BU0D.(T$U0`````IT(T$Q>`0``")1"0PQT0D+`````"#
+M[`S_="1<BU0D8/^2@`$``(E$)#C'1"0T`````(/$$(M,)#!F@WD,``^$%P(`
+M``^W1"0TB40D#(GVBU0D)(M,)#"+;)$0#[=U`,=$)"``````BT4$9H,X``^$
+MT0$```^W1"0TB40D$(M4)`R)5"0<P>H#B50D&(M,)!S!Z0*)3"04A70D*`^$
+MC@$``(M<)!"%WG4B5O]T)%3HS/C__X/$"*F`````#X1N`0``]L,L#X1E`0``
+MD(M$)%@Y1"0L#X."`0``BT4$BU0D(`^W/%`/M\=0#[?&4/]T)%CH'O?__P^W
+MV(/$#/?#@````'0DB=@ET````#W0````=!:!XP_^___V1"08`70%@,O`ZP2`
+MRZ"0A=L/A``!``"`Y_WWQ@P```!T68'_J`D``'0:@?^H"0``=PJ!_Z,)``!T
+M"NL/@?^T"0``=0>X`0```.L%N`$```"%P'0J@?^T"0``=0:`XS^`RZ`/M\=0
+M_W0D5.B$_/__@\0(A<!T"(#/`NL#@,\"BTPD+(M$)%1FB3R(9HE<B`)!B4PD
+M+(M4)%0/MT2*_B70````/<````!U*O9$)!0!=".+1"18.<$/@X<```"`XS^`
+MRZ!FB3R*9HE<B@)!B4PD+(UV`(M4)"R+3"14#[=$D?XE4`$``#U0`0``=2OV
+M1"0<`70DBT0D6#G"<TB!XZ_^__^!RT`!``!FB3R19HE<D0)"B50D+(GV_T0D
+M((M%!(M4)"!F@SQ0``^%4O[___]$)"2+3"0P#[=!##M$)"0/C_3]__^+1"1<
+MBU0D+(D0A=(/E<`/MM")T(/$/%M>7UW#BU0D!(M,)`AFBP)F.P%U&`^W4@*!
+MXO`!```/MT$")?`!```IPNL)D`^W$@^W`2G"B=##D%575E.#["R+?"1`BUPD
+M4(M$)%1FB40D(F;'1"0:6!M7Z%_\__^#Q`2Z`````(7`#X2C`P``5^A1]___
+M9HF'U@$``%?HR/?__X/$"(7`=`K'A]P!```!````9H._U@$```!U(0^WPU!7
+MZ)?[__^#Q`BZ`````(7`#X1;`P``9HF?U@$``(/L"`^WA]8!``!05^C\____
+MB40D+%?H,?O__X/$%(7`=$*#[`C_="1D9HM$)"XC1"0H#[?`4/]T)%S_="1<
+M_W0D7%?H&/S__X/$(+H`````A<`/A/P"``"+5"1,BRKI?`(``)"#?"18`'41
+M9H'[2`-U"F;'1"0:71:-=@"]`````+X$%@``@?X8%@``#X--`@``B?9FBUPD
+M(F:%'@^$+@(```^W!H5$)!P/A"$"``"-1"0J4(U$)"Q0#[=&`E!7_Y=X`0``
+M@\00A<`/A``"```/MT8"4`^WA]8!``!05^BE]?__B40D(`^W7@)35^A2\___
+M@\0(9HE$)!Y3#[>'U@$``%!7Z./U__]FB40D*,=$)"0`````@\08BT0D%&:#
+M>`(`#X2H`0``BU0D#(T$4HM<)!2-!$-FBU@&9CE8"`^"<P$``(U$)"2)1"0$
+M9CE<)"@/AT4!``!F.UPD*@^'.@$``&8[7"0:#X<O`0``9H'[M`EU#&:!?@+`
+M``^$'`$```^WPXM4)%P]J`D``'07/:@)``!W"3VC"0``=`GK"SVT"0``=02)
+MT.L%N`$```"%P`^$Y@```#ML)$@/@Q\!``!FB5PD)(U4)"1FBT8"9HE"`F:!
+M^[0)=0@D/PR@9HE"`HU4)"2)5"0(9H%B`O_]4@^W1"044%?H_??__X/$#(7`
+M=`R+1"0(9H%(`@`"ZU,/MP:H#'1,#[?#/:@)``!T%SVH"0``=PD]HPD``'0)
+MZPX]M`D``'4'N`$```#K!;@!````A<!T&P^WPU!7Z(SX__^#Q`B%P'0*BU0D
+M!&:!2@(``HM$)"2+5"1$B02J10^W1*K^)5`!```]4`$``'4>]D0D(@%T%SML
+M)$AS5(M$)`1F@V`"[XM$)"2)!*I%9@-<)!*+5"0,C012BU0D%&8Y7$((#X.5
+M_O___T0D#(M<)!0/MT,".T0D#`^'6_[__XUV`(/&!('^&!8```^"M?W__X7M
+M=%5H@$4``&H$5?]T)%#H;`8``(/$$(/]0'8%O4````")K_@'``"Y`````#GI
+M<RB-!$F-!,>+7"1$9HL4BV:)D/@!``!FBU2+`F:)D/H!``!!.>ERVHGVBT0D
+M3(DH9HN'U@$``&:)1QB%[0^5P`^VT(UV`(G0@\0L6UY?7<.)]E575E.+3"04
+MBUPD&`^W>P*!Y_`!``"+D?P'``"%TG0<9HL"9CL#=10/MT(")?`!```Y^'1=
+MZP6)RNM7D(VQ^`$``(N1^`<``(72=$$/MQN0B=#1^(T$0(T,Q@^W`8G=*<6)
+MZ'4<#[=!`B7P`0``.?ATQ0^W00(E\`$``(G]*<6)Z(7`?@2-<1A*T?IUP[H`
+M````B=!;7E]=PXUV`%575E.#[`R+1"0D9HL`9HE$)`J+5"0@xxxxx@$````/
+MA?D```!2Z(7N__^#Q`1FB40D"+@`````9H-\)`@`>!*+1"0()?\/``#K!XG0
+MZ2(!``!FB40D"&:%P`^$O@```+\`````C78`C03]`````"GXBUPD"&8Y',7@
+M$```#X61````BVPD)`^W70)3_W0D).@7\/__@\0(B<93_W0D).C([___@\0(
+MB40D!+L`````.<-]8+D`````C00;B<(!V(T$@&:#?$8"`'0_B10DB?:-!!J-
+M!("-%$F-!!"-!$:-4`9FBVPD"F8Y:`9W"F8Y:@(/@U3___]!BQ0DC00:C02`
+M#[=$1@(YR'_&0SM<)`1\HXUV`$>#_PH/ADK___^+5"0D#[="`E"+7"0D#[>#
+MU@$``%!3Z%/Q__^)QK\`````@\0,9H-X`@!T)0^W2`*)]HT$?XT41HU"!F:+
+M;"0*9CEJ!G<&9CEJ"',*1SGY?^&X`````(/$#%M>7UW#_W0D"/]T)`CH=_[_
+M_X/$"+H`````A<!T&P^V4`71XHM$)`PHT`^^T(3`>0BZ`````(UV`(G0PY!5
+M5U93@^P<BWPD,(''Y`$```^V1P&#Z`.)1"00QT0D%`````"#^`(/CHD```"-
+M=@"+5"04C012`?AF#[90!6:)5"0:BE@'O@````"`>`8`=%&+1"04C2Q`A-MT
+M/(M4)#@X6@1R,XM$)#0/MP")1"0,@^P(BU0D/`^W0@)0#[=$)"90Z/S___^#
+MQ!`Y1"0,=0@/ML/K*8UV`$8/MD0]!CGP?[:#;"00`_]$)!2#?"00`@^/>O__
+M_XM4)#@/MD($@\0<6UY?7<.)]E93@^P$BUPD$(MT)!2#N]P!````=#.Z$@``
+M`/9&`H!U9[H`````9HL.C78`C012T>!F.XA`````<@EF.XA"````<CM"@_H&
+M=N-64^@T_?__@\0(N@4```"%P'0L@[O@`0```'03@^P$4%93Z,C^__\/MM"#
+MQ!#K$`^V4`3K"@^VD$0```"-=@")T(/$!%M>PU575E.#[!"+1"0D9H.XU@$`
+M```/A1(!``!0Z(7K__^#Q`1FB40D#HM4)"AFBQ)FB50D#+@`````9H-\)`X`
+M>!1FBT0D#B7_#P``ZPB-!#GI]0```&:)1"0.9H7`#X3)````QT0D"`````")
+M]HM$)`C!X`,K1"0(9HML)`YF.2S%X!````^%D@```(M$)"@/MU@"4_]T)"CH
+M!.W__X/$"(G'4_]T)"CHM>S__X/$"(E$)`2^`````#G&?6&0NP````"-!#:)
+MP@'PC02`9H-\1P(`=$")%"2)]HT$,HT$@(T,`(T$6XT$00'XC5`&BVPD#&8Y
+M:`9W"F8Y:@(/@TS___]#BQ0DC00RC02`#[=$1P(YV'_%1CMT)`1\HHGV_T0D
+M"(-\)`@*#X9!____BU0D*`^W0@)0BVPD*`^WA=8!``!05>@Z[O__@\0,@\00
+M6UY?7<.-=@!3BUPD#%/_="0,Z)W^__\/ME`$#[=#`B7`````@\0(/<````!U
+M$HG0@^`/@_@!=0B#XO"#R@*)]HG06\-75E.+?"00BW0D%(/L#%?_EX`!``")
+MPX/$$*@"="H/M\905^B\\/__@\0(A<!U`X/C_0^WQE!7Z.CP__^#Q`B%P'4%
+M@^/?B?;VPP%T%P^WQE!7Z!'O__^#Q`B%P'4&@^/^C78`]L,(=!</M\905^C%
+M[O__@\0(A<!U!H/C]XUV`(G86UY?PXGVBU0D!(M$)`@/MT`"4`^W@M8!``!0
+M4NAUZO__N@````"#Q`RY[!<``&8Y!%%U!K@!````PT*#^@5V[K@`````PU57
+M5E.#[`R+;"0HBT0D((E$)`0!Z(D$)(M$)"1(B40D"'1#BSPDBT0D!#G'=B^)
+M]HG^*>Z#[`A75O]4)#R#Q!"%P'X9B?F)ZXH6B@&(!D:($4%+=?,I[SM\)`1W
+MTP$L)/],)`AUO8/$#%M>7UW#D)!55U93@>RH````BZPDO````&B4"0``Z/S_
+M__^)PX/$$+X"````A<`/A&@%``")QX/L!&@`"```:``8``!0Z/S___^+A"3$
+M````B4,,BX0DR````(E#$(N$),P```")0Q1FB:N@`0``9L>#H@$`````9L>#
+MS`$``#P`QX/0`0```````,>#Q`@```````#'@X0)````````QX.("0``____
+M_\>#C`D``/_____'@Y`)``#_____@\0(:@!3Z/S___^#Q!"^`P```(7`#X3%
+M!```QX.D`0```0```(M#%(N0($```&8/MM)FB9.H`0``BY`8F```9HF3J@$`
+M`&;'@ZX!`````,>`T)@``!8<``"^`````)"+1Q3'@("8``````$`1H/^`W;M
+MBT<4BX``G```P>@<@^P(:@10Z/S___]`9HF'K`$``(M7%(N"$$```(E$)!B#
+MR`&)@A!```"#Q`R-1"024&H]5^C\____@\00O@@```"%P`^$#`0``+X$````
+M9H%\)`ZE6@^%^@,``(/L!(U$)!)0:C]7Z/S___^#Q!"^"````(7`#X3:`P``
+M9HM$)`YFB8,""```@^P$C40D$E!HP0```%?H_/___X/$$+X(````A<`/A*L#
+M``!FBT0D#F;!Z`QFB8,`"```O@4```!F@_@!#X6,`P``O0````"^`````(GV
+M@^P$C41T%%"-AL````!05^C\____@\00A<`/A%@#```/MT1T$#'%1H/^/W;3
+MO@<```"!_?__```/A4(#``"#[`2-1"024&B_````5^C\____@\00O@@```"%
+MP`^$'P,``&8/MD0D#F:)A]0!``"+1"049HF#!`@``&:+1"069HF#!@@``(M$
+M)!B(@P@(``!F#[9$)!F(@PD(``!FBT0D&HB#"P@``&8/MD0D&XB#"@@``&8/
+MMD0D'8B##@@``(M$)!R(@P\(``!F#[9$)!^(@Q`(``!FBT0D'HB#$0@``(I$
+M)""#X`&(@PP(``"+1"0@9M'H@^`'B(,-"```O@````"]"0```(T4]0`````I
+M\HT4E@':C8H2"```9HM$;!!FP>@*B((2"```9HM$;!!FP>@$@^`_B$$+#[=$
+M;!#!X`*#X#QFBU1L$F;!Z@X)T(A!`8I$;!.#X#^(00QFBT1L$F;!Z`*#X#^(
+M00(/MT1L$L'@!(/@,&:+5&P49L'J#`G0B$$-9HM$;!1FP>@&@^`_B$$#BD1L
+M%(/@/XA!#F:+1&P69L'H"HA!!&:+1&P69L'H!(/@/XA!#P^W1&P6P>`"@^`\
+M9HM4;!AFP>H."="(006*1&P9@^`_B$$09HM$;!AFP>@"@^`_B$$&#[=$;!C!
+MX`2#X#!FBU1L&F;!Z@P)T(A!$6:+1&P:9L'H!H/@/XA!!XI$;!J#X#^(01)F
+MBT1L'&;!Z`J(00AFBT1L'&;!Z`2#X#^(01,/MT1L','@`H/@/&:+5&P>9L'J
+M#@G0B$$)BD1L'X/@/XA!%&:+1&P>9L'H`H/@/XA!"@^W1&P>P>`$@^`P9HM4
+M;"!FP>H,"="(015FBT1L(&;!Z`:#X#^(01:*1&P@@^`_B$$79HM$;")FP>@*
+MB$$89HM$;")FP>@$@^`_B$$9#[=$;"+!X`*#X#QFBU1L)&;!Z@X)T(A!&HI$
+M;"6#X#^(01MFBT1L)&;!Z`*#X#^(01Q&@\4+@_X$#X82_O__@^P,5^CW````
+MO0````"^`````(/$$(/L!(U$)!)0N!\````I\%!7Z/S___^#Q!"%P'1*#[=$
+M)`X!Q68/MD0D#XB$<Z,(``!FBT0D#HB$<Z0(``!&@_X"=KV%[70(@?W]_P(`
+M=0>^"0```.L@BT<4BU0D"(F0$$```(GXZT2^"````.L5O@@```"-=@"+1Q2+
+M5"0(B9`00```A=MT#(/L#%/H_/___X/$$(.\),``````=`F+A"3`````B3"X
+M`````('$G````%M>7UW#@^P8_W0D'.C\____@\0<P[@`````]D0D"0%T%XM$
+M)`QFQP``%(M$)!!FQP`V%;@!````PXM4)`2-@K0!``"#2`0!9L=`#``49L=`
+M#C85@(JT`0```H!@`7]FQT`(`P!FQT`*0`"X`0```,.05E.+3"0,BW0D$(M<
+M)!2+012)L"R```"#N;`!```!=#R+412)\"L%`````,'@`XF",(```(M1%(GP
+M*P4`````P>`#B8(T@```BU$4B?`#@80)``")@CB```#K*9"+013'@#"```#_
+M____BT$4QX`T@```_____XM!%,>`.(````$```"0@>/__X`!BT$4B9@D@```
+M6U[#B?964X/L!(MT)!"[,@```(M6%(M"+*@$=0B+0@BH`G0^D(/L#&H!Z/S_
+M__^#Q!!+=1R+1A2+5"04B5`$BT84QT`H"@```+@`````ZQ>0BU84BT(LJ`1U
+MRHM""*@"=<.X`0```(/$!%M>PXM4)`2+0A3'@"R`````````BTH4BX$$@```
+M#0``$``E__]?_XF!!(```(M"%,>`)(```/__``##5E.+="0,BTPD$&:#>1(`
+M=$>+5A2+@@2````E__]__PT``"``B8($@```BU84#[=!$(F"*(```(M6%`^W
+M01*)@DB```"+5A2+013!X`.)@C2```#K%XUV`(M6%(N"!(```"7__U__B8($
+M@```BU84BP&)@BR```"+7A2+@R2````E``"`_P^W40@)PF:#>1@`=!$/MT$8
+M@\`$P>`0)0``?P`)PHF3)(```&:#OJ@!```#=B4/MT$:J`=T'8M.%(N1&(``
+M`(#F^,'@""4`!P``"<*)D1B```"06U[#D(M$)`2+0!2+@`A```"%P`^5P`^V
+MP,.)]E.+7"0,BTPD"(M!%(M0'(/Z_W40QP,`````N`````#K.8UV`(G0(X&L
+M"```);K8!0&)`_?"(`!P`'0'#0```$")`_;"!70#@PL!]\+`!0``=`.#"T"X
+M`0```%O#BT0D!(N`K`@``,.05U93BW0D$(M<)!2)\8N^K`@``(7_>0V+1A3'
+M0"0`````C78`B=J!XKK8!0'VPP%T`X/*!?;#0'0S@[FP"````'0#@\I`@[FT
+M"````'0#@,X!@[FX"````'0#@,J`@[F\"````'0&@,X$C78`BT84B5`@B9FL
+M"```A=MY#(M&%,=`)`$```")]HGX6UY?PY"0N$````##B?:+1"0(9H/X/W<?
+M#[?`P>`%BU0D!`-"%(N`')```+H!````J0"```!U!;H`````B=##C78`BTPD
+M!(M$)`BZ`````&:#^#\/AX$````/M\#!X`6)P@-1%,>"`)````````")P@-1
+M%,>"!)````````")P@-1%,>"")````````")P@-1%,>"#)````````")P@-1
+M%,>"$)````````")P@-1%,>"%)````````")P@-1%,>"&)`````````#013'
+M@!R0````````N@$```")T,.05U93BWPD$(M4)!B+="04N`````!F@_X_=VJ%
+MTG0X#[9:!<'C"`^V0@0)PP^V2@/!X1@/MD("P>`0"<$/MD(!P>`("<$/M@()
+MP='IB=C!X!\)P='KZPJ[`````+D`````#[?&P>`%B<(#5Q2)BAB0```#1Q2)
+MVH#.@(F0')```+@!````6UY?PU575E.#[!"+="0LBT0D*&:)1"0.@WPD-`$9
+MR??1@>&JJJJJN`````!F@WPD#C\/AU`!``"X`````(`^``^%0@$``+@`````
+M9H-^`@0/AC(!``#'!"0`````9H-^`@5V$&:#?@(.&=*#XOZ#P@.)%"0/MFX$
+M#[9&!<'@"`G%#[9&!L'@$`G%#[9&!\'@&`G%,<T/MD8)P>`(#[96"`G",<J!
+MXO__``")5"0(#[9^"@^V1@O!X`@)QP^V1@S!X!`)QP^V1@W!X!@)QS'/#[9&
+M#\'@"`^V5@X)PC'*@>+__P``B50D!`^V7A`/MD81P>`("<,/MD82P>`0"<,/
+MMD83P>`8"<,QRV:#?@(-=P:!X_\````/MTPD#HG(P>`%B<*+="0D`U84B:H`
+MD```B<(#5A2+="0(B;($D```B<*+="0D`U84B;H(D```B<(#5A2+="0$B;(,
+MD```B<*+="0D`U84B9H0D````T84BQ0DB9`4D```_W0D,%%6Z/S___^#Q`R-
+M=@"#Q!!;7E]=PX/L$&H&BT0D&`6C"```4/]T)"#H_/___X/$',.#[!!J!O]T
+M)!R+1"0<!:,(``!0Z/S___^X`0```(/$',.-=@!3@^P(BUPD$(M3%(M$)!2+
+MA((`8```:@)J`V@`;```4^C\____@\00N@````"%P'05BT,4BY``:```BT0D
+M&&:)$+H!````B="#Q`A;PXUV`%.+7"00BTPD"+H,````BT0D#&8Y@=0!``!T
+M&`^W@0((``#!Z`>#X`&#^`$9TH/B^(/""X7;=`*)$[@`````6\.X`0```,.)
+M]HM$)`2`N`P(````#Y7`#[;`PXGV4X/L$(M<)!AJ`%/H_/___X/$#(7`#Y3`
+M#[;`4&H`4^C\____@\086\.-=@!3BT0D"(M8%(M,)`S1X;H#````T^+WTHN#
+M%$```"'"N`(```#3X`G"B9,40```N`$```!;PXUV`%.+1"0(BU@4BTPD#-'A
+MN`,```#3X/?0BY,40```(=")@Q1```"X`0```%O#4XM,)`R+1"0(BU@4BY,8
+M0```N/[____3P"'"BT0D$(/@`=/@"<*)DQA```"X`0```%O#D(M,)`BX____
+M_X/Y!7<5BT0D!(M`%(N`'$```(/@+]/H@^`!PU93@^P$BW0D$(M,)!2+1A2+
+MF!1```")RL'B#-'AN`,```#3X`G0#0"``0#WT"'#"=.`SX"#?"08`'0&@<L`
+M``$`BT84B9@40```@^P(BX:L"```#0````%05NC\____@\046U[#C78`4XM<
+M)`B+3"0,BT,4BY`00```A<ET"H/Y!'0-ZQ.-=@"#XI_K$8UV`(/BWX/*0.L&
+M@\H@@^*_BT,4B9`00```6\.-=@"+1"0$BT`4BX`$@```P>@7@^`!@_@!&<"#
+MP`+#BTPD!(M4)`B+012+@`2```"I``"``'0(@_H"=0C#B?:#^@%T#HM1%`T`
+M`(``B8($@```PU93@^P(BW0D%(M<)!QJ!O]T)!R-AL@(``!0Z/S___^+3A0/
+MMI;("```#[:&R0@``,'@"`G"#[:&R@@``,'@$`G"#[:&RP@``,'@&`G"B9$(
+M@```@\00BTX4#[:&S0@``,'@"`^VELP(```)PHG8)?\_``#!X!`)PHF1#(``
+M`&:%VW05@^P$:@!J`%;H_/___X/$$.L/C78`@^P,5NC\____@\00@\0$6U[#
+MB?93BT0D"(M(%(N!<(```(G"N`````"+B6R```"[``````G("=I;PXGVBT0D
+M!(M`%(N`;(```,.)]HM$)`2+4!2+@B2````-`````8F")(```,.-=@"+5"0$
+MBT(4BX!DF```B<'!Z1.!X?\!``")R,'H"(7`=`:!\0#^__^+4A2+@G"```"+
+MDFR````QT#'(PY"+1"0$#[>0J`$``(M`%(N`($```"7_````.<(/E,`/MM")
+MT,.+3"0$BT0D"(M1%(N2F(````$0BU$4BY*4@````5`$BU$4BY*<@````5`,
+MBU$4BY*0@````5`(BU$4BY*@@````5`0PXM4)`2+0A3'0"0`````BXJL"```
+M@,U`B8JL"```BT(4B4@@BT(4QT`D`0```,.)]E=64XM\)!"+="04B?N#_@AV
+M%H/L"&C__P``5^C\____@\00.?!S$I#'@X@)``#_____N`````#K(X/L"%97
+MZ/S___^+5Q2)@A"```"#Q!")MX@)``"X`0```(GV6UY?PX/L%(M4)!B+0A2+
+M@!"````E__\``%!2Z/S___^#Q!S#55=64X/L%(ML)"AH_Q\``%7H_/___X/$
+M$#M$)"1S$<>%C`D``/____^X`````.L\BW44BYX4@```@>,`X/__@^P(_W0D
+M+%7H_/___R7_'P``"<.)GA2```"#Q!"+1"0DB86,"0``N`$```"0@\0,6UY?
+M7<.#[!2+5"08BT(4BX`4@```)?\?``!04NC\____@\0<PU575E.#[!2+;"0H
+M:/\?``!5Z/S___^#Q!`[1"0D<Q''A9`)``#_____N`````#K0(MU%(N>%(``
+M`('C__\`X(/L"/]T)"Q5Z/S____!X!`E``#_'PG#B9X4@```@\00BT0D)(F%
+MD`D``+@!````B?:#Q`Q;7E]=PX/L%(M4)!B+0A2+@!2````E``#_'\'H$%!2
+MZ/S___^#Q!S#D+@`````PXGVPXUV`,.-=@"#[`R+1"04BU0D&(/X`74,@_H!
+M&<#WT(/@#>L2_W0D'%)0_W0D'.C\____@\00@\0,PXGV@^P,BT0D$(M,)!2+
+M5"0<@_D+=1R#X@:)D,@!``"+0!2)D&B```"X`0```.L9C78`@^P,_W0D+%+_
+M="0L45#H_/___X/$((/$#,.)]H/L%/]T)"S_="0L_W0D+/]T)"S_="0L_W0D
+M+.C\____@\0LPU.+7"0(BTPD$(M3%(N"!(```"7__W__#0``!`")@@2```"#
+M?"0,`'01BU,4#[?!#0```P")@@1```!;PU93@^P$BW0D$(-\)!0`=&2+1A3'
+M@`1`````````@^P,:-`'``#H_/___[L*````@\00B?:+1A2+@!!```"I```!
+M`'0B@^P,:,@```#H_/___XM&%,>`!$````````"#Q!!+==#K!H7;=0J)]K@`
+M````ZQJ0BU84BX($@```)?__>_^)@@2```"X`0```(/$!%M>PY"+3"0$BU$4
+MBX($@```)?__?_\-```$`(F"!(```(-\)`@`=`V+013'@`1```````$`PXGV
+M5U93BU0D$(M<)!2+3"08BT0D'(G6OP$```"#^P)T)8/[`G<(@_L!=`KK.9"#
+M^P-T).LQ#[?`4%%2Z+[^__^#Q`SK*9"#[`A14NCJ_O__B<>#Q!#K%U%2Z'#_
+M__^#Q`CK"XUV`+@`````ZPF0B9[$"```B?A;7E_#BT0D!(N`Q`@``,.0N```
+M``##B?:+1"0$BU`4BX($@```)?__;_^)@@2```"X`0```,.)]HM$)`2+4!2+
+M@@2````E__]__PT``!``B8($@```N`$```##D%.#[`B+1"04@_@!=`^[````
+M`(/X`G05ZPN-=@"[`````.L)D+@`````ZQ.0@^P(4_]T)!SH_/___XG8@\00
+M@\0(6\.0BT0D!(M`%(M`#,.0BT0D!(M0%(M$)`B)0@S#D(M$)`2+0!3'0`@$
+M````PY!64X/L!(MT)!"+1A3'0`@@````NP````"+1A2+0`BH!'4*N`$```#K
+M'HUV`(/L#&H*Z/S___^#Q!!#@?OG`P``?M:X`````(/$!%M>PXUV`(M$)`2+
+M4!2+@FB```"#X+^)@FB```##D(M$)`2+4!2+@FB```"#R$")@FB```##D(M,
+M)`2+412+1"0(B8)0@```BU$4BT0D#(F"5(```,.04XM4)`B+3"0,N`````"#
+M^3]W0H/Y'W8@BU(4BYI4@```@^D@N/[____3P"'8B8)4@```ZQN-=@"+4A2+
+MFE"```"X_O___]/`(=B)@E"```"X`0```%O#D%.+5"0(BTPD#+@`````@_D_
+M=T*#^1]V((M2%(N:5(```(/I(+@!````T^`)V(F"5(```.L;C78`BU(4BYI0
+M@```N`$```#3X`G8B8)0@```N`$```!;PY"+1"0$BT`4BX!,@```PXGVBU0D
+M"/;&`G0&@.;]@\H@BT0D!(M`%(F03(```,.-=@"+5"0,BTPD",=!"`````")
+MT"7_#P``B4$,N``````Y40QU(?9$)!`@=`>!20P`(```QT$4`````,=!$```
+M``"X`0```,.-=@!75E.+?"00BW0D%(GSBT0D'+H/````]D84`0^$!P$``/9`
+M%`%U%8M'%(M`#+H/````.T0D&`^$[````&:+0Q`E_P\``&:)1B"+2Q2!X0"`
+M_P_!Z0^+1Q2+@&R```")PL'J"H'B__\``(G0)?\?```YR',1C8(`X/__)?__
+M```)P>L$B?8)T8G()?]_``!FB48BQD8D`(M#%*@"=3BH!'0(QD8D`>LNB?;V
+M0Q00=`:`3B0(ZR#V0Q0(=`:`3B0$ZQ2`3B0"BT,4)>````#!Z`6(1B6)]HM#
+M$"4``/@'P>@3B$8FBT,4]L0!=`XE`'X``,'H"8A&)^L%D,9&)_^+0Q`E`(`'
+M`,'H#XA&*(M#$,'H#H/@`8A&*8M#$,'H#(/@`8A&*KH`````B=!;7E_#D)"0
+M55=64X/L#(M\)""+;"0LB7PD"+H,````BT0D*/9``P$/A/(%``"#?"0D!G0A
+M@WPD)`9W"8-\)"0!=PGK$8-\)"0(=`JZ#````.G*!0``BT<4BX`00```B<.#
+MXV"#[`C_="0P5^C\____@\00N@,```"%P`^$GP4``(M/%(MT)`@/MI:C"```
+M#[:&I`@``,'@"`G"#[:&I0@``,'@$`G"#[:&I@@``,'@&`G"B9$`@```@WPD
+M)`$/A)T```"#?"0D`7)8@WPD)`9T$(-\)"0(#X3"````Z?D```"+3Q2+1"0(
+M#[:0J`@``,'B"`^V@*<(```)T`T``%$`B8$$@```BT<4QT`H`````(M'%,>`
+M$$```$`0``#IN````(M/%(MT)`@/MI:H"```P>((#[:&IP@```G0#0``4@")
+M@02```"+1Q3'0"@!````BT<4QX`00```)!```.MZBT\4BT0D"`^VD*@(``#!
+MX@@/MH"G"```"=`-```4`(F!!(```(M'%,=`*`````"+1Q3'@!!````D$```
+MZSR+3Q2+="0(#[:6J`@``,'B"`^VAJ<(```)T`T``!``B8$$@```BT<4QT`H
+M`````(M'%,>`$$```$`0``"+5Q2+@A!````)V(F"$$```(M/%(M$)`@/MI#(
+M"```#[:`R0@``,'@"`G"BUPD"`^V@\H(``#!X!`)P@^V@\L(``#!X!@)PHF1
+M"(```(M/%`^VD\T(``#!X@@/MH/,"```"=")@0R```"+1Q3'``````"+1Q3'
+M0`0`````BT<4QT`,`````(M'%(M0',=`(`````"+1Q3'0"0`````QX.L"```
+M`````(M'%(M0+,=`,`4```"+1Q3'0#0%````BT<4QT!$"````(M'%,=`2`@`
+M``"+1Q3'0%``````BT<4QT!,`````(M'%,>`#$````````"+1Q3'0$``````
+MBT<4QX`8@`````<``(M'%,>`2(````````"#[`AJ`%?H_/___XM'%,>`4(``
+M``````"#Q!"+1Q3'@%2`````````BT<4QX!8@````````(M'%,>`7(``````
+M``"+1Q3'@&"````!````BT<4QX!D@````0```(M'%,>`:(````````"+1Q3'
+M@"B`````````BT<4QX`L@````````(M'%,>`;(````````"+1Q3'@#"```#_
+M____BT<4QX`T@```_____XM'%,>`.(````$```"Y`````+X`(```D(L<SH7M
+M=`V-@P"`__\]_P\``'8*BU<4BT3.!(D$&D&!^:8```!VV8/L"/]T)#!7Z/S_
+M__^#Q!"Z`P```(7`#X0H`@``BT\4BY$HF```,/:+="0(#[:&"0@``,'@"`G"
+MB9$HF```BU\4#[:6"@@``(G0P>`8P>(0"=`/MHX+"```B<K!X@@)T`G(B8,T
+MF```BT\4BY%$F```@>)_P/__9HN&!`@``&;1Z"6`/P``"<*)D428``"+3Q2+
+MD4B8``"!XO\/_/\/MX8$"```P>`*)0#P`P`)PHF12)@``(M/%(N19)@``('B
+M_P_X_P^VA@@(``#!X`PE`/`'``G"B9%DF```BT\4BY$0F0``@^+\#[>&!`@`
+M`(/@`PG"B9$0F0``@^P(_W0D,%?HQ`P``(/$$+H#````A<`/A#`!``"+1Q3'
+M@!R8```!````@^P,:.@#``#H_/___XM7%(N"8)@``(/(`8F"8)@``(/$$&H`
+M:@%H8)@``%?H_/___X/$"/]T)#!7Z/S___^#Q!"[`````(7`=1.+1"0H9H-(
+M`@*Z`P```.G&````@^P(4U?H_/___X/$$$.#^P)^[8M4)`B`N@P(````=`R#
+M[`Q7Z/S___^#Q!"+5Q2+@B2````E__]__HF")(```(M<)`B#NX@)``#_=!*#
+M[`C_LX@)``!7Z/S___^#Q!"+="0(@[Z,"0``_W02@^P(_[:,"0``5^C\____
+M@\00BT0D"(.XD`D``/]T$H/L"/^PD`D``%?H_/___X/$$(._R`$```!T#XM7
+M%(N'R`$``(F":(```(M4)"2)E[`!``"X`0```.L0BUPD,(,[`'0"B1.X````
+M`(/$#%M>7UW#BTPD!(M!%(N`!(```"7__P``BY&P`0``@_H!=#.#^@%R'H/Z
+M!G0)@_H(=#/#C78`BU$4#0``40")@@2```##D(M1%`T``%(`B8($@```PY"+
+M410-```4`(F"!(```,.+410-```0`(F"!(```,.)]H/L$&H*:@C_="0<Z#@#
+M``"#Q!S#4X/L"(M<)!!J`&H!:@)3Z/S___^#Q!"Z`````(7`=%"#[`1H($X`
+M`&H/4^@$`P``@\00N@````"%P'0T@^P,:.@#``#H_/___X/$#&@@3@``:A]3
+MZ-L"``#'!"0T"```Z/S___^Z`0```(/$$(UV`(G0@\0(6\.05E.#[`2+="00
+MBUPD%&H`:@%J`E;H_/___X/$$+H`````A<`/A)<```"+1A2Z`````(7;=`CV
+M0P(0=`*R`8F0!)@``(/L!&@@3@``:@]6Z&D"``"#Q!"Z`````(7`=&&#[`QH
+MZ`,``.C\____@\0,:"!.``!J'U;H0`(``(/$$+H`````A<!T.(/L#&@T"```
+MZ/S___]J`&H!:@)6Z/S___^#Q""Z`````(7`=!.#[`1J"FH`5N@"`@``B<*#
+MQ!"0B="#Q`1;7L-55U93@^P8BVPD+(M5%(N":(```(/(8(F":(```(M5%(NZ
+M)(```(GX)?__?_^)@B2```!HH`\``.C\____BU44BX((F```#0````B)@@B8
+M``#'!"0*````Z/S___^#Q`C_="0L5>@^"0``@\00N@````"%P`^$;@$``(/L
+M#&CH`P``Z/S___^+512+@@B8```E____]XF"")@``(/$!(M%%(N86)@``(NP
+M7)@``(N0:)@``(E4)!2)VH'*``#\`XF06)@``(M5%(GP)7\`P/\-@,`_`(F"
+M7)@``(M5%(M$)!0E'P#^_PV`$0``B8)HF```:A3H_/___XM5%(N"")@```T`
+M```(B8((F```QP0D"@```.C\____BT44QX#4F```(0```(M5%(N"")@``"7_
+M___WB8((F```QP0DZ`,``.C\____BU44BX)@F```@\@!B8)@F```@\00:@!J
+M`6A@F```5>C\____@\0(BT44B9A8F```BT44B;!<F```BT44BU0D$(F0:)@`
+M`/]T)"Q5Z/S___^#Q!"%P'4L@^P,:(@3``#H_/___X/$"/]T)"Q5Z/S___^#
+MQ!"%P'4+BT0D)&:#2`("B?:+112+D&B```"#XI^)D&B```"+112)N"2```"Z
+M`0```(G0@\0,6UY?7<.)]E=64XM\)!"+="04B?"%]G4%N/____^)PXM'%(FP
+M`$```(/L#/]T)"3H_/___X/F#X/C#U93:`!```!7Z/S___^)PH/$(/?&!```
+M`'4*BT<4QT`4`````(G06UY?PXUV`%93@^P$BTPD%(I$)!B(1"0#NP````"Z
+M"@````^VP(UP`8UV`(U$$@,Z1"0#=1J`/!$_=`P/M@01Z9X```"-=@"[`0``
+M`.MQD(U$$@,/ML`YQG51A=)^38`\$3]T/X!\"O\_=#@/MAP1#[9,"O\IRXT$
+MFXT$@(T4Q0`````IPHV<$N<#``"XTTUB$/?CB=#!Z`:-'`@/ML/K0HUV`+L!
+M````ZQ60@_L!=0^`/!$_=`D/M@01ZR:-=@!*#XEE____N@````"`/!$_=`8/
+MM@01ZPM"@_H*?NZX`0```(/$!%M>PXUV`%575E.#[`2+7"0<BVPD)(I4)""_
+M_____[[_____N0````")]H`\"S]T*C@4"W1/.!0+<P*)SC@4"W89B<^#_O]U
+M&HU$"0.(10`/MD0+"^F2````D$&#^0I^RNL%@_D*?BNX/P```(/^_W1Z@_D*
+M?AR-1#8#B$4`#[9$,POK9XU$"0.(10`/MD0+"^M9C40^`XA%``^VT@^V##,I
+MRHT4DHT4DHT4DHTLU0`````/M@0[*<B)P8GHF??YB<4/MD0["P^V3#,+*<B)
+MZ@^OT('"YP,``+C336(0]^*)T,'H!@)$,PL/ML"#Q`1;7E]=PXUV`(M4)`B#
+M^CQV!;H\````BT0D!&:)D,P!``"X`0```,.055=64X/L$(ML)"2+5"0HBWPD
+M+(EL)`1FBX4&"```9L'H!(/@!XA'#XJ%!@@``(/@!XA'$&:+`BTR%```N0``
+M``!F/98`#X=,`@``NP````"+3"0$9@^VA`L."```9CF%U`$``'0&0X/[`W;D
+MN0````"#^P0/A!T"```/MPJ!Z3(4``"X9V9F9O?IP?H"B<C!^!^)T2G!@_D,
+M@]'_N*NJJJKWX8G1T>F-!,T`````*<B--(&+1"0$C;0&$@@``(I$'AF(1PZ*
+M1A8Z1!X9=@2*1!X9B$<)BD87.D0>&78$BD0>&8A'"(I&&#I$'AEV!(I$'AF(
+M1P>-1"0/4`^V1!X94%95Z.G]__^(PXU$)!Y0#[9'"5!65>C6_?__B$0D(X/$
+M((U$)`U0#[9'"%!65>B^_?__B$0D$HU$)!Q0#[9'!U!65>BI_?__B,*#Q""#
+MO=`!````#X3T````BX70`0``9HN,`$HE```/ME0D#P^WP8/``SG"?0?&1"0/
+M`^L$*$PD#P^V1"0/4%95Z'[\__^(1PZ-1"074`^V1PY05E7H3OW__XC#BD0D
+M*X/$'#I$)`YV!(I$)`Z(1"0.#[;`4%95Z$C\__^(1PF-1"074`^V1PE05E7H
+M&/W__XA$)!^*1"0K@\0<.D0D#78$BD0D#8A$)`T/ML!05E7H$/S__XA'"(U$
+M)!=0#[9'"%!65>C@_/__B$0D'HI$)"N#Q!PZ1"0,=@2*1"0,B$0D#`^VP%!6
+M5>C8^___B$<'C40D%U`/MD<'4%95Z*C\__^(PH/$'`^V1"0/T>!FB87.`0``
+MBD<.B$<*B$<+B$<,B$<-B-@HT(@'B-@J1"0"B$<!B-@J1"0#B$<"QD<&`,9'
+M!0#&1P0`QD<#`+D!````B<B#Q!!;7E]=PXUV`%=64X/L=(N\)(0```!J1&A@
+M)0``C40D#%#H_/___X/$#&H1:#@E``"-7"1<4^C\____4_^T))@```!7Z!S]
+M__^#Q!RZ`````(7`#X1@`@``BD0D7TBZ`````#P$#X=.`@``BD0D8$BZ````
+M`#P$#X<\`@``O@````"-=@`/M]Z#[`AJ!0^V1!Q<4.C\____B$0<8(/$$$9F
+M@_X&=M^^!P```(GV#[?>@^P(:@8/MD0<7%#H_/___XA$'&"#Q!!&9H/^#G;?
+M#[9$)%'!X`4EX`````^V5"10@^(?"=`)!"0/ME0D4\'B!X'B@`````^V1"12
+MP>`"@^!\"<**1"11P.@#@^`#"<()5"0$#[94)%3!X@2!XO````"*1"13T.B#
+MX`\)P@E4)`@/ME0D5L'B!H'BP`````^V1"15T>"#X#X)PHI$)%3`Z`2#X`$)
+MP@E4)`P/ME0D5\'B`X'B^````(I$)%;`Z`*#X`<)P@E4)!`/ME0D6<'B!X'B
+M@`````^V1"18T>"#X'X)PHI$)%?`Z`6#X`$)P@E4)!0/ME0D6L'B!8'BX```
+M`(I$)%G0Z(/@'PG""50D&`^V5"1;P>(#@>+X````BD0D6L#H`X/@!PG""50D
+M'`^V5"1<T>*#XGZ*1"1;P.@%@^`!"<()5"0@#[9$)%W!X`4EX`````E$)"0/
+MME0D7L'B`X'B^````(I$)%W`Z`.#X`<)P@E4)"B*1"1>P.@%@^`!"40D+(/L
+M"&H##[9$)&M0Z/S____!X`<E@`````E$)#"#Q`AJ`P^V1"1K4.C\____T>B#
+MX`,)1"0T@\0(:@,/MD0D;%#H_/___\'@`H/@'`E$)#2^`````(/$$(GVBT<4
+M#[?6BQ24B9"<F```1F:#_@]VZHM'%`^WUHL4E(F0U)@``+H!````B?:)T(/$
+M<%M>7\.-=@!75E.+7"00BWPD%(/L"%=3Z/S___^)QH/$$+@`````A?9T3H/L
+M"&H%#[</@>D`%```N&=F9F;WZ8G0P?@"P?D?*<A0Z/S____1X(/(08M3%(F"
+MG)@``(/$$(M#%,>`P)@```````")L_P'``"X`0```%M>7\.-=@"+1"0$BT`4
+MBX!DF```P>@3)?\!``#VQ`%T!34`_O__F,.-=@!64X/L!(MT)!"+1A2+D&"8
+M``"#R@*)D&"8``!J`&H":&"8``!6Z/S___^#Q!"Z`````(7`=#N[`````)"#
+M[`QHZ`,``.C\____5NC\____F(/$%$.#^Q1_!X/XN'_>ZPRZ`````(/XN'\'
+MB?:Z`0```(G0@\0$6U[#C78`N`````##D)!3@^P(BUPD$(M4)!2X`````(/Z
+M`G\>@^P$_W0D'(T$4HT$@(V$@]`(``!04^C\____@\00@\0(6\.-=@!3@^P(
+MBUPD$(M4)!2X`````(/Z`G\>@^P$C012C02`C82#T`@``%#_="0@4^C\____
+M@\00@\0(6\.-=@!55U93@^P,BVPD((MT)"2)ZH/^`G06@_X"=PF#_@%T'.LB
+MB?:#_@-T"^L9D+\"````ZQF0OP$```#K$9"_`````.L)D+C_____ZVB0C01_
+MC02`C9R"T`@``+C_____@WL$`'5/@^P(:CQ3Z/S___^)<P2#Q!"#?"0H`'4D
+MQT,,"P```,=#%`(```#'0QC_____9L=#(`H`9L=#(@H`ZQ*0@^P$_W0D+%=5
+MZ/S___^#Q!")^(/$#%M>7UW#D%.+3"0,BU0D"+L`````@_D"=TF-!$F-!("-
+MA(+0"```NP````"#>`0`=#''0`0`````N/[____3P"&"L`@``"&"M`@``"&"
+MN`@``"&"O`@``"&"P`@``+L!````B=A;PU575E.+="04BTPD&(GSBY;\!P``
+MN`````"#^0(/APX"``"-!$F-!("-O(;0"```N`````"#?P0`#X3R`0``N`$`
+M``"#?P0!#X7C`0``]D("$'1XBT84QX`0@```X`$``(M&%,>`%(`````(``B+
+M1A3'@""```#/C]T!BU84BT<4C01`C02`P>`0C8````\`#>`!``")@D"```"+
+M1A3'@$2```#``ZX%BU84BX)$F```@^"`@\@XB8)$F```BT84QX`$F```(R``
+M;^MZBT84QX`0@```:`$``(M&%,>`%(`````$``2+1A3'@""```"GC]T!BVX4
+MBU<4C022C01"C02"C03%,`(``,'@"PTP`@``B85`@```BT84QX!$@```F`/7
+M!(M6%(N"1)@``(/@@(/('(F"1)@``(M&%,>`!)@``"`0`&^X#P```(-_&/]T
+M`XM'&(MV%(G"P>(4#[='(L'@!"7P````"<(/MT<@@^`/"<*!R@`@"`")EAR`
+M``#V1PP!=`^X`0```-/@"8.P"```ZPVX_O___]/`(8.P"```]D<,`70/N`$`
+M``#3X`F#M`@``.L-N/[____3P"&#M`@``/9'#`)T#[@!````T^`)@[@(``#K
+M#;C^____T\`A@[@(``#V1PP$=`^X`0```-/@"8.\"```ZPVX_O___]/`(8.\
+M"```]D<,"'0/N`$```#3X`F#P`@``.L-N/[____3P"&#P`@``+@!````C78`
+M6UY?7<.-=@"+3"0$BT0D"(T$0(T$@+K_____@[R!U`@```%U!8M!%(L0B=##
+MC78`BU0D!(M$)`B+3"0,C01`C02`BX2"U`@``(/X`70.@_@!<AF#^`-W%.L*
+MB?:+0A2)".L1D(M"%(E(!.L(N`````##B?:X`0```,.)]E93@^P0BW0D'%;H
+M_/___XG#@\0()?___W]05NC\____BT84BY!D@```@\00@WPD%`!T#;@E````
+M*=#1Z`'"ZQR#^@%V`TKK%(/L"%-6Z/S___^X`````(/$$.L;BT84B9!D@```
+M@^P(4U;H_/___[@!````@\00@\0$6U[#C78`BU0D!(M$)`B-!$"-!("+A(+4
+M"```@_@"=#J#^`)W"8/X`70,ZSJ)]H/X`W0/ZS&0BT(4QT`(`0```.LLBT(4
+MQT`(`@```(M"%,=`*`X```#K%HGVBT(4QT`H"@```.L(N`````##B?:X`0``
+M`,.)]HM,)`2+1"0(C01`C02`N@````"#O('4"````743BT$4BT`4)0!X``")
+MPL'J"XUV`(G0PY!64X/L!(MT)!"+1"04C01`C02`BX2&U`@``(/X`70'@_@"
+M=$WK7HM&%,=`"`@```"[`````(UV`(M&%(M`%/;$>'06@^P,:@KH_/___X/$
+M$$.!^^<#``!^WXM&%,=`"`````"!^^<#```/GL`/ML#K&&H`:@1J+%;H_/__
+M_X/$$.L'B?:X`````(/$!%M>PY"X`0```,.)]E=64XM4)""+?"0PBW0D.(M,
+M)!2-0OV[````#(/X`78%B=/!XQJ+1"08)?\/``"+5"0HP>(2"="+5"0<P>(,
+M@>(`\`,`"=`)V/?&`0```'0%#0````'WQA````!T!0T````@B<*#?"0T`'0&
+M@<H````"B5$(@___=!N)^,'@#24`X`<`B4$,B=`-````0(E!".L*B?;'00P`
+M````D/?&!````'03@4D(``!``(M$)$`E``#X_PE!#+@!````6UY?P[@`````
+MPXGV4XM,)!"+7"08BU0D#(-\)!0`=!2+0@P)R(7;=0.`S!")0@SK)XUV`(7;
+M=!"+1"0<BT`(B4((B4H,ZQ&0QT((`````(G(@,P0B4(,D,="%`````#'0A``
+M````N`$```!;PXUV`(M,)`B)RK@/````]D$4`0^$@````&:+010E_A\``&:)
+M02`/MT$29HE!(L9!)`"+01"H`74?J`)T!,9!)`'V0A`(=`2`220"]D(0!'0'
+M@$DD!(UV`(M"""4``#P`P>@2B$$EBT(4)0#@'P#!Z`V(02:+0A`E``\``,'H
+M"(A!)XM"$"7P````P>@$B$$HQD$J`+@`````PXGVPY"0D(/L#(M,)!"+013'
+M@-"8```6'```N@````"-=@"+013'@("8``````$`0H/Z!W[MBT$4BX``G```
+MP>@8B<+!Z@2#X`_!X`0)T(/L"&H(4.C\____@\0<PY!55U93@^P8BVPD+&@4
+M&0``Z/S___^)PX/$$+X"````A<`/A"D$``")QX/L!&@`"```:,`E``!0Z/S_
+M__^+1"0TB4,,BT0D.(E#$(M$)#R)0Q1FB:N@`0``9L>#H@$`````9L>#S`$`
+M`#P`QX/0`0```````,>#W!@```````#'@]@8````````QX/X&```_____\>#
+M_!@``/_____'@P`9``#_____@\0(:@!3Z/S___^#Q!"^`P```(7`#X2/`P``
+M9H&[H`$``!OQ=2R+0Q3'@`"B````````BT,4QX!\F```&0```(/L#&CH`P``
+MZ/S___^#Q!")]HM'%(N`($```"7_````B<+!Z@2)EZ0!``"#X`]FB8>H`0``
+M@^H"O@T```"#^@(/AR0#``"+1Q2+@!B8``!FB8>J`0``@^P,5^A'`P``@\00
+MO@X```"%P`^$^P(``(._I`$```-V$HM'%,>``)@```<```#K$(UV`(M'%,>`
+M`)@``$<```"#[`QHT`<``.C\____B3PDZ!;^__]FB8>L`0``#[?`)?````"#
+MQ!"^#0```(/X$`^%G@(``(/L!(U$)`Y0:,$```!7Z/S___^#Q!"^"````(7`
+M#X1[`@``O@4```!F@7PD"O\O#X9I`@``9HM$)`IFB8,`"```BT<4BX`00```
+M@^`8P>@#O@H```"#^`(/A4`"``"#[`2-1"0.4&H_5^C\____@\00O@@```"%
+MP`^$(`(``&:+1"0*9HF#`@@``+T`````O@````")]H/L!(U$)`Y0C8;`````
+M4%?H_/___X/$$(7`#X3@`0``#[=$)`HQQ4:!_C\#``!VT+X'````@?W__P``
+M#X7'`0``9L>#=@D```H`9L>#@`L```,`O@````"-!':-!(9FQX2#?@D```L`
+M1H/^"7;JO@````"ZP"T``&:+!')FB81SB`L``&:)A'.""P``C01VC02&C02#
+M9L>`,`P```L`9L>`E`L```L`1H/^`G;+@^P(C8,`"```4%?H_/___X/$$+X(
+M````A<`/A#L!``"#OZ0!```#=FMF@[L8"````'1ABT<4QX``F```!T```(/L
+M#&C0!P``Z/S___^)/"3H7OS__V:)AZX!``"+1Q3'@`"8```'````QP0DT`<`
+M`.C\____#[>'K@$``"7P````@\00O@T```"#^"`/A<D```#K"6;'@Q@(````
+M`(/L!(U$)`Y0:+\```!7Z/S___^#Q!"^"````(7`#X2;````9HM$)`IFB8,$
+M"```9HF'U`$``(/L#%?H]P$``(D\).C\____O0````"^`````(/$$(/L!(U$
+M)`Y0N!\````I\%!7Z/S___^#Q!"%P'0[#[=$)`H!Q68/MD0D"XB$<U@6``!F
+MBT0D"HB$<UD6``!&@_X"=KV%[70*B?B!_?W_`@!U.[X)````ZQ*^"````.L+
+MC78`O@@```"-=@"%VW0,@^P,4^C\____@\00@WPD,`!T!HM$)#"),+@`````
+M@\0,6UY?7<.)]H/L&/]T)!SH_/___X/$',-55U93@^PLBW0D0,=$)`@`@```
+MQT0D#""8``#'1"0055555<=$)!2JJJJJQT0D&&9F9F;'1"0<F9F9F;\`````
+MC6PD"(T$O0````"+'"B+5A2+%!J)%`2Y`````(G(P>`0B<()RHM&%(D4&(M&
+M%(L$&#G0=`>X`````.MA08'Y_P```'[7N0````"+5(P0BT84B108BT84BP08
+M.<)T"K@`````ZSB-=@!!@_D#?MR-!+T`````BTX4BQ0HBP0$B0011X/_`0^.
+M>?___X/L#&IDZ/S___^X`0```(/$$(/$+%M>7UW#C78`BU0D#(M,)!"+1"0(
+M]L0!=!-FQP(X$V;'`=07N`$```##C78`J8````!T(8M$)`1F@[@8"````'03
+M9L<""`EFQP&L"K@!````PXUV`+@`````PXGV5E.#[`2+="00C9ZT`0``9H.^
+MU`$```%U$X/L!(U$)`10:A!6Z/S___^#Q!#'0P0`````9H.^%@@```!T&\=#
+M!`$```!F@[X&"````'4*QT,$`P```(UV`&:#OA@(````=`2#2P0$9L=#$`@)
+M9L=#$JP*9L=###@39L=##M07@`L#@$L!@(!+`@%FQT,("@!FQT,*@`"X`0``
+M`(/$!%M>PU=64XM,)!"+="04BUPD&(G/BT$4B;`H@```BX&P`0``@_@!=`^#
+M^`%R)H/X!G0A@_@(=42+013'@"R```#__P``BT$4QX`P@```__\'`.LHBU$4
+MB?`K!0````#!X`.)@BR```"+412)\"L%`````,'@`XF",(```(M1%(U&`8._
+MV!@```!T"(GP`X?8&```B8(T@```@>/__X`!BT$4B9@@@```6UY?PU93@^P$
+MBW0D$+L`````B?:#[`AJ`E;H_/___X/$$(7`=!:#[`QJ"NC\____@\000X'[
+MYP,``'[8@?OG`P``#Y[`#[;`@\0$6U[#B?:+5"0$BT(4QX`H@````````(M*
+M%(N!!(````T```0`)?__S_^)@02```"+0A3'@""```#__P``PU93BW0D#(M<
+M)!!F@WL2`'0_BU84BX($@```#0``$`")@@2```"+5A0/MT,0B8(D@```BU84
+M#[=#$HF".(```(M6%(M#%,'@`XF",(```.L4BU84BX($@```)?__[_^)@@2`
+M``"+5A2+`XF"*(```(M.%(N!((```"4``(#_#[=3"`G"9H-[&`!T$0^W0QB#
+MP`3!X!`E``!_``G"B9$@@```BTX4BY$8@```,/8/MT,:P>`()0#_```)PHF1
+M&(```(M.%(N1!$```('B``#__XM#'(/H`\'@`R7__P``"<*)D01```!;7L.+
+M1"0$BT`4BX`(0```A<`/E<`/ML##B?:+3"0(BT0D!(M`%(N0P````(/Z_W4.
+MQP$`````N`````##B?:)T"6ZV`4!B0'WP@``"`!T!PT```!`B0'VP@5T`X,)
+M`??"P`4``'0#@PE`]L(@=`:!"0```$"X`0```,.+1"0$BX!D%@``PY!75E.+
+M="00BUPD%(GQB[YD%@``A?]Y$8M&%,=`)`````"+1A2+0"20B=J!XKK8!0'V
+MPT!T,X.Y:!8```!T`X/*0(.Y;!8```!T`X#.`8.Y<!8```!T`X#*@(.Y=!8`
+M``!T!H#.!(UV`/;#`70#@\H']\,```!`=`:!R@``"`"+1A2)D*````")F606
+M``"%VWD+BT84QT`D`0```)")^%M>7\.0D+B`````PXGVBT0D"&:#^']W'P^W
+MP,'@!8M4)`0#0A2+@!R(``"Z`0```*D`@```=06Z`````(G0PXUV`(M,)`2+
+M1"0(N@````!F@_A_#X>!````#[?`P>`%B<(#413'@@"(````````B<(#413'
+M@@2(````````B<(#413'@@B(````````B<(#413'@@R(````````B<(#413'
+M@A"(````````B<(#413'@A2(````````B<(#413'@AB(`````````T$4QX`<
+MB````````+H!````B=##D%=64XM\)!"+5"08BW0D%+@`````9H/^?W=JA=)T
+M.`^V6@7!XP@/MD($"<,/MDH#P>$8#[9"`L'@$`G!#[9"`<'@"`G!#[8""<'1
+MZ8G8P>`?"<'1Z^L*NP````"Y``````^WQL'@!8G"`U<4B8H8B````T<4B=J`
+MSH")D!R(``"X`0```%M>7\-55U93@^P0BWPD+(M$)"AFB40D#H-\)#0!&<GW
+MT8'AJJJJJK@`````9H-\)`Y_#X=\`0``#[8'@_@!=!2#^`%_!X7`=!3K39"#
+M^`5T/.M%D,<$)`4```#K1[@`````9H-_`@0/AD<!``#'!"0`````9H-_`@5V
+M*6:#?P(.&=*#XOZ#P@.)%"3K%\<$)`<```#K#HGVN`````#I$@$``(GV#[9O
+M!`^V1P7!X`@)Q0^V1P;!X!`)Q0^V1P?!X!@)Q3'-#[9'"<'@"`^V5P@)PC'*
+M@>+__P``B50D"`^V=PH/MD<+P>`("<8/MD<,P>`0"<8/MD<-P>`8"<8QS@^V
+M1P_!X`@/ME<."<(QRH'B__\``(E4)`0/ME\0#[9'$<'@"`G##[9'$L'@$`G#
+M#[9'$\'@&`G#,<MF@W\"#7<&@>/_````#[=,)`Z)R,'@!8G"BWPD)`-7%(FJ
+M`(@``(G"`U<4BWPD"(FZ!(@``(G"BWPD)`-7%(FR"(@``(G"`U<4BW0D!(FR
+M#(@``(G"`U<4B9H0B````T<4BSPDB;@4B```_W0D,%'_="0LZ/S___^#Q`R#
+MQ!!;7E]=PX/L$&H&BT0D&`58%@``4/]T)"#H_/___X/$',.#[!!J!O]T)!R+
+M1"0<!5@6``!0Z/S___^X`0```(/$',.-=@!3@^P(BUPD$(M3%(M$)!2)@@!@
+M``"+0Q3'@`A@```!````:@)J`V@,8```4^C\____@\00N@````"%P'05BT,4
+MBY`$8```BT0D&&:)$+H!````B="#Q`A;PXUV`%.+7"00BTPD"+H,````BT0D
+M#&8Y@=0!``!T&`^W@0((``#!Z`>#X`&#^`$9TH/B^(/""X7;=`*)$[@`````
+M6\.+5"0$N`````!F@[H6"````'0.9H.Z!@@```$9P(/@`D!F@[H8"````'0#
+M@\@$PY!3@^P(BUPD$&:#NPH(````=$:#[`2-1"0*4&H/4^C\____@\00N@``
+M``"%P'16#[=4)`:)T(/@','X`HF#!!D``(/B`M'ZB9,(&0``QX,0&0```0``
+M`.L>QX,(&0```````,>#!!D```````#'@Q`9````````9H.["@@````/E<`/
+MMM")T(/$"%O#D%.#[!"+7"08:@!3Z/S___^#Q`R%P`^4P`^VP%!J`%/H_/__
+M_X/$"/^S!!D``%/H_/___XM3%(N"`)@``(#DWXF"`)@``(/$"/^S!!D``%/H
+M_/___XF##!D``(/$##N#"!D```^5P`^VP%#_LP09``!3Z/S___^#Q!A;PY!3
+MBT0D"(M8%(N3%$```(M,)`S1X;@#````T^`)PHF3%$```+@!````6\.)]E.+
+M1"0(BU@4BY,40```BTPD#-'AN`,```#3X/?0(<*)DQ1```"X`0```%O#4XM,
+M)`R+1"0(BU@4BY,80```N/[____3P"'"BT0D$(/@`=/@"<*)DQA```"X`0``
+M`%O#D(M,)`BX_____X/Y!7<5BT0D!(M`%(N`'$```(/@+]/H@^`!PX/L#(M,
+M)!"+012+D!1```"!XOQ__O^`SH"#?"08`'0&@<H```$`BT$4B9`40```@^P(
+MBX%D%@``#0````%04>C\____@\0<PXM$)`2+2!2+@1!````EG__Q_XM4)`B#
+MX@<+!)7@+0``B8$00```PY!64X/L"(M<)!2+="0<:@;_="0<C8->%@``4.C\
+M____BTL4#[:37A8```^V@U\6``#!X`@)P@^V@V`6``#!X!`)P@^V@V$6``#!
+MX!@)PHF1"(```(M+%`^V@V,6``#!X`@/MI-B%@``"<*!YO\_``#!YA`)\HF1
+M#(```(/$%%M>PU.+1"0(BT@4BX%0@```B<*X`````(N)3(```+L`````"<@)
+MVEO#B?:+1"0$BT`4BX!,@```PXGVBT0D!(M0%(N"((````T````!B8(@@```
+MPXUV`(M4)`2+0A2+@&28``")P<'I$X'A_P$``(G(P>@(A<!T!H'Q`/[__XM2
+M%(N"4(```(N23(```#'0,<C#D%.+5"0(BT(4BX`@0```)?\```")P8/A#[L`
+M````P>@$.8*D`0``=0QF.8JH`0``=0.S`9")V%O#BTPD!(M$)`B+412+DI"`
+M```!$(M1%(N2C(````%0!(M1%(N2E(````%0#(M1%(N2B(````%0"(M1%(N2
+MF(````%0$,.#[!2+1"08BU`4QX)4F0```0```(N09!8``(#.0%)0Z/S___^#
+MQ!S#5U93BWPD$(MT)!2)^X/^"'86@^P(:/__``!7Z/S___^#Q!`Y\',.D(FS
+M^!@``+@`````ZR.#[`A65^C\____BU<4B8)P$```@\00B;?X&```N`$```")
+M]EM>7\.#[!2+5"08BT(4BX!P$```)?__``!04NC\____@\0<PU575E.#[!2+
+M;"0H:/\?``!5Z/S___^#Q!`[1"0D<Q''A?P8``#_____N`````#K/(MU%(N>
+M%(```('C`.#__X/L"/]T)"Q5Z/S___\E_Q\```G#B9X4@```@\00BT0D)(F%
+M_!@``+@!````D(/$#%M>7UW#@^P4BU0D&(M"%(N`%(```"7_'P``4%+H_/__
+M_X/$',-55U93@^P4BVPD*&C_'P``5>C\____@\00.T0D)',1QX4`&0``____
+M_[@`````ZT"+=12+GA2```"!X___`."#[`C_="0L5>C\____P>`0)0``_Q\)
+MPXF>%(```(/$$(M$)"2)A0`9``"X`0```(GV@\0,6UY?7<.#[!2+5"08BT(4
+MBX`4@```)0``_Q_!Z!!04NC\____@\0<PY"X`````,.)]L.-=@##C78`BT0D
+M!(M`%(N`')P``"7_````PY"+1"0$BT`4BX!8@```@^`'PXUV`(M$)`2+4!2+
+M1"0(@^`'B8)8@```PXUV`%575E.+?"04BVPD&(G[BT0D'`^W0`(EX`$``#W`
+M````="H]P````'\+/:````!T%.LBB?:^`````#U``0``="#K$HGVO@$```#K
+M%9"^`@```.L-D+@`````Z;L```")]@^WC'-X"```#[>$<WX(``#!X`8)P0^W
+MA'.$"```P>`,"<$/MX1SB@@``,'@$@G!#[>$<Y`(``#!X!@)P0^WE'.6"```
+M#[>$<YP(``#!X`8)P@^WA'.B"```P>`,"<(/MX1SJ`@``,'@$@G"#[>$<ZX(
+M``#!X!@)PH/]`70/@_T!<AJ#_0)T">L+C78`B<KK#(G1ZPBX`````.L>D(FK
+MW!@``(M'%(F(8)D``(M'%(F09)D``+@!````6UY?7<.)]H/L#(M$)!2+5"08
+M@_@!=12#^@%V![`-@_H%=1JX`````.L3D/]T)!Q24/]T)!SH_/___X/$$(/$
+M#,.)]H/L#(M$)!"+3"04BU0D'(/Y"W4<@^(&B9#(`0``BT`4B9!(@```N`$`
+M``#K&8UV`(/L#/]T)"Q2_W0D+%%0Z/S___^#Q""#Q`S#B?:#[!3_="0L_W0D
+M+/]T)"S_="0L_W0D+/]T)"SH_/___X7`#Y7`#[;`@\0LPU.+7"0(BTPD$(M3
+M%(N"!(```"7__]__#0``!`")@@2```"#?"0,`'01BU,4#[?!#0```@")@@1`
+M``!;PU93@^P$BW0D$(-\)!0`=&"+1A3'@`1`````````@^P,:@KH_/___[L*
+M````@\00D(M&%(N`$$```*D```$`="*#[`QHR````.C\____BT84QX`$0```
+M`````(/$$$MUT.L&A=MU"HGVN`````#K&I"+5A2+@@2````E___[_XF"!(``
+M`+@!````@\0$6U[#D(M,)`2+412+@@2````-```$`(F"!(```(-\)`@`=`V+
+M013'@`1```````$`PXUV`%.+7"0(BTPD$(M3%(N"!(````T```0`B8($@```
+M@WPD#`!T$8M3%`^WP0T```(`B8($0```6\.05U93BU0D$(M<)!2+3"08BT0D
+M'(G6OP$```"#^P)T*8/[`G<(@_L!=`_K39"#^P-T*(/[!'0OZT`/M\!045+H
+MB?[__X/$#.LX@^P(45+HMO[__XG'@\00ZR=14N@X____@\0(ZQL/M\!045+H
+M6/___X/$#.L+C78`N`````#K"9")GM08``")^%M>7\.+1"0$BX#4&```PY"X
+M`````,.)]K@`````PXGVN`````##D)!3@^P(BT0D%(/X`G0G@_@"=PJ#^`%T
+M#>LCC78`@_@$=`OK&9"[`````.L9D+L`````ZQ&0NP````#K"9"X`````.L3
+MD(/L"%/_="0<Z/S___^)V(/$$(/$"%O#D(M$)`2+0!2+0`S#D(M$)`2+4!2+
+M1"0(B4(,PY"+1"0$BT`4QT`(!````,.0@^P,BU0D$(M"%,=`""````!J`&H$
+M:@A2Z/S___^%P`^5P`^VP(/$',.-=@"+1"0$BU`4BX)(@```@^#?B8)(@```
+MPY"+1"0$BU`4BX)(@```@\@@B8)(@```PY"+3"0$BU$4BT0D"(F"0(```(M1
+M%(M$)`R)@D2```##D%.+5"0(BTPD#+@`````@_D_=T*#^1]V((M2%(N:1(``
+M`(/I(+C^____T\`AV(F"1(```.L;C78`BU(4BYI`@```N/[____3P"'8B8)`
+M@```N`$```!;PY!3BU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FD2```"#
+MZ2"X`0```-/@"=B)@D2```#K&XUV`(M2%(N:0(```+@!````T^`)V(F"0(``
+M`+@!````6\.0BT0D!(M`%(N`/(```,.)]HM$)`2+4!2+1"0(B8(\@```PXGV
+MBU0D#(M,)`C'00@`````B=`E_P\``(E!#+@`````.5$,=2'V1"00('0'@4D,
+M`"```,=!%`````#'01``````N`$```##C78`4XM,)`R)RHM$)!2[#P```/9!
+M%`$/A,<```#V0!0!=1F+1"0(BT`4BT`,NP\````[1"00#X2H````9HM"$"7_
+M#P``9HE!((M"%"4`@/\/P>@/9HE!(L9!)`"+0A2H`G4LJ`1T",9!)`'K(HGV
+M]D(4$'0&@$DD".L4@$DD`HM"%"7@````P>@%B$$EB?:+0A`E``#X!\'H$XA!
+M)HM"%/;$`70.)0!^``#!Z`F(02?K!9#&02?_BT(0)0"`!P#!Z`^(02B+0A`E
+M````.,'H&XA!*8M"$,'H#(/@`8A!*KL`````B=A;PY"0D%575E.#[&R+K"2`
+M````B6PD)&;'1"06``!FQT0D%```QT0D$`````#'1"0,`````(N4)(@````/
+MMT("B<+!Z@?!Z`@QT+H,````J`$/A+X(``"+C"2(````#[=!`HG"P>H&P>@%
+M,="Z#````*@!#X2<"```@^P(_[0DD````%7H_/___XE$)#"#Q!"Z#````(7`
+M#X1X"```@[PDA`````9T*H.\)(0````&=PR#O"2$`````7<,ZQ2#O"2$````
+M"'0*N@P```#I1`@``(.\)(P`````=$R+112+F$R```")7"00BY!0@```B50D
+M#(.]I`$```-V#(N`0!$``(E$)##K(+X`````BU44C02U`````(N$`D`1``")
+M1+0P1H/^"7;HBT44BX!8@```B40D"(7`=0C'1"0(`0```(M5%(N"!(```"4`
+M```"B40D&(N"$$```"5@`/X`B40D'(N*%$```(E,)"R+DAA```")5"0H@^P(
+MBYPDD`````^W0P)05>C\____@\00N@,```"%P`^$>P<``(N4)(@````/MT("
+M)?`!```]P````'10/<````!_"3V@````=#+K3CU``0``=`D]4`$``'02ZSYF
+MQT0D%@$`9L=$)!0!`.LN9L=$)!8"`&;'1"04`0#K'F;'1"06`P!FQT0D%`(`
+MZPYFQT0D%@0`9L=$)!0"`(.]I`$```-V#XM%%,>``)@```<```#K#8M%%,>`
+M`)@``$<```"#O:0!```##X;E````BXPDB`````^W00*I@`````^$I0```(M<
+M)"1F@;L`"````#`/AI(```"H('04#[>[_`@```^W@P`)``")1"0$ZQ:+5"0D
+M#[>Z_@@```^WB@()``")3"0$@^P(:@-7Z/S___^)QX/$"&H#_W0D$.C\____
+MB40D%`^W7"0DN<P,``"+%)F`XC^)^,'@!B7`````"<*)%)F^V`P``(L,GH/A
+M\(GZP>H"@^(!BT0D%-'@@^`."<()T8D,GH/$$+X`````OZ`+```/MUPD%(T$
+M=HM-%(L4A:`+```!V(L$AXD$$4:#_AMVY8/L"/^T))````!5Z,<,``"^````
+M`(/$$+\`+@``#[=<)!:0C02VBTT4BQ2%`"X```'8BP2'B0011H/^(G;EO@``
+M``"_(#8```^W7"04B?:-!':+312+%(4@-@```=B+!(>)!!%&@_X_=N6^````
+M`+O`,```O\0P``")]HL,\X.\)(P`````=`V-@0"`__\]_P\``'8)BU44BP3W
+MB00*1H'^J@```';4@[VD`0```W=$BU44BXH<@```B<@E__\/``T``-`!B8(<
+M@```BT44QT!<`````(M%%,>`>)@```@```"+512+@DB```"`S`2)@DB```"#
+MO"2,`````'14BT44BUPD$(F83(```(M%%(M4)`R)D%"```"^`````(.]I`$`
+M``-V$8M5%(M$)#")@D`1``#K'8GVC0RU`````(M5%(M$M#")A`I`$0``1H/^
+M"7;EBTT4BUPD)`^VDU@6```/MH-9%@``P>`("<(/MH-:%@``P>`0"<(/MH-;
+M%@``P>`8"<*)D0"```"#O"2$`````71U@[PDA`````%R1(.\)(0````&=`^#
+MO"2$````"'1^Z:(```"+312+1"0D#[:0718``,'B"`^V@%P6```)T`M$)!@-
+M``"!`(F!!(```.MWBTT4BUPD)`^VDUT6``#!X@@/MH-<%@``"=`-``""`(F!
+M!(```.M0BTT4BT0D)`^VD%T6``#!X@@/MH!<%@``"=`-```@`(F!!(```.LI
+MBTT4BUPD)`^VDUT6``#!X@@/MH-<%@``"=`+1"08#0``(`")@02```"+512+
+M@A!````+1"0<B8(00```BT44BU0D+(F0%$```(M%%(M,)"B)B!A```"+112+
+M7"0(B9A8@```BTT4BT0D)`^VD%X6```/MH!?%@``P>`("<*+7"0D#[:#8!8`
+M`,'@$`G"#[:#818``,'@&`G"B9$(@```BTT4#[:38Q8``,'B"`^V@V(6```)
+MT(F!#(```(M%%,>`@````/____^#O:0!```$=19F@[VH`0```7<,BU44BT(4
+M@,P$B4(4BT44QX`8@`````<``(/L"/^T))````!5Z/S___^#Q!"Z`P```(7`
+M#X2K`@``@^P(_[0DD````%7H`PT``(/$"/]T)"A5Z$H&``"#Q!"Z`P```(7`
+M#X1^`@``9H&]H`$``!OQ=1J+A"2(````]D`"@'0-BT44QX`(V````@4``(M%
+M%,>`')@```$```"+112+@!29``")P8'A_S\``(N4)(@```#V0@(@=!6-%(T`
+M````N*.++KKWXHG0P>@$ZPRXS<S,S/?AB=#!Z`.#[`R#P&10Z/S___^+512+
+M@F"8``"#R`&)@F"8``"#Q!!J`&H!:&"8``!5Z/S___^#Q`C_M"20````5>C\
+M____@\00A<!U'(N,)(@```#V00(@=05F@TD"`KH#````Z:H!``"+7"0D@[O@
+M&````'07BT44QX`@F0```/`!`,>#Y!@```$```"[`````+X!````C3R=````
+M`(M5%(GPB-G3X(F$.@`0``!#@_L)?N.[`````(/L"%-5Z/S___^#Q!!#@_L)
+M?NV+113'@*0````!``$`BT44QX"H`````0```(M%%,>`K`````$```"+512+
+M@K`0``")@K`0``"+113'@*````!E"0@`BUPD),>#9!8``&4)"`"+512+@JP`
+M```-```'`(F"K````(.\)(0````&=1R+512+@J````"`S!")@J````"!BV06
+M````$```@^P,5>C\____@\00A<!T#(/L#%7H_/___X/$$(M5%(N"((```"7_
+M_W_^B8(@@```BT0D)(.X^!@``/]T$H/L"/^P^!@``%7H_/___X/$$(M4)"2#
+MNOP8``#_=!*#[`C_LOP8``!5Z/S___^#Q!"+3"0D@[D`&0``_W02@^P(_[$`
+M&0``5>C\____@\00@[W(`0```'0/BU44BX7(`0``B8)(@```BYPDA````(F=
+ML`$``+@!````ZQ:-=@"+A"20````@S@`=`*)$+@`````@\1L6UY?7<.0@^P4
+M:@+_="0<Z#(#``"#Q!S#B?93@^P(BUPD$&H`:@%J`E/H_/___X/$$+H`````
+MA<!T+(/L"&H34^@!`P``@\00N@````"%P'05@^P,:#0(``#H_/___[H!````
+M@\00B="#Q`A;PY!64X/L!(M<)!"+="04:@!J`6H"4^C\____@\00N@````"%
+MP`^$AP$``(GP)?`!```]P`````^$B0```#W`````?Q8]H````'0]/;````!T
+M-ND/`0``C78`/4`!```/A*@````]0`$``'\,/=````!T4^GN````/5`!```/
+MA(H```#IW@```(M#%,>`!)@```````"+0Q3'@`"B```#````BT,4QX!\F```
+M&0```(/L#&@L`0``Z/S___^#Q!#IH@```(GVBT,4QX`$F````````&:#NZ`!
+M```2#X6%````BT,4QX!\F```&````(/L#&@L`0``Z/S___^+0Q3'@`"B```"
+M````@\00ZUGWQA````!T#XM#%,>`!)@```,```#K#8M#%,>`!)@```````!F
+M@[N@`0``$G4KBT,4QX!\F```&````(/L#&@L`0``Z/S___^+0Q3'@`"B````
+M````@\00D(/L"&H34^AI`0``@\00N@````"%P'0U@^P,:#0(``#H_/___VH`
+M:@%J`E/H_/___X/$(+H`````A<!T$(/L"&H`4^@M`0``B<*#Q!")T(/$!%M>
+MPU575E.#[`R+="0@BWPD)(.^Y!@````/A(````"+7A2+@R"9``"I```!`'5P
+MQX;D&````````(NK$)P``(N#%)P``(N3&)P``(E4)`B)ZM'JB<'1Z0'*B<'!
+MZ0;!Z@>)%"1T.87)=#6+1"0(]]B9]SPD@^`_B40D!(GHF??YB<&#X1^+1"0$
+MP>`%BY,@F0``"=`)R(#,"(F#()D``(/L"%=6Z"(#``"#Q!"%P'43]D<"('4%
+M9H-/`@*X`````.M9D(/L"%=6Z/S___^#Q!"%P'4S@^P,:(@3``#H_/___X/$
+M"%=6Z/S___^#Q!"%P'45]D<"('4%9H-/`@*X`````.L7C78`@^P,5N@W&```
+MN`$```"#Q!"-=@"#Q`Q;7E]=PU=64XM\)!"+="04B?"%]G4%N/____^)PXM'
+M%(M0#(FP`$```(/L#&H/Z/S___^#Y@.#XP-64V@`0```5^C\____B<*#Q"#W
+MQ@$```!U"HM'%,=`%`````")T%M>7\.)]E575E.#[!2+;"0L#[=%`E`/MT4`
+M4.C\____@\00]D4"@'0]#[_XC1Q_P>,"C;L$.@``@^P(:@C_=P3H_/___XG&
+M@>;_````P>8%BX,$.@``P>`$"<9FBT<(@\00ZP>)]KX`````9CV0`'\$J`%T
+M(8/L"&H(F(/H&%#H_/___XG#@>/_````N`$```"#Q!#K*(/L"&H(F(/H&(G"
+MP>H?`=#1^%#H_/___XG#@>/_````N`````"#Q!#!XP+1X`G#@<L!!```BT0D
+M((M(%(GP)?\```#!X`@/MM,)T(F!G)@``(M$)""+2!2)\"4`_P``#[;7"=")
+M@="8``"+1"0@B:C\!P``N`$```"#Q`Q;7E]=PXUV`(M$)`2+0!2+@&28``#!
+MZ!,E_P$``/;$`70%-0#^__^8PXUV`%=64XM\)!"*7"04BT\4BY%DF```@>(`
+M\/__B=C!X`DE``X```G"#[]$)!@E_P$```G"B9%DF```BU<4BX)@F```@\@"
+MB8)@F```OC@```"$VW01#[;SC03U`````"GPB<;!Y@F[`````(UV`(M'%(N`
+M8)@``*@"=!2#[`Q6Z/S___^#Q!!#@_L[?N'K!8/[.WX'N`````#K"E?H_/__
+M_YB#Q`1;7E_#D(M,)`R+5"0$BT0D"`^W0`(EX`$``#W`````=#`]P````'\)
+M/:````!T%NLL/4`!``!U)6:+@EH(``!FB0'K(9!FBX)<"```9HD!ZQ1FBX)>
+M"```9HD!ZPBX`````,.)]K@!````PXGV4X/L!(M<)`R-1"0"4/]T)!13Z('_
+M__^#Q`RZ`````(7`="R+0Q2+D&"8``"+@&28``#!Z!,E_P$``/;$`70%-0#^
+M__]F.T0D`@^>P`^VT(G0@\0$6\.)]E93@^P$BUPD$(MT)!2#NZ0!```#=U:#
+M[`A64^C\____@\00A<!T18U$)`)05E/H#?___X/$#+H`````A<!T1+X`````
+M@^P$:@`/MH9(.P``4%/H0?[__X/$$$:#_@)VY(/^`P^6P`^VT.L8D(M3%(N"
+M8)@``(/(`HF"8)@``+H!````B="#Q`1;7L.055=64X/L/(M4)%2+1"10B40D
+M+/9"`H`/E,!F#[;`9HE$)`BX`@```&8K1"0(9HE$)`@/MT(")>`!```]P```
+M``^$Q@$``#W`````?Q`]H`````^$9P$``.G\`0``/4`!```/A?$!``!FBP(M
+MH0\``&8]Z@1W)8M4)"QFBY+D"```9HE4)`R+="0L9HNVY@@``&:)="0*Z9<`
+M``!FBP(MC!0``&8][P!W(HM$)"QFBX#H"```9HE$)`R+5"0L9HN2Z@@``&:)
+M5"0*ZV=FBP(M?!4``&8]X`!W(HMT)"QFB[;L"```9HET)`R+1"0L9HN`[@@`
+M`&:)1"0*ZS=F@3I<%G8BBU0D+&:+DO`(``!FB50D#(MT)"QFB[;R"```9HET
+M)`KK#F;'1"0*``!FQT0D#```BT0D+&:+J&8(``!FBY!L"```9HE4)!!F@[AL
+M"`````^4P&8/ML!FB40D#@^W3"0(NSP-``"+%(N!XO___^^+="0L#[>&7`D`
+M`,'@'`G"B12+NT@-``"+%(N!XO____L/MX9>"0``P>`:"<*)%(N[_`T``(L4
+MBX/B]P^WAEH)``#!X`,)PHD4B^FD````BT0D+&:+@/0(``!FB40D#(M4)"QF
+MBY+V"```9HE4)`J+="0L9HNN:`@``&:+AFX(``!FB40D$&:#OFX(````#Y3`
+M9@^VP&:)1"0.ZU>+5"0L9HN2^`@``&:)5"0,BW0D+&:+MOH(``!FB70D"HM$
+M)"QFBZAJ"```9HN0<`@``&:)5"009H.X<`@````/E,!F#[;`9HE$)`[K"K@`
+M````Z1,!```/MW0D"+^$#0``BQRW@.,_@^P(:@0/M^U5Z/S____!X`</MU0D
+M'L'B!@G0)<`````)PXD<M[^0#0``BQRW@^/X@\0(:@15Z/S____1Z(/@!PG#
+MB1RW@.-_@\0(:@,/MVPD&%7H_/___\'@!R6`````"<.)'+>_G`T``(L<MX/C
+M_(/$"&H#5>C\____T>B#X`,)PXD<MX/CXX/$"&H##[=$)!90Z/S____!X`*#
+MX!P)PXD<M[G,#0``BQ2Q@^+WBT0D(,'@`X/@"`G"B12QNP````"#Q!"_``T`
+M``^W="0(B?:-!%N+5"10BTH4BQ2%``T```'PBP2'B0010X/[&';ABW0D+,>&
+M[!@```````"X`0```(/$/%M>7UW#B?955U93@^P,BWPD((G^BU0D)`^W0@(E
+MX`$``#W`````=$L]P````'\,/:````!T->M#C78`/4`!``!U.;T`````BT\4
+MBY%$F0``@^+'#[>'8`D``,'@`X/@.`G"B9%$F0``ZQV0O0$```#K%9"]`@``
+M`.L-D+@`````Z=<!``")]H._I`$```-W%XM7%(N"$)D``(/(`XF"$)D``.M7
+MC78`BT\4BX$0F0``)0;\__\/MY1N<@@``,'B!`G0@\@!B8$0F0``@^P$_W0D
+M*/^VW!@``%?H_/___XM7%`^_A&Y:"```)?\!``"`S`*)@FB9``"#Q!"0BT\4
+MBY%$F```@>)_P/__#[>$;C`(``#!X`<E@#\```G"B9%$F```BT\4BY%(F```
+M@>+_#_S_#[>$;C8(``#!X`PE`/`#``G"B9%(F```BT\4BY%0F```@>(``/__
+M#[Z$-5<(``#!X`@E`/\```G"#[:$-50(```)PHF14)@``(M?%`^WE&Y("```
+MB=#!X!C!XA`)T`^WC&Y."```B<K!X@@)T`G(B8,TF```BT\4BY$HF```,/8/
+MMX1N/`@``,'@"`G"B9$HF```BT\4BY%DF```@>+_#_C_#[>$;D((``#!X`PE
+M`/`'``G"B9%DF```NP(```!F@;X`"````C!W'&:!OZ(!```B$'4UBT0D)/9`
+M`D!T*[,(ZR>-=@"+5"0D9HL"@^`?#[?`A<!T$X/H"H/X#'8+#[>$;K0(```!
+MPY"+3Q2+D229``"`X@&-!!LE]P````G"B9$DF0``N`$```"#Q`Q;7E]=PXUV
+M`(M,)`2+5"0(B="#^CQV!;@\````9HF!S`$``(M!%(F0/)D``+@!````PXGV
+M55=64X/L+(M\)$2+7"1`#[='`B7@`0``/<````!T5CW`````?PX]H````'1[
+MZ:H```")]CU``0``#X6=````9HN#=@D``&:)1"04C8-B"0``B40D$(V#>`D`
+M`(E$)!@/MX/&#```B40D"(VKR`P``.F#````9HN#@`L``&:)1"04C8.""P``
+MB40D$(V#C@L``(E$)!@/MX,8#0``B40D"(VK&@T``.M09HN#@`L``&:)1"04
+MC8.("P``B40D$(V#*@P``(E$)!@/MX,X#0``B40D"(VK.@T``.L=D+@`````
+MZ98```")T,'@!HV<&%`-``")7"0,ZV2#[`0/MP=0C40D&%#_="1,Z'<```#'
+M1"0<`````(/$"%?_="1,Z/S___^)QKH`````@\009H.[!`D```!T)@^WBP0)
+M``"-=@!F@[Q3!@D```!T#`^WA%,&"0``.?!TCT(YT7_D@^P,5P^W1"084%7_
+M="0D_W0D7.A4`P``N`$```"#Q""#Q"Q;7E]=PU575E.#[#2+7"109L=$)"X`
+M`&;'1"0L/P!H"`$``&@`````Z/S___^#Q`AH@````&@@`0``Z/S___^]B```
+M`+\!````O@````"#Q!`/M\9FB;P`"````$=&9H/_/W;M9HDU!@```&;'!0(`
+M```!`&;'!00````_`+X`````9H,]!@````!V+@^W^P^WWH/L!/]T)$@/MX0;
+M"````%!7Z+4'``!FB41=`(/$$$9F.34&````=]5FBTT`#[<%!@```&:+7$7^
+MO@````!F@ST&`````'9V#[?&9CE,10!_"F:+3$4`9HET)":)\/?0B<=F`ST&
+M````=",/M]=FBT15_F8[1%4`?@IFBT15`&:)1%7^1F8Y-08```!WNKX`````
+M9H,]!@````!V(6:+%08````/M\9F.5Q%`'X*9HM<10!FB70D)$9F.?)WY@^_
+MR8/!&;L?A>M1B<CWZXG0P?@$P?D?*<B-!("-!("--`!FQT0D(@``OP`````/
+MO\Z)3"0<B<CWZXE$)!")5"04BT0D%,'X!,'Y'RG(0(7`?CJY(`$``+@?A>M1
+M]VPD'(G3P?L$BT0D')F)V"G0C5`!#[=$)")FBUPD)F:)'$%F_T0D(D</M\<Y
+MT'SEOP`````/MP4&````B<)F.71%_@^.V0```(/&,HE4)!AF.715_GY9#[_.
+MB<L/M\>)1"0,#[]$10")RBG"B50D$(M$)`P/OU1%`BG1BT0D$`^OP87`?BI'
+MBU0D&&8Y=%7^?AX/M]</OT15`(G9*<&)R`^_5%4"B=DIT0^OP87`?]:#[`AJ
+M``^WUP^WA!(*````T>`/M\!0#[>$$@@```#1X`^WP%`/MT15`E`/MT15`%`/
+MM\90Z)T'``!`#[=4)$*Y(`$``&;1Z&:)!%&#Q""+7"0D9CG8=@1FB1Q19O]$
+M)"(/MQ4&````9CET5?X/CR?___]F@WPD(C]W)+L@`0``N1X!```/MU0D(F:+
+M!%%FB0139O]$)")F@WPD(C]VYKF`H0``OP````"^(@$``+L@`0``#[?'#[<4
+MAL'B&('*``#_``^W!(/!X`@,_R7__P``"<*+;"1`BT44B10(@\$$1V:#_Q]V
+MS(/$+%M>7UW#55=64X/L1(MT)&2+1"18B40D(&;'1"0>``!FQT0D'```9L=$
+M)!H``&;'1"08``!FQT0D%C\`9L=$)!(``+^@`0``_W0D:/]T)%SH_/___]'@
+M9HE$)!R#Q!"+5"1@]D(#`706BTPD4(J!'`@``.L49HE<)!+I6`$``(M4)!B*
+M@AT(``"#[`0/OL!0_W0D:/]T)%SH_/___XA$)!F#Q!"#?"14``^$HP```+L`
+M````B?8/M].+3"149H,\T0!T$&:+!-%FB414($-F@_L'=N*)W8/L#(U$)"I0
+MC40D+%`/M\-0C40D.%"+5"1\#[<"4.C=!@``NP````"#Q"!F.>MS%(M4)!P/
+MM\-F.51$('0&0V8YZW+PBT0D'&8[1"0>=0Z+3"1@9HL!9CM$)!QT#@^WPXM4
+M)%2#?,($`'01#[?#BTPD5&:+1,$"9HE$)`Z[`````&8Y\W,<B?8/M\.-%("+
+M3"189HM440AFB51$($-F.?-RYH/L#(U$)"I0C40D+%`/M\90C40D.%"+5"1\
+M#[<"4.@[!@``NP````"#Q"!F.?-S+XGV#[?#9HM$1"!F.T0D''4%9HE<)!8/
+MM\-FBT1$(&8[1"0>#X2D_O__0V8Y\W+3NP````")]HM,)&#V00)`#X36````
+M9H/[!'<P#[=$)!:-!("+5"189HM$0@9FB40D%`^W1"02C02`9HM$0@9FB40D
+M$.E;`0``C78`9H/[!74N#[=$)!:-!("+3"189HM$001FB40D%`^W1"02C02`
+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
+M5"04BT0D$(N`_`<``/9``B!T);\`````NQP```"Y0````+YR````QT(,````
+M`,="$'<```#K(Y"_`````+LR````N0````"^,@```,="#!0```#'0A`C````
+MBU($N``````Y^G($.=IV#3G*<@0Y\G8%N`$```!;7E_#D(M$)`2+2!2+D/`8
+M``#!X@F!X@!^``"`SH")D3"9``#'@.P8```!````PXGV5U93BWPD$(G[C;<\
+M%@``N`````"#?A0`='B#O^P8```!=6F+1Q2+@#"9``"I`(```'59P>@9B48$
+MQX?L&````````%97Z`K___^#Q`B%P'4[@^P(5E?H/0```(/$$(7`="J#[`A6
+M5^A(````@\00A<!^&8/L"%97Z$L!``#'A^P8```"````@\00B?:+@^P8``!;
+M7E_#B?:+3"0(N`````"+400[40QV!3M1$'(%N`$```##5E.+7"00NO____^#
+M>Q0`#X3W````BP.-%,4`````*<*-%)6(.P``B5,8BT,$.T,0<F*Z_____X,[
+M``^$S````(M#!(E#"#M#$')!@SL`=#R+`TB)`XT4Q0`````IPL'B`HM+&(N"
+MD#L``"M!"-'@BTL(*<&)2PB!PH@[``")4Q@[2Q!R!X,[`'7&B?:Z`0```.MY
+MD(M#!+H`````.T,,=VNA@#L``$BZ_O___SD#=%R+0P2)0P@[0PQW2:&`.P``
+M2#D#<S^)QI"+`T")`XT4Q0`````IPL'B`HM+&(N"D#L``"M!"-'@BTL(*<&)
+M2PB!PH@[``")4Q@[2PQW!SDS<L>-=@"Z`@```(UV`(G06U[#C78`BTPD!(M4
+M)`B#>A0`=#>+0AAFBP!FB8%@"0``BT(89HM``F:)@5X)``"+0AAFBT`$9HF!
+M7`D``(M"&&:+0`9FB8%:"0``PXGVBTPD!(M!%(N`!(```"7__P``BY&P`0``
+M@_H!=#.#^@%R'H/Z!G0)@_H(="3#C78`BU$4#0``@0")@@2```##D(M1%`T`
+M`$(`B8($@```PY"+410-```@`(F"!(```,.05U93BWPD$(/L#%?H_/___XG&
+M@\0()?___W]05^C\____BT<4BU`PB=.!X_`#``#!ZP2#Q!"#?"04`'00N"4`
+M```IV-'H`</K'XUV`(/[`78#2^L4@^P(5E?H_/___[@`````@\00ZRJ+3Q2!
+MX@_\__^)V,'@!"7P`P``"<*)43"#[`A65^C\____N`$```"#Q!!;7E_#B?93
+M@^P(BUPD$(M4)!2X`````(/Z"7\>@^P$_W0D'(T$4HT$@(V$@WP6``!04^C\
+M____@\00@\0(6\.-=@!3@^P(BUPD$(M4)!2X`````(/Z"7\>@^P$C012C02`
+MC82#?!8``%#_="0@4^C\____@\00@\0(6\.-=@!55U93@^P,BVPD((MT)"2)
+MZH/^`G0:@_X"=PF#_@%T*.L^B?:#_@-T#X/^!'01ZS"_"0```.LQD+\(````
+MZRF_`0```.LBB?:_`````+@`````@[V`%@```'5\ZPN-=@"X_____^MPD(T$
+M?XT$@(V<@GP6``"X_____X-[!`!U5X/L"&H\4^C\____B7,$@\00@WPD*`!U
+M+,=##`L```#'0Q0"````QT,8_____\=#'/\#``!FQT,@"@!FQT,B"@#K$XGV
+M@^P$_W0D+%=5Z/S___^#Q!")^(/$#%M>7UW#D%.+3"0(BUD4BY%H%@``@>+_
+M`P``BX%P%@``P>`0)0``_P,)PHF3I````(M9%(N1;!8``('B_P,``(N!=!8`
+M`,'@$"4``/\#"<*)DZ@```"+612+@ZP````E`/S__XN1>!8``('B_P,```G0
+MB8.L````6\.05E.+="0,BTPD$+@`````@_D)=U2-!$F-!("-G(9\%@``N```
+M``"#>P0`=#S'0P0`````N/[____3P"&&:!8``"&&;!8``"&&<!8``"&&=!8`
+M`"&&>!8``%-6Z"W___^X`0```(/$")!;7L.055=64XM\)!B+;"04BY7\!P``
+MN`````"#_PD/AP@$``"-!'^-!("-M(5\%@``N`$```"#?@0`#X3L`P``@WX8
+M_W4VA=)T%0^W0@(EH````+H?````/:````!T!;H/````N`$````YT',2C78`
+MT>"#R`$YT'+WZP20BT88C1R]`````(M4)!2+2A2)PH'B_P,``(M&','@"B4`
+M_`\`"<*+1A3!X!0E``#P#PG"B9090!```(M$)!2+2!0/MT8BP>`$)?`````/
+MMU8@@^(/"=`-`"`(`(F$&8`0``"+5"04BT(4QX08P`D````(``"#NJ0!```#
+M=PZ+0A3'A!@`$0```````8-^)`!T3HT,O0````"+1"04BU@4BU8D@>+___\`
+MBT8HP>`8"<*)E`O`"```BU0D%(M:%(N$"\`)``")PH/*`8-^*`!T"(G"@<H!
+M`0``B90+P`D``(-^,`!T(HT,O0````"+1"04BU`4BT8P)?___P`-`````8F$
+M"@`)``"#?BP`=$.-#+T`````BT0D%(M0%(M&+"7__P\`#0``$`")A`K`$```
+M]D8,0'0;BT0D%(M0%(N$"L`)``"`S`*)A`K`"0``C78`]D8,$'0AC0R]````
+M`(M$)!2+4!2+A`H`$0``#0``(`")A`H`$0``]D8,@'0?C0R]`````(M$)!2+
+M4!2+A`H`$0``@,P"B80*`!$``(M&!(/X`W1I@_@#=PJ#^`)T$^GY````@_@$
+M#X30````Z>L```"-#+T`````BT0D%(M0%(N$"L`)```,HHF$"L`)``"+5"04
+M@[JD`0``!!G;@>,````!@<,``"4`B<J+3"04BT$4B9P0`!$``.F?````C0R]
+M`````(M$)!2+4!2+A`K`"0``#6("``")A`K`"0``H0`````K!0````"+E?08
+M``")TRG#*QT`````P>,*BT0D%(M0%(G8#0````&)A`H`"0``BU0D%(.ZI`$`
+M``09VX'C`````8'#```$`(G*BTPD%(M!%(F<$,`)``#K((T,O0````"+1"04
+MBU`4BX0*P`D``(/((XF$"L`)``"0]D8X`70AC0R]`````(M$)!2+4!2+A`H`
+M$0``#0``)`")A`H`$0``]D8,`703N`$```")^=/@"85H%@``ZQ&)]KC^____
+MB?G3P"&%:!8``/9&#`%T$[@!````B?G3X`F%;!8``.L1B?:X_O___XGYT\`A
+MA6P6``#V1@P"=!.X`0```(GYT^`)A7`6``#K$8GVN/[___^)^=/`(85P%@``
+M]D8,!'03N`$```")^=/@"85T%@``ZQ&)]KC^____B?G3P"&%=!8``/9&#`AT
+M$[@!````B?G3X`F%>!8``.L1B?:X_O___XGYT\`AA7@6``!6_W0D&.@#^___
+MN`$```"#Q`B-=@!;7E]=PXUV`(M$)`C!X`*+5"0$BU(4BX0"``@``,.)]HM4
+M)`C!X@*+1"0$BT@4BT0D#(F$$0`(``"X`0```,.0BTPD"(M$)`2+4!2X`0``
+M`-/@B8)`"```N`$```##B?964XM4)!#!X@*+1"0,BW`4BX06``H``(G#@^,#
+M=1JX`0```(I,)!#3X(N60`@``(7"=`6[`0```(G86U[#C78`5U93BWPD$(MT
+M)!2+5Q2X`0```(GQT^")@H`(``"[`````(GV5E?H_/___X/$"(7`=!:#[`QJ
+M"NC\____@\000X'[#R<``'[<BT<4QX"`"````````('[#R<```^>P`^VP%M>
+M7\.-=@"X`0```,.)]E93BW0D+(M<)#2+3"00BT0D%"7_#P``BU0D),'B$@G0
+MBU0D,,'B&0G0]L,!=`4-`````?;#$'0%#0```"#VPP1T!0T``$``]L,@=`4-
+M``"``(E!"(M$)!R)PL'B&O;#`G0&@<H``(``B5$,@_[_=!:)\,'@#24`X`\`
+M"=")00R!20@```!`N`$```!;7L.)]K@`````PXGV4XM,)!"+7"08BU0D#(-\
+M)!0`=!2+0@P)R(7;=0.`S!")0@SK)XUV`(7;=!"+1"0<BT`(B4((B4H,ZQ&0
+MQT((`````(G(@,P0B4(,D,="%`````#'0A``````N`$```!;PXUV`%.+3"0,
+MB<JX#P```/9!%`$/A*(```"+010E_A\``-'H9HE!(`^W01)FB4$BQD$D`(M!
+M$*@!=1VH`G0$QD$D`?9"$`AT!(!))`+V0A`$=`6`220$D(M"""4``#P`P>@2
+MB$$EBT(4)0#@'P#!Z`V(02:+0A`E``\``(G#P>L(B%DGBT(0)?````#!Z`2(
+M02B+0A`E`/```,'H#(A!*<9!*@"$VW0&C4,!B$$G@'DH`'0#_D$HN`````!;
+MPXGVPY"0D(/L#(M,)!"+013'@-"8```6'```N@````"-=@"+013'@("8````
+M``$`0H/Z!W[MBT$4BX``G```P>@8B<+!Z@2#X`_!X`0)T(/L"&H(4.C\____
+M@\0<PY!75E.![)````"+G"2@````C7PD<+ZL1```_+D%````\Z6-?"10OL!$
+M``"Q!?.EC7PD,+[41```L07SI8U\)!"^Z$0``+$%\Z6Z`````(UV`(M$E'")
+MA).T+@``BT244(F$D\@N``"+1)0PB823W"X``(M$E!")A)/P+@``0H/Z!'[.
+M@<20````6UY?PU93@^P0BW0D'&@P+P``Z/S___^)PX/$$(7`=12+1"0@QP`"
+M````N`````#INP```(/L!&@`"```:*`\``!0Z/S___^+1"0DB4,,BT0D*(E#
+M$(M$)"R)0Q1FB;.@`0``9L>#H@$`````9L>#S`$``#P`QX/0`0```````,>#
+M5!D```````#'@U@9````````QX-<&0```````,>#:!D```$```#'@VP9````
+M````QX-P&0``9````,>#=!D```(```#'@X09``#_____QX.(&0``_____\>#
+MC!D``/_____&@Y`9````B=B#Q!"#Q`1;7L.-=@!55U93@^PHBWPD3%?_="1,
+M_W0D3/]T)$P/MT0D3%#H_/___XG&@\0@N`````"%]@^$:@4``(GS:@!J`6H"
+M5NC\____@\00A<!U#L=$)!0#````Z2D%``"0@^P(:@!6Z/S___^#Q!"%P'4.
+MQT0D%`,```#I"04``)"+1A2+@"!````/MM")T,'H!(F&I`$``(G0@^`/9HF&
+MJ`$``(.^I`$```5T"8.^I`$```=U"F:#NZ@!```!=PW'1"04#0```.F\!```
+MBT,4BX`8F```9HF#J@$``(/L#%/H_/___X/$$(7`=0W'1"04#@```.F/!```
+MBT,4QX``F```!P```(/L#%/H_/___V:)@ZP!``"#Q!`/M\`E\````(/X('18
+M@_@@?PR#^`=T3H/X$'1)ZPJ#^#!T0H/X4'0]9H.[K`$```!U,X.[I`$```5U
+M&(&[J`$```D`0P!U#&;'@ZP!``!&`.L3D(.[I`$```=U"6;'@ZP!``!1``^W
+MDZP!``")T"7P````@_@O?A>)T(/@#X/X!'\-QT0D%`T```#IX`,``(/L!(U$
+M)!Y0:,$```!3Z/S___^#Q!"%P'4-QT0D%`@```#IN0,``&:!?"0:`3!W#<=$
+M)!0%````Z:,#``!FBT0D&F:)A@`(``"+0Q2+D!!```"#XAC!Z@.#^@)T#<=$
+M)!0*````Z78#``"#[`2-1"0>4&H_4^C\____@\00A<!U#<=$)!0(````Z5(#
+M``!FBT0D&F:)A@((``"#[`2-1"0>4&H<4^C\____@\00A<!U#<=$)!0(````
+MZ2(#``#'1"0,0`,``&:#?"0:`'1&#[=$)!HE\/\``,'@#(E$)`R#[`2-1"0>
+M4&H;4^C\____@\00A<!U#<=$)!0(````Z=T"```/MT0D&@E$)`R!;"0,P```
+M`,=$)!``````O0````"+1"0,.<5S,(/L!(U$)!Y0C87`````4%/H_/___X/$
+M$(7`#X2/`@``#[=$)!HQ1"0013ML)`QRT(%\)!#__P``=`W'1"04!P```.EP
+M`@``9L>&=@D```H`9L>&@`L```,`O0````"-1&T`C42%`&;'A(9^"0``"P!%
+M@_T)=NB]`````+J@1```N:9$``!FBP1J9HF$;H@+``!FBP1I9HF$;H(+``"-
+M1&T`C42%`(T$AF;'@#`,```+`&;'@)0+```+`$6#_0)VQ8/L"(V&``@``%!3
+MZ/S___^#Q!"%P'4-QT0D%`@```#ITP$``&:#OA@(````='4/MX.L`0``)?``
+M``"#^!!U9(M#%,>``)@```=```"#[`QHT`<``.C\____B1PDZ/S___]FB8.N
+M`0``BT,4QX``F```!P```,<$)-`'``#H_/___P^W@ZX!```E\````(/$$(/X
+M('0.QT0D%`T```#I50$``)"#[`2-1"0>4&B_````4^C\____@\00A<!U#<=$
+M)!0(````Z2T!``!FBT0D&F:)A@0(``!FB8/4`0``@^P,4^C\____@\00A<!U
+M#<=$)!0(````Z?T```"#NZ0!```'=12#[`B-1"0<4%/H_/___X/$$.LVD`^W
+M@ZP!```E\````(/X+WX3@^P(C40D'%!3Z/S___^#Q!#K$8/L"(U$)!Q04^C\
+M____@\00A<`/A*,```"#[`Q3Z/S____'1"0@`````+T`````@\00@^P$C40D
+M'E"X'P```"GH4%/H_/___X/$$(7`=%D/MT0D&@%$)!!F#[9$)!N(A&Y<%@``
+M9HM$)!J(A&Y=%@``18/]`G:[@WPD$`!T"H%\)!#]_P(`=0K'1"04"0```.LJ
+M4^@D^?__@^P(4^C\____B=B#Q!#K,\=$)!0(````ZPJ)]L=$)!0(````A?9T
+M#(/L#%;H_/___X/$$(7_=`:+1"04B0>X`````(/$'%M>7UW#D%.#[!2+7"0<
+M4^C\____@\00@[O(%@```'0.@^P,4_^3R!8``(/$$)!J`&H!:@-3Z/S___^)
+M'"3H_/___X/$&%O#C78`55=64X/L+(MT)$#'1"0(`(```,=$)`P@F```QT0D
+M$%55557'1"04JJJJJL=$)!AF9F9FQT0D')F9F9F_`````(UL)`B-!+T`````
+MBQPHBU84BQ0:B10$N0````")R,'@$(G""<J+1A2)%!B+1A2+!!@YT'0'N```
+M``#K84&!^?\```!^U[D`````BU2,$(M&%(D4&(M&%(L$&#G"=`JX`````.LX
+MC78`08/Y`W[<C02]`````(M.%(L4*(L$!(D$$4>#_P$/CGG___^#[`QJ9.C\
+M____N`$```"#Q!"#Q"Q;7E]=PXUV`(M4)`R+3"00BT0D"/;$`7039L<".!-F
+MQP'4%[@!````PXUV`*F`````="&+1"0$9H.X&`@```!T$V;'`@@)9L<!K`JX
+M`0```,.-=@"X`````,.)]E575E.#[`R+;"0@B>^)ZXVUM`$``&;'1"0*``!F
+M@;T`"````%!V)8/L!(U$)`Y0:,D```!5_Y6$`0``@\00N@````"%P`^$3`(`
+M`)!F@WPD"@!U+(.]I`$```=U(V:#O:@!```(=1EFQT0D"@4`9L>'!@@```$`
+M9L>'"`@```$`@[NP`0``!G0[9H&[H@$``&5P=3!FBY/4`0``C4*<9H/X`7<,
+MC4(%9HF#U`$``.L49H.[U`$``$%U"F;'@]0!``!#`)#'1@0`````9H._%@@`
+M``!T&\=&!`$```!F@[\&"````'4*QT8$`P```(UV`&:#OQ@(````=`2#3@0$
+M9H._&@@```!T*&:!NZ(!```1#G0=BU8$B="#R`B)1@1F@[\("````'4(B="#
+MR"B)1@1FQT80"`D/MX6L`0``)?````"#^"]_"8.]I`$```=U"&;'1A+$">L&
+M9L=&$JP*9L=&##@39L=&#M07BD8!@^#?@\A`B$8!N`````!F@[NH`0```W8+
+M]D0D"@)U!+`!B?;!X`2*5@&#XNL)PH/*"`^W3"0*B<C1Z(/P`8/@`='@@^+]
+M"<*(5@&`#@-F@[NH`0```79=N`````#VP0%U"O9&!`ET!+`!B?:-'(4`````
+MBA:#XO,/MTPD"HG(P>@#@_`!@^`!P>`#"=H)PH@6N`````#VP01U"?9&!`ET
+M`[`!D(C"P>($B@:#X.\)T(/(H(@&@":_N@````"#O\@(````=`F#O\P(````
+M=06Z`0```(I&`8/@_@G0@\B`B$8!@$X"`0^W1"0*)?`!``!T"L'X!&:)1@CK
+M!Y!FQT8("@!F]T0D"@#P=!4/MTPD"L'I#+@!````T^!FB48*ZP9FQT8*@`"Z
+M`0```(G0@\0,6UY?7<.0D)!75E.+3"00BW0D%(M<)!B)SXM!%(FP*(```(N!
+ML`$``(/X`70/@_@!<B:#^`9T(8/X"'5$BT$4QX`L@```__\``(M!%,>`,(``
+M`/__!P#K*(M1%(GP*P4`````P>`#B8(L@```BU$4B?`K!0````#!X`.)@C"`
+M``"+412-1@&#OU09````=`B)\`.'5!D``(F"-(```('C__^``8G8P>@8A<!T
+M#8M!%,>`((````````&+012)F""```!;7E_#B?964X/L!(MT)!"[`````(GV
+M@^P(:@)6Z/S___^#Q!"%P'06@^P,:@KH_/___X/$$$.!^^<#``!^V('[YP,`
+M``^>P`^VP(/$!%M>PXGVBU0D!(M"%,>`*(````````"+2A2+@02````-```$
+M`"7__\__B8$$@```BT(4QX`@@```__\``,-55U93BVPD%(M<)!AF@WL2`'1!
+MBU44BX($@```#0``$`")@@2```"+510/MT,0B8(D@```BU44#[=#$HF".(``
+M`(M5%(M#%,'@`XF",(```.L6B?:+512+@@2````E___O_XF"!(```(M5%(L#
+MB8(H@```BTT4BX$@@```)0``@/\/MU,("<)F@WL8`'01#[=#&(/`!,'@$"4`
+M`'\`"<*)D2"```"+312+D1B````P]@^W0QK!X`@E`/\```G"B9$8@```BWL(
+M.7L<=@.+>QR+<PPY<QQV`XMS'#GW=0:+2P3K`Y"+"XM5%(M#!(/H`\'@`R7_
+M_P<`#0``&`J)@M2```"+512-!,WH____)?__!P`-````"HF"V(```(M-%(GX
+M)?__``")\L'B$`G0B8'<@```6UY?7<-3@^P(BUPD$(M3%(M$)!2)@@!@``"+
+M0Q3'@`A@```!````:@)J`V@,8```4^C\____@\00N@````"%P'05BT,4BY`$
+M8```BT0D&&:)$+H!````B="#Q`A;PY"0D%.+1"0(BU@4BTPD#-'AN@,```#3
+MXHN#%$````G0B8,40```N`$```!;PXGV4XM$)`B+6!2+3"0,T>&X`P```-/@
+M]]"+DQ1````AT(F#%$```+@!````6\-3BTPD#(M$)`B+6!2+DQA```"X_O__
+M_]/`(<*+1"00@^`!T^`)PHF3&$```+@!````6\.0BTPD"+C_____@_D%=Q6+
+M1"0$BT`4BX`<0```@^`OT^B#X`'#5E.#[`2+="00BU0D%(M&%(N8%$```(T,
+M$K@#````T^`-`/`!`/?0(</!X@P)TX#/@(-\)!@`=`:!RP```0"+1A2)F!1`
+M``"#[`B+AF@6```-`````5!6Z/S___^#Q!1;7L.0D(M$)`2+0!2+@`A```"#
+M^`$/E,`/ML##D%=64XM\)!"+="04BT<4BYC`````@_O_=1/'!@````"X````
+M`.F9````C78`B=@ENM@%`8D&]\,```@`=`<-````0(D&]L,%=`.##@'WP\`%
+M``!T7H,.0(M/%(N1Q````('B_P,```N7+"\``(F7+"\``(N!Q````"4``/\#
+MP>@0"=")ARPO``"+D<@```"!XO\#```)PHF7+"\``(N!R````"4``/\#P>@0
+M"=")ARPO``#VPR!T!H$.````0+@!````6UY?PXGVBT0D!(N`:!8``,.05U93
+MBW0D$(M<)!2)\8N^:!8``(7_>1&+1A3'0"0`````BT84BT`DD(G:@>*ZV`4!
+M]L-`=#.#N>06````=`.#RD"#N>@6````=`.`S@&#N>P6````=`.`RH"#N?`6
+M````=`:`S@2-=@#VPP%T`X/*!_?#````0'0&@<H```@`BT84B9"@````B9EH
+M%@``A=MY"XM&%,=`)`$```"0B?A;7E_#D)"+1"0$#[>`O@$``,.+5"0$BT0D
+M"&8Y@KX!``!V&P^WP,'@!0-"%(N`'(@``+H!````J0"```!U!;H`````B=##
+M5E.+7"0,BW0D$+@`````9CFSO@$```^&V0````^WQL'@!8G"`U,4BXH4B```
+MQX(`B````````(G"`U,4QX($B````````(G"`U,4QX((B````````(G"`U,4
+MQX(,B````````(G"`U,4QX(0B````````(G"`U,4QX(4B```!P```(G"`U,4
+MQX(8B`````````-#%,>`'(@```````"#^01U38.[:!D```!T1(U&0`^WP,'@
+M!8G"`U,4QX(`B````````(G"`U,4QX($B````````(G"`U,4QX((B```````
+M``-#%,>`#(@```````"0N`$```!;7L-75E.+?"00BU0D&(MT)!2X`````&8Y
+MM[X!``!V:X72=#@/MEH%P>,(#[9"!`G##[9*`\'A&`^V0@+!X!`)P0^V0@'!
+MX`@)P0^V`@G!T>F)V,'@'PG!T>OK"[L`````N0````"0#[?&P>`%B<(#5Q2)
+MBAB(```#1Q2)VH#.@(F0'(@``+@!````6UY?PU575E.#[!2+="0PBTPD+(M4
+M)"B!PK0!``"#?"0X`1G;]].!XZJJJJJ_`````&8Y2@H/AD$#```/M@:#^`4/
+MAXT```#_)(7\1```QT0D!`4```#IA0```+\`````]D(!$`^$$@,``,=$)`0&
+M````ZVS'1"0$!`````^WP8/`0`^W4@J_`````#G0#XWI`@``ZTN_`````&:#
+M?@($#X;7`@``QT0D!`````!F@WX"!78L9H-^`@X9P(/@_H/``XE$)`3K&<=$
+M)`0'````ZP^-=@"_`````.F>`@``B?8/ME8$#[9&!<'@"`G"#[9&!L'@$`G"
+M#[9&!\'@&`G",=J)5"00#[9&"<'@"`^V5@@)PC':@>+__P``B50D#`^V;@H/
+MMD8+P>`("<4/MD8,P>`0"<4/MD8-P>`8"<4QW0^V1@_!X`@/ME8."<(QVH'B
+M__\``(E4)`@/MGX0#[9&$<'@"`G'#[9&$L'@$`G'#[9&$\'@&`G',=]F@WX"
+M#7<&@>?_````@WPD!`0/A7,!``"+7"0H@[MH&0````^$8@$``(U90`^WR8G(
+MP>`%B00DB<*+1"0H`U`4BT0D$/?0B8(`B```BQ0DBT0D*`-0%(M$)`SWT(F"
+M!(@``(L$)(M4)"@#0A2)J`B(``"+!"0#0A2+5"0(B9`,B```BP0DBU0D*`-"
+M%(FX$(@``(L$)`-"%,>`%(@```0```#_="0T45+H_/___P^V3A0/MD85P>`(
+M"<$/MD86P>`0"<$/MD87P>`8"<$/ME88#[9&&<'@"`G"#[9&&L'@$`G"#[9&
+M&\'@&`G"#[?;P>,%B=B+="0T`T84B8@`B```@\0,B=@#1A3'@`2(````````
+MB=@#1A2)D`B(``")V`-&%,>`#(@```````")V`-&%,>`$(@```````")V`-&
+M%,>`%(@```<```")V`-&%,>`&(@````````#7A3'@QR(````````BP0D`T84
+MBU0D$(F0`(@``(L$)`-&%(M,)`R)B`2(``#K=(UV``^WR8G(P>`%B<*+7"0H
+M`U,4BW0D$(FR`(@``(G"`U,4BUPD#(F:!(@``(G"BW0D*`-6%(FJ"(@``(G"
+M`U84BUPD"(F:#(@``(G"`U84B;H0B````T84BW0D!(FP%(@``/]T)#11_W0D
+M,.C\____@\0,OP$```")]HGX@\046UY?7<.0D(/L$&H&BT0D&`5<%@``4/]T
+M)"#H_/___X/$',.#[!!J!O]T)!R+1"0<!5P6``!0Z/S___^X`0```(/$',.-
+M=@!3BUPD$(M,)`BZ#````(M$)`QF.8'4`0``=!@/MX$""```P>@'@^`!@_@!
+M&=*#XOB#P@N%VW0"B1.X`````%O#BTPD!(G*N`````!F@[D6"````'0.9H.Y
+M!@@```$9P(/@`D!F@[H8"````'0#@\@$9H.Z&@@```!T'F:!N:(!```1#G03
+M@\@(9H.Z"`@```!U!H/(((UV`,.-=@!3@^P(BUPD$&:#NPH(````=$J#[`2-
+M1"0*4&H/4_^3A`$``(/$$+H`````A<!T60^W5"0&B="#X!S!^`*)@Y09``"#
+MX@+1^HF3F!D``,>#H!D```$```#K(8UV`,>#E!D```````#'@Y@9````````
+MQX.@&0```````&:#NPH(````#Y7`#[;0B="#Q`A;PY!3@^P0BUPD&/^SE!D`
+M`%/_DY`!``"+4Q2+@@"8``"`S"")@@"8``"#Q`C_LY09``!3_Y.4`0``B8.<
+M&0``@\0,.X.8&0``#Y7`#[;`4/^SE!D``%/_DYP!``"#Q!A;PY"+1"0$BT@4
+MBX$00```)9__\?^+5"0(@^('"P25($4``(F!$$```,.05E.#[`B+7"04BW0D
+M'&H&_W0D'(V#8A8``%#H_/___XM+%`^VDV(6```/MH-C%@``P>`("<(/MH-D
+M%@``P>`0"<(/MH-E%@``P>`8"<*)D0B```"+2Q0/MH-G%@``P>`(#[:39A8`
+M``G"@>;_/P``P>80"?*)D0R```"+4Q2+@@R````E__\``(F"#(```(/$%%M>
+MPU.+1"0(BT@4BX%0@```B<*X`````(N)3(```+L`````"<@)VEO#B?:+1"0$
+MBT`4BX!,@```PXGVBTPD!(M1%(N"((````T````!B8(@@```BU$4B8(@@```
+MPXGV5E.+="0,BUPD$(N&_`<``(7`=&#V0`(@=%JP`+D`````.PMS'(UV`(I4
+M"P2$TGD,@^)_.,)R!8C0C78`03L+<N>+5A2+B@2```"$P'06T.@\`G<0B<@-
+M`````HF"!(```.L1D(M6%(G()?____V)@@2```!;7L.0BU0D!(M"%(N`9)@`
+M`(G!P>D3@>'_`0``B<C!Z`B%P'0&@?$`_O__BU(4BX)0@```BY),@```,=`Q
+MR,.04XM4)`B+0A2+@"!````E_P```(G!@^$/NP````#!Z`0Y@J0!``!U#&8Y
+MBJ@!``!U`[,!D(G86\.+3"0$BT0D"(M1%(N2D(````$0BU$4BY*,@````5`$
+MBU$4BY*4@````5`,BU$4BY*(@````5`(BU$4BY*8@````5`0P[@!````PXGV
+MBT0D!(M0%(N"5)D``(/(`8F"5)D``,.0BT0D!(M`%(N`')P``"7_````PY"+
+M1"0$BT`4BX!8@```@^`'PXUV`(M$)`2+4!2+1"0(@^`'B8)8@```PXUV`%57
+M5E.+?"04BVPD&(G[BT0D'`^W0`(EX`$``#W`````="H]P````'\+/:````!T
+M%.LBB?:^`````#U``0``="#K$HGVO@$```#K%9"^`@```.L-D+@`````Z;L`
+M``")]@^WC'-X"```#[>$<WX(``#!X`8)P0^WA'.$"```P>`,"<$/MX1SB@@`
+M`,'@$@G!#[>$<Y`(``#!X!@)P0^WE'.6"```#[>$<YP(``#!X`8)P@^WA'.B
+M"```P>`,"<(/MX1SJ`@``,'@$@G"#[>$<ZX(``#!X!@)PH/]`70/@_T!<AJ#
+M_0)T">L+C78`B<KK#(G1ZPBX`````.L>D(FK6!D``(M'%(F(8)D``(M'%(F0
+M9)D``+@!````6UY?7<.)]K@!````PXGV5U93BWPD$(MT)!2)^X/^"'86@^P(
+M:/__``!7Z/S___^#Q!`Y\',2D,>#A!D``/____^X`````.LC@^P(5E?H_/__
+M_XM7%(F"<!```(/$$(FWA!D``+@!````B?9;7E_#@^P4BU0D&(M"%(N`<!``
+M`"7__P``4%+H_/___X/$',-55U93@^P4BVPD*&C_/P``5>C\____@\00.T0D
+M)',1QX6(&0``_____[@`````ZSR+=12+GA2```"!XP#`__^#[`C_="0L5>C\
+M____)?\_```)PXF>%(```(/$$(M$)"2)A8@9``"X`0```)"#Q`Q;7E]=PX/L
+M%(M4)!B+0A2+@!2````E_S\``%!2Z/S___^#Q!S#55=64X/L%(ML)"AH_S\`
+M`%7H_/___X/$$#M$)"1S$<>%C!D``/____^X`````.M`BW44BYX4@```@>/_
+M_P#`@^P(_W0D+%7H_/___\'@$"4``/\_"<.)GA2```"#Q!"+1"0DB86,&0``
+MN`$```")]H/$#%M>7UW#@^P4BU0D&(M"%(N`%(```"4``/\_P>@04%+H_/__
+M_X/$',.0@^P4BT0D&/^PL`$``%#H_/___X/$',.0BU0D!+@`````@WPD"`9T
+M%("Z(0@```!T"X.Z=!D```%W`K`!PXUV`%.+7"0(_W0D#%/H_/___X/$"(7`
+M#X2R````BT,4QX!PF```'P```(M#%,>`=)@```T```"+0Q3'@'B8```,````
+MBT,4QX#PF0```P```(M#%,>`])D```4```"+4Q0/MX.L`0``)?````"#^#`/
+MG,`/ML"-!(44````B8+XF0``BU,4BX(<@```)7_`__\,@(F"'(```(M#%,>`
+M!($``#T```"+4Q2+@A!```"#R`*)@A!```"+4Q2+@A!````-`````XF"$$``
+M`.MGD(M#%,>`<)@``!\```"+0Q3'@'28``!_````BT,4QX!XF```#@```(M#
+M%,>`\)D```P```"+0Q3'@/29``#_````BU,4#[>#K`$``"7P````@_@P#YS`
+M#[;`C02%%````(F"^)D``%O#4XM<)`C_="0,4^C\____@\0(A<`/A+(```"+
+M4Q2+@A!````E_____(F"$$```(M3%(N"$$```(/@_8F"$$```(M#%,>`!($`
+M``$```"+4Q2+@AR````E?\#__PV`#P``B8(<@```BT,4QX!PF```'P```(M#
+M%,>`=)@``'\```"+0Q3'@'B8```.````BT,4QX#PF0``#````(M#%,>`])D`
+M`/\```"+4Q0/MX.L`0``)?````"#^#`/G,`/ML"-!(44````B8+XF0``6\.)
+M]E.#[`B+3"00BT0D%(M<)!B#^!`/A[,```#_)(5`10``@_L"=!:#^P)R(X/[
+M!'(H@_L%=AF#^W]T%.L<9H.YJ`$```09P(/@#>F.````N`````#IA````+@-
+M````ZWV#N6@9````#Y3`#[;`ZVZX`````.MG@[FH&0````^4P`^VP.M8N```
+M``"%VW1/N`P```"#^P%U18M!%(N`"*(``/;$(`^4P`^VP.LQN`````"%VW0H
+MN`````"#^P%U'H.Y;!D````/E,`/ML#K#_]T)!Q34%'H_/___X/$$(/$"%O#
+M4X/L"(M<)!"+1"04BU0D'(/X!70S@_@%=PJ#^`)T$>M_C78`@_@+=$>#^!!T
+M6^MPA=(/E<`/ML")@V@9``"X`0```.MQC78`BT,4BX@(H@``A=)T!X#-(.L%
+MB?:`Y=^+0Q2)B`BB``"X`0```.M'D(/B!HF3R`$``(M#%(F02(```+@!````
+MZRV%T@^5P`^VP(F#;!D``+@!````ZQB)]H/L#/]T)"Q2_W0D+%!3Z/S___^#
+MQ""#Q`A;PY"#[!3_="0L_W0D+/]T)"S_="0L_W0D+/]T)"SH_/___X7`#Y7`
+M#[;`@\0LPU93@^P$BW0D$(-\)!0`=&"+1A3'@`1`````````@^P,:@KH_/__
+M_[L*````@\00D(M&%(N`$$```*D```$`="*#[`QHR````.C\____BT84QX`$
+M0````````(/$$$MUT.L&A=MU"HGVN`````#K&I"+5A2+@@2````E___[_XF"
+M!(```+@!````@\0$6U[#D(M,)`2+412+@@2````-```$`(F"!(```(-\)`@`
+M=`V+013'@`1```````$`PXUV`%.+7"0(BTPD$(M3%(N"!(````T```0`B8($
+M@```@WPD#`!T$8M3%`^WP0T```(`B8($0```6\.05U93BU0D$(M<)!2+3"08
+MBT0D'(G6OP$```"#^P-T)8/[`W<(@_L"=`KK-9"#^P1T'^LM@^P(45+HR_[_
+M_XG'@\00ZR114NA-____@\0(ZQ@/M\!045+H;?___X/$#.L(N`````#K"9")
+MGE`9``")^%M>7\.+1"0$BT`4BX`$0```)0```P#!Z!##B?:+1"0$BT`4BX`0
+M0```P>@0@^`!P[@`````PXGVN`````##B?:X`````,.0D%.#[`B+1"04@_@$
+M=#N#^`1W#H/X`70I@_@"=#SK2HGV@_@@=#.#^"!W"H/X"'0@ZS>-=@`]``$`
+M`'0DZRN-=@"[`````.LID+L`````ZR&[`````.L:B?:[`````.L1NP````#K
+M"HGVN`````#K$Y"#[`A3_W0D'.C\____B=B#Q!"#Q`A;PY"+1"0$BT`4BT`,
+MPY"+1"0$BU`4BT0D"(E"#,.0BT0D!(M`%,=`"`0```##D(/L#(M4)!"+0A3'
+M0`@@````:@!J!&H(4NC\____A<`/E<`/ML"#Q!S#C78`4X/L%(M<)!R+4Q2+
+M@DB```"#X-^)@DB```!3Z/S___^)'"3H_/___X/$&%O#C78`@^P8BTPD'(M1
+M%(N"2(```(/(((F"2(```%'H_/___X/$',.0BTPD!(M1%(M$)`B)@D"```"+
+M412+1"0,B8)$@```PY!3BU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FD2`
+M``"#Z2"X_O___]/`(=B)@D2```#K&XUV`(M2%(N:0(```+C^____T\`AV(F"
+M0(```+@!````6\.04XM4)`B+3"0,N`````"#^3]W0H/Y'W8@BU(4BYI$@```
+M@^D@N`$```#3X`G8B8)$@```ZQN-=@"+4A2+FD"```"X`0```-/@"=B)@D"`
+M``"X`0```%O#D(M$)`2+0!2+D#R```"+@`R!``"H('0#@,X"J0```@)T`X#.
+M`8G0PY!3BUPD"(M,)`R+4Q0/ML&)@CR```"Z`````/;%`G0"LB#VQ0%T!H'*
+M```"`HM#%(F0#($``(72=`^+4Q2+0C2#R!")0C3K#9"+4Q2+0C2#X.^)0C1;
+MPXGVBU0D",=""`````"+1"0,)?\/``")0@SV1"00('0&@,P@B4(,QT(4````
+M`,="$`````"X`0```,-64X/L!(M,)!"+="04B?.+1"0<N@\```#V1A0!#X3G
+M````]D`4`745BT$4BT`,N@\````[1"08#X3,````9HM#$"7_#P``9HE&((M#
+M%"4``/]_P>@09HE&(L9&)`"+0Q2H`G50J`1T",9&)`'K1HGV]D,4$'0F@$XD
+M`@^V0Q6(1B6#N:@9````=2J#[`B-1B!04>C\____@\00ZQCV0Q0(=`:`3B0(
+MZPSV0Q0@=`:`3B00B?:+0Q`E``#P#\'H%(A&)HM#%/;$`70.)0#^``#!Z`F(
+M1B?K!9#&1B?_BT,0)0"`#P#!Z`^(1BB+0Q`E````\,'H'(A&*8M#$,'H#(/@
+M`8A&*KH`````B="#Q`1;7L.0D)!55U93@^P\BWPD4(ML)%R)?"0LO@````"+
+M5"18#[="`HG"P>H'P>@(,="Z#````*@!#X0-"```BTPD6`^W00*)PL'J!L'H
+M!3'0N@P```"H`0^$[@<``&H`:@%J`E?H_/___X/$$+H`````A<`/A.('``"#
+M[`C_="1@5^C\____B40D.(/$$+H,````A<`/A+$'``"#?"14!G0A@WPD5`9W
+M"8-\)%0!=PGK$8-\)%0(=`JZ#````.F)!P``QT0D)`````"%[70=BT<4BX!`
+M$0``B40D)(/L"/]T)#!7Z-,,``"#Q!"+1Q2+@%B```")1"0@A<!U",=$)"`!
+M````BU<4BX($@```)0````*)1"08BX(00```)6``_@")1"0<BYH40```B5PD
+M-(N2&$```(E4)#"#[`C_="1<5^C\____B3PDZ/S___^#Q`C_="1@5^C\____
+M@\00N@,```"%P`^$X`8``(M4)%@/MT(")?`!```]0`$``'14/4`!``!_)CW`
+M````='P]P````'\,/:````!T7.F-````/=````!T=.F!````/<`(``!T5CW`
+M"```?PD]4`$``'0DZVH]0`D``'0)/5`)``!T%.M:QT0D%`$```#'1"00`0``
+M`.M2QT0D%`(```#'1"00`0```.M`QT0D%`,```#'1"00`@```.LNQT0D%`0`
+M``#'1"00`@```.L<QT0D%`4```#'1"00`@```.L*N@P```#I%`8``(M'%,>`
+M`)@```<```"[`````(GVC01;BT\4BQ3%H$4``(E4)`R+5"04C01"BP2%H$4`
+M`(M4)`R)!!%&]\8_````=0V#[`QJ`>C\____@\000X/[&':^NP````"0BPS=
+M`$@``(7M=`V-@0"`__\]_P\``'8DBU<4BP3=!$@``(D$"D;WQC\```!U#H/L
+M#&H!Z/S___^#Q!"00X'[Q@```':[5O]T)!3_="0<5XM,)#S_D<P6``"#Q`C_
+M="1@5^C\____@\009H._J@$``$$/AMT```"+1Q3'@"R8```"H`(`BUPD6&:!
+M.[0)=2F+1"0L#[:((`@```^W@"H(```IP;AG9F9F]^F)T-'XP?D?B<-F*<OK
+M%HM,)"P/MI$@"```N&=F9F;WZHG3T>N+5"18#[="`B70````/<````!U+XM/
+M%(M$)"P/MI`@"```]]K!X@:!XL`/``")V,'@$O?8)0``_``)PHF13)D``.L-
+MBT<4QX!,F0```````(M7%(N"**(``(#D_8F"**(``(M7%(N"**(``"7_`_[_
+M@,P(B8(HH@``BT<4QX!@@```#P```&:#OZH!``!"=@V+1Q3'@%2B````````
+MBT<4QX!XF```#@```(/L!(U$)#Q0_W0D,%?H_/___X/$$+H#````A<`/A!X$
+M``"-1"0X4`^W1"084/]T)#!7BU0D//^2V!8``(/$$+H#````A<`/A/0#``"+
+M3"18]D$"0'0-@^P(45?H_/___X/$$(/L"/]T)#!7Z/S___^#Q!"Z`P```(7`
+M#X3``P``A>UT#8M'%(M<)"2)F$`1``"+3Q2+1"0L#[:07!8```^V@%T6``#!
+MX`@)PHM<)"P/MH->%@``P>`0"<(/MH-?%@``P>`8"<*)D0"```"+3Q0/MI-A
+M%@``P>((#[:#8!8```G0"T0D&(G"@<H``(``@[MH&0```'0(B<*!R@``@`B)
+MD02```"#[`C_="1<5^C\____BT<4QX#@@```_____X/$"(M'%,>`Y(```/__
+M__^+5Q2+@A!````+1"0DB8(00```BT<4BU0D/(F0%$```(M'%(M,)#B)B!A`
+M``"+1Q2+7"0HB9A8@```BT\4BT0D-`^VD&(6```/MH!C%@``P>`("<*+7"0T
+M#[:#9!8``,'@$`G"#[:#918``,'@&`G"B9$(@```BT\4#[:39Q8``,'B"`^V
+M@V86```)T(F!#(```(M'%,>`@````/____^+1Q3'@!B`````!P``_W0D,%?_
+MD]06``"#Q!"Z`P```(7`#X1)`@``BT<4BX`4F0``B<*!XO\_``"+1"18]D`"
+M('0/P>("N*.++KKWXL'J!.L*N,W,S,SWXL'J`XM'%,>`')@```$```"#[`R-
+M0F10Z/S___^+5Q2+@F"8``"#R`.)@F"8``"#Q!"+5"18#[="`B6@````/:``
+M``!T/XM,)"R#N5P9```"=#*+5Q2+@B"9``"`S/")@B"9``"+5Q2+@B"9```-
+M```!`(F"()D``,>!7!D```$```#K#HM<)"S'@UP9````````NP````"^`0``
+M`(TLG0````"+5Q2)\(C9T^")A"H`$```0X/["7[CBUPD+,>#+"\```````"[
+M`````&:#O[P!````=!F#[`A35^C\____@\000P^WA[P!```YV'_GBT0D+,>`
+M:!8``&4)"`"#?"14!G4*QX!H%@``91D(`(M7%(M,)"R+@6@6``")@J````"+
+M5Q2+@JP````-```'`(F"K````(/L#%?H_/___X/$$(7`=`R#[`Q7Z/S___^#
+MQ!!J`&H!:&"8``!7Z/S___^#Q`B+1Q3'@`B!``!2````_W0D7%?H_/___XM7
+M%(N"((```"7__W_^B8(@@```@\00BUPD+(.[A!D``/]T$H/L"/^SA!D``%?H
+M_/___X/$$(M$)"R#N(@9``#_=!*#[`C_L(@9``!7Z/S___^#Q!"+5"0L@[J,
+M&0``_W02@^P(_[*,&0``5^C\____@\00@[_(`0```'0/BU<4BX?(`0``B8)(
+M@```BTPD5(F/L`$``+H!````ZQ&0BUPD8(,[`'0"B1.Z`````(G0@\0\6UY?
+M7<.)]E.+7"0(BU0D#(M#%(N(!(```('A___\_X/Z`713@_H!?P:%TG0LZU&#
+M^@9T!X/Z"'0^ZT6+4Q2)R`T```$`B8($@```BU,4BT(4@^#?B4(4ZR>+4Q2)
+MR`T```(`B8($@```BU,4BT(4@\@@B4(4ZPF+0Q2)B`2```!;PY"#[!1J`O]T
+M)!SHP@,``(/$',.)]E.#[`B+7"00:@!J`6H"4^C\____@\00N@````"%P'00
+M@^P(:A-3Z)$#``")PH/$$(G0@\0(6\.055=64X/L%(M<)"B+="0L:A-3Z&T#
+M``"#Q!"Z`````(7`#X1=`0``:@!J`6H"4^C\____@\00N@````"%P`^$00$`
+M`(/L"&H`4^@V`P``@\00N@````"%P`^$)@$``(7V#X09`0``#[>#K`$``"7P
+M````@_@O?B6]"`````^W1@*H('41)=````"YZ@```#W`````=2JYZP```.LC
+MO0`````/MT8"J"!U$270````N:H````]P````'4%N:L````/MT8"J$!T%:@@
+M=0PET````#W`````=06#S03K"?9&`D!U`X/-`?9&`P%U`X/-`@^W1@+!Z`2#
+MX`&#^`$9__?7@^<#BT,4BY!\F```#[=&`J@@=0PET````#W`````=3&+0Q2)
+MN`28``"+0Q2)J`"B```YRG1*BT,4B8A\F```@^P,:"P!``#H_/___X/$$.LO
+M.<IT&8M#%(F(?)@``(/L#&@L`0``Z/S___^#Q!"+0Q2)N`28``"+0Q2)J`"B
+M``"Z`0```(G0@\0,6UY?7<.)]E575E.#["2+;"0XB6PD(/]T)#Q5Z/S___^)
+MQX/$$+@`````A?\/A+X!``"+1"08@[A<&0```0^%Z````(M%%(N`()D``*D`
+M``$`#X74````BU0D&,>"7!D```````"[`````)"+112+L!"<``"+B!2<``"+
+M@!B<``")1"04A?9T!(7)=1J+512+@B"9```-```!`(F"()D``$.#^PE^Q8GP
+MT>B)RM'J`=#!Z0:)PL'J!P^$Q0```(/Y`0^.O````(I$)!3WV`^^P(G3F??[
+MB40D#(/@/XE$)!")\)GW^8G!@^$?BUT4BT0D$,'@!8N3()D```G0"<B`S`B)
+M@R"9``"+5"08QX)<&0```@```,='#`$```"*7"00B%\0B$\1ZUN-=@"+5"0T
+M#[="`B6@````/:````!T1(M<)!B#NUP9```"=3>#?PP`=3&+512+@B"9``"`
+MS/")@B"9``"+512+@B"9```-```!`(F"()D``,>#7!D```$```"0@^P(5U7H
+M=@$``(/$$+@`````]D<"`G55BU44BX)@F```@\@"B8)@F```BT0D-`^W4`+V
+MQ@%U&0^WA:P!```E\````(/X+WX@]L)`=!N-=@"#O:0!```'=`^#[`Q5Z/H4
+M``"#Q!"-=@"X`0```(/$'%M>7UW#C78`5U93BWPD$(MT)!2)\(7V=06X____
+M_XG#BT<4BU`,B;``0```@^P,:@_H_/___X/C`X/F`U93:`!```!7Z/S___^)
+MPX/$(/?&`0```'4FBT<4QT`4`````&H`:@%J`E?H_/___X/$$(7`=`F+1Q2+
+M@,````")V%M>7\.)]HM$)`2+0!2+@&28``#!Z!,E_P$``/;$`70%-0#^__^8
+MPXUV`(M,)`R+5"0$BT0D"`^W0`(EX`$``#W`````=#`]P````'\)/:````!T
+M%NLL/4`!``!U)6:+@EH(``!FB0'K(9!FBX)<"```9HD!ZQ1FBX)>"```9HD!
+MZPBX`````,.)]K@!````PXGV5U93@^P$BW0D%(M\)!B+1A2+@&"8``"[````
+M`*@"=2A6Z/S___^)PXU$)`905U;H9/___X/$$(7`=`UF.UPD`GX&9H-/`@*0
+M9HE?$@^_PX/$!%M>7\.)]E575E.#[`R+1"0HQT0D"`````"->/_![P-(@^`'
+MB00DBW0D)+T`````A?9^9XM$)"S!X`.)1"0$BQPD`?.#^PAV!;L(````N`$`
+M``"(V=/@2+H!````B@PDT^)*,="*3"0$T^"+5"0@(P2ZT^B*#"33Z(GIT^`)
+M1"0(B=@K!"0!Q8L$)(UT!OC'!"0`````1X7V?Z2#[`C_="0L_W0D%.C\____
+MB40D&(M$)!B#Q!Q;7E]=PU575E.#[$R+;"1@B>Z+1"1D#[=X`L'O!X/G`0^W
+M0`(E\`$``#U``0``=&$]0`$``'\R/<`````/A*,````]P````'\0/:`````/
+MA(0```#IF````#W0````#X2!````Z8@````]P`@``'1U/<`(``!_"CU0`0``
+M=!/K<9`]0`D``'0)/5`)``!U8HGVQT0D/``````/MX6L`0``)?````"#^"]_
+M4X.]I`$```=T2HM-%(N11)D``(/BQXN&6!8```^_`,'@`X/@.`G"B9%$F0``
+MZR7'1"0\`0```.L;C78`QT0D/`(```#K#HGVN`````#I#0,``(GVBTT4BX$0
+MF0``)0;\__^+7"0\#[>47G((``#!X@0)T(/(`8F!$)D``(/L!/]T)&C_ME@9
+M``!5Z/S___^+510/OX1>6@@``"7_`0``@,P"B8)HF0``@\009H&^``@``/]/
+M=D*+1"1D]D`"$'0X9HN$?M0(``"*G#?<"```BI0WW@@``(A4)"!FBXQ^V`@`
+M`&:)3"009HN4?N`(``!FB10DZSJ-=@"+3"0\9HN$3C`(``"*G#%4"```BI0W
+M5P@``(A4)"!FBXQ^-@@``&:)3"009HN4?L`(``!FB10DBTT4BY%$F```@>)_
+MP/__P>`')8`_```)PHF11)@``(M-%(N!4)@``+``#[;3"=")@5"8``"+312+
+MD5"8```P]HI$)"#!X`@E`/\```G"B9%0F```BTT4BY%(F```@>+_#_S_BT0D
+M$,'@#"4`\`,`"<*)D4B8``"+712+3"0\#[>43D@(``")T,'@&,'B$`G0#[>,
+M3DX(``")RL'B"`G0"<B)@S28``"+312+D2B8```P]HM<)#P/MX1>/`@``,'@
+M"`G"B9$HF```BTT4BY%DF```@>+_#_C_#[>$7D((``#!X`PE`/`'``G"B9%D
+MF```NP(```!F@;X`"````C!W&6:!O:(!```B$'4RBT0D9/9``D!T*+,(ZR2+
+M5"1D9HL"@^`?=!B#Z`IF@_@,=@^+3"0\#[>$3K0(```!PY"+312+D229``"`
+MX@&-!!LE]P````G"B9$DF0``BUPD9(-[#`!T"@^^0Q`/OEL1ZQ`/MX1^1@D`
+M``^WG'Y*"0``BTT4BY$@F0``@>(?^/__P>`%)>`'```)PHF1()D``(M-%(N!
+M()D``(/@X(G:@^(?"=")@2"9``"+512+@B"9``"`S`B)@B"9``!F@;X`"```
+M`$!V08M4)&0/MT(")=`````]T````'4+9H&^``@``/]/=B*+312+D0RB``"!
+MXO__`_^+!"3!X!(E``#\``G"B9$,H@``9H&^``@```!0=@V+113'@."9````
+M````N`$```"#Q$Q;7E]=PY!75E.+="00BU0D%`^W0@+!Z`2#X`&#^`$9P(/@
+MV(V$@)`!``#!X!B)P]'K#[<2B=B)T;H`````]_&)P[\?````B=B)^=/HJ`%U
+M`T]U\[@F````*?B)Q[@7````B<(I^K`!B-'3X`'8NA@````I^HC1T^B+7A2+
+MDQ28``"!XO__`0#!X!$)PHF3%)@``(M>%(N3%)@``('B_Q_^_XGXP>`-)0#@
+M`0`)PHF3%)@``%M>7\.-=@"#[`R+5"00BT0D%(/X/'8%N#P```!FB8+,`0``
+M@^P$C40D#%#_LOP'``!2Z/S___^#Q!S#55=64X/L%(ML)"B+7"0LB>__M0@O
+M``#_M00O``#H_/___X/$"&H@C84,+P``4.C\____9HN5S`$``(/$$&:#^CQ^
+M!;H\````9H/Z.W\*N0````!FA=)U#HN%T`$``&:+C``X3@``@^P(C40D$E"-
+M1"044`^_PE`/O\%04U7H9@(``(/$(+H`````A<`/A$H"``"#[`S_="0T4XU$
+M)!Y0C40D(%!5_Y?<%@``@\0@N@````"%P`^$(0(``(.]I`$```=T"&:#ARHO
+M```$O@````!FBX>`&0``9@&$=PPO``!F@[QW#"\``#]V"F;'A'<,+P``/P!&
+M@_X/=MUF@[\L"````0^'I@```&:#O:H!``!!=UP/MT,")=`````]P````'5,
+M9H$[M`EU(P^VCR`(```/MX<J"```*<&X9V9F9O?IB=#1^,'Y'V8IR.L2#[:7
+M(`@``+AG9F9F]^J)T-'H@^P(#[?`4%7H4`8``(/$$+X`````C1RU`````(M-
+M%(N'!"\```^W5+`"P>(8@<H``/\`#[<$L,'@"`S_)?__```)PHF4&8"A``!&
+M@_X??L6+310/MY<2+P``@^(_P>(8#[>'$"\``(/@/\'@$`G"#[>'#B\``(/@
+M/\'@"`G"#[>'#"\``(/@/PG"B9$TF0``BTT4#[>7&B\``(/B/\'B&`^WAQ@O
+M``"#X#_!X!`)P@^WAQ8O``"#X#_!X`@)P@^WAQ0O``"#X#\)PHF1.)D``(M-
+M%`^WER`O``"#XC_!XA@/MX<>+P``@^`_P>`0"<(/MX<J+P``@^`_P>`("<(/
+MMX<<+P``@^`_"<*)D32B``"+310/MY<H+P``@^(_P>(8#[>')B\``(/@/\'@
+M$`G"#[>')"\``(/@/\'@"`G"#[>'(B\``(/@/PG"B9$XH@``BU44@[]L&0``
+M`1G`@^#`@\!\B8(\F0``9HN'#"\``&:)A<X!``"Z`0```(GVB="#Q`Q;7E]=
+MPXGV55=64X/L5(M$)'!FB40D)HM4)'1FB50D)(MT)&B-O@PO``!FQT0D(CP`
+M9L=$)"`\`/]T)&Q6Z/S____1X&:)1"0FBXPDA````&;'`<3_BX0D@````&;'
+M`#P`@\0(_W0D;%;H_/___XA$)"6[`````(/$$&:#O@0)````#X2'````#[9L
+M)!6)ZH/B^(E4)!"09H.\7@8)````=&%F#[9$)!5F.81>!@D``'01#[>$7@8)
+M``"#X`<,X#G%=4")V,'@!HV$,%`-``"#[`A0BTPD<`^W`5#H2P4``(/$$(%\
+M)!#@````=0YF.40D&G8/9HE$)!KK"&:)1"0:ZPV00P^WA@0)```YV'^(BU0D
+M9`^W0@(ET````#W`````#X6F````@&0D%0>`3"05`;L`````9H.^!`D````/
+MA),````/MFPD%8GI@^'XB4PD#)!F@[Q>!@D```!T868/MD0D%68YA%X&"0``
+M=!$/MX1>!@D``(/@!PS@.<5U0(G8P>`&C80P4`T``(/L"%"+5"1P#[<"4.B/
+M!```@\00@7PD#.````!U#F8Y1"08=@]FB40D&.L(9HE$)!CK&9!##[>&!`D`
+M`#G8?XCK"F:+3"0:9HE,)!B+1"1D]D`#`70(BH8<"```ZP:*AAT(``"#[`0/
+MOL!0_W0D;/]T)&SH_/___XC#BU0D=`^W0@*#Q!"H0`^$I@$``"70````/<``
+M``!U)H/L#(U$)#Q0#[>&&`T``%"-AAH-``!04O]T)'SH&@4``(/$(.LG@^P,
+MC40D/%`/MX;&#```4(V&R`P``%#_="1\_W0D?.CQ!```@\0@#[=4)!8/OL,I
+MP@^W1"0:.<)^`HG"B=&+1"1D]D`"$'1$9H&^``@````P=A(/MX8."```#[_2
+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
+MY$\``(F!/!8``(T$P(T$A>A/``")0AS'0A@!````QT(,%````,="$%4```##
+MC78`H61.``")`HT$P(T$A6A.``")0AS'0A@!````QT(,%````,="$",```##
+MB?955U93@^P,BU0D((M\)"0/MX*L`0``)?````"#^"]^2&H`:B1J`8/L#&H'
+M4O^2T!8``(/$%%#H,>W__[T`````OFL```"Y`````+MK````@\00@_@!=7-F
+MOE,`LU/'1Q`W````ZV2)]FH`:B5J!H/L#&H'4O^2T!8``(/$%%#HZ>S__[T`
+M````@\00OC(```"#^#]T`XUP!(GI@_@_=`6Y0````(U9,HGJ@_@_=0:-512-
+M=@")5PR#^#]U"(U#\>L&C78`C4,%B4<0BU<$N``````YZG($.?)V#3G*<@0Y
+MVG8%N`$```"#Q`Q;7E]=PY"+1"0$#[^0@!D```.0?!D``(M(%,'B"8'B`'X`
+M`(#.@(F1,)D``,>`8!D```$```##C78`5U93BWPD$(G[C;<\%@``N`````"#
+M?A@`#X3@````@[]@&0```0^%S0```(M'%(N`,)D``*D`@```#X6Y````B<+!
+MZAF)5@0E``"``<'H%X/X`G4<9H._J@$``$%V#@^WAR@(```!T(E&!.L$@T8$
+M!0^WAZP!```E\````(/X+WXC@^P,5^B2`0``@\00BT8$.T84<@@K1A2)1@3K
+M!\=&!`````#'@V`9````````@^P(5E?H)/[__X/$$(7`=3F#[`A65^@[````
+M@\00A<!T*(/L"%97Z$8```"#Q!"%P'X7QX-@&0```@```,>#7!D```````"-
+M=@"+@V`9``!;7E_#B?:+3"0(N`````"+400[40QV!3M1$'(%N`$```##5E.+
+M7"00BT0D#`^W@*P!```E\````+[@3P``@_@O?P6^8$X``(L#C03`C42&"(E#
+M'(M#!#M#$')7NO____^#.P`/A*T```"+0P2)0P@[0Q!R-H,[`'0QD(L32HD3
+MC132C126BTL<BT(8*T$0T>"+2P@IP8E+"(/""(E3'#M+$'('@SL`==*)]KH!
+M````ZV60BT,$N@`````[0PQW5XL&2+K^____.0-T2XM#!(E#"#M##'<XBP9(
+M.0-S,9"+$T*)$XT4THT4EHM+'(M"&"M!$-'@BTL(*<&)2PB#P@B)4QP[2PQW
+M!XL&2#D#<M"Z`@```(UV`(G06U[#C78`5U93BUPD$(VS/!8``,=&%`````!J
+M`&HD:@&#[`QJ!U/_D]`6``"#Q!10Z/WI__^#Q!"#^`%U68M&'`^_.&H`:B!J
+M!(/L#&H'4_^3T!8``(/$%%#HU.G__X/$$(/_`70:@_\!<@R#_P)T%8/_`W09
+MZQ_'1A0`````ZQ:)1A3K$8U$`/N)1A3K"-'@B484C78`6UY?PU575E.#[!2+
+M="0PBUPD-%;_="0PZ/S___^)Q8U[_\'O`TN#XP>#Q!"%]GYRBT0D,,'@`XE$
+M)`B0C0PS@_D(?@6Y"````+H!````T^)*N`$```"(V=/@2#'"BDPD"-/BB='W
+MT8M$)"`C#+B)3"0$B>B(V=/@BDPD"-/@(=`+1"0$BU0D((D$NHUT'OBY"```
+M`"G9T^V[`````$>%]G^:@\0,6UY?7<.)]E575E.#[!2+5"0L#[="`L'H!(/@
+M`8/X`1G`)?X```"#P`)0_W0D+.C\____B<>]`````(/$$(,X`'X\D(U$;0"-
+M1(<@#[98",'C`HM4)""+<A2#[`QJ``^V0`M0:@Y74NC\____#[?`B80>`(<`
+M`(/$($4Y+W_%BT0D)/9``A`/A:L```"#[`AJ!/]T)"SH_/___XG'O0````"#
+MQ!"#.``/CHH```")]HU$;0"-=(<@#[9&"(T$A0"'``")1"0(BU0D((M:%(/L
+M#&H`#[9&"U!J#E=2Z/S___\/M\"+5"0HB003@\0@@'X)`'0X#[9&"8T$@HE$
+M)`B+1"0@BU@4@^P,:@$/MD8+4&H.5_]T)#SH_/___P^WP(M4)"B)!!.#Q""-
+M=@!%.2\/CWO___^-=@"#Q`Q;7E]=PU575E.#[!2+?"0HBX=H%@``)?___W]0
+M5^C\____B<6+1Q2+4#")TX'C\`,``,'K!(G>@\00@WPD)`!T$+@E````*=C1
+MZ(TT`^L(B?:#^P*#UO\YWG08BT\4@>(/_/__B?#!X`0E\`,```G"B5$P@^P(
+M55?H_/___SG>#Y7`#[;`@\0<6UY?7<-64X/L!(M,)!"+5"04#[>!O`$``+L`
+M````.=!^(X/L!/]T)!R-!%*-!("-A('X%@``4%'H_/___XG#@\00C78`B=B#
+MQ`1;7L-64X/L!(M,)!"+5"04#[>!O`$``+L`````.=!^(X/L!(T$4HT$@(V$
+M@?@6``!0_W0D(%'H_/___XG#@\00C78`B=B#Q`1;7L-55U93@^P,BVPD((M\
+M)"2)ZXV5M`$``(/_`G08@_\"=P>#_P%T)NM8@_\#=`^#_P1T$^M,#[=R"$[K
+M39`/MW((@^X"ZT.^`0```.L\O@`````/MT((B<&#^`!^%8T$=HT$@(.\@_P6
+M````=`5&.?%_ZP^W0@BZ_____SGP='GK"+K_____ZW"0C01VC02`C9R#^!8`
+M`+K_____@WL$`'57@^P(:CQ3Z/S___^)>P2#Q!"#?"0H`'4LQT,,"P```,=#
+M%`(```#'0QC_____QT,<_P,``&;'0R`*`&;'0R(*`.L3B?:#[`3_="0L5E7H
+M_/___X/$$(GRB="#Q`Q;7E]=PXUV`%.+3"0(BUD4BY'D%@``@>+_`P``BX'L
+M%@``P>`0)0``_P,)PHF3I````(M9%(N1Z!8``('B_P,``(N!\!8``,'@$"4`
+M`/\#"<*)DZ@```"+612+@ZP````E`/S__XN1]!8``('B_P,```G0B8.L````
+M6\.05U93BWPD$(M,)!0/MX>\`0``O@`````YR'95C01)C02`C9R'^!8``+X`
+M````@WL$`'0]QT,$`````+C^____T\`AA^06```AA^@6```AA^P6```AA_`6
+M```AA_06``!35^@F____O@$```"#Q`B)]HGP6UY?PXGV55=64XMT)!B+?"04
+MBX_\!P``#[>'O`$``+H`````.?`/AL8#``"-!':-!("-G(?X%@``N@$```"#
+M>P0`#X2J`P``@WL8_W4TA<ET%0^W00(EH````+H?````/:````!T!;H/````
+MN`$````YT',0D-'@@\@!.=!R]^L$D(M#&(TLM0````"+5"04BTH4B<*!XO\#
+M``"+0QS!X`HE`/P/``G"BT,4P>`4)0``\`\)PHF4*4`0``"+1"04BT@4#[=#
+M(L'@!"7P````#[=3((/B#PG0#0`@"`")A"F`$```BU0D%(M"%,>$*,`)````
+M"```@WLD`'1#BTH4BU,D@>+___\`BT,HP>`8"<*)E"G`"```BT0D%(M(%(N$
+M*<`)``")PH/*`8-[*`!T"(G"@<H!`0``B90IP`D``(-[,`!T(HT,M0````"+
+M;"04BU44BT,P)?___P`-`````8F$"@`)``"-#+4`````BT0D%(M0%(M#+"7_
+M_P\`@WLL`'0%#0``$`")A`K`$```@WLL`'0E]D,,0'0?C0RU`````(ML)!2+
+M512+A`K`"0``@,P"B80*P`D``/9##!!T(8T,M0````"+1"04BU`4BX0*`!$`
+M``T``"``B80*`!$``/9##(!T'XT,M0````"+;"04BU44BX0*`!$``(#,`HF$
+M"@`1``"+0P2#^`-T6H/X`W<*@_@"=!/IT0```(/X!`^$J0```.G#````C12U
+M`````(M$)!2+2!2+A!'`"0``#**)A!'`"0``BVPD%(M-%(N$$0`1```-```E
+M`(F$$0`1``#IA@```(T,M0````"+1"04BU`4BX0*P`D``(/(8HF$"L`)``"+
+M%0`````K%0````"+AW`9```IT"L%`````,'@"HML)!2+510-`````8F$"@`)
+M``"+512+A`H`$0``#0``!`")A`H`$0``ZQ^-#+4`````BT0D%(M0%(N$"L`)
+M``"#R"")A`K`"0``]D,X`70AC0RU`````(ML)!2+512+A`H`$0``#0``)`")
+MA`H`$0``]D,,`703N`$```")\=/@"8?D%@``ZQ&)]KC^____B?'3P"&'Y!8`
+M`/9##`%T$[@!````B?'3X`F'Z!8``.L1B?:X_O___XGQT\`AA^@6``#V0PP"
+M=!.X`0```(GQT^`)A^P6``#K$8GVN/[___^)\=/`(8?L%@``]D,,!'03N`$`
+M``")\=/@"8?P%@``ZQ&)]KC^____B?'3P"&'\!8``/9##`AT$[@!````B?'3
+MX`F']!8``.L1B?:X_O___XGQT\`AA_06``!3_W0D&.@S^___N@$```"#Q`B-
+M=@")T%M>7UW#D(M$)`C!X`*+5"0$BU(4BX0"``@``,.)]HM4)`C!X@*+1"0$
+MBT@4BT0D#(F$$0`(``"X`0```,.0BTPD"(M$)`2+4!2X`0```-/@B8)`"```
+MN`$```##B?964XM4)!#!X@*+1"0,BW`4BX06``H``(G#@^,#=1JX`0```(I,
+M)!#3X(N60`@``(7"=`6[`0```(G86U[#C78`5U93BWPD$(MT)!2+5Q2X`0``
+M`(GQT^")@H`(``"[Z`,``(GV5E?H_/___X/$"(7`=!"#[`QJ9.C\____@\00
+M2W7BBT<4QX"`"````````(7;#Y7`#[;`6UY?PY!55U93@^P,BUPD)(ML)"B+
+M?"0LBW0D,,=$)`@`````QT0D!`````#&1"0#`<9$)`(`@WPD-``/A.0```"#
+M[`B+5"0HBX)H%@``)?___W]04NC\____B<&#Q!"%]G07BD8<@^`!B$0D`XM7
+M$('B_W\``(E4)`B+4Q"!XO]_``"+0P@E``!`@(!\)`,`=6>%P'1CL`"$P'0(
+MBT0D.(E$)`2+1"0(`=`K1"0$.T0D-'=%B=`K1"0$`40D"(7_="*+1Q`E`(#_
+M_XM4)`B!XO]_```)T(E'$/9&'`%U!<9$)`(!@'PD`@!T#H%C"/__OW^!8Q``
+M@/__@4L(``"`((!\)`(`=`N%[70'@64(__]_WX/L"%'_="0LZ/S___^#Q!"-
+M=@`/MD0D`H/$#%M>7UW#C78`5U93BW0D,(M<)#B+?"04BU0D&('B_P\``(M$
+M)"3!X!`)PO;#('0&@<H``(``BT0D-,'@&24````>"=#VPP%T!0T````!]L,0
+M=`4-````((E'"(M$)"")PL'B%/;#`G0&@<H````!B5<,BT0D+,'@$"4```\`
+MB4<0BT0D*(E'%(/^_W06B?#!X`TE`.`/``G0B4<,@4\(````0/;##'1+N`#_
+M`'^*3"0\T_BZ`````*@!=#R)V,'H`X/@`8/X`1G`]]`E````@/;#!'0%#0``
+M0``)1PB+1"1`)?]_```)1Q"+1"0\P>`4"4<4N@$```")T%M>7\.-=@!3BT0D
+M%(M,)!R+7"0DBU0D#(7`=!7!X!0E``#P``E"$(M$)!#!X`4)0A2%R707B<C!
+MX!@E````#PE"$(M$)!C!X`H)0A2%VW02B=C!X!P)0A"+1"0@P>`/"4(4N`$`
+M``!;PXGV4XM$)!"+3"08BUPD'(M4)`R#?"04`'00"T(,A<EU`X#,$(E"#.LY
+MD(7)=!C'0@@`````B4(,BT,0B4(0BT,4B4(4ZQS'0@@`````@,P0B4(,QT(0
+M`````,="%`````"0QT(<`````,="&`````"X`0```%O#C78`BTPD"(G*N`\`
+M``#V01P!#X1$`0``BT$<)?X?``#1Z&:)02`/MT$:9HE!(L9!)`"+01BH`74>
+MJ`)T!,9!)`'V0A@(=`2`220"]D(8!'0&@$DD!(GVBT(<)0``8`#!Z!6#^`%T
+M((/X`7(/@_@"="F#^`-T-^M'C78`BD(4@^`?B$$EZSF0BT(4)>`#``#!Z`6#
+MR("(027K)8M"%"4`?```P>@*@\B`B$$EZQ*+0A0E`(`/`,'H#X/(@(A!)9"+
+M0APE`.`?`,'H#8A!)HM"&"7P````P>@$B$$GBT(8)0`/``#!Z`B(02B+0APE
+M``!@`,'H%8/X`G0B@_@"=PF#^`%T)NLRB?:#^`-U*XM"$"4````/P>@8`$$H
+MD(M"$"4``/``P>@4`$$HBT(0)0``#P#!Z!``02B+0A@E`/```,'H#(A!*0^V
+M0A^#X`&#^`$9P(/``HA!*K@`````PXGVBT0D!(M,)`B+$2.0+"\``(D1]](A
+MD"PO``##D%.#[!"+7"08C8.H%@``4%/H_/___XM#%,>`)($```````"+0Q3'
+M@"B!````````BT,4QT!``````(M#%,>`,($``````@"+0Q3'@#B!```````"
+M@\086\-3@^P0BUPD&(M#%,=`0`8```"-@Z@6``!04^C\____BT,4QX`D@0``
+M`````(M#%,>`*($```````"#Q!A;PXGV5E.+="00BUPD#+H`````D(T$DHT$
+M@F:+A(.T&0``9CL&=06)T.LTD(T$DHT$@HV,@[`9``!F@WD$`'449HL&9HE!
+M!&:+1@)FB4$&B=#K#)!"@_H_=KJX`````%M>PXGVBT0D!(N`L!D``,.0BT0D
+M!`5L%@``PXGV5E.#[`2+="00B?.X`````(.^I`$```5U#&:#OJ@!```)=0*P
+M`8F#J!D``(/L"&@`%0``C8.T&0``4.C\____N0````"#Q!"0C02)C02!C12#
+MQX+$&0``]`$``,>"R!D``,@```#'@LP9``#(````QX+0&0``9````,>"V!D`
+M`"@```#'@M09```'````C8*P&0``QD`+`,9`#`#&0`D'QD`*`(.[J!D```!T
+M%,>"]!D```S^OP#'@O@9```X_[\`08/Y/W:"@[NH&0```'0JBU84BX/T&0``
+MB8(L@0``BU84BX/X&0``B8(T@0``@^P,5NC\____@\00QX.L&0``9````,>#
+MI!D```$```"#Q`1;7L.04X/L"(M<)!"#NZ@9````=">#[`Q3Z/S___^+0Q3'
+M@"R!````````@\00BT,4QX`T@0```````)"#Q`A;PXUV`%575E.![(P```"+
+ME"2D````BYPDJ````(NL)*````"+A;`9``")1"04N`````"#^@4/AQ($``#_
+M))5P40``B=ZX`````(/[!`^'^P,``(N4)*````"+2A2+D5"8``"!XO__#_"+
+MA)VT+@``P>`4)0``\`\)PHF14)@``(N\)*````"+3Q2+D5R8``"!XG^`__^+
+MA)W<+@``P>`')8!_```)PHF17)@``(M/%(N17)@``('B_W_`_XN$G<@N``#!
+MX`\E`(`_``G"B9%<F```BT\4BY%8F```@>+__P/\BX2=\"X``,'@$B4``/P#
+M"<*)D5B8``"+5"04#[9"!#G8<PC_A6P6``#K$HM,)!0/MD$$.=AV!O^%<!8`
+M`(GPBU0D%(A"!.D<`P``QT0D2'\```"-="1(QT8$,@```,=$)$!_````QT0D
+M1"@```#'1"0X?P```,=$)#Q-````QT0D,'\```#'1"0T0````,=$)"@?````
+MQT0D+!````#'1"0@/P```,=$)"0P````A=L/E<`/ML")1"00B[PDH````(M/
+M%(N1;)@``('B_S_@_XG#P>,"BP0SP>`.)0#`'P`)PHF1;)@``(M/%(N1;)@`
+M`('B__\?\(M$'$#!X!4E``#@#PG"B9%LF```BT\4BY%HF```@>+__P'_BT0<
+M.,'@$24``/X`"<*)D6B8``"+3Q2+D6B8``"!XO___X"+1!PPP>`8)0```'\)
+MPHF1:)@``(M/%(N!:)@``(/@X(M4'"B#XA\)T(F!:)@``(M/%(N1;)@``(#F
+MP(M$'"#!X`@E`#\```G"B9%LF```@WPD$`!T%(M7%(N";)@``(/(`8F";)@`
+M`.L9BX0DH````(M0%(N";)@``(/@_HF";)@``(-\)!``#Y3`#[;`BTPD%`^V
+M40<YT`^$C`$``(-\)!``=`C_A7P6``#K!O^%@!8``(-\)!``BWPD%`^41P?I
+M90$``,=$)!@(````C50D&,="!`8```"%VP^5P`^VV(N$)*````"+2!2+@0BB
+M``"#X,"+%)J#XC\)T(F!"*(``(M4)!0/MD((.=@/A!D!``"%VW0(_X6$%@``
+MZP;_A8@6``"+3"04B%D(Z?L```#'1"1P`````,=$)'0$````QT0D>`@```")
+MWK@`````@_L"#X?8````B[PDH````(M/%(N16)@``('B_P_\_XM$G'#!X`PE
+M`/`#``G"B9%8F```BU0D%`^V0@8YV',(_X6,%@``ZQ*+3"04#[9!!CG8=@;_
+MA9`6``")\(M4)!2(0@;K>(U,)%")3"0,OE!1``#\N0@```"+?"0,\Z6X````
+M`(/[!W=:BX0DH````(M(%(N1))D``(#B`8M$G%#1X"7^````"<*)D229``"+
+M5"04#[9"!3G8<PC_A706``#K$HM,)!0/MD$%.=AV!O^%>!8``(M\)!2(7P6)
+M]K@!````@<2,````6UY?7<-64X/L!(M,)!")SHN9L!D``,=##`````"#N:@9
+M````#X2#````@7L0``#``'8*QT-``````.L,D+@``,``*T,0B4-`@7L8``#`
+M`'X,QT-$`````.L.C78`N```P``K0QB)0T2+412+0T")@BR!``"+412+0T2)
+M@C2!``"+013'@#"!``````(`BT$4QX`X@0```````H/L"(V&J!8``%!1Z/S_
+M__^#Q!#'0S@`````QT,\`````(/$!%M>PU=64XM<)!"+B_P'``"#NZ09````
+M#X0B`0``@[NP`0```0^%%0$``(NSL!D``(!^!`-W&0^V1@1`4&H!4^C\____
+M@\0,Z?,```"-=@"`?@4&=Q8/MD8%0%!J!5/H_/___X/$#.G4````B[N\%@``
+MB?B#X'^#^#]V"(U'?\'H!^L)BX.\%@``P>@'.48D?3^`?@<`=1QJ`&H"4^C\
+M____:@!J!5/H_/___X/$&.F,````@'X&`0^'@@````^V1@9`4&H$4^C\____
+M@\0,ZV\Y1B!]+(!^!P!T#6H!:@)3Z/S___^#Q`R`?@8!=U$/MD8&0%!J!%/H
+M_/___X/$#.L^@^P(45/H_/___X/H`H/$$(/X`7<I@'X'`'4-:@!J`E/H_/__
+M_X/$#(!^!@!T$&H`:@13Z/S___^#Q`R-=@!;7E_#5U93BUPD$(NS_`<``(.[
+MI!D````/A)8```"#N[`!```!#X6)````B[NP&0``@'\$`W<5#[9'!$!0:@%3
+MZ/S___^#Q`SK:HGVBXN\%@``B<B#X'^#^#]V"(U!?\'H!^L)BX.\%@``P>@'
+M.4<@?1F`?P8!=SP/MD<&0%!J!%/H_/___X/$#.LI@^P(5E/H_/___X/H`H/$
+M$(/X`7<4@'\&`'0.:@!J!%/H_/___X/$#)!;7E_#5U93BW0D$(GW_[;\!P``
+M5N@;]___C12`C120C9R6M!D``(F>L!D``(/$"(.^I!D```!T;(.^L`$```%T
+M8_^&G!8``&H`:@%6Z/S___]J`&H%5NC\____:@!J!%;H_/___X/$)&H`:@)6
+MZ/S___]J`&H#5NC\____@^P$5NC\____@\0(@,P!4%;H_/___X/$%%;HN?S_
+M_X/$$.GB````D(![!`!T$@^V0P10:@%6Z/S___^#Q`R)]H![!0!T$@^V0P50
+M:@56Z/S___^#Q`R)]H![!P!T$@^4P`^VP%!J`E;H_/___X/$#(!["`!T$@^V
+M0PA0:@-6Z/S___^#Q`R)]H![!@!T$@^V0P90:@16Z/S___^#Q`R)]H._J!D`
+M``!T/X/L#%;H_/___X/$"(#D_E!6Z/S___^)-"3H$?S__XM&%,>`,($`````
+M`@"#Q!"+1A3'@#B!```````"ZR.)]H/L#%;HY_O__XDT).C\____@\0(@,P!
+M4%;H_/___X/$$%M>7\.-=@!75E.+="00BUPD%(GWBT84QX`D@0```````(M&
+M%,>`*($```````"#[`B-AJ@6``!05NC\____BP.)AKP6``"+0P2)AL`6``"+
+M0PB)AL06``"+1A2+D"R!``"+B#2!``")T"4``,``@\00/0``P`!T#HG()0``
+MP``]``#``'5ABY^P&0``*U-`B=`K0S@!AY06``")4SB)RBM31(G0*T,\`8>8
+M%@``B5,\BT,X.T,0=@^#[`Q6Z,K[__^#Q!"-=@"+0SP[0QAV#(/L#%;H\_S_
+M_X/$$(/L#%;HZ_K__X/$$%M>7\-3@^P(BUPD$(M$)!2+D[`9``"`>`41=2C_
+M0CC_@Y06``"+0C@[0A!V0X/L#%/H;OO__XD<).BJ^O__@\00ZRV0@'@%&74F
+M_T(\_X.8%@``BT(\.T(8=A6#[`Q3Z(#\__^)'"3H?/K__X/$$)"#Q`A;PXUV
+M`%93BW0D#(N6L!D``(N.O!8``(G(@^!_@_@_=@B-07_!Z`?K"8N&O!8``,'H
+M!SE")'Q2.4(@?3&`>@<`=`]J`6H"5NC\____@\0,ZVR`>@8`=#(/MD(&2%!J
+M!%;H_/___X/$#.M3C78`@'H&`'06#[9"!DA0:@16Z/S___^#Q`SK-XUV`(!Z
+M!0!T%@^V0@5(4&H%5NC\____@\0,ZQN-=@"`>@0`=!(/MD($2%!J`5;H_/__
+M_X/$#)!;7L.055=64XM4)!2+0A2+N.R```"+J/"```"+L/B```"+FK`9``"#
+M>S0`=`4Y<S1V#KD`````_X*@%@``ZRF0B?$K2S2)Z"M#,(GZ*U,L*<$IT;@I
+M.5-?]^G!^@Z)R,'X'XG1*<&)]HES-(E[+(EK,(G(6UY?7<-55U93@^P,BWPD
+M((M4)"2)^XNWL!D``(L"B8>\%@``BT($B8?`%@``BT((B8?$%@``5^A5____
+M@\0$A<!Y&O^'I!8``(/L#%?H\_C__X/$$.FO`0``C78``48,@[^H&0````^$
+MS````(/L"(V'J!8``%!7Z/S___^+1Q2+D"R!``"+J#2!``"#Q!`Y5D!W"CEN
+M1'9Y.59`=C.#[`S_=D!2:(A1``!H`````%?H_/___XM'%(M60(F0+($``(/$
+M((M'%,>`,($``````@`Y;D0/AB\!``"#[`S_=D15:(A1``!H-````%?H_/__
+M_XM'%(M61(F0-($``(/$((M'%,>`.($```````+I]P```"M60(G0*T8X`8>4
+M%@``B58XB>HK5D2)T"M&/`&'F!8``(E6/(UV`(.[I!D````/A,,```"#O[`!
+M```!#X6V````BX.L&0``C02`.48,=D.+3@R)R`^O1A2[TTUB$/?CB=#!Z`8Y
+M1CAW&XG(#Z]&'/?CB=#!Z`8Y1CQW"5?H0OW__X/$!(/L#%?HIO?__X/$$.ME
+MBT8,.X.L&0``=EJ)P@^O5A"XTTUB$/?BB=#!Z`8Y1CAV%H/L#%?H,OC__XD\
+M).AN]___@\00ZRV+1@P/KT88NM--8A#WXHG0P>@&.48\=A6#[`Q7Z$3Y__^)
+M/"3H0/?__X/$$)"#Q`Q;7E]=PU575E.#[`R+?"0@BVPD*(M<)"R^`````(T$
+M=HM/%(L4Q:!1``")5"0(BU0D)(T$0HL$A:!1``"+5"0(B0010_;#/W40@^P,
+M:@'H_/___X/$$(UV`$:#_@UVOKX`````D(M/%(L4]0!3``"+!/4$4P``B001
+M0_;#/W4.@^P,:@'H_/___X/$$)!&@_Y%=M*^`````)"-!':+3Q2+%(7@5@``
+M`>B+!(7@5@``B0010_;#/W4-@^P,:@'H_/___X/$$$:#_C]VSH/$#%M>7UW#
+MB?955U93@^P4BVPD+`^W10)0#[=%`%#H_/___X/$$/9%`H!T;0^_\(T<=L'C
+M`HVS9%T``(/L"&H(_W8$Z/S___^)QX'G_P```,'G!8N#9%T``,'@!`G'9HM.
+M"(M$)#"+4!2+@@2B``"#Q!!F@7T`M`EU"X/($(F"!*(``.L;BUPD((M3%(/@
+M[XF"!*(``.L)B?:)P;\`````9H'YD`!_!?;!`70E@^P(:@@/O\&#Z!A0Z/S_
+M__^)PX'C_P```+@!````@\00ZRZ)]H/L"&H(#[_!@^@8B<+!ZA\!T-'X4.C\
+M____B<.!X_\```"X`````(/$$(GVP>,"T>`)PX'+`00``(M$)""+2!2)^"7_
+M````P>`(#[;3"=")@9R8``"+1"0@BT@4B?@E`/\```^VUPG0B8'0F```BUPD
+M((FK_`<``+@!````@\0,6UY?7<.-=@"+5"0(BT0D!(N`>!D``(/Z!W<A_R25
+MJ%X``(GV@\!$PX/`2,.#P$S#@\!0PP64````PXGVN`````##B?955U93@>R,
+M````B[PDH````(N$)*@```!FB40D+HG]O@````"+E"2D````#[="`B7P`0``
+M/<`````/A*0!```]P````'\0/:`````/A"H!``#I]0$``#U``0``=`L]4`$`
+M``^%XP$``(N4)*0```!FBP(MH0\``&8]Z@1W'6:+A>0(``!FB40D)&:+E>8(
+M``!FB50D(NF4````BY0DI````&:+`BV,%```9CWO`'<:9HN%Z`@``&:)1"0D
+M9HN5Z@@``&:)5"0BZV6+E"2D````9HL"+7P5``!F/>``=QIFBX7L"```9HE$
+M)"1FBY7N"```9HE4)"+K-HN$)*0```!F@3A<%G8:9HN5\`@``&:)5"0D9HN%
+M\@@``&:)1"0BZPYFQT0D(@``9L=$)"0``,=$)!@`````QT0D'`````!FBY5F
+M"```9HE4)"QFBX5L"```9HE$)"IF@[UL"`````^4P&8/ML!FB40D*&:+E;H(
+M``!FB50D)NG:````9HN']`@``&:)1"0D9HN7]@@``&:)5"0B#[>'_`@``(E$
+M)!P/MY<`"0``B50D&&:+AV@(``!FB40D+&:+EVX(``!FB50D*F:#OVX(````
+M#Y3`9@^VP&:)1"0H9HN'O`@``&:)1"0FZW)FBY?X"```9HE4)"1FBX?Z"```
+M9HE$)"(/MY?^"```B50D'`^WAP()``")1"089HN7:@@``&:)5"0L9HN'<`@`
+M`&:)1"0J9H._<`@````/E,!F#[;`9HE$)"AFBY>^"```9HE4)";K"K@`````
+MZ00#``"[``````^W5"0NN4!5``"-!%N-!$*+!(&)1)PP0X/[$';MBX0DI```
+M`/9``H!T+8/L#&H`:G=J`_]T)#2-7"1,4^C\____@\04:@!J>FH#_W0D,%/H
+M_/___X/$(+L`````B?:-!%N+3Q2+%,5`50``BT2<,(D$$4;WQC\```!U#X/L
+M#&H!Z/S___^#Q!")]D.#^Q!VSKL`````BT\4BQ3=X%D``(L$W>19``")!!%&
+M]\8_````=0V#[`QJ`>C\____@\000W33NP`````/MU0D+HE4)!2-!%N+3Q2+
+M%,7H60``B50D#(M4)!2-!$*+!(7H60``BU0D#(D$$4;WQC\```!U#8/L#&H!
+MZ/S___^#Q!!#=,&[``````^W1"0NB40D$(T$6XM/%(L4Q0!:``")5"0,BU0D
+M$(T$0HL$A0!:``"+5"0,B0011O?&/P```'4-@^P,:@'H_/___X/$$$-TP;L`
+M````#[=4)"ZY(%H``(UV`(T$6XT$0HL$@8E$G#!#@_L0=NV+E"2D````#[="
+M`B5``0``/4`!``!U-8/L#&H#:C-J`0^WA5P)``!0C5PD3%/H_/___X/$%&H#
+M:BUJ`0^WA5X)``!04^C\____@\0@@^P,:@!J7VH!#[=$)$!0C5PD3%/H_/__
+M_X/$%&H`:F!J!`^W1"1$4%/H_/___X/$%&H`:FAJ`P^W1"0\4%/H_/___X/$
+M%&H`:FMJ`P^W1"0Z4%/H_/___[L`````@\0@D(T$6XM/%(L4Q2!:``"+1)PP
+MB0011O?&/P```'4/@^P,:@'H_/___X/$$(GV0X/[$';.NP`````/MU0D+KG`
+M6P``C78`C01;C01"BP2!B42<,$.#^P=V[8/L#&H`:AUJ!@^W1"0^4(U<)$Q3
+MZ/S___^#Q!1J`&H$:@$/MT0D0E!3Z/S___^[`````(/$((UV`(T$6XM/%(L4
+MQ<!;``"+1)PPB0011O?&/P```'4/@^P,:@'H_/___X/$$(GV0X/[!W;.QX5@
+M&0```````+@!````@<2,````6UY?7<-55U93BVPD%(M,)!B+?"0<BUPD((MT
+M)"0/M\,/M]8/K\*Z`````(7`=&&)V&8YSW17#[?%#[?)*<B-!("-!(#!X`(/
+MM]<IRHG1F??YB<*)V&:%TG@SB?!F@_ID?RL/O](/M\X/K\JX9````"G0#[?3
+M#Z_"`<&X'X7K4??IB=#!^`7!^1]F*<B0#[?0B=!;7E]=PXGV55=64X'L3`$`
+M`(N$)&`!``")1"0<9L=$)!@``&;'1"06/P"+E"1L`0``#[="`B7P`0``/=``
+M```/A(,````]T````'\3/:````!T3CW`````=&[IC0```#U0`0``=!<]4`$`
+M`'\)/4`!``!T">MV/4`)``!U;XM,)!QFBX%V"0``9HE$)"2)R`5B"0``B40D
+M((U`%HE$)"CK58M<)!QFBX.`"P``9HE$)"2)V`6("P``B40D((V`H@```(E$
+M)"CK+HM4)!QFBX*`"P``9HE$)"2)T`6""P``B40D((U`#(E$)"CK"K@`````
+MZ=@"``"-="0@@^P(:`@!``"-1"0\4.C\____C:PDR````+\!````NP````"#
+MQ!"-=@!FB7Q<.$=#@_\_?O1FB5PD-F;'1"0R`0!FQT0D-#\`NP````!F@WPD
+M-@!T+(/L!%8/MT1<0%"+C"1X`0``#[<!4.AR`@``9HE$70"#Q!!##[=$)#8Y
+MV'_49HM5``^W1"0V9HM,1?Z[`````(/X`'YJ9CE470!_"F:+5%T`9HE<)!B)
+MV/?09@-$)#8/M_B%_W0@9HM$??YF.T1]`'X*9HM$?0!FB41]_D,/MT0D-CG8
+M?[^[`````&:#?"0V`'0<#[=$)#:09CE,70!^"F:+3%T`9HE<)!9#.=A_Z@^_
+MRH/!&;L?A>M1B<CWZXG0P?@$P?D?*<B-!("-!(#1X&:)1"0:9L=$)!0``+\`
+M````#[_(B<Z)R/?KB40D"(E4)`R+1"0,P?@$P?D?*<A`@_@`?CJX'X7K4??N
+MB='!^02)\)F)R"G0C4@!C78`#[=4)!2+7"0<BX,$+P``BUPD&&:)'%!F_T0D
+M%$<Y^7_?OP`````/MT0D-HG"9HM,)!IF.4Q%_@^.YP```&:#?"04/P^'"`$`
+M`&:#1"0:,HG69HM<)!IF.5Q5_GY'#[_#B<,/OU1]`(G!*=&)R@^_3'T"*<@/
+MK]"%TGXID$=FBT0D&F8Y1'7^?AL/OT1]`(G:*<*)T`^_5'T"B=DIT0^OP87`
+M?]@/MU1\.M'B#[?2#[=$?#C1X`^WP`^W3'T"#[=<?0`/MW0D&E)045-6Z#?\
+M__^#Q!1`#[=,)!2+7"0<BY,$+P``9M'H9HD$2HN#!"\``&:+5"069CD42'8$
+M9HD42&;_1"04#[=4)#9FBTPD&F8Y3%7^?@YF@WPD%#\/AB?____K+6:#?"04
+M/W<E#[=,)!2+7"0<BY,$+P``9HM$2OYFB01*9O]$)!1F@WPD%#]VVXM$)!QF
+MQX"`&0````"X`0```('$3`$``%M>7UW#B?955U93@^P<BVPD.(M<)#"+="0T
+MC40D&E!5#[?&4`^WPU#H0@$``(/$$(7`=`L/MT0D&NDI`0``D(/L#(U$)"10
+MC40D)E`/MT4$4/]U``^WVXE<)"!3Z/S___^#Q!2-1"0@4(U$)")050^W1"0N
+M4`^W]E;H=0$``(/$%(U$)!Q0C40D'E!5#[=$)#!05NA;`0``@\0@C40D#%!5
+M#[=$)!I0#[=$)")0Z+T```"-1"0:4%4/MT0D+%`/MT0D,E#HI@```(/$(`^W
+M1"0*#[=4)`P/MTPD%`^W7"024%)14U;HM?K__X/$%(G'C40D#%!5#[=$)!90
+M#[=$)"10Z&D```"-1"0:4%4/MT0D*%`/MT0D-%#H4@```(/$(`^W1"0*#[=4
+M)`P/MTPD$`^W7"0.4%)14U;H8?K__X/$%`^WP`^WWP^W5"08#[=,)!904U)1
+M_W0D%.A!^O__@\04#[?`C78`@\0<6UY?7<-55U93@^P$BVPD((M$)!AFB40D
+M`HM\)!R+30B^`````&:#?00`=$V09HM$)`)F.0%U-HU1"+L`````9H-Y!@!T
+M)XUV`&8Y.G439HM461Z+1"0D9HD0N`$```#K'8/"`D,/MT$&.=A_W(/!-$8/
+MMT4$.?!_M+@`````@\0$6UY?7<.-=@!75E.+1"08BWPD$(MT)!2+4`BY````
+M``^W0`2)PX/X`'X/B?9F.3)T"(/"-$$YRW_S@^P,_W0D+/]T)"P/MT(&4(U"
+M"%`/M\=0Z/S___^#Q"!;7E_#C78`4X/L"(M<)!"#NP0O````=!N#[`S_LP0O
+M``#H_/___\>#!"\```````"#Q!"#NW@9````=!N#[`S_LW@9``#H_/___\>#
+M>!D```````"#Q!"#Q`A;PXUV`%93@^P0BW0D((M<)!QHM````.C\____B8-X
+M&0``@\00A<!U",<&`@```.MPQX,(+P``@````(/L#&B`````Z/S___^)@P0O
+M``"#Q!"%P'4(QP8"````ZT3'@\@6``"H1@$`QX/,%@``/#@!`,>#T!8``%PZ
+M`0#'@]06```,.0$`QX/8%@``F#H!`,>#W!8``)!``0"X`0```(UV`(/$!%M>
+MPY"055=64X/L#(M\)""+;"0HBUPD++X`````C01VBT\4BQ3%X%X``(E4)`B+
+M5"0DC01"BP2%X%X``(M4)`B)!!%#]L,_=1"#[`QJ`>C\____@\00C78`1H/^
+M#W:^O@````"0BT\4BQ3U8&```(L$]61@``")!!%#]L,_=0Z#[`QJ`>C\____
+M@\00D$:#_D)VTKX`````D(T$=HM/%(L4A8!B```!Z(L$A8!B``")!!%#]L,_
+M=0V#[`QJ`>C\____@\001H/^/W;.@\0,6UY?7<.)]E575E.#[`R+;"0@BW0D
+M),=$)`@`````OP````!F@3Z_$@^'S0````^W!HE$)`0MD`@``+H%````B=.9
+M]_N%TG4CBT0D!(V<`.#N__^X9V9F9O?KP?H"B=C!^!^)TRG#ZT6-=@`/MPZ-
+M@5#W__^Z!0```(G3F??[N`````"%T@^%N`$``(V<":#N__^X9V9F9O?KP?H"
+MB=C!^!^)TRG#QT0D"`$```#!XP*!X_\```"#[`AJ"%/H_/___XG#BU44BX($
+MH@``@\009H$^M`EU$8/($(F"!*(``.D;`0``C78`BU44@^#OB8($H@``Z0<!
+M``"-=@!FBP:Y%````+H`````9O?Q9H72=4=F@3[_$W9`@^P(:@@/MPZ!Z<`2
+M``"X9V9F9O?IB=#!^`/!^1\IR,'@`E#H_/___XG#@\0(:@)J`^C\____B<>#
+MQ!#IJ````&:+!KD*````N@````!F]_%FA=)U/X/L"&H(#[<.@>G`$@``N&=F
+M9F;WZ8G0P?@"P?D?*<C1X%#H_/___XG#@\0(:@)J`NC\____B<>#Q!#K5XUV
+M`&:+!KD%````N@````!F]_&X`````&:%TG5^@^P(:@@/MPZ!Z<`2``"X9V9F
+M9O?IB=#1^,'Y'RG(4.C\____B<.#Q`AJ`FH!Z/S___^)QX/$$(UV`(G9P>$$
+MC02]``````G!BT0D"-'@"<&!R0$0``"+510/ML&)@IR8``#!Z0B+512)R(/@
+M?XF"V)@``(FU_`<``+@!````@\0,6UY?7<.+5"0(BT0D!(N`>!D``(/Z!W<=
+M_R25N&H``(GV@\`$PX/`",.#P`S#!:P```##B?:X`````,.)]E575E.#[!R+
+M;"0PBT0D.&:)1"0:B6PD%&;'1"0.``!FQT0D#```9L=$)`H``&;'1"0(``"+
+MM7@9``")ZH'"/!8``(E4)`2_`````(M4)#0/MT(")?`!```]T`````^$>`$`
+M`#W0````?QL]H`````^$)`$``#W`````#X1;`0``Z8T!```]4`$``'0>/5`!
+M``!_##U``0``=!#I<P$``#T`"```#X5H`0``BU0D-&:+`BVA#P``9CWJ!'<E
+MBT0D%&:+@.0(``!FB40D#HM4)!1FBY+F"```9HE4)`SIDP```(M4)#1FBP(M
+MC!0``&8][P!W(HM$)!1FBX#H"```9HE$)`Z+5"049HN2Z@@``&:)5"0,ZU^+
+M5"0T9HL"+7P5``!F/>``=R*+1"049HN`[`@``&:)1"0.BU0D%&:+DNX(``!F
+MB50D#.LKBT0D-&:!.%P6=B"+5"049HN2\`@``&:)5"0.BT0D%&:+@/((``!F
+MB40D#(M4)!1FBY)L"```9HE4)!*+1"049HN`N@@``&:)1"00Z8,```"+5"04
+M9HN2_`@``&:)5"0*BT0D%&:+@``)``!FB40D"(M4)!1FBY)N"```9HE4)!*+
+M1"049HN`O`@``&:)1"00ZT&+5"049HN2_@@``&:)5"0(9HE4)`J+1"049HN`
+M<`@``&:)1"02BU0D%&:+DKX(``!FB50D$.L*N`````#I;00``+H`````N81E
+M``"+!-&)!)9"=/>Z``````^W3"0:NXAE``"-!%*-!$&+!(.)1)8$0G3PN@``
+M```/MTPD&KN@90``C012C01!BP2#B426"$)T\+H`````#[=,)!J[P&4``(T$
+M4HT$08L$@XE$E@Q"@_HG=NV#[`QJ`&@N`0``:@$/MT0D*E"-7@Q3Z/S___^#
+MQ!1J`&@.`0``:@*+5"14#[<"4%/H_/___X/$%&H`:`$!``!J`HM4)%0/MT("
+M4%/H_/___X/$((M$)#3V0`)`#X2W````@^P,:@-HJ````&H!BU0D'(M"'`^_
+M0`)04^C\____@\04:@-HJ0```&H!BU0D'(M"'`^_0`104^C\____@\04:@-H
+MJ@```&H!BU0D'(M"'`^_0`904^C\____@\04:@-HK@```&H!BU0D'(M"'`^_
+M0`A04^C\____@\04:@-HKP```&H!BU0D'(M"'`^_0`I04^C\____@\04:@-H
+ML````&H!BU0D'(M"'`^_0`Q04^C\____@\0@BT0D-/9``H!T.(/L#&H`:!\!
+M``!J`P^W1"0B4(U>#%/H_/___X/$%&H`:"(!``!J`P^W1"0@4%/H_/___X/$
+M(.LV@^P,:@!H%P$``&H##[=$)"90C5X,4^C\____@\04:@!H&@$``&H##[=$
+M)"104^C\____@\0@#[>%K`$``"7P````@_@O?F%F@[VL`0``-70*9H.]K`$`
+M`$5U38/L#&H":EIJ`FH"C5X,4^C\____@\04:@)J7&H":@)3Z/S___^#Q!1J
+M`FI>:@)J`E/H_/___X/$%&H":/X```!J`6H"4^C\____@\0@9H.]J@$``$%V
+M9(/L#&H!:!D!``!J`6H!C5X,4^C\____@\04:@-J`6H":@%3Z/S___^#Q!1J
+M`VH#:@)J`5/H_/___X/$%&H#:(L```!J`6H!4^C\____@\04:@-HC````&H!
+M:@%3Z/S___^#Q""Z``````^W3"0:NX!I``")]HT$4HT$08L$@XF$EJP```!"
+M@_H,=NJ+5"0T]D("0'0C@^P,:@!J)6H"BU0D'(M"'`^_`%"-AJP```!0Z/S_
+M__^#Q""#[`QJ`&H.:@8/MT0D*%"-AJP```!0Z/S___^[`````(/$((M-%(L4
+MW8!E``"+!)Z)!!%']\<_````=0V#[`QJ`>C\____@\000W37NP````"-!%N+
+M312+%,6(90``BT2>!(D$$4?WQS\```!U#8/L#&H!Z/S___^#Q!!#=-.[````
+M`(T$6XM-%(L4Q:!E``"+1)X(B0011_?'/P```'4-@^P,:@'H_/___X/$$$-T
+MT[L`````C01;BTT4BQ3%P&4``(M$G@R)!!%']\<_````=0^#[`QJ`>C\____
+M@\00B?9#@_LG=LZ[`````)"-!%N+312+%,6`:0``BX2>K````(D$$4?WQS\`
+M``!U$(/L#&H!Z/S___^#Q!"-=@!#@_L,=LJ+1"04QX!@&0```````+@!````
+M@\0<6UY?7<.-=@!55U93@>S\`P``BX0D$`0``(E$)!@/MX"L`0``)?````"#
+M^"]^(HM4)!AF@[JL`0``-70*9H.ZK`$``$5U"L=$)!0"````ZPC'1"04`0``
+M`(N,)!P$```/MT$")?`!```]T````'1I/=````!_$#V@````=$$]P````'14
+MZVP]4`$``'07/5`!``!_"3U``0``=`GK53T`"```=4Z+1"08!5`1``")1"0,
+MBTPD&`^WD68(``#K/HM$)!@%7!$``(E$)`R+3"08#[>1:`@``.LDBT0D&`5H
+M$0``B40D#(M,)!@/MY%J"```ZPJY`````.GV!0``BTPD#`^W00:Y`````(7"
+M#X3A!0``BY0D&`0```^_`M'@9HE$)`2+C"04!```#[\!T>!FB40D!F;'1"0H
+MK=YFQT0D*JW>QT0D"`````"^`````(M$)`P/MU`&C5PD*(GVB=")\=/XJ`%T
+M&(-\)`@!#X?1!```BT0D"&:)-$-`B40D"$:#_@-VV(/L#(U$)#!0C40D,%"+
+M5"0@#[="!%#_,HN,)#@$```/MP%0Z)P%``#'1"0H`````(ML)$"#Q"`[;"0D
+M#X?U`0``C78`C42M`(U$A0"+3"0,BU$(C02"B40D$&:!?"0JK=X/A9<````/
+MMW0D*(T<MHT<F(/L!`^W>P:--#]6C4,(4(V$)-P"``!0Z/S___^#Q`Q6@\,0
+M4XV4)+P"``!2Z/S___^#Q`2-3"0\48M4)"`/OT("4(V,),0"``!1C80DZ`(`
+M`%!7Z(H%``"#Q""%P`^$\P,``(/L!&B`````C50D.%*+1"04P>`'C80$O`$`
+M`%#H_/___X/$$.DI`0``#[=T)"B-'+:+3"00C1R9@^P$#[=[!HTT/U:-0PA0
+MC80DW`(``%#H_/___X/$#%:#PQ!3C90DO`(``%+H_/___X/$!(U,)#Q1BU0D
+M(`^_0@)0C8PDQ`(``%&-A"3H`@``4%?H[P0``(/$((7`#X1B`P``@^P$:(``
+M``"-5"0X4HM$)!3!X`>-A`2\`0``4.C\____#[=T)#J-'+:+3"0@C1R9@\0,
+M#[=[!HTT/U:-0PA0C80DW`(``%#H_/___X/$#%:#PQ!3C90DO`(``%+H_/__
+M_X/$!(U,)#Q1BU0D(`^_0@)0C8PDQ`(``%&-A"3H`@``4%?H7`0``(/$((7`
+M#X39`@``@^P$:(````"-5"0X4HM$)!3!X`>-A`2\````4.C\____@\00_T0D
+M"$4[;"0D#X8._O__BTPD((M$)`R+$&:+'$J+1"0D9HL\0BG(B40D"&:!?"0J
+MK=X/A;@```"^`````(/L#(M$)!3!X`8!\`^_A$2\`0``4`^_A'3``0``4`^W
+MQU`/M\-0BY0D.`0```^W`E#HX@(``&:)A'20`P``@\0@1H/^/W:Y@^P(BTPD
+M(/^Q!"\``(V$)'P#``!0Z&<$``")PF;!Z`^-!`)FT?B+E"0D!```9HD"9HN$
+M)/X#``")PF;!Z@\!T&;1^&:)1"0^BXPD*`0``&:)`8M$)#B+E"0P!```9HD"
+M9HE"`H/$$.DX`@``O@`````/M^\/M_N)]H/L#(M<)!3!XP8!\P^_A%R\`0``
+M4`^_A'3``0``4%57BXPD.`0```^W`5#H*`(``&:)A'20`P``@\04#[^$7+P`
+M``!0#[^$=,````!055>+E"0X!```#[<"4.CY`0``9HF$=!`#``"#Q"!&@_X_
+M=I"#?"04`@^%BP```(U$)!Y0BTPD'/^Q!"\``(V$)/@"``!0C80D?`,``%#H
+M-00``(G"9L'H#XT$`F;1^(N4)"0$``!FB0)FBT0D+HG"9L'J#P'09M'X9HE$
+M)#YFBX0D_@,``(G"9L'J#P'09M'XBXPD*`0``&:)`8M$)#B+E"0P!```9HD"
+M9HM$)#IFB4("@\00Z24!``!FBTPD!F8YC"1N`P``#XRI````BT0D!&8YA"1N
+M`P``#XR7````@^P(BU0D(/^R!"\``(V$)/P"``!0Z,,"``")PF:+1"0ZBXPD
+M,`0``&:)`6:)00*)T&;!Z`^-!`)FT?B+E"0D!```9HD"9HN$)'X#``")PF;!
+MZ@\!T&;1^&:)1"0^BXPD*`0``&:)`8/$$.F1````N0````#II@```+D`````
+MZ9P```"Y`````.F2````N0````#IB````(/L"(M$)"#_L`0O``"-A"1\`P``
+M4.@L`@``B<*+1"0XBXPD,`0``&:)`6:)00*)T&;!Z`^-!`)FT?B+E"0D!```
+M9HD"9HN$)/X#``")PF;!Z@\!T&;1^&:)1"0^BXPD*`0``&:)`8/$$+@_````
+MBY0D&`0``&8K`HM,)!AFB8&`&0``N0$```")R('$_`,``%M>7UW#D%=64XM<
+M)!"+="04BTPD&(M\)!R+5"0@B?AF.?%T)`^WVP^W]HG8*?`/O](/K\(/M\F)
+MRBG:#[_?#Z_3`=`I\9GW^9A;7E_#D%575E.+="08BVPD((M\)"2+5"0<#[=<
+M)!0/M\J-#$X/MP8YV'82QP<`````QT4``````.M3C78`#[=!_CG8=R@/M\)(
+MB0>)10#K/8G0*?#1^(D'B44`ZS")T"GPT?B)10!`B0?K(HGVB?(YSG,:B?8/
+MMP(YV'34#[="`CG8=]F#P@(YRG+JB?9;7E]=PXUV`%575E.#[`R+;"0PBU0D
+M((M$)"QFB40D"F;'1"0(``!FQT0D!@$`N`````!F@_H!#X:;````OP`````/
+MM\)(B00DC78`#[=$)`:+5"0D9CD\0G,1.P0D?0QF_T0D"&;_1"0&B?8/MU0D
+M!HM<)"@/OS13#[=$)`@/OPQ#BUPD)`^W%%,/MP1##[??5E%24%/HE?[__X/$
+M%&:)1%T`9HM4)`IF.=!\&V:#_S]W%9`/M\=FBUPD"F:)7$4`1V:#_S]V[$=F
+M@_\_#X9Y____N`$```"#Q`Q;7E]=PU575E.#[`2+?"08BVPD'`^_1WX/OQ<I
+MT(/X?GX.9HM'?H/H?F:)1"0"ZPAFBP=FB40D`F:+=WZY/P````^_5WZ)T$@Y
+MPGX6B<*-=@!)#[_!#[\$1SG0?@5FA<EY[XG*B?.^/P```(GVC4+_B<%F@_@^
+M=QT/O\)F.1Q'?!2)RHU*_V:#^3YW"0^_PF8Y'$=][&:%TG4;9H7V>"6)]@^_
+MUF:+1%4"9HE$50!F3GGOZQ"0#[_&9HE410"#ZP)F3GFI#[]$)`*#Q`1;7E]=
+MPU575E.#[!"+="0D9L=$)`)```^_1GZ+3"0H#[\1*="#^'Y^#F:+;GZ#[7YF
+MB6PD#NL,BT0D*&:+`&:)1"0.9HM6?F:)5"0,N3\````/OU9^#[]$)`Q(.<)^
+M$XG"20^_P0^_!$8YT'X%9H7)>>^+;"0H9HM%?HM4)#!FB0*_/P```(M<)`R-
+M=@"+;"0P9CE=`'T.9H7)=1EF@WPD`D!U$9!FQT0D`@``BW0D*+D_````9H7)
+M?AH/O\%F.1Q&?!&)]DEFA<E^"0^_P68Y'$9]\6:%R74D9H-\)`(`=1QFA?]X
+M-`^_UXM,)"QFBT11`F:)!%%F3WGLZQZ0#[_O9HM$)`()R(M4)"QFB01J@^L"
+M9D\/B7/___\/OT0D#H/$$%M>7UW#B?93@^P(BUPD$(.[!"\```!T&X/L#/^S
+M!"\``.C\____QX,$+P```````(/$$(.[>!D```!T&X/L#/^S>!D``.C\____
+MQX-X&0```````(/$$(/$"%O#C78`5E.#[!"+="0@BUPD'&C@````Z/S___^)
+M@W@9``"#Q!"%P'4(QP8"````ZWC'@P@O``"`````@^P,:(````#H_/___XF#
+M!"\``(/$$(7`=0C'!@(```#K3,>#""\``$````#'@\@6```<7`$`QX/,%@``
+MI$<!`,>#T!8``+A*`0#'@]06``!T2`$`QX/8%@``\$H!`,>#W!8``(11`0"X
+M`0```)"#Q`1;7L.0D%575E.#[`R+?"0@BVPD*(MT)"R[`````(T$6XM/%(L4
+MQ>!J``")5"0(BU0D)(T$0HL$A>!J``"+5"0(B0011O?&/P```'4-@^P,:@'H
+M_/___X/$$$.#^P]VOKL`````D(M/%(L4W6!L``"+!-UD;```B0011O?&/P``
+M`'4/@^P,:@'H_/___X/$$(GV0X'[B````';+NP````")]HT$6XM/%(L4A<!P
+M```!Z(L$A<!P``")!!%&]\8_````=0Z#[`QJ`>C\____@\00D$.#^S]VRH/$
+M#%M>7UW#B?955U93@^P,BVPD((MT)"3'1"0(`````+\`````9H$^OQ(/A\T`
+M```/MP:)1"0$+9`(``"Z!0```(G3F??[A=)U(XM$)`2-G`#@[O__N&=F9F;W
+MZ\'Z`HG8P?@?B=,IP^M%C78`#[<.C8%0]___N@4```")TYGW^[@`````A=(/
+MA;@!``"-G`F@[O__N&=F9F;WZ\'Z`HG8P?@?B=,IP\=$)`@!````P>,"@>/_
+M````@^P(:@A3Z/S___^)PXM5%(N"!*(``(/$$&:!/K0)=1&#R!")@@2B``#I
+M&P$``(UV`(M5%(/@[XF"!*(``.D'`0``C78`9HL&N10```"Z`````&;W\6:%
+MTG5'9H$^_Q-V0(/L"&H(#[<.@>G`$@``N&=F9F;WZ8G0P?@#P?D?*<C!X`)0
+MZ/S___^)PX/$"&H":@/H_/___XG'@\00Z:@```!FBP:Y"@```+H`````9O?Q
+M9H72=3^#[`AJ"`^W#H'IP!(``+AG9F9F]^F)T,'X`L'Y'RG(T>!0Z/S___^)
+MPX/$"&H":@+H_/___XG'@\00ZU>-=@!FBP:Y!0```+H`````9O?QN`````!F
+MA=)U?H/L"&H(#[<.@>G`$@``N&=F9F;WZ8G0T?C!^1\IR%#H_/___XG#@\0(
+M:@)J`>C\____B<>#Q!"-=@")V<'A!(T$O0`````)P8M$)`C1X`G!@<D!$```
+MBU44#[;!B8*<F```P>D(BU44B<B#X'^)@MB8``")M?P'``"X`0```(/$#%M>
+M7UW#55=64X/L#(ML)""+1"0H9HE$)`J);"0$OP````"+M7@9``"+1"0D#[=`
+M`B7P`0``/<````!T.CW`````?PD]H````'0+ZTL]T````'0CZT*+1"0$9HN`
+M]`@``&:)1"0"BT0D!&:+@/8(``!FB00DZRN+1"0$9HN`^`@``&:)1"0"BT0D
+M!&:+@/H(``!FB00DZPJX`````.GA`0``N@````"YQ',``(L$T8D$ED)T][H`
+M````#[=,)`J[R',``(T$4HT$08L$@XE$E@1"=/"Z``````^W3"0*N^!S``"-
+M!%*-!$&+!(.)1)8(0G3PN@`````/MTPD"KL`=```C012C01!BP2#B426#$*#
+M^AIV[8/L#&H`:*@```!J`P^W1"0:4(U>#%/H_/___X/$%&H`:*4```!J`P^W
+M1"084%/H_/___[H`````@\0@#[=,)`J[H'8``(T$4HT$08L$@XE$EGA"@_H"
+M=NV[`````(M-%(L4W<!S``"+!)Z)!!%']\<_````=0V#[`QJ`>C\____@\00
+M0W37NP````"-!%N+312+%,7(<P``BT2>!(D$$4?WQS\```!U#8/L#&H!Z/S_
+M__^#Q!!#=-.[`````(T$6XM-%(L4Q>!S``"+1)X(B0011_?'/P```'4-@^P,
+M:@'H_/___X/$$$-TT[L`````B?:-!%N+312+%,4`=```BT2>#(D$$4?WQS\`
+M``!U#X/L#&H!Z/S___^#Q!")]D.#^QIVSKL`````C01;BTT4BQ3%H'8``(M$
+MGGB)!!%']\<_````=1"#[`QJ`>C\____@\00C78`0X/[`G;-BT0D!,>`8!D`
+M``````"X`0```(/$#%M>7UW#C78`BU0D"(M$)`2+@'@9``"#^@=W&?\DE>AV
+M``")]H/`!,.#P`C#@\`,PX/`>,.X`````,.)]E575E.+?"08BVPD)(MT)!R+
+M7"04#[?.C0Q/#[_3#[<'.<)]%,=%``````"+1"0@QP``````ZU&09CE9_G\N
+M#[?&2(E%`(M4)"")`NL[*?C1^(E%`(M4)"")`NLL*?C1^(M4)"")`D")10#K
+M'(GX.<]S%HGV9CD8=-1F.5@"?]V#P`(YR'+NB?9;7E]=PXUV`%575E.#[!B+
+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
+M$$C!X`XE`,````G"B9%8H@``@\0@9H-\)!8`=!!FBT0D%O?89HF%@!D``.L)
+M9L>%@!D`````NX"B``"Y``````^V%,X/MD3.`L'@"`G"#[9$S@3!X!`)P@^V
+M1,X&P>`8"<*+1Q2)%!B#PP1!@_D?=L^+7Q2+%"2#X@\/MT0D&,'@!"7P`P``
+M"<*-3"08#[=!`L'@"B4`_```"<(/MT$$P>`0)0``/P`)P@^W00;!X!8E``#`
+M#PG"B9-LH@``N@$```")T(/$+%M>7UW#4X/L"(M<)!"#NP0O````=!N#[`S_
+MLP0O``#H_/___\>#!"\```````"#Q!"#NW@9````=!N#[`S_LW@9``#H_/__
+M_\>#>!D```````"#Q!"#Q`A;PXUV`%93@^P0BW0D((M<)!QHA````.C\____
+MB8-X&0``@\00A<!U",<&`@```.MPQX,(+P````$``(/L#&@``0``Z/S___^)
+M@P0O``"#Q!"%P'4(QP8"````ZT3'@\@6``!H:P$`QX/,%@``(%T!`,>#T!8`
+M`,AB`0#'@]06``#\70$`QX/8%@``0&`!`,>#W!8```AJ`0"X`0```(UV`(/$
+M!%M>PP`````````````X!P``2P<``$L'``!5!P``4`@``%\'``!I!P``>0<`
+M`%`(``")!P``G0<``.X'``"U!P``R@<``-P'``#]!P`````%``H`%``>`#(`
+M1@!5`%H`7P!D````"@`4`!X`*``R`#P`1@!0`%H`9`#"````Q````,4```#0
+M````V@```.0```#"````PP```-0```#R````#0$``"@!````````3D].10``
+M`````/\!1D-#```````0`$@#34M+``````!``(@!151320`````W`#H#````
+M`````````````````/\!``"?````H@````$````!`````0``````$`"H````
+MJP````$````!`````0````@``P"Z````O0````$``````````0````P``P#%
+M````R`````$``````````0```"``1P#0````TP```````````````````#,`
+M,`#=````X`````$``````````0```"0`(0#H````ZP````$````!`````0``
+M`"@`.0#U````^`````$``````````0```!\`,````0```P$```$````!````
+M`0```#```P`.`0``$0$```$``````````0```'```P`9`0``'`$```$`````
+M`````0```#@`,``D`0``)P$```$``````````0```%0`50`O`0``,@$```$`
+M```!`````0```$0`50`Y`0``/`$```$````!`````0```$P`"`!#`0``1@$`
+M`````````````````&``4@!-`0``4`$```$````!`````0```&0`-`!B`0``
+M90$```$``````````0```'P`(`!N`0``<0$```$````!`````0```)@`6`!X
+M`0``>P$````````!`````````)P`4@"!`0``A`$```$````!`````0```*H`
+M$`"*`0``C0$```$``````````0```+P``P"6`0``F0$```$``````````0``
+M`+\`-@"D`0``IP$```$``````````0```,0`-P"O`0``L@$```$````!````
+M`0```,L`-@"Y`0``O`$``````````````````-``-P#+`0``S@$```$`````
+M`````0```-8`$`#6`0``V0$```$````!`````0```-H``P#L`0``[P$`````
+M`````````````#(#`P#W`0``^@$```$``````````0```-X``P```@```P(`
+M``$``````````0```.D`-P`/`@``$@(```$``````````0```/8`-P`:`@``
+M'0(```$``````````0```/H`-@`E`@``*`(```$``````````0```/\`-@`O
+M`@``,@(```$``````````0````P!,``]`@``0`(```$````!`````0```!0!
+M-P!(`@``2P(```$``````````0```"P!`P!3`@``5@(```$``````````0``
+M`$`!$`!=`@``8`(```$````!`````0```%0!`P!J`@``;0(```$`````````
+M`0```%@!(0!V`@``>0(```$````!`````0```%P!-0"#`@``A@(```$`````
+M`````0```&`!-P".`@``D0(```$``````````0```&0!`P"9`@``G`(```$`
+M`````````0```&@!`P"B`@``I0(```$``````````0```&P!4@"O`@``L@(`
+M``$````!`````0```'0!-P"W`@``N@(```$``````````0```'@!`P#"`@``
+MQ0(```$``````````0```'P!-P#,`@``SP(```$``````````0```(@!0`#5
+M`@``V`(```$``````````````(D!00#>`@``X0(```$``````````````(H!
+M2`#H`@``ZP(```$``````````````(L!0P#R`@``]0(```$`````````````
+M`(P!2@#\`@``_P(```$``````````````(T!2P`&`P``"0,```$`````````
+M`````)`!`P`0`P``$P,```$``````````0```(X!`P`:`P``'0,```$`````
+M`````0```)@!10`H`P``*P,```$````!`````0```)H!10`W`P``.@,```$`
+M`````````````)L!20!)`P``3`,```$``````````````)X!`P!<`P``7P,`
+M``$``````````0```*P!`P!F`P``:0,```$``````````0```*8!`P!P`P``
+M<P,```$``````````0```+8!-0![`P``?@,```$``````````0```+@!-P",
+M`P``CP,```$``````````0```+H!-P"9`P``G`,```$``````````0```+X!
+M(0"G`P``J@,```$````!`````0```"<#`P"P`P``LP,```$``````````0``
+M`,H!`P"]`P``P`,``````````````````.0!$`#)`P``S`,```$````!````
+M`0```.P!,`#3`P``U@,```$````!`````0```/@!`P#=`P``X`,```$`````
+M`````0```!`"-P#H`P``ZP,```$``````````0```"H"(@#W`P``^@,```$`
+M`````````0```$("-P`&!```"00```$``````````0`````"`P`0!```$P0`
+M``$``````````0```$H"`P`8!```&P0```$``````````0```$\"$``D!```
+M)P0```$````!`````0```%P"`P`N!```,00```$``````````0```&`"$0`V
+M!```.00```$````!`````0```&@"-P!%!```2`0```$``````````0```&P"
+M-P!/!```4@0```$``````````0```'8"$`!;!```7@0```$````!`````0``
+M`'H"`P!J!```;00```$``````````0```(("`P!S!```=@0```$`````````
+M`0```(,"`P!^!```@00```$``````````0```*H"`P"(!```BP0```$`````
+M`````0```+X"0@"8!```FP0```$````!`````0```+\"-@"E!```J`0```$`
+M`````````0```,$"-P"X!```NP0```$``````````0```,8"-P#$!```QP0`
+M``$````!`````0```-0"-P#4!```UP0```$``````````0```/`"-P#=!```
+MX`0```$``````````0```/0"-0#G!```Z@0```$``````````0```/@"`P#V
+M!```^00```$``````````0```)X`1P#_!````@4```$````!`````0```/P"
+M10`)!0``#`4```$````!`````0````P#,``5!0``&`4```$``````````0``
+M`!0#-@`J!0``+04```$``````````0```!@#-@`U!0``.`4```$`````````
+M`0```"0#`P`_!0``0@4```$``````````0```!`#`P!*!0``304```$`````
+M`````0```#H#-P!B!0``904```$``````````0```$@#$`!T!0``=P4```$`
+M```!`````0```%H#10"%!0``B`4```$``````````0```%P#.@"0!0``DP4`
+M``$````!`````0```%X#5@">!0``H04```$``````````0```,`"`P"K!0``
+MK@4```$``````````0```'<#`P"W!0``N@4```$``````````0```,P"`P#`
+M!0``PP4```$``````````0````````````````#_`?\!`P"8`9D!!P"8`3`+
+M"`"8`3`,(``@`1`*(0`@`9D!(@`@`3`,.@!@`1`*-P`P`9D!-0`P`ID!-@`P
+M`YD!,``P!)D!.0`P!9D!-``P!ID!,@`P`YD!,0`P`YD!$0`0`9D!$``0`1`*
+M4@!0`9D!10!0`ID!1P!0`YD!0@!0!)D!6`!0!9D!50!0`3`,5@!0`C`,20!0
+M`E`-0`!``4`*00!``4`*0P!``D`*2`!``1`*2@!``4`*2P!``4`*8`!@`&``
+M80!A`&$`8@!B`&(`8P!C`&,`9`!D`&0`90!E`&4`9@!F`&8`9P!G`&<`:`!H
+M`&@`:0!I`&D`:@!J`&H`````````````````````````````````````````
+M_P$"`!```!1$%@4&<1;!%@4&````````````````4`$!`!``<1;!%AX`````
+M````````````````````4`(!`!``<1:M%A<`````````````````````````
+M4`,"`!``H!3(%!$&<1:M%AX&````````````````4`0"`!``/!1X%!0`<1;!
+M%A0`````````````````4`4"`!``<1;!%A$`````````````````````````
+M,`$"`#``/!3(%!0`?!5$%AL`````````````````,`(!`#``/!1X%!(`````
+M````````````````````,`,!`#``/!3(%!0`````````````````````````
+M,`0!`#``/!3(%!(`````````````````````````,`4!`#``/!1X%`\`````
+M````````````````````,`8"`#``/!2@%!<`?!5$%AX`````````````````
+M$`$#`!``C!3(%!<&/!1X%!$&<1;!%AX&````````(`$"`!``/!3(%!<&<1;!
+M%AX&````````````````8`$$`!``/!1X%!$&C!3(%!0&?!5$%A0&<1;!%AX&
+M0`$!`$``,A1N%!<`````````````````````````0`(#`$``,A1N%!<`L!/8
+M$Q<`.!-T$Q<```````````#_`0(`$P`*%"86!08>%!(6!08`````````````
+M```0`0,`$P""%*H4%P9:%%H4$0:`%J@6'@8```````!@`0,`$P""%*H4%P9:
+M%%H4$0:`%J@6'@8```````!@`00`$P!X%*`4%P90%%`4$0:%%JT6'@:D%1P6
+M'@80"@$`$0``````````````````````````````````````````````_P$#
+M`/\`"`E$"04&A0F%"04&T`FL"@4&````````$`H!`!0`A0F%"10&````````
+M````````````````,`H!`#0`A0F%"10&````````````````````````,`L!
+M`#0`A0F%"10&````````````````````````,`P!`#0`A0F%"10&````````
+M````````````````0`H!`$0`A0F%"10&````````````````````````F0$!
+M`#0`A0F%"10&``````````````````````````````````````````#_`00`
+M_P`("40)!09L":@)!0:T";0)!0;0":P*!090#0(`_P!L":@)%``("40)%```
+M```````````````P"@$`_P"9":@)%``````````````````````````P"P$`
+M,0"`"8H)%``````````````````````````P#`$`,0!L":@)'@``````````
+M```````````````0"@$`$0!L"9X)&P8```````````````````````!`"@(`
+M00!L":@)%`"T";0)%`````````````````"9`0$`,0!L":@)%```````````
+M````````````````````_P``````````````````````````````````````
+M``````````````````!@`````0`````````*````.`$``$`!``!(`0``:`$`
+M`'`!``!X`0``@`$``(@!``"H`0``L`$``&8````!``````````D````X`0``
+M0`$``%`!``!H`0``<`$``'@!``"``0``D`$``+`!````````9P````$`````
+M````"0```#@!``!``0``2`$``&@!``!P`0``>`$``(`!``"(`0``L`$`````
+M``!H`````0`````````)````.`$``$`!``!(`0``:`$``'`!``!X`0``@`$`
+M`(@!``"P`0```````&$```````````````@````X`0``0`$``$@!``!H`0``
+M@`$``(@!``"H`0``L`$`````````````8@````(````L`0``"@```#@!``!`
+M`0``2`$``&@!``!P`0``>`$``(`!``"(`0``J`$``+`!``!C`````0``````
+M```(````.`$``$`!``!(`0``:`$``'`!``!X`0``B`$``+`!````````````
+M`&0```````````````<````X`0``6`$``&@!``!P`0``>`$``)@!``"P`0``
+M````````````````90``````````````!0```#@!``!(`0``:`$``(@!``"P
+M`0````````````````````````````!I```````````````(````.`$``%@!
+M``!H`0``<`$``'@!``"``0``F`$``+`!`````````````&H`````````````
+M``8````X`0``2`$``&@!``"``0``B`$``+`!````````````````````````
+M````````````````````````````````8`````$`````````"0```#@!``!`
+M`0``4`$``&@!``!P`0``>`$``(`!``"0`0``L`$```````!F`````0``````
+M```)````.`$``$`!``!0`0``:`$``'`!``!X`0``@`$``)`!``"P`0``````
+M`&<````!``````````D````X`0``0`$``$@!``!H`0``<`$``'@!``"``0``
+MD`$``+`!````````:`````$`````````"0```#@!``!``0``2`$``&@!``!P
+M`0``>`$``(`!``"0`0``L`$```````!A```````````````'````.`$``$`!
+M``!0`0``:`$``(`!``"0`0``L`$``````````````````&(````"````+`$`
+M``D````X`0``0`$``%`!``!H`0``<`$``'@!``"``0``D`$``+`!````````
+M8P````$`````````"````#@!``!``0``4`$``&@!``!P`0``>`$``)`!``"P
+M`0````````````!D```````````````'````.`$``&`!``!H`0``<`$``'@!
+M``"@`0``L`$``````````````````&4```````````````4````X`0``8`$`
+M`&@!``"@`0``L`$`````````````````````````````:0``````````````
+M"````#@!``!@`0``:`$``'`!``!X`0``@`$``*`!``"P`0````````````!J
+M```````````````&````.`$``&`!``!H`0``@`$``*`!``"P`0``````````
+M`````````````````````````````````````````````$`!B`%``0``N`$`
+M`!`!2`-0`0``P@$``#`!$`)``0``S@$```(`4`$!`$`!!`"@``@`P``@`-``
+MN#P``)@\``"J/```N#P``)X\``"X/```N#P``+@\``"D/```N#P``+@\``"X
+M/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\
+M``"X/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\``"P/```BCT`
+M`)$]``"\/0``F#T``+P]``"\/0``O#T``+P]``"?/0``O#T``*8]``"M/0``
+MC!2@%+04R!0``'P5D!6D%;@5S!7@%?05"!8<%C`61!8`````0`$"`,P6``#6
+M%@``````````````````````````````````````````````````8`$Z`$`!
+M``#P%@``,`$``$`!````````,`(``$`!````````,`,``$`!````````,`0`
+M`$`!````````,`4``$`!````````,`8``$`!````````,`H``$`!````````
+M,`L``$`!````````,`P``$`!````````:`!H`$`!````````0`)#`$`!````
+M````0`I#`*``````````0`I#`,``````````0`%!`$`!````````0`I!`*``
+M````````0`I!`,``````````0`!#`$$`2`!*`$L````````````D`9@9`"D1
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````X%4`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````"8``!'````")@````````,F```IHZ$"1"8````
+MX#(]%)@``&L'```<F````````""8`````@("))@```X.```HF````0(""BR8
+M``#\;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F`````!C
+MB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8F```
+MNKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\```!T
+MF```@````'B8```$`````)D````````$F0````````B9````````#)D`````
+M@``0F0```P````";````````!)L``"`````(FP``$`````R;```P````$)L`
+M``@````4FP``*````!B;```H````')L```0````@FP``)````"2;```4````
+M*)L``#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;```2
+M````0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0```%2;
+M```1````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``)0``
+M`&R;```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`FP``
+M(P```(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<```"8
+MFP``)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L``"\`
+M``"PFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````Q)L`
+M`"\```#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O````
+MW)L``"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";```O
+M````])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70````B:
+M``"=````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``H0``
+M`"":``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````TF@``
+M7````#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D```!,
+MF@``60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H``&4`
+M``!DF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````>)H`
+M`!@```!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$````
+MD)H``(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:``#2
+M````J)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P```+R:
+M```:````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``!@``
+M`-2:```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#HF@``
+M!@```.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8```#4
+MF```(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@``!0`
+M```)"0```````@(&!@8&!@8"`@````,`!@`)`#P`````````````````````
+M``````````````````````````#P````S`````````````````````KB````
+M(```"@(```$8```!````0!@$````````````````````````````````````
+M````!017&0`I$00`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````-R(````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!L"8\)M`D`````````````````
+M```````````````````````@````(````$````!````````&````!@````8`
+M,````!4````5````'0```!4```!`$```#_PO``_\+P`?_"\`#_PO`$00```/
+M_"\`#_PO`!_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\
+M+P`?_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO
+M``_\+P!8$```#_PO``_\+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`
+M8!````_\+P`/_"\`'_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H
+M`0``X`$``+@!``!H`0``,!```#`"``#@`0``L````#`"``"P$```F`T``(`1
+M``!('P``F`T``/`0``#@H```:$`!`(!8``#@H```%(`````$``0`"``(`#``
+M(``$``0<@```IX^-#L^/C0Z5CV`!IX^-#@28`````````P``````````````
+M()@````"`@(``@("``(!`@`"`@(DF```#@X```X.```'!P``#@X``"B8```!
+M``(*`0`""@```04!``(*-)@```X.```.#@``#@X```X.```XF```!P````<`
+M```+````"P```$28``"<%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8
+M`&FZ&`!0F```X+0H#."T*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^
+M7)@``%Y=-S%>73<Q7ETZ,5Y=-S%@F```$+T``!"]```XO0``$+T``&28````
+MS@$``,X!``#.`0``S@$`%)D``!`G```0)P``?!4``!`G```8F0``D`$``)`!
+M``"$````D`$``$29```@$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_
+M!?\9_P74F```$````!0````0````$``````````,`````````"@```"<G(2$
+M+````'Q\?'PT````!0```$``````````1`````@```!(````"````$P````0
+M````4`````````!4````'P`````(````````!`@````````("`````````P(
+M````````$`@````````4"````````!@(````````'`@````````@"```````
+M`"0(````````,!(````````$@`````````B`````````#(`````````8@```
+M`````"2`````````*(```#`````L@```__\'`#"```#___\!-(```#$````X
+M@````````#R`````````0(````````!$@````@```$B`````````5(``````
+M``!8@`````````B8````````#)@``).0A"T0F````.`R?128``!K#P``')@`
+M```````LF```_F\"`#"8````````/)@````!`@!`F```>@%J($R8```\8802
+M5)@``%D(``!HF```D$&:0&R8``"!L`P%<)@```\```!TF```@````'B8```,
+M`````)D````````$F0````````B9````````#)D`````@``0F0```0```!R9
+M```J"0``()D````````DF0``!8H%`"B9```!````+)D````````PF0``````
+M`#29````````.)D````````\F0``/P```$"9```$````2)D```````!,F0``
+M`````%"9````````5)D``$SQ4%U8F0``&````%R9``".:DL`A*$``/\%_P:(
+MH0``_P?_!XRA``#_"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+G*$``/\,
+M_PR@H0``_PW_#:2A``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_%?\6M*$`
+M`/\7_QFXH0``_QK_&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA``#_*?\L
+MS*$``/\O_S'0H0``_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_.N"A``#_
+M.O\ZY*$``/\Z_SKHH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``_SK_.OBA
+M``#_.O\Z_*$``/\Z_SH`FP````````2;```@````")L``!`````,FP``,```
+M`!";```(````%)L``"@````8FP``!````!R;```D````()L``!0````DFP``
+M-````"B;```,````+)L``"P````PFP```@```#2;```B````.)L``!(````\
+MFP``,@```$";```*````1)L``"H```!(FP``!@```$R;```F````4)L``!8`
+M``!4FP``-@```%B;```.````7)L``"X```!@FP```0```&2;```A````:)L`
+M`!$```!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````
+M@)L``!4```"$FP``-0```(B;```-````C)L``"T```"0FP```P```)2;```C
+M````F)L``!,```"<FP``,P```*";```+````I)L``"L```"HFP``*P```*R;
+M```K````L)L``"L```"TFP``*P```+B;```K````O)L``"L```#`FP``*P``
+M`,2;```K````R)L``"L```#,FP``*P```-";```K````U)L``"L```#8FP``
+M*P```-R;```K````X)L``"L```#DFP``*P```.B;```K````[)L``"L```#P
+MFP``*P```/2;```K````^)L```(```#\FP``%@```-28```@````V)@``&@0
+M8`````````````":``"I`0````````2:``#I`0``0`````B:```I````@```
+M``R:``!I````4`$``!":``"9`0``D`$``!2:``#9`0``T`$``!B:```9````
+M$````!R:``!9````1````"":``"9````A````"2:``"E`0``2`$``"B:``#E
+M`0``B`$``"R:```E````R`$``#":``#(`0``%````#2:```(````0@```#B:
+M``!(````@@```#R:``"(````>`$``$":``"8`0``N`$``$2:``#8`0``^`$`
+M`$B:```8````$@```$R:``!8````4@```%":``"8````D@```%2:``"D`0``
+M?`$``%B:``#D`0``O`$``%R:```D````_`$``&":``!D````"@```&2:``"D
+M````2@```&B:``#D````B@```&R:```*`0``6@$``'":``!*`0``F@$``'2:
+M``"*`0``V@$``'B:``#*`0``#@```'R:```*````3@```(":``!*````C@``
+M`(2:``"*````7@$``(B:``"Z`0``G@$``(R:``#Z`0``W@$``)":```Z````
+M"0```)2:``!Z````20```)B:``"&`0``B0```)R:``#&`0``>0$``*":```&
+M````N0$``*2:``!&````^0$``*B:``"&````.0```*R:``#&````>0```+":
+M``#&````N0```+2:``#&````O0$``+B:``#&````_0$``+R:``#&````/0``
+M`,":``#&````?0```,2:``#&````O0```,B:``#&````_0```,R:``#&````
+M_0```-":``#&````_0```-2:``#&````_0```-B:``#&````_0```-R:``#&
+M````_0```.":``#&````_0```.2:``#&````_0```.B:``#&````_0```.R:
+M``#&````_0```/":``#&````_0```/2:``#&````_0```/B:``#&````_0``
+M`/R:``#&````_0````$```!&````8`````$```!&````80````$```!&````
+M8@````$```!&````8P````$```!&````9`````$```!&````90````$```!&
+M````9@````$```!&````9P````$```!&````:`````$```!&````:0````$`
+M``!&````:@````$```!&````:P````$```!&````;`````$```!&````=```
+M``$```!&````=`````$```!&````=`````$```!&````=`````$```!&````
+M=`````$```!&````=`````$```!&````=`````$```!&````=`````$```!&
+M````=0````$```!&````=@````$```!&````=P````$```!&````>`````$`
+M``!&````>0````$```!&````>@````$```!&````>P````$```!&````?```
+M``$```!&````?0````$```!&````?@````$```!&````?P````$```!&````
+M@`````$```!$````?`````$```!&````B`````$```!&````C`````$```!&
+M````D`````$```!&````E`````$```!&````F`````$```!&````G`````$`
+M``!&````H`````$```!&````I`````$```!&````J`````$```!&````K```
+M``$```!&````L`````$```!&````M``````"!P````,`!@`)`#P```!CNP``
+M8[L``(V[``"-NP``M[L``+>[``#ANP``X;L`````````````"0````0````$
+M``$``0`!``8```!&1S@`````````````````!`````$``0`$````1D<W````
+M``````````````,``0`!``$``P```$9'-@`````````````````$```````!
+M``$```!&1S4`````````````````!``!``$`````````1D<T````````````
+M``````0````!````_O___T9',P`````````````````#``$``0```/W___]&
+M1S(`````````````````!`````````#\____1D<Q``````````````````(`
+M`0`!````^O___T9',```````````````````````````````````````````
+M````````````%!!4&0`I$00`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!L"8\)M`D("6P)M`G)
+M____R?___\G____)____PO____+____R____\O____+____T____P/___\#_
+M___`____P/___[K___^R____LO___[+___^R____L/___RWB``#FX0``\^$`
+M`&SB```,X@``7^(````````````````````````@````(````$````!`````
+M```&````!@````8`?.\``-#N```.[P``'>\``"3O```S[P``?.\``'SO``!\
+M[P``?.\``'SO``!\[P``?.\``'SO``!\[P``?.\``%KO````````````````
+M````````````````````````0!````_\+P`/_"\`'_PO``_\+P`/_"\`1!``
+M``_\+P`/_"\`'_PO``_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P`/_"\`
+M3!````_\+P`/_"\`'_PO``_\+P`/_"\`4!````_\+P`/_"\`'_PO``_\+P`/
+M_"\`5!````_\+P`/_"\`'_PO``_\+P`/_"\`6!````_\+P`/_"\`'_PO``_\
+M+P`/_"\`7!````_\+P`/_"\`'_PO``_\+P`/_"\`8!````_\+P`/_"\`'_PO
+M``_\+P`/_"\`9!````_\+P`/_"\`'_PO``_\+P`/_"\`,!```#`"``#@`0``
+ML````&`!``#@`0``<!```&@!``#@`0``N`$``(P!``#@`0``L!```&`.``"`
+M$0``'!\``#@^``"`$0``\!```."@``!H0`$`@%@``."P``!H0`$`%(```.@#
+MZ`/@!N`&(`0@!$`(0`C@!N`&!)@````````#```````````````#````()@`
+M```"`@(``@("``(!`@`"`@(``@("))@```X.```.#@``!P<```X.```.#@``
+M1)@``!P6<A,E''(3*!=R$Z(6<A,E''(38)@``!"=```0G0``&)T``!B=```0
+MG0``9)@```#.`0``S@$``,X!``#.`0``S@$`:)@``)!!FD"009I`D$&:0)!!
+MFD"009I`&)D``+@!``"X`0``A`````@!``"X`0``))D```6*!1`%B@40!8H%
+M$`6*!1`%B@40,*(```````````````````@!```````````````````,````
+M`````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?``````@````````$"`````````@(````````#`@`````
+M```0"````````!0(````````&`@````````<"````````"`(````````)`@`
+M``````!P$@```````#@0````````>!````````"X$````````/@0````````
+M.!$```````!X$0```````+@1````````^!$````````X$@```````'@2````
+M````N!(```````#X$@```````#@3````````>!,```````"X$P```````/@3
+M````````.!0```````!X%````````+@4````````^!0````````X%0``````
+M`'@5````````N!4```````#X%0```````#@6````````>!8```````"X%@``
+M`````/@6````````.!<```````!X%P```````+@7````````^!<````````\
+M$````````'P0````````O!````````#\$````````#P1````````?!$`````
+M``"\$0```````/P1````````/!(```````!\$@```````+P2````````_!(`
+M```````\$P```````'P3````````O!,```````#\$P```````#P4````````
+M?!0````````$@`````````B`````````#(`````````8@````````""`````
+M````)(`````````H@```,````"R```#__P<`,(```/___P$T@```,0```#B`
+M````````/(````````!(@````````%2`````````6(````````!<@```_\?_
+M_\"````:,((JQ(```.`!W`7(@```$"=`'\R``````/0!T(```!P>``#4@```
+MJJH"`-B```!550`"W(````````#@@```_____^2```#__P``Z(````````#L
+M@````````/"`````````](````````#X@````````/R```"(`````(<`````
+M```$AP``C`````B'``#D````#(<``-4"```0AP```````!2'````````&(<`
+M`*`````<AP``R0$``""'```L````)(<``"P````HAP``,````"R'```\````
+M,(<``"P````TAP``+````#B'```P````/(<``#P```!`AP```````$2'````
+M````2(<```````!,AP```````%"'````````5(<```````!8AP```````%R'
+M````````8(<``-4```!DAP``WP```&B'```"`0``;(<``#H!``!PAP``=0``
+M`'2'``!_````>(<``*(```!\AP````````"!```"``$`!($```$````(@0``
+MP`````R!````````$($``&@!```4@0```````,"'`````0(#Q(<```0%!@?(
+MAP``"`D*"\R'```,#0X/T(<``!`1$A/4AP``%!46%]B'```8&1H;W(<``!P=
+M'A_@AP````$"`^2'```$!08'Z(<```@)"@OLAP``#`T.#_"'```0$1(3](<`
+M`!05%A?XAP``&!D:&_R'```<'1X?")@````````,F```&8Z$K1"8````X"A]
+M%)@``&N?"IP<F````````$"8``!Z`6H@5)@``%D(````F0````````29````
+M````")D````````,F0````"``!"9```!````')D``(`,```@F0`````0!2B9
+M```!````+)D```0````TF0``(B`?'CB9```-#`L*/)D``#\```!(F0``$K*`
+MDE29``"(X5!=6)D``/\```!<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0``
+M`0```'R9````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$D
+MH@````0``"RB````````-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[
+M``!(H@``_#__#P";````````*)L```P````XFP``$@```&2;```A````C)L`
+M`"T```"<FP``,P```````P`&``D`/```````````````````````````````
+M```````````)````!`````0``0`!``$````````````&````1D<X````````
+M``````````0````!``$````````````$````1D<W``````````````````,`
+M`0`!``$````````````#````1D<V``````````````````0```````$`````
+M```````!````1D<U``````````````````0``0`!````````````````````
+M1D<T``````````````````0````!``````````````#^____1D<S````````
+M``````````,``0`!``````````````#]____1D<R``````````````````0`
+M``````````````````#\____1D<Q``````````````````(``0`!````````
+M``````#Z____1D<P````````````````````````````````````````````
+M```````````````````````````````````````````(`````0````,`````
+M```````````````&````1D<W``````````````````(`````````````````
+M````````1D<V``````````````````$```````````````````#]____1D<U
+M``````````````````````````````````````#Z____1D<T````````````
+M`````````0`!``````````````#X____1D<S`````````````````````0`!
+M`````0`!``````#V____1D<R`````````````````````0````$``0`!````
+M``#S____1D<Q`````````````````````0````$``0````$```#P____1D<P
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````(````$
+M````!@````@````*````#`````X````0````8"\!`%HK`0!$+`$`^RT!`&4N
+M`0#H+@$`87(U,C$R06YI4&]L;```````````````,````!6````5@```%8``
+M`!6````5@```'(```*>/C1+/#X@)E0_@!*L/X!+/#X@)*)@```$``@H!``(*
+M``$!!0$``@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'
+M````"P````L````+````2)@``%K:&`!:VA@`:<H8`&G*&`!IRA@`4)@``."T
+MZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+DWH?BY-Z'XN#8!^7)@`
+M`%YF-S%>9C<Q7F8W,5YF-S%>83<Q;)@``(&P#`6!L`P%@;`,!8"P#`6`L`P%
+M%)D``!`G```0)P``?!4``/@J```0)P``1)D``"`0N/<@$+CW(`VX]R`0N/<@
+M$+CW#*(``&I!+&1J02QD:D%`9&I!0&1J04!D'*(```J`@Q@*@(,8"H!S&`J`
+M@Q@*@(,8`````````````````````#`2````````+)@``/XO`@`\F`````$"
+M`$R8```\8802,)D``(-(``!`F0``!````'29````````^)D``!@````$H@``
+M``````BB``"(9S[0**(``+4!```\H@``KXG($P2;```@````")L``!`````,
+MFP``,````!";```(````%)L``"@````8FP``!````!R;```D````()L``!0`
+M```DFP``-````"R;```L````,)L```(````TFP``(@```#R;```R````0)L`
+M``H```!$FP``*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````
+M6)L```X```!<FP``+@```&";```!````:)L``!$```!LFP``,0```'";```)
+M````=)L``"D```!XFP``!0```'R;```E````@)L``!4```"$FP``-0```(B;
+M```-````D)L```,```"4FP``(P```)B;```3````H)L```L```"DFP``*P``
+M`*B;```K````K)L``"L```"PFP``*P```+2;```K````N)L``"L```"\FP``
+M*P```,";```K````Q)L``"L```#(FP``*P```,R;```K````T)L``"L```#4
+MFP``*P```-B;```K````W)L``"L```#@FP``*P```.2;```K````Z)L``"L`
+M``#LFP``*P```/";```K````])L``"L```#XFP```@```/R;```6````````
+M`````````````````)R8`````````````````````````````)R8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````````````````````````````)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````#@````X````.````#@````X`)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`,````"`````@````)R8``#Y``0`^0`$`/\`!`#]``0`_0`$`-28````````
+M``````0````$````!````````````````)H``*D!````````!)H``.D!``!`
+M````")H``"D```"`````#)H``&D```!0`0``$)H``)D!``"0`0``%)H``-D!
+M``#0`0``&)H``!D````0````')H``%D```!$````()H``)D```"$````))H`
+M`*4!``!(`0``*)H``.4!``"(`0``+)H``"4```#(`0``,)H``,@!```4````
+M-)H```@```!"````.)H``$@```""````/)H``(@```!X`0``0)H``)@!``"X
+M`0``1)H``-@!``#X`0``2)H``!@````2````3)H``%@```!2````4)H``)@`
+M``"2````5)H``*0!``!\`0``6)H``.0!``"\`0``7)H``"0```#\`0``8)H`
+M`&0````*````9)H``*0```!*````:)H``.0```"*````;)H```H!``!:`0``
+M<)H``$H!``":`0``=)H``(H!``#:`0``>)H``,H!```.````?)H```H```!.
+M````@)H``$H```".````A)H``(H```!>`0``B)H``+H!``">`0``C)H``/H!
+M``#>`0``D)H``#H````)````E)H``'H```!)````F)H``(8!``")````G)H`
+M`,8!``!Y`0``H)H```8```"Y`0``I)H``$8```#Y`0``J)H``(8````Y````
+MK)H``,8```!Y````L)H``,8```"Y````M)H``,8```"]`0``N)H``,8```#]
+M`0``O)H``,8````]````P)H``,8```!]````Q)H``,8```"]````R)H``,8`
+M``#]````S)H``,8```#]````T)H``,8```#]````U)H``,8```#]````V)H`
+M`,8```#]````W)H``,8```#]````X)H``,8```#]````Y)H``,8```#]````
+MZ)H``,8```#]````[)H``,8```#]````\)H``,8```#]````])H``,8```#]
+M````^)H``,8```#]````_)H``,8```#]````U)@``"````#4F```$````!0`
+M```0````$````!0```#8F```:!!@`&@08`!H$&``:!!@`&@08```````````
+M`)R8`````````````````````````````)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````````````````````````````)R8```````0````$```
+M`!`````0````$)R8```````$````!`````0````$````!)R8````````````
+M`````````````````)R8`````````````````````````````)R8````````
+M`````````````````````)R8``````````````````H``````````)R8``#`
+M`#@`@``X`,``.`+``#@`P``X`)R8```&``(`!@`"``8````&``(`!@`"`)R8
+M``")````B0```(D```")````B0```)R8``"@````H````*````"@````H```
+M`)R8```'``0`!P`$``<`!``'``0`!P`$`-28```:````&@```!H````:````
+M&@``````````````G)@``$````!(````0````$````!`````G)@``!`````0
+M````$````!`````0````G)@```@````(````"`````@````(````G)@``$\`
+M``!/````3P```$\```!/````G)@``/$```#Q````80```/$```#Q````G)@`
+M`$^0``!/D```3)```$^0``!/D```G)@``%H2``!:$@``FA(``%H2``!:$@``
+MS)@```X````.````#P````X````.`````0```$8```!@`````0```$8```!A
+M`````0```$8```!B`````0```$8```!C`````0```$8```!D`````0```$8`
+M``!E`````0```$8```!F`````0```$8```!G`````0```$8```!H`````0``
+M`$8```!I`````0```$8```!J`````0```$8```!K`````0```$8```!L````
+M`0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8```!T
+M`````0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8`
+M``!T`````0```$8```!U`````0```$8```!V`````0```$8```!W`````0``
+M`$8```!X`````0```$8```!Y`````0```$8```!Z`````0```$8```![````
+M`0```$8```!\`````0```$8```!]`````0```$8```!^`````0```$8```!_
+M`````0```$8```"``````0```$0```!\`````0```$8```"(`````0```$8`
+M``",`````0```$8```"0`````0```$8```"4`````0```$8```"8`````0``
+M`$8```"<`````0```$8```"@`````0```$8```"D`````0```$8```"H````
+M`0```$8```"L`````0```$8```"P`````0```$8```"T````E3H!`'@Z`0!\
+M.@$`@#H!`)`Z`0"0.@$`A#H!`(@Z`0``````````````````````````````
+M```P````%8```!6````5@```%8```!6````<@```IY.-$L\3B`F5$^`$JQ/@
+M$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```#@X```X.```.#@``
+M#@X```X.```XF```!P````<````+````"P````L```!(F```;=H8`&W:&`!U
+MRA@`=<H8`'7*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-
+M@'XN#>A^+@WH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YF-S%LF```@;`,
+M!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$F0``
+M(!"X]R`0N/<0#;CW$!"X]Q`0N/<$H@`````````````(````"`````@````(
+MH@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L9$`!+&1@P4)D8,%"9&#!
+M0F0<H@``"H"#&`J`@Q@*@',8"H"#&`J`@Q@P$@```````"R8``#^+P(`/)@`
+M```!`@!,F```/&&$$C"9``""2```0)D```0```!TF0```````"BB``"U`0``
+M/*(``*^)R!,$FP```0````B;```"````#)L```,````0FP``!````!2;```%
+M````&)L```@````<FP``"0```"";```*````))L```L````LFP``#0```#";
+M```0````-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``&```
+M`$R;```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@FP``
+M(````&B;```B````;)L``",```!PFP``)````'2;```E````>)L``"@```!\
+MFP``*0```(";```J````A)L``"L```"(FP``+````)";```P````E)L``#$`
+M``"8FP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U````L)L`
+M`#4```"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U````
+MR)L``#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;```U
+M````X)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;
+M```U````^)L``!````#\FP``&@```````````````)H```<````'````!)H`
+M`$<```!'````")H``(<```"'````#)H``*`!``"@`0``$)H``.`!``#@`0``
+M%)H``"`````@````&)H``&````!@````')H``*$!``"A`0``()H``.$!``#A
+M`0``))H``"$````A````*)H``&$```!A````+)H``&(!``!B`0``,)H``*(!
+M``"B`0``-)H``.(!``#B`0``.)H``"(````B````/)H``&(```!B````0)H`
+M`&,!``!C`0``1)H``*,!``"C`0``2)H``.,!``#C`0``3)H``",````C````
+M4)H``&,```!C````5)H``(0!``"$`0``6)H``,0!``#$`0``7)H```0````$
+M````8)H``.H!```+````9)H``"H```!+````:)H``&H```"+````;)H``*H`
+M``"L`0``<)H``*L!``#L`0``=)H``.L!```L````>)H``"L````2````?)H`
+M`&L```!2````@)H``*L```"2````A)H``*P!``"3`0``B)H``.P!``#3`0``
+MC)H``"P````3````D)H``#H```!3````E)H``'H```"3````F)H``+H```"4
+M`0``G)H``+L!``#4`0``H)H``/L!```4````I)H``#L````Z````J)H``'L`
+M``!Z````K)H``+L```"Z````L)H``+P!``"[`0``M)H``/P!``#[`0``N)H`
+M`#P````[````O)H``'P```![````P)H``+P```"[````Q)H``/P```"\`0``
+MR)H``/P```#\`0``S)H``/P````\````T)H``/P```!\````U)H``/P```"\
+M````V)H``/P```#\````W)H``/P```#\````X)H``/P```#\````Y)H``/P`
+M``#\````Z)H``/P```#\````[)H``/P```#\````\)H``/P```#\````])H`
+M`/P```#\````^)H``/P```#\````_)H``/P```#\````U)@``"````#0F```
+M"`0&`P@$!P,(!`8#"`0&`P@$!P/<F```P,"@`,#`H`#`P.``P,#@`,#`X```
+M`````````)R8```````/````#P````\````/````#YR8````````````````
+M`````````````)R8`````(````"`````@````(````"``)R8`````"H````J
+M````*@```"H````J`)R8``````$````!`````0````$````!`)R8````````
+M`````````````````````)R8`````!@````8````&````!@````8`)R8````
+M`&````!@````;@```&X```!N`)R8`````,<```#'````QP```,<```#'`)R8
+M`````$L```!+````2P```$L```!+`)R8`````$@$``!(!```2`0``$@$``!(
+M!)R8`````$P```!,````3````$P```!,`)R8`````.0```#D````Y````.0`
+M``#D`)R8`````````````````````````````)R8`````/P```#\````_```
+M`/P```#\`)R8`````/\```#_````_P```/\```#_`)R8`````#\$```_!```
+M/P0``#\$```_!)R8``````P````,````#`````P````,`)R8`````!D"```9
+M`@``&0(``!D"```9`IR8`````"0````D````)````"0````D`)R8`````+0`
+M``"T````M````+0```"T`)R8`````)D```"9````F0```)D```"9`)R8````
+M`%````!0````4````%````!0`)R8`````"H````J````*@```"H````J`)R8
+M`````!(````2````$@```!(````2`)R8`````#+````RP```,L```#+````R
+MP)R8`````'0!``!T`0``=`$``'0!``!T`9R8`````!$````1````$0```!$`
+M```1`)R8`````"B&```HA@``*(8``"B&```HAIR8`````(0Q``"$,0``A#$`
+M`(0Q``"$,9R8``"``/(`@`#R`(``\@"``/(`@`#R`)R8```9`"<`&0`G`!D`
+M)P`9`"<`&0`G`)R8```#`````P````,````#`````P```)R8````````````
+M`````````````````)R8``"R````L@```+(```"R````L@```)R8``"$(+``
+MA""P`(0@L`"$(+``A""P`)R8``"D)4$`I"5!`*0E00"D)4$`I"5!`)R8```@
+MDA$`()(1`""2$0`@DA$`()(1`)R8````2!H``$@:``!(&@``2!H``$@:`-B8
+M```P`@L`,`(+`#`""P`P`@L`,`(+`)R8``"4````E````)0```"4````E```
+M`)R8``"1````D0```)$```"1````D0```)R8```2````$@```!(````2````
+M$@```)R8``"`````@````(````"`````@````)R8``#9````V0```-D```#9
+M````V0```)R8``!@````8````&````!@````8````)R8``#P````\````/``
+M``#P````\````)R8``"B````H@```*(```"B````H@```)R8``!2````4@``
+M`%(```!2````4@```)R8``#4````U````-0```#4````U````)R8``#,%```
+MS!0``,P4``#,%```S!0``)R8``",!```C`0``(P$``",!```C`0``,28```#
+M`````P````,````#`````P```.A*`0#M2@$`U$H!`-A*`0#H2@$`Z$H!`-Q*
+M`0#@2@$````````````P````%0```!4````5````%0```!4````<@```IY.-
+M$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H```(%`0`""@$``@HTF```
+M``X````.````#@````X````.```XF````@````(````*````"@````H```!(
+MF```;=H8`&W:&`!D:AH`9&H:`&1J&@!0F```X+3H#>"TZ`W:L.@-VK"8#-JP
+MZ`U8F```+@V`?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F`Y
+M,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```
+MF`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````
+M```````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L`$`!
+M+`!`P4(`0,%"`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@P$@``X`,`
+M`&"````/````&($````````<@0```````""!````````)($````````H@0``
+M`````"R!````````,($````````T@0```````#B!````````/($```````!`
+M@0``J```@$2!````````+)@```"@```\F`````0@`$R8```\(X02<)@``!\`
+M``!TF```@````'B8```.````@)D```````"$F0````"``J"9````````X)D`
+M``````#DF0``JJJJJNB9``!X9$8\[)D``*H```#PF0``#````/29``#_````
+M^)D``!0````HH@``M0D``#RB``"OB<B33*(```$```!0H@```*```%2B````
+M````6*(``(!3QPQ<H@```0\/#V"B```!#VE?9*(``!&*00!HH@```````&RB
+M``!JP3`,<*(``"`(@@!TH@``JGP;`'BB``#..><<?*(``,X!%P4`HP`````!
+M&`2C```")@,P"*,```8^!T@,HP``"DP+5A"C```/8!ID%*,``!MN3W@8HP``
+M6GR/AARC``!;AL^.(*,```^73YTDHP``CZ'/I2BC```?KU^U+*,``)^YW[TP
+MHP``/\=_S32C``"_T?_5.*,````````\HP```````$"C````````1*,`````
+M``!(HP``____/TRC``#___\_4*,``/___S]4HP``__\#`%BC```?JJAY7*,`
+M``]";`9@HP``!R(H#V2C``"%%F`7:*,```01@!]LHP```PR@-W"C``"#",0_
+M=*,```,(P%=XHP``@@;87WRC``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!
+M````")L```(````,FP```P```!";```$````%)L```4````8FP``"````!R;
+M```)````()L```H````DFP``"P```"R;```-````,)L``!`````TFP``$0``
+M`#R;```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D```!0FP``
+M&@```%2;```;````6)L``!P```!<FP``'0```&";```@````:)L``"(```!L
+MFP``(P```'";```D````=)L``"4```!XFP``*````'R;```I````@)L``"H`
+M``"$FP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R````H)L`
+M`#0```"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;```U````
+MN)L``#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0```,R;```U
+M````T)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``-0```.2;
+M```U````Z)L``#4```#LFP``-0```/";```U````])L``#4```#XFP``$```
+M`/R;```:`````````````````````````````````````)H`````````````
+M!)H```````!`````")H```````"`````#)H```````"!`0``$)H```````#!
+M`0``%)H````````!````&)H```````!!````')H```````"!````()H`````
+M``!H`0``))H```````"H`0``*)H```````#H`0``+)H````````H````,)H`
+M``````!H````-)H```````")`0``.)H```````#)`0``/)H````````)````
+M0)H```````!)````1)H```````")````2)H```````"0`0``3)H```````#0
+M`0``4)H````````0````5)H```````!0````6)H```````"0````7)H`````
+M``"1`0``8)H```````#1`0``9)H````````1````:)H```````!1````;)H`
+M``````"1````<)H```````!X`0``=)H```````"X`0``>)H```````#X`0``
+M?)H````````X````@)H```````!X````A)H```````"9`0``B)H```````#9
+M`0``C)H````````9````D)H```````!9````E)H```````"9````F)H`````
+M``#9````G)H```````#Y````H)H```````#Y````I)H```````#Y````J)H`
+M``````#Y````K)H```````#Y````L)H```````#Y````M)H```````#Y````
+MN)H```````#Y````O)H```````#Y````P)H```````#Y````Q)H```````#Y
+M````R)H```````#Y````S)H```````#Y````T)H```````#Y````U)H`````
+M``#Y````V)H```````#Y````W)H```````#Y````X)H```````#Y````Y)H`
+M``````#Y````Z)H```````#Y````[)H```````#Y````\)H```````#Y````
+M])H```````#Y````^)H```````#Y````_)H```````#Y````U)@``"````#0
+MF```"!0``@@4`0((%``""!0``@@4`0+<F```P""@`,`@H`#`(.``P"#@`,`@
+MX````````````)R8``````#P````\````/````#P````\)R8````````````
+M`````````````````)R8```````#`````P````,````#`````YR8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8`````$!```!`0```0$```$!```!`
+M0)R8``````5E```%90``!64```5E```%99R8````````````````````````
+M`````)R8`````````````````````````````)R8`````$(```!"````0@``
+M`$(```!"`)R8`````+4```"U````M0```+4```"U`)R8``````,````#````
+M`P````,````#`)R8`````/<```#W````]P```/<```#W`)R8`````)T```"=
+M````G0```)T```"=`)R8`````"(````B````(@```"(````B`)R8`````"($
+M```B!```(@0``"($```B!)R8```8`",`&``C`!@`(P`8`",`&``C`)R8````
+M`"@````H`&``*`!@`"@`8``H`)R8``#``%``P`!0`,,`4`##`%``PP!0`)R8
+M``!_``0`?P`$`'\`!`!_``0`?P`$`)R8``!8!```6`0``%@$``!8!```6`0`
+M`)R8`````````````````````````````)R8````P````,````#`````P```
+M`,```-B8```P`D``,`)``#`"0``P`D``,`)`````````````````````````
+M`````````)R8````9````&0```!D````9````&0``)R8````"`````@````(
+M````"`````@``,R8```.````#@````X````.````#@```/1B`0#Y8@$`Y&(!
+M`.AB`0#T8@$`]&(!`.QB`0#P8@$`05(U,C$P`$%2-3(Q,0!!4C4R,3(`4D8U
+M,3$Q`%)&-3$Q,@!21C(T,3,`071H97)O<R`R,S$S(%=I4V]#`$%T:&5R;W,@
+M-3(Q,B`H1E!'02D`071H97)O<R`U,C$Q("A&4$=!*0!!=&AE<F]S(#4R,3``
+M071H97)O<R`U,C$Q`$%T:&5R;W,@-3,Q,B!7:5-O0P!!=&AE<F]S(#4R,3(`
+M1$(`1$5"54<`3D$`3D]?0T]53E1265]3150`04P`04Q"04Y)00!$6@!!3$=%
+M4DE!`$%2`$%21T5.5$E.00!!30!!4DU%3DE!`$%5`$%54U1204Q)00!!5`!!
+M55-44DE!`$%:`$%:15)"04E*04X`0D@`0D%(4D%)3@!"60!"14Q!4E53`$)%
+M`$)%3$=)54T`0EH`0D5,25I%`$)/`$)/3%9)00!"4@!"4D%:24P`0DX`0E)5
+M3D5)($1!4E534T%,04T`0D<`0E5,1T%224$`0T$`0T%.041!`$-,`$-(24Q%
+M`$-.`$-(24Y!`$-/`$-/3$]-0DE!`$-2`$-/4U1!(%))0T$`2%(`0U)/051)
+M00!#60!#65!255,`0UH`0UI%0T@@4D5054),24,`1$L`1$5.34%22P!$3P!$
+M3TU)3DE#04X@4D5054),24,`14,`14-5041/4@!%1P!%1UE05`!35@!%3"!3
+M04Q6041/4@!%10!%4U1/3DE!`$9)`$9)3DQ!3D0`1E(`1E)!3D-%`$8R`$92
+M04Y#15]215,`1T4`1T5/4D=)00!$10!'15)-04Y9`$=2`$=2145#10!'5`!'
+M54%414U!3$$`2$X`2$].1%5205,`2$L`2$].1R!+3TY'`$A5`$A53D=!4ED`
+M25,`24-%3$%.1`!)3@!)3D1)00!)1`!)3D1/3D5324$`25(`25)!3@!)10!)
+M4D5,04Y$`$E,`$E34D%%3`!)5`!)5$%,60!*4`!*05!!3@!*,0!*05!!3C$`
+M2C(`2D%004XR`$HS`$I!4$%.,P!*-`!*05!!3C0`2C4`2D%004XU`$I/`$I/
+M4D1!3@!+6@!+05I!2TA35$%.`$M0`$Y/4E1(($M/4D5!`$M2`$M/4D5!(%)%
+M4%5"3$E#`$LR`$M/4D5!(%)%4%5"3$E#,@!+5P!+55=!250`3%8`3$%45DE!
+M`$Q"`$Q%0D%.3TX`3$D`3$E%0TA414Y35$5)3@!,5`!,251(54%.24$`3%4`
+M3%5814U"3U521P!-3P!-04-!50!-2P!-04-%1$].24$`35D`34%,05E324$`
+M35@`345824-/`$U#`$U/3D%#3P!-00!-3U)/0T-/`$Y,`$Y%5$A%4DQ!3D13
+M`$Y:`$Y%5R!:14%,04Y$`$Y/`$Y/4E=!60!/30!/34%.`%!+`%!!2TE35$%.
+M`%!!`%!!3D%-00!010!015)5`%!(`%!(24Q)4%!)3D53`%!,`%!/3$%.1`!0
+M5`!03U)454=!3`!04@!054525$\@4DE#3P!100!1051!4@!23P!23TU!3DE!
+M`%)5`%)54U-)00!300!3055$22!!4D%"24$`4T<`4TE.1T%03U)%`%-+`%-,
+M3U9!2R!215!50DQ)0P!320!33$]614Y)00!:00!33U542"!!1E))0T$`15,`
+M4U!!24X`4T4`4U=%1$5.`$-(`%-7251:15),04Y$`%-9`%-94DE!`%17`%1!
+M25=!3@!42`!42$%)3$%.1`!45`!44DE.241!1"`F(%1/0D%'3P!43@!454Y)
+M4TE!`%12`%154DM%60!500!52U)!24Y%`$%%`%5.251%1"!!4D%"($5-25)!
+M5$53`$="`%5.251%1"!+24Y'1$]-`%53`%5.251%1"!35$%415,`55D`55)5
+M1U5!60!56@!56D)%2TE35$%.`%9%`%9%3D5:545,00!63@!62454($Y!30!9
+M10!914U%3@!:5P!:24U"04)710`E<SH@<&AY0VYT,2`P>"5X+"!R97-E='1I
+M;F<@8V]U;G1E<B!V86QU92!T;R`P>"5X"@``)7,Z('!H>4-N=#(@,'@E>"P@
+M<F5S971T:6YG(&-O=6YT97(@=F%L=64@=&\@,'@E>`H````````P+CDN,30N
+M.0``````````!P````X````5````'````",`````````````````````````
+M````````````````)!.($Q$`B!/L$Q$`'A2"%`\`@A3F%!(`7A5=%A0`71;!
+M%A0`P1;:%A<`C!2@%+04R!0\%%`49!1X%```,A1&%%H4;A0``&P)A0F>"8H)
+MJ`D``&P)A0F>"8H)``!L"84)G@F*"0``;`F%"9X)B@D``'$6A1:9%JT6P18`
+M`%H4@A2J%```@!:H%@``?!60%:05N!7,%>`5]!4(%AP6,!9$%@``<0EV"7L)
+M@`F/"90)F0FC"0``<0EV"7L)@`F/"90)F0D``'$)=@E["8`)CPF4"9D)``!Q
+M"78)>PF`"8\)E`F9"0``M`D``(4)```\%%`49!1X%``````!````:@````$`
+M``!\````!````(8````$````D@````0```"<````!````*8````!````L```
+M``(```"\`````@```,0````!````R@````0```#B````!````/0````$````
+M!`$```0````4`0``!````"0!```@````*`$``#(41A1:%&X4``!:%((4JA2`
+M%J@6``!\%9`5I!6X%<P5X!7T%0@6'!8P%D06````````````````````````
+M`````````````&````"H"0```0```*,)```!````M`D```$```!G````J`D`
+M``$```"C"0```0```+0)```!````80```*@)```!````HPD```$```"T"0``
+M`0```&4```"H"0```0```*,)```!````M`D```$```!*````J`D```````"C
+M"0```````+0)```!````2P```*@)```!````HPD```$```"T"0```0```&H`
+M``"H"0```0```*,)```!````M`D```$`````````````````````````````
+M````````````"```````````````````````````````````````````````
+M`0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(``````0)01@X`)`(`
+M`````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0``````0+PT@P`
+M;`0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````@```````````````````````````````````````````````$#
+M<!<+`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"````
+M``$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(```````````````````````````````````````````````!`G`7
+M"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!
+M`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````````0-P%PL`
+MC````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`
+M70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``0```````````````````````````````````````````````$`Z`,+`((`
+M``````$`T`<*!(0!``````$`?!4)!(L!``````$`^"H(!)8!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````$
+MH@`````````````(H@``1D8^4$9&/E`,H@``;$&`9&Q!@&00H@```Z"9`0.@
+MF0$4H@``$-9,!!#63`08H@``0`"`$T``@!,<H@``8`#@&V``X!L@H@``"H!3
+M#`J`4PPDH@``.]\4`#O?%``HH@``M0$``+4!```LH@``(````"````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````"<F```````````
+M``"<F`````````````"<F`````````````"<F`````````````"<F``````X
+M````.`"<F`````````````"<F`````````````"<F`````````````"<F```
+M^0`$`/D`!`#4F`````````0`````````````````````````G)@`````````
+M````G)@`````````````G)@`````````````G)@`````````````G)@`````
+M````````G)@``````!`````0G)@```````0````$G)@`````````````G)@`
+M````````````G)@`````````````G)@````````````*G)@``(``.`"``#@"
+MG)@```8``@`&````G)@``)(```"2````G)@``*````"@````G)@```<`!``'
+M``0`U)@``!H````:````G)@``$@```!(````G)@``!`````0````G)@```@`
+M```(````G)@```\````/````G)@``/(```!B````G)@``$^0``!,D```G)@`
+M`%H2``":$@``S)@```X````/```````````````````````````````(````
+M```````````````````````````````````````````!`G`7"P",```````!
+M`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!="0"P!```
+M```!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````````0-P%PL`C````````0,H
+M(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0`````
+M`0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````0`````````
+M``````````````````````````````````````$`Z`,;`((```````$`T`<:
+M!(0!``````$`?!49!(L!``````$`^"H8!)8!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````,````````````
+M```````````````````````````````````!`.@#&P`"```````!`-`'&@0$
+M`0`````!`'P5&00+`@`````!`/@J&`06`P```````G`7"P`,!````````B@C
+M#P`2!``````!`N`N"@`8!@`````!`E!&#@`D!@`````!`L!="0`P"``````!
+M`J",#0!("``````!`H"["`!@"``````!`O#2#`!L"```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````#```````````````
+M`````````````````````````````````03T`0<`@0```````03H`P(`BP$`
+M`````030!P8`E@(``````02X"P$`E@,``````0)P%PL`C`0``````0(H(P\`
+M$@0``````0+@+@H`F`8``````0)01@X`)`8``````0+`70D`L`@``````0*@
+MC`T`2`@``````0*`NP@`8`@``````0+PT@P`;`@`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!'0T,Z("A'3E4I(#,N
+M-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E
+M94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P
+M,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```
+M1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.
+M52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR
+M(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)3
+M1%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P
+M-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#
+M.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@
+M,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&
+M<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@
+M,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X
+M``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H
+M1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT
+M+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E
+M0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P
+M-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'
+M0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5
+M*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@
+M6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$
+M72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W
+M,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z
+M("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S
+M+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R
+M965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R
+M,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@`
+M`$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'
+M3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N
+M,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"
+M4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T
+M,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#
+M0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I
+M(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;
+M1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=
+M(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R
+M.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@
+M*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N
+M-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E
+M94)31%T@,C`P-#`W,C@``"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E
+M;"YT97AT`"YR96PN<F]D871A`"YR;V1A=&$N<W1R,2XQ`"YR;V1A=&$N<W1R
+M,2XT`"YR96PN9&%T80`N8G-S`"YC;VUM96YT````````````````````````
+M`````````````````````````````````!\````!````!@`````````T````
+M8FP!````````````!``````````;````"0``````````````9#("`/`6```,
+M`````0````0````(````*0````$````"`````````*!L`0`(=P``````````
+M```@`````````"4````)``````````````!420(`$!D```P````#````!```
+M``@````Q`````0```#(`````````J.,!`,P%``````````````$````!````
+M0`````$````R`````````'3I`0!G```````````````$`````0```%,````!
+M`````P````````#@Z0$`Y!8`````````````(`````````!/````"0``````
+M````````9&("`+`````,````!P````0````(````60````@````#````````
+M`.```@"P`0`````````````@`````````%X````!``````````````#@``(`
+MRP8``````````````0`````````1`````P``````````````JP<"`&<`````
+M``````````$``````````0````(``````````````$0*`@"@%P``#0````@`
+M```$````$`````D````#``````````````#D(0(`@!```````````````0``
+M`````````````````````````````````````````````P`!````````````
+M``````,``P`````````````````#``4``````````````````P`&````````
+M``````````,`!P`````````````````#``D``````````````````P`*``$`
+M``#0B0``J````!(``0`,````1'L```8````2``$`%P```)#O``"[````$@`!
+M`"(```!P80``=````!(``0`M````_.4``(\````2``$`.````'17``#;````
+M$@`!`$,```"H,P$`Y````!(``0!.````X`(``*0!```1``<`60```#CS```C
+M````$@`!`&0```!H60``,0```!(``0!O````E$X``#P````2``$`>@```(3L
+M```E````$@`!`(4```!4Z0``$P```!(``0"0````V-\```P````2``$`FP``
+M`/C-``"Z````$@`!`*8```!\U@``Y0```!(``0"Q````7`@``#P````2``$`
+MO````(3"``"6````$@`!`,<````TK0``BP```!(``0#2````')L```L````2
+M``$`W0```!A_```E````$@`!`.@````@\@``!@```!(``0#S````C,T```8`
+M```2``$`_@```$C>```7````$@`!``D!``!8_@``>P```!(``0`4`0``#`8`
+M`'4````2``$`'P$```R-```&````$@`!`"H!``#()@$`=0```!(``0`U`0``
+M"((```8````2``$`0`$``"B;```/````$@`!`$L!``!`#@``I`$``!$`!P!6
+M`0``/.L``'0````2``$`80$```R```!N````$@`!`&P!``"\`@``+````!(`
+M`0!W`0``N"@!`%@````2``$`@@$``*BK```A````$@`!`(T!````````````
+M`!````"N`0``B%X``$$````2``$`N0$``/3$``"6````$@`!`,0!``!88```
+M)````!(``0#/`0``Z)(``$@````2``$`V@$``!R6``!X````$@`!`.4!``#(
+MQ0``.0```!(``0#P`0``$((``&$````2``$`^P$``,A=```S````$@`!``8"
+M``"(>P``.0```!(``0`1`@``9)@``$H````2``$`'`(``+#K```@````$@`!
+M`"<"``"\Z@``8````!(``0`R`@``Z/X``#<````2``$`/0(``+C.``!7````
+M$@`!`$@"``!@60``!@```!(``0!3`@``T.L``'@````2``$`7@(```A0``#(
+M!0``$@`!`&D"```(EP``'@$``!(``0!T`@``J.<``"8````2``$`?P(``&@"
+M``!3````$@`!`(H"```<ZP``(````!(``0"5`@``O!<!``(!```2``$`H`(`
+M`!CR```&````$@`!`*L"``!@W0``+````!(``0"V`@``G,\``/$````2``$`
+MP0(```!@```9````$@`!`,P"``!(C0``FP```!(``0#7`@``O)$``'L````2
+M``$`X@(``*1Z```A````$@`!`.T"``!,'`$`B````!(``0#X`@``A'```/(!
+M```2``$``P,``*AB```!````$@`!``X#``#4'`$`2````!(``0`9`P``X'P`
+M`#4"```2``$`)`,``!@!``!0`0``$@`!`#,#``"L"0$`Y@(``!(``0`^`P``
+M*/(``(<````2``$`20,``-R6```1````$@`!`%0#```4&P$`.`$``!(``0!?
+M`P``X.T``,X````2``$`:@,``+SR```/````$@`!`'4#````E```#@```!(`
+M`0"``P``!,8``-\````2``$`BP,``(S%```Y````$@`!`)8#```(IP``4P``
+M`!(``0"A`P``T%4``!`````2``$`K`,``!Q@```[````$@`!`+<#``#H`@``
+M*`$``!(``0#-`P``(`,!`"$````2``$`V`,``'2"``"6````$@`!`.,#``!0
+M80``(````!(``0#N`P``Y(L``!8````2``$`^0,``-3^```2````$@`!``0$
+M``"@LP``*@```!(``0`/!```G.$``((#```2``$`&@0``"C?```+````$@`!
+M`"4$```X6@``B````!(``0`P!```Q(H``#@````2``$`.P0``-PJ`0`]````
+M$@`!`$8$```8X```^````!(``0!1!```P)8```$````2``$`7`0``"!>``!E
+M````$@`!`&<$```PD0``BP```!(``0!R!```E,0``%\````2``$`?00``)#0
+M``"G!0``$@`!`(@$``!L&@$`I@```!(``0"3!```-.D```8````2``$`G@0`
+M`$"0```A````$@`!`*D$``#4\P``5P```!(``0"T!```;"4!`/4````2``$`
+MOP0``)B<``!%````$@`!`,H$```X70``*0```!(``0#5!```2.P``",````2
+M``$`X`0``#C6``!!````$@`!`.L$```,S```'P```!(``0#V!```$"D!`#X`
+M```2``$``04``!#R```&````$@`!``P%`````````````!`````9!0``@'P`
+M`&`````2``$`)`4``!AG``!%````$@`!`"\%``"P*0$`"P```!(``0`Z!0``
+M!.@``'<````2``$`104``&P$``#%````$@`!`%8%``!4'P$`\P,``!(``0!A
+M!0``?&```$0````2``$`;`4``+"```"/````$@`!`'<%``!HZ0``$0```!(`
+M`0""!0``C#0!`'$````2``$`C04``)!F``!7````$@`!`)@%```4C0``,0``
+M`!(``0"C!0``%*D``"`!```2``$`K@4``,AZ``!Y````$@`!`+D%````$```
+MI`$``!$`!P#$!0``K/0``#@````2``$`SP4``$SP```L````$@`!`-H%``!X
+MB@``2@```!(``0#E!0``X)P``.4````2``$`\`4``*SL```T`0``$@`!`/L%
+M```,E0``7````!(``0`&!@``R)8``!,````2``$`$08``+#N``#@````$@`!
+M`!P&``!D'0$``0$``!(``0`G!@``'"L!`%0$```2``$`,@8``"B8```Z````
+M$@`!`#T&``#$6```"P```!(``0!(!@``_(H``.@````2``$`4P8``!S;``!*
+M````$@`!`%X&``#LY@``)P```!(``0!I!@``,&,``"0````2``$`=`8``,!K
+M`0"B````$@`!`'\&``"XZ```.````!(``0"*!@``P!$``*0!```1``<`E08`
+M`(S,``!E````$@`!`*`&```XFP``#P```!(``0"K!@``8&<``"T!```2``$`
+MM@8``#SE```A````$@`!`,$&```4YP``E````!(``0#,!@``U%8``&@````2
+M``$`UP8``,@I`0`3`0``$@`!`.(&```P;P``%````!(``0#M!@``>&4```\`
+M```2``$`^`8``!Q?``"J````$@`!``,'``#X9@``'0```!(``0`.!P``C.8`
+M`%\````2``$`&0<``+```0#Q`0``$@`!`"0'``#TS```!@```!(``0`O!P``
+MX",!`%L````2``$`.@<```1E```C````$@`!`$4'``!@!@``I`$``!$`!P!0
+M!P``P%H``(P!```2``$`6P<``$Q[```Y````$@`!`&8'``#H9@``#@```!(`
+M`0!Q!P`````````````0````D0<``)!H```P!@``$@`!`)P'````````"0``
+M`!$`!P"L!P``-`4``'4````2``$`O0<``#B2```J````$@`!`,@'``!DUP``
+M4@```!(``0#3!P``X.<``"(````2``$`W@<``*QB```!````$@`!`.D'``"X
+ME@``!@```!(``0#T!P``G)H```L````2``$`_P<``.2-``"(````$@`!``H(
+M``"4Z0``'@$``!(``0`5"```W&0```8````2``$`(`@`````````````$```
+M`"\(``"0D@``,P```!(``0`Z"```_/$``!0````2``$`10@``.3Q```6````
+M$@`!`%`(``!HVP``.````!(``0!;"```P&X``&X````2``$`9@@``(B5``!T
+M````$@`!`'$(```\Z0``%P```!(``0!\"```--\``*(````2``$`AP@``&SL
+M```7````$@`!`)((``#8DP``)@```!(``0"="```5/0``%8````2``$`J`@`
+M`"`R`0"%`0``$@`!`+,(``!LC@``N`$``!(``0"^"````&8``!<````2``$`
+MR0@``,"0``!`````$@`!`-0(``"L=```'P```!(``0#?"```?/,``%<````2
+M``$`Z@@``&22```L````$@`!`/4(``!8DP``@````!(``0``"0``R%\``"8`
+M```2``$`"PD``&`C`0`?````$@`!`!8)`````````````!`````E"0``:%P`
+M`"$````2``$`,`D``*#E``!9````$@`!`#L)```@"```I`$``!$`!P!&"0``
+M=)P```X````2``$`40D``/R+``!@````$@`!`%P)``#D````,P```!(``0!J
+M"0``)%T``!(````2``$`=0D``*`$``"D`0``$0`'`(`)```<G```5P```!(`
+M`0"+"0``7(P```L````2``$`E@D```P````<````$0`'`*@)``#,7@``'```
+M`!(``0"S"0``Y-\``#0````2``$`O@D``%AD``!X````$@`!`,D)```P-@$`
+M#`(``!(``0#4"0``T&0```L````2``$`WPD```CS```M````$@`!`.H)``"8
+M20``F0```!(``0#U"0``2",!`!8````2``$```H``,2;``!7````$@`!``L*
+M``"4E@``(P```!(``0`6"@``W/(``"D````2``$`(0H``"S,```>````$@`!
+M`"P*```<'0$`2````!(``0`W"@``_)4``"`````2``$`0@H``$"!```&````
+M$@`!`$T*``#$"`$`L0```!(``0!8"@``:(P``*(````2``$`8PH``)3-``!A
+M````$@`!`&X*``#@"0``I`$``!$`!P!Y"@``Z&4``!<````2``$`A`H``+PI
+M`0`*````$@`!`(\*``!H6```7````!(``0":"@``*&4``$,````2``$`I0H`
+M`,3'```M!```$@`!`+`*``#D8@``2@```!(``0"["@``L)H```8````2``$`
+MQ@H``*#;```X`0``$@`!`-$*``"$G```$@```!(``0#<"@``L$L``#<````2
+M``$`YPH``.3=``!B````$@`!`/(*``"8"@``;P```!(``0#]"@``J)H```8`
+M```2``$`"`L``!`'``!+`0``$@`!`!,+```TW0``*@```!(``0`>"P``!&(`
+M`'@````2``$`*0L``&QE```+````$@`!`#0+``#DE```*````!(``0`_"P``
+M(!8!`'8````2``$`2@L``)Q=```L````$@`!`%4+``!X"0$`-````!(``0!@
+M"P``$`0``%L````2``$`:PL``&#E``!`````$@`!`'8+`````````````!``
+M``"&"P``S+,``(0!```2``$`D0L``%!8```6````$@`!`)P+``!D)@$`8@``
+M`!(``0"G"P``_%T``"0````2``$`L@L``!#A``",````$@`!`+T+``"@E```
+M1````!(``0#("P``_,P``(X````2``$`TPL`````````````$````/,+``"$
+M!@``B@```!(``0#^"P``C%P``$T````2``$`"0P``-Q<``!`````$@`!`!0,
+M````D0``+P```!(``0`?#```G%D``)L````2``$`*@P``#"3```G````$@`!
+M`#4,``"XUP``H0(``!(``0!`#```\)8``!4````2``$`2PP``.3T```1`0``
+M$@`!`%8,``!,7```'````!(``0!A#``````````````0````;PP``"20```<
+M````$@`!`'H,``#\"```4P```!(``0"%#```L&(``#(````2``$`D`P``*2;
+M```?````$@`!`)L,``"PF```+````!(``0"F#```O&\``,@````2``$`L0P`
+M`!AF```?````$@`!`+P,``#H7@``-````!(``0#'#```(.4``!P````2``$`
+MT@P``,SR```/````$@`!`-T,``#$D@``)````!(``0#H#```P-T``"0````2
+M``$`\PP``+@$`0`+!```$@`!`/X,``#`8```+@```!(``0`)#0``\%\```X`
+M```2``$`%`T``,":``!;````$@`!`!\-```\)`$`+0$``!(``0`J#0``$)0`
+M`!D````2``$`-0T``$B!``#`````$@`!`$`-``!DD```60```!(``0!+#0``
+MQ)8```$````2``$`5@T``,1[``"[````$@`!`&$-``"`$P``I`$``!$`!P!L
+M#0``/%<``#@````2``$`=PT``-!8``".````$@`!`((-``",W0``,P```!(`
+M`0"-#0``G"@!`!L````2``$`F`T``+3J```&````$@`!`*,-``!HE```.```
+M`!(``0"N#0``N)H```8````2``$`N0T``&`5`0#`````$@`!`,0-```0F@``
+MC````!(``0#/#0``R)T``"L)```2``$`V@T``$`5``"D`0``$0`'`.4-``!D
+M70``-0```!(``0#P#0``K`4``%T````2``$`^PT``$`G`0!:`0``$@`!``8.
+M``#<'@$`=@```!(``0`1#@``Y&0``!X````2``$`'`X``(AE```/````$@`!
+M`"<.``!HE0``(````!(``0`R#@``L/(```L````2``$`/0X``)AE``!-````
+M$@`!`$@.``#D80``(````!(``0!3#@``Y(<``!`````2``$`7@X``%`)``!'
+M`0``$@`!`&D.``"TS@```0```!(``0!T#@``0'\``$H````2``$`?PX``'2;
+M```7````$@`!`(H.``"@8@``!@```!(``0"5#@``6,<``&L````2``$`H`X`
+M`%SS```?````$@`!`*L.````1P$`H@```!(``0"V#@``?&(``",````2``$`
+MP0X``%A/``!`````$@`!`,P.``"T10``X@,``!(``0#B#@``+/0``"<````2
+M``$`[0X``#AF``!7````$@`!`/@.``#X]0``7@@``!(``0`##P``8-X``,8`
+M```2``$`#@\``$S,```]````$@`!`!D/``",FP``%P```!(``0`D#P``C'\`
+M`'T````2``$`+P\``&@X``!\````$@`!`#H/``!$;P``=P```!(``0!%#P``
+M2)L``"D````2``$`4`\``/2F```2````$@`!`%L/```\5@``E@```!(``0!F
+M#P``#(,```$````2``$`<0\``/!@``!@````$@`!`'P/``"8P0``/P```!(`
+M`0"'#P``</$``'0````2``$`D@\``/#H``!$````$@`!`)T/```LE```.P``
+M`!(``0"H#P``:(,``'H$```2``$`LP\``'!W``"Y`@``$@`!`+X/``!\Z0``
+M%0```!(``0#)#P``],L``!8````2``$`U`\``'1<`0"J````$@`!`-\/``"P
+M3```D````!(``0#J#P``?.@``#L````2``$`]0\``-C<``!9````$@`!```0
+M```@_P``C@$``!(``0`+$```@",!`!X````2``$`%A```%S:``"^````$@`!
+M`"$0`````````````!`````P$```'%T```8````2``$`.Q```'R````S````
+M$@`!`$80``#0YP``#@```!(``0!1$```7*<``+@!```2``$`7!```-!.``"&
+M````$@`!`'40``"@(P$`/0```!(``0``>GHP,#5B-3@T-@!Z>C`P,F1B,3%C
+M`'IZ,#)D8F8X-S4`>GHP,F1B8C%B,@!Z>C`P,F1B-#8P`'IZ,&(W8C@S-C@`
+M>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#DT8V0P-`!Z
+M>C`P,3EF-#<P`'IZ,#)D8F4W,V0`>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ
+M,#`U8C@U,V0`>GHP,#$V9#DR90!Z>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP
+M,F1A8F)A8P!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,F1B-6)F,`!Z>C`Q
+M-F4Q9&9D`'IZ,&(W,&4Y.&,`>GHP-F4P9C9C,@!Z>C`P-C=D,F(Q`'IZ,&(V
+M8V$S,C4`>GHP,#5B-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F-C@`>GHP,#5B
+M-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`>GHP,S-E8SAB9@!Z>C!D8C1C
+M.31D`'IZ,#)D8C-B86,`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I
+M;64`>GHP,&(V9C$V,0!Z>C!D8S4X-S$X`'IZ,&1B,#DQ,&4`>GHP,&(V93(W
+M80!Z>C`R9&)B86(R`'IZ,&(V9#%E9F8`>GHP,#5B-C1F9`!Z>C`P,&(V9#4R
+M`'IZ,&(V8SEE9F8`>GHP,F1B9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`
+M>GHP,#!B-F0Q9`!Z>C`P8C9D-#4P`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z
+M>C`P,#5B-C,R`'IZ,#9D9C)F-3<`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ
+M,#!B-F0Y,C,`>GHP,#)D8C4Q8P!Z>C`Q-F1A-V8P`'IZ,#$V9&-B9F4`>GHP
+M,#$V9&5C,0!Z>C`P,39D9C)C`'IZ,&(X,30V,3(`>GHP,39D.3DR,`!Z>C`R
+M9&(Q8F%C`'IZ,&1C-S@W,3@`>GHP-6(W,#%E,`!Z>C`P,&(V8C$P`'IZ,&(W
+M,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93$T9&0Q`'IZ
+M,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,&(V9C(S`'IZ,#$V93(Y,60`>GHP
+M,#!B-F9E.`!Z>C`P,39D.30X`'IZ,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P
+M,&(V8SED`'IZ,#`P-6(U83(`>GHP,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T
+M>'1I;64`>GHP,F1B-6)A8P!Z>C`P-6(X,3-D`'IZ,#!B-F,Y,C,`>GHP8C9C
+M93DX8P!Z>C`P-6(W9CED`'IZ,&(W,#%D,#(`>GHP-F4P-#8P90!Z>C`R9&(U
+M-S8S`'IZ,#9F,C,R8V,`>GHP93`W.#,W.0!Z>C`P,F1A9C8R`'IZ,&(X-30V