From rik@hanoi.cronyx.ru Thu Mar 7 03:53:12 2002 Return-Path: Delivered-To: murray@stokely.org Received: from hanoi.cronyx.ru (hanoi.cronyx.ru [144.206.181.53]) by mao.stokely.org (Postfix) with ESMTP id DEEC84B6A6 for ; Thu, 7 Mar 2002 03:53:04 -0800 (PST) Received: by hanoi.cronyx.ru id OAA24762 for murray@stokely.org.checked; (8.9.3/vak/2.1) Thu, 7 Mar 2002 14:50:12 +0300 (MSK) (envelope-from rik@hanoi.cronyx.ru) From: rik@hanoi.cronyx.ru Received: by hanoi.cronyx.ru id OAA24725; (8.9.3/vak/2.1) Thu, 7 Mar 2002 14:49:24 +0300 (MSK) (envelope-from rik@hanoi.cronyx.ru) Date: Thu, 7 Mar 2002 14:49:24 +0300 (MSK) Message-Id: <200203071149.OAA24725@hanoi.cronyx.ru> To: undisclosed-recipients:; Hi, I just find some spare time to check 5.x kernel and made first part of the patch. This patch for Tau-PCI only. Netgraph and support of modules wasn't tested. Now I get back to work with FreeBSD code and will have more time for revision of the our current code for 5.x branch. Best regards, Roman Kurakin diff -u -r -P -N src-old/etc/MAKEDEV src/etc/MAKEDEV --- src-old/etc/MAKEDEV Wed Mar 6 20:02:33 2002 +++ src/etc/MAKEDEV Wed Mar 6 19:45:36 2002 @@ -153,6 +153,7 @@ # agpgart AGP interface # cfs* Coda Distributed Filesystem # nsmb* SMB/CIFS protocol interface +# cp* Control devices for Cronyx/Tau-PCI adapters # if [ -n "$MAKEDEVPATH" ]; then @@ -340,6 +341,7 @@ sh $0 i4brbch0 i4brbch1 # ISDN sh $0 agpgart # AGP sh $0 nsmb0 # SMB/CIFS + sh $0 cp # Cronyx adapters ;; # a much restricted set of the above, to save precious i-nodes on the @@ -1736,6 +1738,22 @@ mknod nsmb$unit c 144 $unit ;; +cp*) + unit=`expr $i : 'cp\(.*\)'` + mkdir -p /dev/serial + if [ ! "$unit" ]; then + for unit in 0 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15\ + 16 17 18 19 20 21 22 23 24 + do + mknod /dev/serial/${i}${unit} c 134 $unit + chmod 644 /dev/serial/${i}${unit} + done + else + mknod /dev/serial/${i} c 134 $unit + chmod 644 /dev/serial/${i} + fi + ;; + local) umask 0 # XXX should be elsewhere sh $0.local diff -u -r -P -N src-old/sbin/Makefile src/sbin/Makefile --- src-old/sbin/Makefile Wed Mar 6 20:00:05 2002 +++ src/sbin/Makefile Wed Mar 6 17:10:42 2002 @@ -72,6 +72,7 @@ routed \ rtsol \ savecore \ + sconfig \ shutdown \ slattach \ spppcontrol \ diff -u -r -P -N src-old/sbin/sconfig/Makefile src/sbin/sconfig/Makefile --- src-old/sbin/sconfig/Makefile Thu Jan 1 03:00:00 1970 +++ src/sbin/sconfig/Makefile Wed Mar 6 17:12:05 2002 @@ -0,0 +1,4 @@ +PROG= sconfig +MAN= sconfig.8 + +.include diff -u -r -P -N src-old/sbin/sconfig/sconfig.8 src/sbin/sconfig/sconfig.8 --- src-old/sbin/sconfig/sconfig.8 Thu Jan 1 03:00:00 1970 +++ src/sbin/sconfig/sconfig.8 Wed Oct 17 20:19:49 2001 @@ -0,0 +1,396 @@ +.Dd June 9, 2001 +.Dt SCONFIG 8 +.Os FreeBSD +.Sh NAME +.Nm sconfig +.Nd channel configuration utility for Cronyx adapters +.Sh SYNOPSIS +.Nm +.Op Fl imsefc +.Op Ar device name +.Op Ar data rate options +.Op Ar protocol options ... +.Op Ar interface options ... +.Sh DESCRIPTION +The +.Nm +utility is used for configuring the channel options of the Cronyx +adapters. In asynchronous mode all the parameters should be set by standard +.Xr stty 1 +utility, with +.Nm +you could set only few of them (see below). +.Pp +Some of the options could be set only on free channels, that is the +corresponding network interface in +.Ar down +state in the synchronous mode, and in the asynchronous mode the asynchronous +terminal device +.Pa /dev/tty* +closed. +.Pp +Other channel options could be changed +.Do on the fly +.Dc . +Generally, the channel options are set up during the operating system startup, +for example from the +.Pa /etc/rc +file. +.Pp +Note, that not all options have a sense for every particular +case, and an attempt to set some of them can hang up the channel or +the whole adapter. +.\"-------------------------------------------------------------- +.Ss "Information options" +You can specify only one of these options. If information option is specified, +sconfig will show corresponding information and will ignore all other options, +except +.Ar device name. +See also description of the +.Ar device name. +.Bl -tag -width 10n +.It +This will show settings to the channel. +.It Fl i +Print interface settings, equal to the output of +.Xr ifconfig 1 +command. +.It Fl m +Print modem signal status. The description off all signals can be found in +any document related to the modems. Only LE signal should be described. If +this signal is On, than some what use channel. If it is Off, than channel is +free. +.It Fl s +Print channel statistics. This is general statistics. See also +.Fl e +and +.Fl f +options. For the description of output see below. +.Pp +This statistics is very useful if somefing goes wrong. For example, if you +have no any interrupts, than you use interrupt that is not registered in BIOS +for use with ISA bus. +.It Fl e +Print brief E1/G703 statistics. If you select this option, you will get +statistics accumulated for period of time equal to 15 minutes. For the +description of output see below. +.It Fl f +Print full E1/G703 statistics. This option shows all E1/G703 statistics that +shows previous option( +.Fl e +), but also total statistics for whole period of time and statistics for 24 +hours (if available). For the description of output see below. +.It Fl c +Cleans all kind of statistics. +.El +.\"-------------------------------------------------------------- +.Ss "Device selection" +Device is equal to the name of the interface that is used for a name of +the interface that is sees +.Nm ifconfig. +The channel number depends on the order of loading drivers by the system. +Some times people confuse channel number and adapter number because of the +same spelling. Adapter number appears in kernel context, channel number +in configuration context. +.Bl -tag -width 10n +.It +You can omit device name only if you want to get information. This will cause +printing information about all available channels of Cronyx adapters. In the +case you want to make some settings you MUST specify device name. +.It cx## +This is the channel name for the Sigma family of Cronyx adapters. (ISA bus) +.It ct## +This is the channel name for the Tau family of Cronyx adapters. (ISA bus) +.It cp## +This is the channel name for the Tau-PCI family of Cronyx adapters. (PCI bus) +.El +.\"-------------------------------------------------------------- +.Ss "Data rate options" +.Bl -tag -width 10n +.It value +If case of nonzero value it will cause setting data rate to given value and +setting the internal clock source of the synchronization (in synchronous mode). +Zero value is equal to the +.Ar extclock. +The transmitted data (TXD) are synchronized using the internal on-board timing +generator, the internally generated timing signal is driven on the TXCOUT pin, +and the signal on the TXCIN pin is ignored. This mode is used for direct +terminal-to-terminal communication, e.g. for connecting two computers together +in a synchronous mode via relatively short cable. This method should also be +used for testing channels with an external loopback connector. +.It extclock +Set the external timing clock source of synchronous channels. External clock +mode is the most common method for connecting external modem hardware. In this +mode the external timing signal is received on TXCIN pin of the connector, +and it is used as a synchronization clock for transmitting data (TXD). +.El +.\"-------------------------------------------------------------- +.Ss "Protocol options" +Note. These option could be set only if channel is free and they requires +specifying of the device name. +.Bl -tag -width 10n +.It async +Set asynchronous protocol (or mode). In this mode Cronyx adapters behave as a +usual serial devices and you may work with them using usual serial utilities. +All asynchronous settings are performed via serial configuration utilities. With +.Nm sconfig +you may set only a few of them. See also +.Xr stty 1 . +(Only for Sigma family) +.It cisco +Set the Cisco HDLC synchronous protocol. +.It fr +Set the Frame Relay synchronous protocol. +.It ppp +Set the PPP synchronous protocol. Parameters to the PPP could be set by the +command +.Xr spppcontrol 1 . +.It keepalive=on, keepalive=off +Turns on/off sending keepalive messages. This option is used only for +synchronous PPP. If this option is on, than PPP will periodically send +echo-request messages. If it would not receive any echo-reply messages for +some (definite) period of time it will break connection. It is used for +tracking line state. +.El +.\"-------------------------------------------------------------- +.Ss "Interface options" +Not all of these options could be set on running channel and not all of them +are suits to all kind of adapters/channels. In all dual state options off is +default value. All this options is not applicable in asynchronous mode, except +debug option. +.Bl -tag -width 10n +.It port=rs232, port=v35, port=rs449 +Set port type for old Sigma models. +.It cfg=A, cfg=B, cfg=D +Set configuration for the adapter. This option could be set only for Tau/E1 +and Tau/G703 and only if all channels are not running. +.Ar cfg=A +- Two independent E1/G703 channels. This is default setting. +.Ar cfg=B +- For Tau/G703 this mean one G703 channel and one digital channel. +For Tau/E1 first physical channel divides on to subchannels. One of them +goes to the first logical channel and another one goes to the second physical +channel. Second (logical) channel is digital channel. +.Ar cfg=C +- This configuration is used only for Tau/E1. In this case first +physical channel consists of three data flows. Two of them go to two +(logical) channels. The last one goes to the second physical channel. +For the detailed description of the configutration see your documentation +to the adapter. This option could not be set on running channel. +.It loop=on, loop=off +Turn on/off internal loopback. This mode is useful for testing. Switch on this +option and try to send something. If you have no any interrupt, than, probably, +you forgot to switch using IRQ for PCI to ISA bus. Check your BIOS settings. +.It dpll=on, dpll=off +Turn on/off digital phase locked loop mode (DPLL). When enabled, the receiver +timing clock signal is derived from the received data. Must be used with NRZI +encoding, to avoid the synchronization loss. +.It nrzi=on, nrzi=off +Turn on/off nrzi encoding. In off state nrz encoding is used. NRZ - the zero +bit is transmitted by the zero signal level, the one bit - by the positive +signal level. NRZI - the zero bit is transmitted by the change of the signal +level, the one bit - by the constant signal level. Commonly is used with +dpll=on option. +.It invclk=on, invclk=off +Invert both the transmit and receive clock signals (Tau and Tau-PCI only). +.It invrclk=on, invrclk=off +Invert the receive clock signals (Tau-PCI only). +.It invtclk=on, invtclk=off +Invert the transmit clock signals (Tau-PCI only). +.It higain=on, higain=off +Turn on/off increasing the E1 receiver sensitivity to -30 dB (Tau/E1 only). +In of state the sensitivity is -12 dB. +.It phony=on, phony=off +Turn on/off the so called phony mode (Tau-PCI/E1 only, NETGRAPH required). +This mode allows to receive raw CEPT frames from E1 line. Raw frames could be +accessed via netgraph hook of adapter driver. Packets would come at rate of 500 +frames per second with length 16xN, where N is the number of timeslots. +.It use16=on, use16=off +Turn on/off the usage of 16-th timeslot for data transmission (Tau-PCI/E1 only). +Normaly 16-th timeslot is used for signaling information (multiframing CAS). +.It crc4=on, crc4=off +Turn on/off CRC4 superframe mode (E1 only). +.It syn=int, syn=rcv, syn=xrcv +.Ar int +- use an internal clock generator for G703 transmitter +(clock master). +.Ar rcv +- use the G703 receiver data clock as the transmit clock +(clock slave). +.Ar xrcv +- use the G703 receiver clock of the other channel +(Tau/E1 only). +.It ts=interval +Set up the list of timeslots to use by the channel (Tau/E1 only). The +timeslots are numbered from 1 to 31, and are separated by comma or minus sign, +giving an interval. For example: "ts=1-3,5,17". +.It pass=interval +Set up the list of timeslots, translated to the E1 subchannel in cfg=B and +cfg=C configurations (Tau/E1 only). +.It debug=0, debug=1, debug=2 +Turn on/off debug messages. +.Ar 0 +- turn off debug messages. +.Ar 1 +- turn on debug +messages, equal to the +.Ar debug +option to the +.Xr ifconfig 8 +utility. +.Ar 2 +- high intensive debug message, developers only. +.El +.\"-------------------------------------------------------------- +.Sh EXAMPLES +Set up the channel 1 for use with the HDSL modem or any other +synchronous leased-line modem, and PPP/HDLC protocol (for Sigma): +.Bd -literal -offset indent +sconfig cx1 ppp extclock +ifconfig cx1 158.250.244.2 158.250.244.1 up +.Ed +.Pp +Set up the channel 0 of Tau/E1 for use with the Cisco protocol +over E1 link, with the single virtual connection. +The DLCI number is detected automatically. +Use timeslots 1-10: +.Bd -literal -offset indent +sconfig ct0 cisco ts=1-10 +ifconfig ct0 158.250.244.2 158.250.244.1 up +.Ed +.Pp +Set up the channel 0 for the synchronous null-modem link to the nearby computer, +internal clock source, 256000 bits/sec, protocol Cisco/HDLC (for Tau): +.Bd -literal -offset indent +sconfig ct0 cisco 256000 +ifconfig ct0 200.1.1.1 200.1.1.2 up +.Ed +.Pp +Set up the channel 1 for the leased line link using data-only +null-modem cable (or modems like Zelax+ M115). Synchronous DPLL mode, 128000 +bits/sec, protocol PPP/HDLC, NRZI encoding (for Sigma): +.Bd -literal -offset indent +sconfig cx1 ppp 128000 nrzi=on dpll=on +ifconfig cx1 158.250.244.2 158.250.244.1 up +.Ed +.\"-------------------------------------------------------------- +.Sh DIAGNOSTICS +This section contains description of abbreviations used by +.Nm sconfig +while displaying various statistics. For description of options connected with +statistics see above. +.\"-------------------------------------------------------------- +.Ss Statistics +When running, the driver gathers the statistics about the channels, which +could be accessed via sconfig utility or by +.Xr ioctl 2 +call +.Ar SERIAL_GETSTAT. +.Bl -tag -width 10n +.It Rintr +The total number of receive interrupts. +.It Tintr +The total number of transmit interrupts. +.It Mintr +The total number of modem interrupts. +.It Ibytes +The total bytes received. +.It Ipkts +The total packets received (for HDLC mode). +.It Ierrs +The number of receive errors. +.It Obytes +The total bytes transmitted. +.It Opkts +The total packets transmitted (for HDLC mode). +.It Oerrs The number of transmit errors. +.El +.\"-------------------------------------------------------------- +.Ss E1/G.703 Statistics +For E1 and G.703 channels the SNMP-compatible statistics data are gathered +(see RFC 1406). It could be accessed via sconfig utility or by ioctl(2) call +.Ar SERIAL_GETESTAT . +.Bl -tag -width 10n +.It Unav (uas) +Unavailable seconds - receiving all ones, or loss of carrier, or loss of +signal. +.It Degr (dm) +Degraded minutes - having error rate more than 10e-6, not counting unavailable +and severely errored seconds. +.It Bpv (bpv) +HDB3 bipolar violation errors. +.It Fsyn (fse) +Frame synchronization errors (E1 only). +.It CRC (crce) +CRC4 errors (E1). +.It RCRC (rcrce) +Remote CRC4 errors: E-bit counter (E1). +.It Err (es) +Errored seconds - any framing errors, or out of frame sync, or any slip events. +.It Lerr (les) +Line errored seconds - any BPV. +.It Sev (ses) +Severely errored seconds - 832 or more framing errors, or 2048 or more bipolar +violations. +.It Bur (bes) +Bursty errored seconds - more than 1 framing error, but not severely errored. +.It "Oof (oofs) +Severely errored framing seconds - out of frame sync. +.It "Slp (css) +Controlled slip second -- any slip buffer overflow or underflow. +.El +.\"-------------------------------------------------------------- +.Ss E1/G.703 Status +.Nm sconfig +utility also prints the E1/G.703 channel status. The status could have the +following values (nonexclusive): +.Bl -tag -width 10n +.It Ok +The channel is in valid state, synchronized. +.It LOS +Loss of sync. +.It AIS +Receiving unframed all ones (E1 only). +.It LOF +Loss of framing (E1 only). +.It LOMF +Loss of multiframing (E1 only). +.It FARLOF +Receiving remote alarm (E1 only). +.It AIS16 +Receiving all ones in timeslot 16 (E1 only). +.It FARLOMF +Receiving distant multiframe alarm (E1 only). +.It TSTREQ +Receiving test request code (G.703 only). +.It TSTERR +Test error (G.703 only). +.El +.\"-------------------------------------------------------------- +.Sh SEE ALSO +.Xr stty 1 +.Xr ioctl 2 +.Xr sppp 4 +.Xr ifconfig 8 +.Xr spppconrol 8 +.\"-------------------------------------------------------------- +.Sh HISTORY +This utility is a replacement of utilities +.Nm cxconfig +and +.Nm ctconfig +that was used in previous versions of drivers for FreeBSD. Those two utilities +and the present utility are not compatible. And therefore all scripts should +be rewritten. +.\"-------------------------------------------------------------- +.Sh BUGS +All sowtware produced by Cronyx Engineering Ltd is thoroughly tested. But +as created by the man it can contain some +.So +BUGS +.Sc . +If you have caught one, try to localize it and send a letter with description +of this bug and all operation that you have done. We will try to reproduce +an error and fix it. + +E-mail: info@cronyx.ru diff -u -r -P -N src-old/sbin/sconfig/sconfig.c src/sbin/sconfig/sconfig.c --- src-old/sbin/sconfig/sconfig.c Thu Jan 1 03:00:00 1970 +++ src/sbin/sconfig/sconfig.c Wed Mar 6 17:20:53 2002 @@ -0,0 +1,937 @@ +/* + * Channel configuration utility for Cronyx serial adapters. + * + * Copyright (C) 1997-2001 Cronyx Engineering Ltd. + * Author: Serge Vakulenko, + * Author: Kurakin Roman, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXCHAN 128 + +int vflag, eflag, sflag, mflag, cflag, fflag, iflag, aflag; +char mask[48]; +int adapter_type; /* 0-sigma, 1-tau, 2-tau */ +char chan_name[16]; + +extern char *optarg; +extern int optind; + +static void usage (void) +{ + printf( +"Serial Adapter Configuration Utility\n" +"Copyright (C) 1998-1999 Cronyx Engineering Ltd.\n" +"Usage:\n" +"\tsconfig [-imsefc] [device [parameters ...]]\n" +"\n" +"Options:\n" +"\t\t\t -- print channel options\n" +"\t-i\t\t\t -- print network interface status\n" +"\t-m\t\t\t -- print modem signal status\n" +"\t-s\t\t\t -- print channel statistics\n" +"\t-a\t\t\t -- print all available channel modes\n" +"\t-e\t\t\t -- print short E1/G703 statistics\n" +"\t-f\t\t\t -- print full E1/G703 statistics\n" +"\t-c\t\t\t -- clear statistics\n" +"\nParameters:\n" +"\t\t\t -- baud rate, internal clock\n" +"\textclock\t\t -- external clock (default)\n" +"\nProtocol options:\n" +"\tasync\t\t\t -- asynchronous protocol\n" +#ifdef __linux__ +"\tsync\t\t\t -- synchronous protocol\n" +#endif +"\tcisco\t\t\t -- Cisco/HDLC protocol\n" +"\trbrg\t\t\t -- Remote bridge\n" +"\tfr\t\t\t -- Frame Relay protocol\n" +#ifdef __linux__ +"\t dlci\t -- Add new DLCI\n" +#endif +"\tppp\t\t\t -- PPP protocol\n" +#ifdef __linux__ +"\traw\t\t\t -- raw HDLC protocol\n" +"\tidle\t\t\t -- no protocol\n" +#else +"\t keepalive={on,of}\t -- Enable/disable keepalive\n" +#endif +"\nInterface options:\n" +"\tport={rs232,v35,rs449}\t -- port type (for old models of Sigma)\n" +"\tcfg={A,B,C}\t\t -- adapter configuration\n" +"\tloop={on,off}\t\t -- internal loopback\n" +"\tdpll={on,off}\t\t -- DPLL mode\n" +"\tnrzi={on,off}\t\t -- NRZI encoding\n" +"\tinvclk={on,off}\t\t -- invert receive and transmit clock\n" +"\tinvrclk={on,off}\t\t -- invert receive clock\n" +"\tinvtclk={on,off}\t\t -- invert transmit clock\n" +"\thigain={on,off}\t\t -- E1 high input sensitivity\n" +"\tphony={on,off}\t\t -- E1 telepnony mode\n" +"\tunframed={on,off}\t\t -- E1 unframed mode\n" +"\tmonitor={on,off}\t\t -- E1 monitoring mode\n" +"\tuse16={on,off}\t\t -- E1 timeslot 16 usage\n" +"\tcrc4={on,off}\t\t -- E1 CRC4 mode\n" +"\tsyn={int,rcv,xrcv}\t -- G.703 transmit clock\n" +"\tts=...\t\t\t -- E1 timeslots\n" +"\tpass=...\t\t -- E1 subchannel timeslots\n" +"\tdebug={0,1,2}\t\t -- enable/disable debug messages\n" + ); + exit (0); +} + +static unsigned long scan_timeslots (char *s) +{ + char *e; + long v; + int i; + unsigned long ts, lastv; + + ts = lastv = 0; + for (;;) { + v = strtol (s, &e, 10); + if (e == s) + break; + if (*e == '-') { + lastv = v; + s = e+1; + continue; + } + if (*e == ',') + ++e; + + if (lastv) + for (i=lastv; i= 0) { + /* Ok. */ + close (s); + return 1; + } + close (s); + + /* open pseudo-tty and try to set PPP discipline */ + sprintf (pttyname, "/dev/ptyXX"); + p1 = &pttyname[8]; + p2 = &pttyname[9]; + for (i=0; i<16; i++) { + struct stat stb; + + *p1 = "pqrstuvwxyzabcde"[i]; + *p2 = '0'; + if (stat (pttyname, &stb) < 0) + continue; + for (j=0; j<16; j++) { + *p2 = "0123456789abcdef"[j]; + p = open (pttyname, 2); + if (p > 0) { + if (ioctl (p, TIOCSETD, &ppp_disc) < 0) { + fprintf (stderr, "No PPP discipline in kernel.\n"); + close (p); + return 0; + } + close (p); + return 1; + } + } + } + fprintf (stderr, "Cannot get pseudo-tty.\n"); + return 0; +#else + return 1; +#endif +} + +static char *format_timeslots (unsigned long s) +{ + static char buf [100]; + char *p = buf; + int i; + + for (i=1; i<32; ++i) + if ((s >> i) & 1) { + int prev = (i > 1) & (s >> (i-1)); + int next = (i < 31) & (s >> (i+1)); + + if (prev) { + if (next) + continue; + *p++ = '-'; + } else if (p > buf) + *p++ = ','; + + if (i >= 10) + *p++ = '0' + i / 10; + *p++ = '0' + i % 10; + } + *p = 0; + return buf; +} + +static void print_modems (int fd, int need_header) +{ + int status; + + if (ioctl (fd, TIOCMGET, &status) < 0) { + perror ("getting modem status"); + return; + } + if (need_header) + printf ("Channel\tLE\tDTR\tDSR\tRTS\tCTS\tCD\n"); + printf ("%s\t%s\t%s\t%s\t%s\t%s\t%s\n", chan_name, + status & TIOCM_LE ? "On" : "-", + status & TIOCM_DTR ? "On" : "-", + status & TIOCM_DSR ? "On" : "-", + status & TIOCM_RTS ? "On" : "-", + status & TIOCM_CTS ? "On" : "-", + status & TIOCM_CD ? "On" : "-"); +} + +static void print_ifconfig (int fd) +{ + char buf [64]; +#ifdef __linux__ + char protocol [8]; + + if (ioctl (fd, SERIAL_GETPROTO, &protocol) >= 0 && + strcmp (protocol, "fr") == 0) + sprintf (buf, "ifconfig %sd16 2>/dev/null", chan_name); + else +#endif + sprintf (buf, "ifconfig %s 2>/dev/null", chan_name); + system (buf); +} + +static void print_stats (int fd, int need_header) +{ + struct serial_statistics st; + + if (ioctl (fd, SERIAL_GETSTAT, &st) < 0) { + perror ("getting statistics"); + return; + } + if (need_header) + printf ("Channel\tRintr\tTintr\tMintr\tIbytes\tIpkts\tIerrs\tObytes\tOpkts\tOerrs\n"); + printf ("%s\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\n", + chan_name, st.rintr, st.tintr, st.mintr, st.ibytes, st.ipkts, + st.ierrs, st.obytes, st.opkts, st.oerrs); +} + +static void clear_stats (int fd) +{ + if (ioctl (fd, SERIAL_CLRSTAT, 0) < 0) { + perror ("clearing statistics"); + exit (-1); + } +} + +static const char *format_e1_status (unsigned char status) +{ + static char buf [80]; + + if (status & E1_NOALARM) + return "Ok"; + buf[0] = 0; + if (status & E1_LOS) strcat (buf, ",LOS"); + if (status & E1_AIS) strcat (buf, ",AIS"); + if (status & E1_LOF) strcat (buf, ",LOF"); + if (status & E1_LOMF) strcat (buf, ",LOMF"); + if (status & E1_FARLOF) strcat (buf, ",FARLOF"); + if (status & E1_AIS16) strcat (buf, ",AIS16"); + if (status & E1_FARLOMF) strcat (buf, ",FARLOMF"); +/* if (status & E1_TSTREQ) strcat (buf, ",TSTREQ");*/ +/* if (status & E1_TSTERR) strcat (buf, ",TSTERR");*/ + if (buf[0] == ',') + return buf+1; + return "Unknown"; +} + +static void print_frac (int leftalign, unsigned long numerator, unsigned long divider) +{ + int n; + + if (numerator < 1 || divider < 1) { + printf (leftalign ? "/- " : " -"); + return; + } + n = (int) (0.5 + 1000.0 * numerator / divider); + if (n < 1000) { + printf (leftalign ? "/.%-3d" : " .%03d", n); + return; + } + putchar (leftalign ? '/' : ' '); + + if (n >= 1000000) n = (n+500) / 1000 * 1000; + else if (n >= 100000) n = (n+50) / 100 * 100; + else if (n >= 10000) n = (n+5) / 10 * 10; + + switch (n) { + case 1000: printf (".999"); return; + case 10000: n = 9990; break; + case 100000: n = 99900; break; + case 1000000: n = 999000; break; + } + if (n < 10000) printf ("%d.%d", n/1000, n/10%100); + else if (n < 100000) printf ("%d.%d", n/1000, n/100%10); + else if (n < 1000000) printf ("%d.", n/1000); + else printf ("%d", n/1000); +} + +static void print_e1_stats (int fd, int need_header) +{ + struct e1_statistics st; + int i, maxi; + + if (need_header) + printf ("Chan\t Unav/Degr Bpv/Fsyn CRC/RCRC Err/Lerr Sev/Bur Oof/Slp Status\n"); + + if (ioctl (fd, SERIAL_GETESTAT, &st) < 0) + return; + printf ("%s\t", chan_name); + + /* Unavailable seconds, degraded minutes */ + print_frac (0, st.currnt.uas, st.cursec); + print_frac (1, 60 * st.currnt.dm, st.cursec); + + /* Bipolar violations, frame sync errors */ + print_frac (0, st.currnt.bpv, st.cursec); + print_frac (1, st.currnt.fse, st.cursec); + + /* CRC errors, remote CRC errors (E-bit) */ + print_frac (0, st.currnt.crce, st.cursec); + print_frac (1, st.currnt.rcrce, st.cursec); + + /* Errored seconds, line errored seconds */ + print_frac (0, st.currnt.es, st.cursec); + print_frac (1, st.currnt.les, st.cursec); + + /* Severely errored seconds, bursty errored seconds */ + print_frac (0, st.currnt.ses, st.cursec); + print_frac (1, st.currnt.bes, st.cursec); + + /* Out of frame seconds, controlled slip seconds */ + print_frac (0, st.currnt.oofs, st.cursec); + print_frac (1, st.currnt.css, st.cursec); + + printf (" %s\n", format_e1_status (st.status)); + + if (fflag) { + /* Print total statistics. */ + printf ("\t"); + print_frac (0, st.total.uas, st.totsec); + print_frac (1, 60 * st.total.dm, st.totsec); + + print_frac (0, st.total.bpv, st.totsec); + print_frac (1, st.total.fse, st.totsec); + + print_frac (0, st.total.crce, st.totsec); + print_frac (1, st.total.rcrce, st.totsec); + + print_frac (0, st.total.es, st.totsec); + print_frac (1, st.total.les, st.totsec); + + print_frac (0, st.total.ses, st.totsec); + print_frac (1, st.total.bes, st.totsec); + + print_frac (0, st.total.oofs, st.totsec); + print_frac (1, st.total.css, st.totsec); + + printf (" -- Total\n"); + + /* Print 24-hour history. */ + maxi = (st.totsec - st.cursec) / 900; + if (maxi > 48) + maxi = 48; + for (i=0; i= 0; + cfg_valid = ioctl (fd, SERIAL_GETCFG, &cfg) >= 0; + baud_valid = ioctl (fd, SERIAL_GETBAUD, &baud) >= 0; + loop_valid = ioctl (fd, SERIAL_GETLOOP, &loop) >= 0; + dpll_valid = ioctl (fd, SERIAL_GETDPLL, &dpll) >= 0; + nrzi_valid = ioctl (fd, SERIAL_GETNRZI, &nrzi) >= 0; + invclk_valid = ioctl (fd, SERIAL_GETINVCLK, &invclk) >= 0; + invrclk_valid = ioctl (fd, SERIAL_GETINVRCLK, &invrclk) >= 0; + invtclk_valid = ioctl (fd, SERIAL_GETINVTCLK, &invtclk) >= 0; + clk_valid = ioctl (fd, SERIAL_GETCLK, &clk) >= 0; + timeslots_valid = ioctl (fd, SERIAL_GETTIMESLOTS, ×lots) >= 0; + subchan_valid = ioctl (fd, SERIAL_GETSUBCHAN, &subchan) >= 0; + higain_valid = ioctl (fd, SERIAL_GETHIGAIN, &higain) >= 0; + phony_valid = ioctl (fd, SERIAL_GETPHONY, &phony) >= 0; + unfram_valid = ioctl (fd, SERIAL_GETUNFRAM, &unfram) >= 0; + monitor_valid = ioctl (fd, SERIAL_GETMONITOR, &monitor) >= 0; + use16_valid = ioctl (fd, SERIAL_GETUSE16, &use16) >= 0; + crc4_valid = ioctl (fd, SERIAL_GETCRC4, &crc4) >= 0; + level_valid = ioctl (fd, SERIAL_GETLEVEL, &level) >= 0; + keepalive_valid = ioctl (fd, SERIAL_GETKEEPALIVE, &keepalive) >= 0; + debug_valid = ioctl (fd, SERIAL_GETDEBUG, &debug) >= 0; + port_valid = ioctl (fd, SERIAL_GETPORT, &port) >= 0; + cable_valid = ioctl (fd, SERIAL_GETCABLE, &cable) >= 0; + dir_valid = ioctl (fd, SERIAL_GETDIR, &dir) >= 0; + + printf ("%s", chan_name); + if (port_valid) + switch (port) { + case 0: printf (" (rs232)"); break; + case 1: printf (" (v35)"); break; + case 2: printf (" (rs530)"); break; + } + else if (cable_valid) + switch (cable) { + case 0: printf (" (rs232)"); break; + case 1: printf (" (v35)"); break; + case 2: printf (" (rs530)"); break; + case 3: printf (" (x21)"); break; + case 4: printf (" (rs485)"); break; + case 9: printf (" (no cable)"); break; + } + if (debug_valid && debug) + printf (" debug=%d", debug); + if (protocol_valid && *protocol) + printf (" %.8s", protocol); + else + printf (" idle"); + if (keepalive_valid) + printf (" keepalive=%s", keepalive ? "on" : "off"); + + if (cfg_valid) + switch (cfg) { + case 'a' : printf (" cfg=A"); break; + case 'b' : printf (" cfg=B"); break; + case 'c' : printf (" cfg=C"); break; + case 'd' : printf (" cfg=D"); break; + default : printf (" cfg=unknown"); + } + if (dir_valid) + printf (" dir=%d", dir); + + if (baud_valid) { + if (baud) + printf (" %ld", baud); + else + printf (" extclock"); + } + if (clk_valid) + switch (clk) { + case E1CLK_INTERNAL: printf (" syn=int"); break; + case E1CLK_RECEIVE: printf (" syn=rcv"); break; + case E1CLK_RECEIVE_CHAN0: printf (" syn=rcv0"); break; + case E1CLK_RECEIVE_CHAN1: printf (" syn=rcv1"); break; + case E1CLK_RECEIVE_CHAN2: printf (" syn=rcv2"); break; + case E1CLK_RECEIVE_CHAN3: printf (" syn=rcv3"); break; + default: printf (" syn=%d", clk); break; + } + + if (dpll_valid) + printf (" dpll=%s", dpll ? "on" : "off"); + if (nrzi_valid) + printf (" nrzi=%s", nrzi ? "on" : "off"); + if (invclk_valid) + printf (" invclk=%s", invclk ? "on" : "off"); + if (invrclk_valid) + printf (" invrclk=%s", invrclk ? "on" : "off"); + if (invtclk_valid) + printf (" invtclk=%s", invtclk ? "on" : "off"); + if (unfram_valid) + printf (" unframed=%s", unfram ? "on" : "off"); + if (use16_valid) + printf (" use16=%s", use16 ? "on" : "off"); + if (aflag) { + if (crc4_valid) + printf (" crc4=%s", crc4 ? "on" : "off"); + if (higain_valid) + printf (" higain=%s", higain ? "on" : "off"); + if (monitor_valid) + printf (" monitor=%s", monitor ? "on" : "off"); + if (phony_valid) + printf (" phony=%s", phony ? "on" : "off"); + if (loop_valid) + printf (" loop=%s", loop ? "on" : "off"); + } + if (timeslots_valid) + printf (" ts=%s", format_timeslots (timeslots)); + if (subchan_valid) + printf (" pass=%s", format_timeslots (subchan)); + if (level_valid) + printf (" (level=-%.1fdB)", level / 10.0); + printf ("\n"); +} + +static void setup_chan (int fd, int argc, char **argv) +{ + int i, mode, loop, nrzi, dpll, invclk, phony, use16, crc4, unfram; + int higain, clk, keepalive, debug, port, dlci, invrclk, invtclk; + int monitor, dir; + long baud, timeslots; + + for (i=0; i= '0' && argv[i][0] <= '9') { + baud = strtol (argv[i], 0, 10); + ioctl (fd, SERIAL_SETBAUD, &baud); + } else if (strcasecmp ("extclock", argv[i]) == 0) { + baud = 0; + ioctl (fd, SERIAL_SETBAUD, &baud); + } else if (strncasecmp ("cfg=", argv[i], 4) == 0) { + if (strncasecmp ("a", argv[i]+4, 1) == 0) + ioctl (fd, SERIAL_SETCFG, "a"); + else if (strncasecmp ("b", argv[i]+4, 1) == 0) + ioctl (fd, SERIAL_SETCFG, "b"); + else if (strncasecmp ("c", argv[i]+4, 1) == 0) + ioctl (fd, SERIAL_SETCFG, "c"); + else if (strncasecmp ("d", argv[i]+4, 1) == 0) + ioctl (fd, SERIAL_SETCFG, "d"); + else { + fprintf (stderr, "invalid cfg\n"); + exit (-1); + } + } else if (strcasecmp ("idle", argv[i]) == 0) + ioctl (fd, SERIAL_SETPROTO, "\0\0\0\0\0\0\0"); + else if (strcasecmp ("async", argv[i]) == 0) { + mode = SERIAL_ASYNC; + if (ioctl (fd, SERIAL_SETMODE, &mode) >= 0) + ioctl (fd, SERIAL_SETPROTO, "async\0\0"); + } else if (strcasecmp ("sync", argv[i]) == 0) { + mode = SERIAL_HDLC; + if (ioctl (fd, SERIAL_SETMODE, &mode) >= 0) + ioctl (fd, SERIAL_SETPROTO, "sync\0\0"); + } else if (strcasecmp ("cisco", argv[i]) == 0) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "cisco\0\0"); + } else if (strcasecmp ("rbrg", argv[i]) == 0) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "rbrg\0\0\0"); + } else if (strcasecmp ("raw", argv[i]) == 0) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "raw\0\0\0\0"); + } else if (strcasecmp ("packet", argv[i]) == 0) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "packet\0\0\0\0"); + } else if (strcasecmp ("ppp", argv[i]) == 0) { + /* check that ppp line discipline is present */ + if (ppp_ok ()) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "ppp\0\0\0\0"); + } + } else if (strncasecmp ("keepalive=", argv[i], 10) == 0) { + keepalive = (strcasecmp ("on", argv[i] + 10) == 0); + ioctl (fd, SERIAL_SETKEEPALIVE, &keepalive); + } else if (strcasecmp ("fr", argv[i]) == 0) { + mode = SERIAL_HDLC; + ioctl (fd, SERIAL_SETMODE, &mode); + ioctl (fd, SERIAL_SETPROTO, "fr\0\0\0\0\0"); + } else if (strncasecmp ("debug=", argv[i], 6) == 0) { + debug = strtol (argv[i]+6, 0, 10); + ioctl (fd, SERIAL_SETDEBUG, &debug); + } else if (strncasecmp ("loop=", argv[i], 5) == 0) { + loop = (strcasecmp ("on", argv[i] + 5) == 0); + ioctl (fd, SERIAL_SETLOOP, &loop); + } else if (strncasecmp ("dpll=", argv[i], 5) == 0) { + dpll = (strcasecmp ("on", argv[i] + 5) == 0); + ioctl (fd, SERIAL_SETDPLL, &dpll); + } else if (strncasecmp ("nrzi=", argv[i], 5) == 0) { + nrzi = (strcasecmp ("on", argv[i] + 5) == 0); + ioctl (fd, SERIAL_SETNRZI, &nrzi); + } else if (strncasecmp ("invclk=", argv[i], 7) == 0) { + invclk = (strcasecmp ("on", argv[i] + 7) == 0); + ioctl (fd, SERIAL_SETINVCLK, &invclk); + } else if (strncasecmp ("invrclk=", argv[i], 8) == 0) { + invrclk = (strcasecmp ("on", argv[i] + 8) == 0); + ioctl (fd, SERIAL_SETINVRCLK, &invrclk); + } else if (strncasecmp ("invtclk=", argv[i], 8) == 0) { + invtclk = (strcasecmp ("on", argv[i] + 8) == 0); + ioctl (fd, SERIAL_SETINVTCLK, &invtclk); + } else if (strncasecmp ("higain=", argv[i], 7) == 0) { + higain = (strcasecmp ("on", argv[i] + 7) == 0); + ioctl (fd, SERIAL_SETHIGAIN, &higain); + } else if (strncasecmp ("phony=", argv[i], 6) == 0) { + phony = (strcasecmp ("on", argv[i] + 6) == 0); + ioctl (fd, SERIAL_SETPHONY, &phony); + } else if (strncasecmp ("unfram=", argv[i], 7) == 0) { + phony = (strcasecmp ("on", argv[i] + 7) == 0); + ioctl (fd, SERIAL_SETUNFRAM, &unfram); + } else if (strncasecmp ("monitor=", argv[i], 8) == 0) { + phony = (strcasecmp ("on", argv[i] + 8) == 0); + ioctl (fd, SERIAL_SETMONITOR, &monitor); + } else if (strncasecmp ("use16=", argv[i], 6) == 0) { + use16 = (strcasecmp ("on", argv[i] + 6) == 0); + ioctl (fd, SERIAL_SETUSE16, &use16); + } else if (strncasecmp ("crc4=", argv[i], 5) == 0) { + crc4 = (strcasecmp ("on", argv[i] + 5) == 0); + ioctl (fd, SERIAL_SETCRC4, &crc4); + } else if (strcasecmp ("syn=int", argv[i]) == 0) { + clk = E1CLK_INTERNAL; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strcasecmp ("syn=rcv", argv[i]) == 0) { + clk = E1CLK_RECEIVE; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strcasecmp ("syn=rcv0", argv[i]) == 0) { + clk = E1CLK_RECEIVE_CHAN0; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strcasecmp ("syn=rcv1", argv[i]) == 0) { + clk = E1CLK_RECEIVE_CHAN1; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strcasecmp ("syn=rcv2", argv[i]) == 0) { + clk = E1CLK_RECEIVE_CHAN2; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strcasecmp ("syn=rcv3", argv[i]) == 0) { + clk = E1CLK_RECEIVE_CHAN3; + ioctl (fd, SERIAL_SETCLK, &clk); + } else if (strncasecmp ("ts=", argv[i], 3) == 0) { + timeslots = scan_timeslots (argv[i] + 3); + ioctl (fd, SERIAL_SETTIMESLOTS, ×lots); + } else if (strncasecmp ("pass=", argv[i], 5) == 0) { + timeslots = scan_timeslots (argv[i] + 5); + ioctl (fd, SERIAL_SETSUBCHAN, ×lots); + } else if (strncasecmp ("dlci", argv[i], 4) == 0) { + dlci = strtol (argv[i]+4, 0, 10); + ioctl (fd, SERIAL_ADDDLCI, &dlci); + } else if (strncasecmp ("dir=", argv[i], 4) == 0) { + dir = strtol (argv[i]+4, 0, 10); + ioctl (fd, SERIAL_SETDIR, &dir); + } else if (strncasecmp ("port=", argv[i], 5) == 0) { + if (strncasecmp ("rs232", argv[i]+5, 5) == 0) { + port = 0; + ioctl (fd, SERIAL_SETPORT, &port); + } else if (strncasecmp ("v35", argv[i]+5, 3) == 0) { + port = 1; + ioctl (fd, SERIAL_SETPORT, &port); + } else if (strncasecmp ("rs449", argv[i]+5, 5) == 0) { + port = 2; + ioctl (fd, SERIAL_SETPORT, &port); + } else + fprintf (stderr, "invalid port type\n"); + exit (-1); + } + } +} + +static void get_mask (void) +{ +#ifdef __linux__ + int fd; + + fd = open ("/dev/serial/ctl0", 0); + if (fd < 0) { + perror ("/dev/serial/ctl0"); + exit (-1); + } + if (ioctl (fd, SERIAL_GETREGISTERED, &mask) < 0) { + perror ("getting list of channels"); + exit (-1); + } + close (fd); +#else + int fd, fd1, fd2, i; + char buf [80]; + + for (i=0, fd=-1; i<12 && fd<0; i++) { + sprintf (buf, "/dev/serial/cx%d", i*4); + fd = open (buf, 0); + } + + for (i=0, fd1=-1; i<3 && fd1<0; i++) { + sprintf (buf, "/dev/serial/ct%d", i*2); + fd1 = open (buf, 0); + } + + for (i=0, fd2=-1; i<3 && fd2<0; i++) { + sprintf (buf, "/dev/serial/cp%d", i*4); + fd2 = open (buf, 0); + } + + if ((fd < 0) && (fd1 < 0) && (fd2 < 0)) { + fprintf (stderr, "No Cronyx adapters installed\n"); + exit (-1); + } + + if (fd >= 0) { + if (ioctl (fd, SERIAL_GETREGISTERED, &mask) < 0) { + perror ("getting list of channels"); + exit (-1); + } + close (fd); + } + + if (fd1 >= 0) { + if (ioctl (fd1, SERIAL_GETREGISTERED, (mask+16)) < 0) { + perror ("getting list of channels"); + exit (-1); + } + close (fd1); + } + + if (fd2 >= 0) { + if (ioctl (fd2, SERIAL_GETREGISTERED, (mask+32)) < 0) { + perror ("getting list of channels"); + exit (-1); + } + close (fd2); + } +#endif +} + +static int open_chan_ctl (int num) +{ + char device [80]; + int fd; + +#ifdef __linux__ + sprintf (device, "/dev/serial/ctl%d", num); +#else + switch (adapter_type) { + case 0: + sprintf (device, "/dev/serial/cx%d", num); + break; + case 1: + sprintf (device, "/dev/serial/ct%d", num); + break; + case 2: + sprintf (device, "/dev/serial/cp%d", num); + break; + } +#endif + fd = open (device, 0); + if (fd < 0) { + if (errno == ENODEV) + fprintf (stderr, "chan%d: not configured\n", num); + else + perror (device); + exit (-1); + } +#ifdef __linux__ + if (ioctl (fd, SERIAL_GETNAME, &chan_name) < 0) + sprintf (chan_name, "chan%d", num); +#else + switch (adapter_type) { + case 0: sprintf (chan_name, "cx%d", num); break; + case 1: sprintf (chan_name, "ct%d", num); break; + case 2: sprintf (chan_name, "cp%d", num); break; + } +#endif + return fd; +} + +int main (int argc, char **argv) +{ + char *p; + int fd, need_header, chan_num; + + if (argc > 1 && strcmp(argv[1], "help") == 0) + usage(); + + for (;;) { + switch (getopt (argc, argv, "msefcvia")) { + case EOF: + break; + case 'a': + ++aflag; + continue; + case 'm': + ++mflag; + continue; + case 's': + ++sflag; + continue; + case 'e': + ++eflag; + continue; + case 'f': + ++eflag; + ++fflag; + continue; + case 'c': + ++cflag; + continue; + case 'v': + ++vflag; + continue; + case 'i': + ++iflag; + continue; + default: + usage(); + } + break; + } + argc -= optind; + argv += optind; + + if (argc <= 0) { + get_mask (); + need_header = 1; + adapter_type = 0; +#ifndef __linux__ + for (; adapter_type < 3; ++adapter_type) +#endif + { + for (chan_num=0; chan_num argv[0] && p[-1] >= '0' && p[-1] <= '9') + --p; + chan_num = strtol (p, 0, 10); +#ifndef __linux__ + if (strncasecmp ("cx", argv[0], 2)==0) + adapter_type = 0; + else if (strncasecmp ("ct", argv[0], 2)==0) + adapter_type = 1; + else if (strncasecmp ("cp", argv[0], 2)==0) + adapter_type = 2; + else { + fprintf (stderr, "Wrong channel name\n"); + exit (-1); + } +#endif + argc--; + argv++; + + fd = open_chan_ctl (chan_num); + if (vflag) { +#ifdef __linux__ + char buf[256]; + if (ioctl (fd, SERIAL_GETVERSIONSTRING, &buf) >= 0) + printf ("Version: %s\n", buf); +#endif + } + if (iflag) { + print_chan (fd); + print_ifconfig (fd); + close (fd); + return (0); + } + if (sflag) { + print_stats (fd, 1); + close (fd); + return (0); + } + if (mflag) { + print_modems (fd, 1); + close (fd); + return (0); + } + if (eflag) { + print_e1_stats (fd, 1); + close (fd); + return (0); + } + if (cflag) { + clear_stats (fd); + close (fd); + return (0); + } + if (argc > 0) + setup_chan (fd, argc, argv); + else + print_chan (fd); + close (fd); + return (0); +} diff -u -r -P -N src-old/sys/conf/files src/sys/conf/files --- src-old/sys/conf/files Wed Mar 6 19:56:38 2002 +++ src/sys/conf/files Wed Mar 6 16:52:49 2002 @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.608 2002/03/05 11:19:23 tanimura Exp $ +# $FreeBSD: src/sys/conf/files,v 1.605 2002/02/27 23:55:42 peter Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -165,6 +165,7 @@ contrib/ipfilter/netinet/ip_proxy.c optional ipfilter inet contrib/ipfilter/netinet/ip_state.c optional ipfilter inet contrib/ipfilter/netinet/mlfk_ipl.c optional ipfilter inet +crypto/blowfish/bf_enc.c optional ipsec ipsec_esp crypto/blowfish/bf_skey.c optional ipsec ipsec_esp crypto/cast128/cast128.c optional ipsec ipsec_esp crypto/des/des_ecb.c optional ipsec ipsec_esp @@ -206,6 +207,7 @@ dev/acpica/acpi_lid.c optional acpica dev/acpica/acpi_pcib.c optional acpica pci dev/acpica/acpi_powerres.c optional acpica nowerror +dev/acpica/acpi_powerprofile.c optional acpica dev/acpica/acpi_resource.c optional acpica dev/acpica/acpi_thermal.c optional acpica dev/acpica/acpi_timer.c optional acpica @@ -290,6 +292,8 @@ dev/cm/smc90cx6.c optional cm dev/cnw/if_cnw.c optional cnw card #dev/cnw/if_cnw.c optional cnw pccard +dev/cp/cpddk.c optional cp +dev/cp/if_cp.c optional cp dev/cs/if_cs.c optional cs dev/cs/if_cs_isa.c optional cs isa dev/cs/if_cs_pccard.c optional cs card @@ -581,7 +585,6 @@ dev/usb/if_kue.c optional kue dev/usb/ohci.c optional ohci dev/usb/udbp.c optional udbp -dev/usb/ufm.c optional ufm dev/usb/ugen.c optional ugen dev/usb/uhci.c optional uhci dev/usb/uhid.c optional uhid diff -u -r -P -N src-old/sys/conf/options src/sys/conf/options --- src-old/sys/conf/options Wed Mar 6 19:56:38 2002 +++ src/sys/conf/options Wed Mar 6 17:08:19 2002 @@ -330,6 +330,9 @@ NETGRAPH_UI opt_netgraph.h NETGRAPH_VJC opt_netgraph.h +# Netgraph options for Cronyx adapters +NETGRAPH_CRONYX opt_ng_cronyx.h + # ATM (HARP version) ATM_CORE opt_atm.h ATM_IP opt_atm.h diff -u -r -P -N src-old/sys/dev/cp/cpddk.c src/sys/dev/cp/cpddk.c --- src-old/sys/dev/cp/cpddk.c Thu Jan 1 03:00:00 1970 +++ src/sys/dev/cp/cpddk.c Wed Mar 6 17:00:12 2002 @@ -0,0 +1,3054 @@ +#include +#pragma pack(4) +typedef struct{unsigned long l43;unsigned long l101;unsigned long l92 +;unsigned long l104;unsigned long l80;unsigned long l89;unsigned long +l110;unsigned long l95;unsigned long l100;unsigned long l108;unsigned +long l97;unsigned long l84;}l164;typedef struct{unsigned char j[32]; +unsigned char l61[32];}l79;typedef struct{unsigned long s;unsigned +long l172;unsigned long n;unsigned long y;unsigned long l764;}l122; +typedef struct{l122 l37[4];l122 l30[64];unsigned char l643[4][1664]; +unsigned char l527[64][1664];}l185;typedef struct{unsigned long l81[4 +][128];unsigned long l88[4][128];unsigned long l87[128];}l154;typedef +struct l152{unsigned char*r;volatile unsigned long*l113, *l116, *l72, + *l103, *l68, *l115;unsigned char l64,l71,l60,l35,l40,l53,l33; +unsigned char q;unsigned char g;struct l677*e;unsigned char l184; +unsigned char l198;unsigned long u;unsigned char l140;unsigned char +l131;unsigned char l165;unsigned char l162;unsigned char l58;unsigned +char l73;unsigned char l130;unsigned long j;unsigned char l146; +unsigned char l46;unsigned char l48;unsigned char l69;unsigned char +l36;unsigned char l150;unsigned char w;l79 v;unsigned long l50; +unsigned char l28;unsigned char l34;unsigned char l29;unsigned char +l38;unsigned long l636;unsigned long l691;ulong64 l553;ulong64 l657; +unsigned long l646;unsigned long l347;unsigned long l223;unsigned long +l193;unsigned long l567;unsigned long l537;unsigned short y;unsigned +long l135;unsigned long l51;unsigned long l107;unsigned long l93;l164 +m;l164 z;l164 l105[48];unsigned long*l81;unsigned long*l88;int l98, +l109;unsigned char*l142[4];l122*l37;unsigned long l188[4];unsigned +long l127[4];int l39;int l44;unsigned char*l126[64];l122*l30;unsigned +long l178[64];unsigned long l133[64];int l41;void*l67[4];void*l620; +unsigned char l763;void( *l166)(struct l152*a,void*l67,int s);void( * +l155)(struct l152*a,char*n,int s);void( *l56)(struct l152*a,int l765); +}d;typedef struct l677{unsigned char*f;unsigned char q;unsigned char g +;unsigned long l114;char l47[16];d l[4];unsigned char l31;unsigned +char l86;unsigned char l94;unsigned char l144;unsigned char l75; +unsigned long l591;unsigned long*l87;int l99;void*l620;}t; +#pragma pack() +extern unsigned short cp_vendor_id;extern unsigned short cp_device_id +;void cp_init(t*b,int q,unsigned char*f);void cp_reset(t*b,l154*l52, +unsigned long l65);void cp_hard_reset(t*b);unsigned long cp_regio(d*a +,int l186,int l26,unsigned long o);void cp_register_transmit(d*a,void +( *l77)(d* ,void* ,int));void cp_register_receive(d*a,void( *l77)(d* , +char* ,int));void cp_register_error(d*a,void( *l77)(d* ,int));void +cp_start_chan(d*a,int l181,int l180,l185*l42,unsigned long l65);void +cp_stop_chan(d*a);void cp_start_e1(d*a);void cp_stop_e1(d*a);int +cp_transmit_space(d*a);int cp_send_packet(d*a,char*n,int s,void*l67); +int cp_interrupt(t*b);int cp_interrupt_poll(t*b,int l177);void +cp_handle_interrupt(t*b);void cp_enable_interrupt(t*b,int p);void +cp_g703_timer(d*a);void cp_led(t*b,int p);void cp_set_dtr(d*a,int p); +void cp_set_rts(d*a,int p);int cp_get_dsr(d*a);int cp_get_cd(d*a);int +cp_get_cts(d*a);int cp_get_txcerr(d*a);int cp_get_rxcerr(d*a);void +cp_set_baud(d*a,int u);void cp_set_dpll(d*a,int p);void cp_set_nrzi(d + *a,int p);void cp_set_invtxc(d*a,int p);void cp_set_invrxc(d*a,int p +);void cp_set_lloop(d*a,int p);int cp_get_rloop(d*a);int cp_get_lq(d* +a);int cp_get_cable(d*a);void cp_set_gsyn(d*a,int l78);void cp_set_ts +(d*a,unsigned long j);void cp_set_dir(d*a,int w);void cp_set_mux(t*b, +int p);void cp_set_dxc(d*a,l79*l766);void cp_set_higain(d*a,int p); +void cp_set_use16(d*a,int p);void cp_set_crc4(d*a,int p);void +cp_set_phony(d*a,int p);void cp_set_unfram(d*a,int p);void +cp_set_precoder(d*a,int p);void cp_set_monitor(d*a,int p);static void +l170(d*a);static void l141(long l194,long u,int*l45,int*l54);static +void l160(d*a);static void l163(d*a);static void l158(d*a,l79*l125); +static void l145(t*b);unsigned short cp_vendor_id=4362;unsigned short +cp_device_id=8450;static const unsigned char l513[]={79,231,255,255, +98,255,57,0,0,213,255,255,255,255,255,255,255,255,255,255,255,255,255 +,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,160,9,52,1,38,64,6,154,0,0,19,0,0,25,96,6,76, +128,140,134,99,6,200,0,0,25,96,2,100,128,97,144,1,0,15,12,48,1,50,0,0 +,178,74,134,19,104,2,76,128,9,48,9,39,208,4,64,22,152,112,2,100,128, +12,52,1,128,248,0,0,21,160,2,84,0,0,11,80,1,42,128,10,80,0,0,26,64,5, +180,0,0,10,96,1,44,64,5,176,0,0,45,192,2,0,15,18,160,2,88,0,0,21,192, +2,42,64,5,168,0,0,21,160,3,84,128,10,160,2,52,64,5,176,0,0,22,160,2, +80,252,0,11,64,0,5,2,0,31,64,0,21,152,249,0,74,152,255,0,4,128,0,5,64 +,1,0,3,128,2,16,0,0,2,0,1,8,0,1,40,0,19,5,0,1,80,0,7,4,0,4,64,0,1,2,0 +,3,224,255,0,5,18,0,4,65,0,5,1,0,0,130,8,0,1,8,0,12,64,0,8,16,0,2,1,0 +,5,16,1,0,4,1,0,6,8,254,0,4,80,0,5,1,32,64,0,0,128,2,16,72,0,0,64,64, +0,2,32,0,19,52,0,9,32,8,128,16,0,10,20,0,0,56,250,0,4,128,0,10,6,2,0, +2,3,0,23,48,0,11,1,0,11,32,16,96,255,0,4,176,32,0,5,226,64,0,0,128,1, +1,64,0,1,3,0,3,128,0,18,48,16,0,8,128,1,60,8,0,10,48,0,0,88,254,0,4, +80,4,0,8,128,18,64,2,0,1,35,4,0,2,16,0,18,48,0,10,4,54,0,11,160,32, +248,249,0,4,96,8,0,4,32,34,4,0,1,68,2,0,2,163,0,4,1,0,17,48,2,0,9,65, +0,0,4,0,10,48,9,8,253,0,4,144,64,0,4,3,64,64,0,0,128,1,112,64,0,0,192 +,2,0,2,96,0,19,60,32,0,8,96,0,0,60,0,11,44,0,0,152,250,0,4,160,0,5,12 +,2,64,0,1,6,129,0,2,3,1,0,3,1,0,17,48,16,0,9,1,0,0,8,0,10,48,8,128, +252,0,4,64,36,0,4,64,0,0,5,0,1,36,64,2,1,0,0,19,0,2,128,5,0,18,128,0, +9,128,133,176,0,11,48,0,0,232,251,0,4,16,0,6,32,72,4,128,16,0,2,64,17 +,0,4,20,0,19,32,2,0,3,72,4,0,0,32,8,128,16,0,8,32,4,6,0,0,200,253,0, +16,4,4,0,2,2,2,0,3,32,0,25,32,16,0,0,128,1,1,0,13,176,249,0,4,176,32, +0,6,64,0,1,1,0,3,1,1,0,3,44,0,18,128,1,0,4,56,0,3,12,0,11,48,16,216, +251,8,0,3,80,4,0,6,8,48,138,132,0,3,8,0,4,20,0,18,128,0,5,72,0,2,4,6, +0,10,33,0,1,202,248,0,4,96,8,0,6,80,0,0,137,18,1,0,2,139,0,4,24,34,0, +18,6,1,0,3,64,0,1,128,69,0,0,4,0,9,8,177,0,0,32,253,0,4,144,64,0,5,96 +,0,0,12,0,0,1,0,2,192,3,0,4,32,0,18,128,7,0,4,32,0,1,224,0,0,12,0,9, +224,0,0,12,8,136,248,4,0,3,160,0,7,64,48,8,2,0,3,2,2,0,3,36,0,19,6,0, +4,32,0,2,128,48,16,0,8,128,0,0,48,0,0,233,254,0,4,64,32,0,6,5,176,0,5 +,3,0,4,20,8,0,18,6,0,4,64,0,1,128,8,48,2,0,8,128,40,48,16,160,255,0,4 +,144,8,0,4,13,32,128,0,0,128,0,0,4,0,1,64,64,0,4,4,0,19,16,2,0,3,72,0 +,1,32,49,128,16,0,0,16,36,0,0,64,34,4,0,0,5,160,9,52,65,88,251,0,4,64 +,64,0,6,1,0,6,3,0,31,32,0,6,64,0,2,1,0,1,8,4,0,0,17,0,0,112,251,0,4, +176,0,6,64,0,2,2,0,4,1,0,3,44,0,18,128,7,0,4,88,0,1,128,1,60,8,0,1,32 +,0,1,3,2,0,0,4,132,1,28,0,0,56,249,4,0,3,80,0,5,32,48,5,1,0,0,160,0,9 +,20,0,18,128,6,1,0,3,40,0,2,65,52,2,0,1,2,0,1,3,0,1,44,128,5,2,32,26, +253,12,0,3,160,32,0,5,160,144,0,1,38,0,3,19,1,0,3,24,34,0,18,128,0,4, +48,0,1,128,33,0,0,4,0,1,32,0,1,2,0,1,68,8,136,36,1,120,250,0,4,144,0, +5,3,66,0,1,128,7,1,0,1,192,1,0,4,32,0,18,128,7,0,4,64,0,1,224,1,60,0, +1,48,0,1,192,0,0,2,0,0,15,96,1,56,8,88,251,8,0,3,128,0,6,128,0,2,6,0, +9,36,0,20,1,0,3,32,0,1,128,1,0,3,32,0,1,3,2,0,0,12,128,1,1,16,121,254 +,0,4,128,0,5,64,4,0,2,22,8,0,2,65,0,4,148,8,0,18,70,0,4,64,0,1,128,73 +,48,8,0,3,128,10,0,1,78,8,9,160,0,0,176,251,0,11,1,161,0,0,4,146,32,8 +,0,1,64,18,2,0,0,140,16,0,0,4,0,19,16,210,0,3,96,32,0,0,32,0,6,64,35, +2,0,0,77,36,48,132,0,0,8,254,0,11,4,0,0,64,0,39,96,0,4,32,0,4,2,0,1, +12,0,1,32,16,48,254,0,11,7,224,0,0,13,128,3,0,3,3,0,1,15,0,1,44,0,18, +128,7,240,32,0,2,120,0,2,64,12,0,5,3,0,1,8,0,1,8,16,88,252,8,0,10,64, +48,0,0,132,16,22,8,0,2,138,0,1,33,4,0,0,20,0,18,128,70,24,0,3,104,0,2 +,4,4,0,5,2,4,0,0,132,16,68,36,1,75,251,0,11,137,128,9,0,0,138,64,0,3, +3,0,4,24,34,0,18,128,192,4,0,3,66,0,1,80,48,10,0,4,19,0,1,44,4,64,20, +64,65,255,0,11,3,228,65,12,0,0,1,1,0,1,192,131,0,1,14,0,1,32,0,18,128 +,7,240,32,0,2,24,0,1,96,0,0,60,0,4,192,3,1,0,0,15,224,0,0,8,0,0,8,249 +,4,0,11,4,0,2,6,2,0,2,131,0,4,36,0,20,2,128,0,6,64,48,0,5,1,0,1,12, +128,64,16,0,0,97,249,0,11,41,32,41,32,16,68,0,3,35,0,1,12,0,1,20,10,0 +,18,6,208,8,0,5,128,9,48,0,5,35,2,0,0,64,132,1,0,1,200,252,0,11,141, +164,0,0,52,129,6,0,2,64,64,0,4,4,0,19,16,2,0,3,40,16,0,0,32,17,0,2,80 +,0,1,64,2,1,0,1,160,5,38,18,0,0,248,0,11,12,0,0,1,48,8,6,0,36,64,0,1, +128,129,0,0,32,0,0,128,0,2,1,0,2,128,1,16,0,0,224,252,0,11,12,96,1,29 +,144,1,0,3,3,1,0,3,44,0,18,128,7,1,0,6,128,1,57,32,0,0,176,0,2,3,0,2, +128,1,48,0,0,192,249,4,0,10,132,162,16,36,130,0,10,20,0,18,128,38,0,5 +,36,0,0,128,17,4,0,1,80,0,2,35,4,0,1,128,32,48,66,90,250,4,0,10,40, +192,48,48,9,64,2,0,2,10,2,0,3,24,34,0,18,128,0,5,1,0,0,128,129,4,17,0 +,0,96,130,0,1,10,4,0,1,128,5,161,64,184,252,0,11,7,2,1,60,0,0,1,0,2, +192,0,5,32,0,18,128,7,0,4,120,16,0,0,224,1,12,0,1,144,0,1,192,0,3,96, +1,12,0,0,240,252,4,0,10,8,96,65,48,8,6,4,0,2,2,0,4,36,8,0,27,128,1,1, +0,1,128,32,0,1,3,2,0,2,1,48,32,33,248,0,11,68,164,16,160,0,0,6,0,3,19 +,4,0,3,20,2,0,18,70,1,0,4,16,0,0,128,1,48,4,0,0,64,8,0,0,128,34,0,3,9 +,42,2,144,253,0,4,80,0,5,4,36,0,0,180,128,68,2,0,1,64,10,1,0,3,36,34, +0,18,16,2,0,0,10,17,0,0,72,4,0,0,160,0,0,128,16,0,0,16,0,1,64,19,4,0, +1,32,8,52,65,8,250,0,4,128,0,5,8,0,1,48,16,2,0,3,3,0,4,16,0,22,24,0,2 +,16,0,1,1,0,6,2,0,2,128,1,33,0,0,56,252,0,4,176,64,0,4,11,96,1,33,160 +,5,0,2,192,0,5,44,0,18,128,7,1,0,0,8,0,1,16,32,0,0,96,65,60,8,0,0,176 +,0,2,3,1,0,1,128,1,49,16,184,255,8,0,3,80,4,0,4,37,162,16,48,128,2,0, +3,2,1,0,3,20,0,18,128,6,0,1,16,32,0,0,8,1,0,0,160,16,52,1,0,0,80,0,2, +18,0,2,128,1,32,0,0,26,252,0,4,96,0,5,6,192,48,176,16,4,0,2,64,131,0, +4,40,0,19,128,0,1,72,8,0,0,8,8,0,0,192,132,0,0,4,0,0,96,130,0,1,19,0, +2,128,17,48,6,216,254,0,4,144,0,5,8,0,0,1,60,0,0,3,0,2,128,1,0,4,32,0 +,18,128,7,0,1,22,0,1,56,0,1,32,1,60,0,1,144,0,1,192,3,1,0,1,96,65,60, +0,0,40,255,4,0,3,160,0,5,10,96,65,48,8,4,0,3,1,0,4,36,0,22,8,16,0,3, +64,65,0,2,128,32,0,1,1,0,2,128,129,16,0,0,177,253,0,4,64,0,5,4,160,4, +48,0,0,2,0,3,16,2,0,3,36,0,19,22,1,0,0,144,0,1,8,17,0,0,128,4,176,8,0 +,0,64,2,0,1,11,2,0,1,128,9,48,18,40,255,0,4,144,0,6,36,0,0,4,128,70,2 +,0,0,26,64,32,1,0,0,45,8,0,0,4,2,0,18,32,146,64,0,2,72,4,0,0,32,0,3, +16,0,1,64,0,0,4,0,1,160,9,36,66,0,0,254,0,4,64,0,8,16,16,2,0,6,12,0,2 +,8,0,19,64,0,4,16,0,2,48,32,0,4,3,0,2,128,1,17,0,0,40,251,0,4,176,64, +0,4,11,96,1,1,0,0,6,2,0,0,6,0,1,2,0,1,4,0,0,28,0,19,1,160,0,3,64,16,0 +,0,96,65,56,0,1,176,0,2,2,0,4,48,32,208,248,8,0,3,80,4,0,4,37,162,16, +0,0,4,38,0,1,2,2,34,0,1,140,0,1,128,8,0,17,128,6,82,0,4,1,0,0,160,16, +52,64,0,0,80,0,2,67,0,2,128,5,50,0,0,178,251,0,4,96,0,5,6,192,48,0,0, +64,4,0,1,24,4,0,0,2,0,0,8,0,1,4,2,0,17,128,64,144,32,0,3,1,0,0,192, +132,52,8,0,0,96,130,0,1,35,1,0,1,128,132,32,0,0,200,253,0,4,144,0,5,8 +,0,0,1,12,128,7,1,0,0,30,192,1,0,1,7,4,0,0,8,16,0,17,128,1,113,0,3,24 +,16,0,0,32,1,12,0,1,144,0,1,192,2,0,2,224,1,12,32,240,254,4,0,3,96,0, +5,10,96,65,0,4,24,0,0,1,0,1,8,8,0,21,6,132,0,3,64,64,0,0,64,65,48,0,1 +,128,32,0,1,3,2,0,1,128,0,0,48,32,201,250,0,4,128,0,5,4,160,0,0,8,32, +70,8,0,0,66,16,9,4,0,0,66,0,1,32,10,0,19,80,0,3,32,1,0,0,128,0,0,48, +65,0,0,64,0,1,128,19,0,4,169,0,0,56,253,0,3,6,146,40,0,4,8,36,49,4, +134,18,0,1,26,64,9,0,1,13,0,1,4,10,0,18,32,210,0,3,8,4,0,0,32,133,0,2 +,144,130,0,0,64,3,4,0,0,9,0,1,52,34,176,255,0,3,6,192,0,5,4,128,0,0, +16,0,1,4,0,0,24,0,1,2,0,0,12,8,0,21,6,192,0,4,16,0,0,128,0,1,32,0,0, +64,0,5,4,132,1,33,0,0,184,255,0,2,128,7,192,0,5,11,96,1,1,0,0,1,0,1, +30,128,1,0,1,4,0,2,32,0,18,7,240,0,3,80,32,0,0,96,1,12,0,1,176,0,2,3, +0,1,8,228,1,48,0,0,136,252,8,0,1,128,6,192,72,0,4,37,162,16,0,0,160,0 +,0,2,0,0,26,64,64,0,1,136,8,0,20,128,38,210,0,3,8,1,0,0,160,0,0,4,0,1 +,80,0,2,66,0,1,44,128,17,33,64,234,255,0,3,32,192,34,0,4,6,64,1,128, +192,32,4,0,0,64,72,8,0,1,76,16,0,0,128,8,0,17,128,38,200,0,3,8,36,0,0 +,64,73,48,9,0,0,160,0,2,146,0,1,136,164,145,48,6,32,254,0,2,128,1,242 +,0,5,8,0,0,1,12,0,0,5,0,1,6,128,2,1,0,0,3,0,1,12,0,18,128,1,224,0,3, +24,0,1,32,1,60,0,1,144,0,1,192,3,0,1,15,96,0,0,60,0,0,112,253,4,0,3, +192,0,5,6,96,1,0,9,4,0,2,8,0,18,6,192,0,7,1,48,0,1,128,0,2,3,0,1,12, +136,65,16,32,57,253,0,4,192,8,1,0,3,8,32,1,0,0,65,128,0,3,2,0,2,16,0, +0,32,2,0,18,22,196,0,3,40,17,0,1,1,48,0,1,128,0,2,139,0,1,78,128,17, +48,1,200,255,0,13,4,2,0,12,16,0,19,32,0,23,248,254,32,0,0,4,128,0,0, +16,0,0,2,64,0,0,8,0,3,4,128,0,0,16,0,1,64,0,0,8,0,0,1,32,0,17,32,0,0, +4,128,0,2,2,64,0,2,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0, +4,0,1,249,0,13,128,0,13,16,0,25,32,0,17,16,252,36,0,0,4,128,0,0,16,0, +0,2,64,0,0,8,0,0,1,8,16,4,128,0,0,16,0,0,2,73,0,0,8,0,0,1,32,0,1,2,0, +14,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,1,1,32,0,0,4,128,0,0,16,0,0,2, +64,0,0,8,0,0,1,32,0,0,4,0,0,107,254,12,0,2,1,0,8,8,0,1,32,0,3,16,0,1, +128,8,0,1,1,0,20,4,0,2,16,33,0,16,4,201,255,32,0,0,4,0,3,2,64,0,0,8,0 +,1,4,128,0,2,18,0,0,2,0,1,9,0,1,32,0,1,16,0,14,32,0,0,4,0,2,32,2,64,0 +,2,1,0,2,128,0,2,2,64,0,0,8,0,0,1,0,3,166,252,8,0,4,64,0,5,4,0,6,16,0 +,3,4,0,1,32,0,29,1,0,2,64,0,8,16,208,253,32,0,0,4,128,0,0,16,8,2,64,0 +,0,8,0,0,129,0,0,4,5,18,128,16,0,0,2,0,0,64,8,0,0,64,32,0,1,1,0,14,32 +,0,0,4,128,64,18,128,2,64,0,2,1,32,4,4,146,0,0,16,8,2,64,0,0,8,0,0,1, +32,144,0,0,1,144,249,0,12,4,0,2,1,0,2,128,0,5,64,0,21,64,0,13,128,0,0 +,2,0,5,168,255,0,11,2,0,47,32,0,10,8,0,0,16,255,0,4,128,0,5,2,0,3,16, +0,3,64,0,3,32,0,20,8,0,4,32,0,14,64,128,0,1,120,254,0,14,64,0,5,1,1,0 +,1,128,0,21,16,0,17,3,0,1,129,0,1,48,248,252,0,14,32,0,32,4,0,9,32,0, +5,8,0,1,32,0,0,1,0,1,32,248,2,0,3,64,0,5,4,128,32,32,0,11,16,0,33,64, +0,10,145,255,0,2,160,0,0,64,32,0,4,1,8,0,0,5,0,7,32,0,0,136,64,0,19, +128,0,1,128,0,5,2,0,1,8,0,1,128,0,4,4,0,1,16,0,0,40,248,0,2,16,0,1, +128,2,0,4,2,0,3,4,0,37,1,0,2,32,0,0,64,0,0,4,64,0,7,56,248,0,2,48,1, +32,192,2,0,1,192,0,0,66,141,128,8,0,0,160,4,0,2,6,0,0,32,0,0,68,133,0 +,17,40,0,1,1,0,0,64,0,4,41,4,0,0,160,48,0,0,16,64,2,64,0,2,2,0,0,5, +168,0,0,184,248,0,1,16,0,0,4,1,32,0,1,2,0,1,4,32,65,84,4,38,1,24,0,0, +64,2,2,8,4,160,6,0,0,40,0,15,8,0,1,2,80,16,8,4,65,0,1,224,10,0,0,144, +34,0,0,65,0,3,64,0,1,160,6,144,4,56,252,0,1,32,0,1,4,32,0,4,4,0,0,64, +16,0,0,2,1,0,5,4,128,0,1,8,0,17,128,0,0,64,0,0,16,72,0,3,2,0,0,16,0,1 +,18,0,6,128,0,0,4,0,0,40,253,0,2,128,0,3,64,0,3,128,0,1,8,4,0,0,32,0, +0,64,0,1,64,0,25,16,0,2,2,0,11,8,0,4,8,232,251,0,60,32,0,3,64,0,7,248 +,253,0,13,4,0,1,2,0,56,248,255,0,14,68,0,0,8,0,3,8,0,1,2,1,4,0,42,128 +,32,0,1,104,253,0,20,128,0,26,1,0,24,24,254,0,17,8,0,30,32,0,23,144, +253,0,6,1,0,9,8,0,3,4,0,43,4,0,4,64,144,250,0,4,32,0,8,16,0,35,72,0, +21,64,249,2,0,15,1,0,36,16,0,14,64,0,2,184,248,0,5,1,0,8,16,0,2,2,0,3 +,32,0,1,8,0,25,64,0,1,128,0,13,64,0,0,24,253,0,14,24,0,0,8,0,3,8,0,35 +,32,128,0,13,8,253,0,25,2,0,31,32,0,14,184,253,0,54,8,0,18,16,255,0, +21,4,0,51,152,251,0,17,32,0,27,8,0,0,8,0,19,16,0,1,64,0,0,224,250,0, +74,152,255,0,16,16,0,2,4,2,0,26,8,0,15,64,0,5,4,88,252,0,74,152,255,0 +,24,32,0,48,184,253,0,14,2,0,31,16,0,14,16,0,9,184,252,0,12,32,0,0, +128,0,11,128,0,18,128,2,0,1,64,0,6,4,16,0,9,128,0,0,128,168,254,0,11, +4,0,2,224,0,2,1,64,0,0,6,0,34,64,0,6,2,0,3,64,1,0,0,192,250,0,15,128, +0,33,16,0,22,128,255,0,74,152,255,0,25,8,0,47,24,255,0,4,64,0,1,64,0, +0,8,64,0,2,8,8,0,2,2,0,2,32,0,3,8,0,16,8,0,0,1,2,0,0,2,16,128,8,0,1, +128,0,10,2,0,1,16,4,224,250,0,7,16,0,0,1,0,1,8,64,0,4,8,128,0,3,8,0, +22,4,32,0,8,32,0,12,208,249,0,4,32,0,1,144,0,0,18,32,64,9,40,9,16,20, +0,1,6,64,1,0,0,32,4,8,0,0,160,21,0,15,3,8,0,0,1,134,130,4,8,0,0,81,11 +,0,0,64,0,0,16,37,0,4,1,0,1,2,0,1,8,16,168,248,0,3,130,0,0,160,8,4,64 +,64,16,4,128,8,0,0,15,5,64,1,48,7,72,0,3,3,0,0,40,0,12,32,0,4,3,0,0, +44,0,0,4,16,40,72,0,0,128,0,1,8,0,1,16,0,1,2,32,0,0,12,2,96,128,8,64, +253,0,3,2,0,0,32,4,16,0,1,64,1,128,0,1,8,0,0,64,0,1,4,0,6,8,0,12,64,0 +,4,1,0,0,32,0,0,2,0,0,32,0,1,32,0,1,32,0,5,8,0,0,4,8,64,0,0,32,136, +248,0,4,4,0,3,9,0,4,16,2,0,1,8,16,0,0,1,0,1,128,0,28,16,0,6,128,0,0, +128,0,2,8,0,1,1,0,0,104,255,16,0,12,1,0,1,4,0,3,2,0,4,32,0,45,188,251 +,0,24,8,0,39,128,0,2,2,0,1,4,0,0,144,249,0,12,40,0,7,128,0,25,2,0,4, +16,0,1,32,0,0,16,0,9,32,0,1,32,24,252,16,0,15,128,1,0,2,128,0,2,4,0, +30,32,0,0,16,0,9,4,0,2,108,248,0,3,1,0,14,16,0,45,64,0,4,32,132,48, +249,0,11,16,0,0,64,0,5,64,0,30,16,0,4,1,0,6,128,0,6,208,250,0,3,4,0,7 +,16,0,3,64,0,27,16,0,21,4,0,3,200,255,0,18,1,0,29,1,0,4,8,0,13,32,0,1 +,8,136,252,0,11,16,64,0,7,1,0,32,8,0,0,64,2,2,0,11,14,0,0,128,250,0, +11,1,64,0,7,64,0,1,4,16,0,31,4,0,6,8,0,1,4,16,36,160,0,0,8,248,0,19,8 +,0,6,128,0,30,4,0,5,128,4,0,2,4,144,80,64,251,0,19,64,0,3,16,0,48,136 +,250,0,2,128,16,0,1,2,64,160,8,0,6,16,4,0,2,40,0,25,208,4,1,0,14,104, +4,9,0,1,20,0,0,32,248,0,4,1,0,12,128,0,2,64,0,25,192,0,16,64,32,4,4,0 +,0,32,0,0,72,253,0,6,22,192,0,0,88,0,6,128,0,3,88,0,25,192,0,16,96,0, +0,8,0,1,44,0,0,112,248,0,4,1,0,0,10,64,18,41,0,6,64,66,0,2,40,0,25, +192,16,0,16,132,44,8,0,0,20,0,0,120,255,0,3,32,1,0,0,12,0,1,48,0,6, +192,72,0,2,48,34,0,24,128,136,0,15,32,33,40,4,0,0,24,32,88,253,0,2, +128,1,0,1,18,192,0,0,74,0,6,48,0,3,64,0,25,112,0,16,88,0,0,15,0,1,32, +0,0,80,252,0,6,16,0,1,66,0,6,192,64,0,2,64,0,25,192,0,18,12,4,0,0,32, +0,0,40,250,0,3,68,1,0,0,8,64,0,0,32,0,6,64,2,0,2,32,18,0,25,20,0,16, +68,14,0,1,16,9,72,252,0,2,128,68,0,1,2,0,1,8,0,3,52,1,0,0,16,0,3,8,0, +0,1,34,8,1,0,17,20,66,0,1,130,0,4,5,0,5,4,0,0,64,3,40,34,5,160,5,5,0, +0,208,254,0,3,2,1,0,8,32,32,0,1,64,0,6,1,0,18,32,0,1,192,0,6,8,0,4,32 +,0,1,3,64,0,0,8,4,0,2,48,249,0,2,128,3,0,1,22,0,1,88,0,3,48,0,6,88,0, +0,3,68,1,1,0,17,48,32,0,0,32,0,5,4,8,0,3,48,0,2,3,96,0,0,12,128,65,44 +,0,0,16,255,8,0,1,128,4,0,1,10,0,1,40,0,4,5,0,0,64,130,0,2,40,0,0,129 +,160,9,0,19,2,0,0,16,68,0,4,140,0,4,16,0,2,3,0,0,64,40,136,5,20,0,0, +11,253,0,3,4,0,1,12,0,1,48,0,3,144,16,0,1,66,0,2,48,34,32,162,136,0, +19,17,0,0,208,64,0,4,44,16,0,3,192,2,0,1,99,0,0,128,140,136,32,24,32, +81,250,0,2,128,2,0,1,18,0,1,72,0,3,44,0,1,112,0,3,64,0,0,3,96,0,19,12 +,0,1,48,0,5,11,0,4,224,32,0,0,192,3,24,0,0,11,224,1,32,0,0,144,249,4, +0,2,2,0,1,16,0,1,64,0,6,128,64,0,2,64,0,1,128,1,0,19,32,0,1,64,0,4,12 +,0,4,208,0,5,12,128,1,33,0,0,9,254,0,3,4,0,1,8,0,1,32,0,4,16,0,0,64,0 +,3,32,16,136,130,16,2,0,18,1,0,0,16,2,0,4,72,4,0,3,192,0,3,4,128,140, +132,17,16,8,232,250,176,137,0,0,128,0,0,16,128,2,64,33,8,0,3,20,4,0,0 +,16,128,0,2,8,0,22,4,0,14,192,66,0,2,8,1,0,2,4,0,0,136,251,0,0,1,0,7, +2,0,3,32,0,31,16,0,19,32,0,4,136,252,128,1,0,0,128,5,0,0,64,22,128, +131,88,0,3,48,0,2,128,0,2,88,0,23,16,0,13,224,128,0,2,32,0,3,44,0,0, +192,251,12,0,0,1,128,2,64,8,10,64,9,40,0,4,34,0,0,64,0,3,40,0,22,144, +0,14,208,2,0,2,64,8,0,2,20,0,0,242,250,132,4,0,1,3,64,4,13,64,0,0,50, +0,4,17,0,0,64,66,0,2,48,34,0,22,18,0,13,16,2,1,0,6,24,32,24,248,96, +129,0,0,128,4,48,0,0,18,192,2,72,0,3,12,0,1,48,0,3,64,0,22,28,0,14, +240,0,3,120,16,0,2,32,0,0,248,252,4,0,2,4,192,0,0,16,0,0,2,64,0,4,32, +0,0,192,64,0,2,64,0,22,32,0,14,192,0,3,32,0,3,32,0,0,113,253,0,0,128, +0,1,2,0,0,130,8,0,0,19,34,0,4,1,0,5,32,17,0,21,16,16,0,13,208,72,0,2, +96,20,0,2,144,8,120,248,32,16,0,0,128,0,0,80,8,2,0,1,72,0,3,20,4,0,0, +80,16,26,0,1,8,0,0,129,16,0,0,4,66,0,16,20,66,0,2,2,9,0,8,208,128,0,2 +,40,130,0,0,32,16,4,0,0,168,250,0,0,128,0,2,128,128,0,2,32,0,3,32,0, +30,32,0,14,128,0,3,64,0,2,128,0,1,152,251,0,0,1,0,0,128,5,192,0,0,22, +0,1,88,0,3,48,0,1,240,0,0,24,16,0,0,88,0,23,32,0,2,16,8,0,8,192,64,0, +2,96,0,2,1,44,0,1,253,136,132,0,0,128,2,0,0,20,10,0,1,40,0,4,34,0,0, +192,36,88,0,1,40,0,0,128,8,0,1,32,0,17,2,0,2,64,0,10,8,0,3,32,0,0,128 +,132,20,0,0,18,251,128,5,2,0,0,3,0,0,68,12,0,1,48,0,4,64,0,0,16,8,152 +,8,0,0,48,34,32,4,0,0,128,64,0,16,128,16,0,2,80,0,9,64,2,0,3,128,0,0, +128,5,24,32,120,249,96,0,1,128,4,48,0,0,18,0,1,72,0,3,12,0,1,176,128, +30,0,1,64,0,0,3,0,1,12,0,17,60,0,3,6,8,0,8,176,64,0,2,24,0,1,96,0,0, +33,0,0,40,252,132,1,0,1,4,0,0,128,16,0,1,32,0,6,192,32,24,0,1,64,0,27 +,16,16,0,16,128,129,32,0,0,177,248,128,16,2,0,0,2,0,0,4,8,0,1,64,0,4, +64,0,0,192,2,24,9,0,0,32,20,72,16,0,0,32,5,0,17,17,0,2,8,1,0,9,136,0, +3,128,0,0,128,0,0,16,10,240,251,32,8,0,0,128,0,0,16,2,3,64,8,0,1,129, +0,1,20,4,0,0,16,8,1,0,1,72,34,12,8,0,19,132,0,1,16,16,138,72,19,1,0,6 +,192,4,0,2,96,1,0,0,32,16,38,32,64,250,0,0,128,0,6,128,0,1,4,8,0,0,32 +,0,6,32,0,0,12,0,21,16,0,2,16,0,0,2,0,7,192,32,0,2,96,32,0,2,16,0,0, +128,251,128,0,1,128,5,64,0,0,22,192,1,0,12,88,0,0,14,8,0,19,16,32,0,1 +,128,0,0,16,0,8,240,0,3,112,0,3,44,0,0,96,254,4,33,0,0,128,2,128,66, +10,64,16,1,0,0,76,8,0,1,34,0,0,64,16,0,2,40,0,0,33,0,20,160,0,1,128,0 +,0,128,0,0,8,1,0,6,208,0,3,8,34,0,0,128,8,22,0,0,137,252,12,8,0,1,3,0 +,0,4,12,0,3,64,16,0,0,128,0,1,64,66,0,2,80,0,0,13,1,0,20,2,0,0,128,2, +64,8,1,0,7,192,0,3,104,32,0,0,128,144,40,0,0,99,253,224,65,0,0,128,4, +240,32,18,192,0,0,2,0,0,3,0,1,60,32,0,0,48,0,3,64,0,0,15,0,20,60,8,0, +0,48,64,30,64,3,0,7,224,0,3,120,0,1,96,0,0,32,0,0,56,249,136,64,0,1,4 +,64,32,16,0,1,2,0,0,4,8,0,1,16,0,0,192,64,0,2,64,0,22,16,0,1,192,128, +0,0,8,0,8,192,0,4,64,0,0,128,1,32,0,0,170,249,128,5,0,1,2,192,0,0,8, +64,0,2,64,0,9,64,0,0,44,16,0,19,48,10,0,1,8,0,10,192,0,3,104,2,0,1,4, +33,0,0,208,249,32,16,2,128,0,0,16,72,2,64,0,5,132,64,0,0,16,8,0,4,65, +32,80,0,18,4,32,0,0,80,68,64,32,0,0,2,0,4,128,6,16,4,0,2,8,132,0,0,32 +,8,0,1,88,249,0,18,64,0,5,4,1,0,21,128,0,0,24,0,8,6,0,0,128,0,6,128,0 +,1,112,251,0,2,128,5,0,0,64,22,0,6,16,0,1,64,64,0,5,96,0,20,16,0,0, +192,128,4,0,0,3,2,0,5,6,128,0,6,128,128,0,1,152,254,132,8,2,128,2,64, +2,10,0,0,83,0,4,160,16,0,0,128,8,0,4,64,36,132,0,18,16,2,0,1,4,154,8, +10,0,6,6,64,66,0,2,64,130,0,1,5,0,1,42,252,140,8,2,0,0,3,0,0,4,13,0,0 +,8,0,4,128,0,2,36,0,6,8,2,0,17,16,18,0,1,136,26,8,0,7,22,200,72,0,2, +64,36,0,1,8,0,1,56,248,96,0,1,128,4,112,0,0,18,192,3,1,0,3,60,8,0,0, +240,0,5,3,104,0,19,12,0,1,48,0,0,6,0,7,128,7,48,0,3,24,0,1,224,65,0,1 +,128,251,136,1,0,1,4,128,0,0,16,0,0,3,0,4,16,8,0,0,64,0,8,1,0,17,48,0 +,3,24,0,0,1,0,7,196,0,3,96,64,0,0,128,64,0,1,241,249,0,0,4,2,0,0,2,64 +,130,8,0,0,3,1,0,3,48,2,0,0,192,34,0,4,10,33,0,20,16,0,1,20,2,0,0,3,0 +,6,16,64,68,0,3,4,0,0,128,17,0,1,80,254,160,16,0,0,128,0,0,80,8,2,64, +33,4,0,3,4,1,0,0,208,130,0,4,129,36,0,19,132,0,1,192,34,128,4,8,1,0,6 +,80,2,0,3,4,37,176,4,2,0,0,184,255,0,0,1,1,0,1,128,128,0,1,3,0,5,16,0 +,8,128,128,0,19,16,0,0,192,0,12,128,0,3,16,8,0,3,160,248,128,129,0,0, +128,5,0,1,22,128,1,1,0,3,16,0,1,192,0,6,68,0,19,16,32,0,0,240,0,0,6,0 +,0,3,0,7,192,0,3,24,0,0,12,128,1,0,1,64,255,8,16,0,0,128,2,0,0,20,10, +64,11,0,4,32,4,0,0,192,72,0,4,64,160,8,1,0,17,160,0,1,208,0,0,2,0,0, +66,0,8,8,1,0,1,8,0,0,140,16,16,2,0,0,194,248,0,1,2,0,0,3,0,0,66,12,64 +,35,1,0,4,2,0,0,64,8,0,4,128,32,17,0,18,128,8,0,0,192,0,0,88,4,0,8,64 +,4,0,2,96,18,32,128,0,2,200,254,96,0,1,128,4,240,0,0,18,192,2,0,4,60, +8,0,0,240,32,0,4,3,100,0,0,1,0,17,60,0,1,224,0,0,28,0,9,176,128,0,2, +112,0,0,15,104,1,1,0,0,88,253,4,0,2,4,0,0,64,16,0,0,3,0,4,16,0,1,192, +0,6,8,1,0,18,16,0,1,192,0,0,26,0,0,1,0,7,192,0,3,104,0,0,12,128,1,0,1 +,185,249,0,1,2,0,0,2,0,1,8,0,0,2,0,4,48,10,0,0,192,8,1,0,3,136,0,20, +176,8,0,0,192,0,0,24,0,0,3,0,7,224,66,0,2,96,0,0,78,196,17,1,0,0,112, +254,32,8,0,0,128,0,0,16,2,3,64,32,0,4,52,162,6,80,132,0,4,33,160,16,0 +,18,148,64,0,1,34,152,4,19,2,0,1,32,8,1,0,1,208,64,10,9,0,0,96,4,13, +164,129,0,1,24,251,0,0,128,0,6,3,2,0,14,4,64,0,18,32,0,3,24,0,0,2,0,7 +,192,0,3,96,16,12,128,1,0,1,216,252,128,0,1,128,5,64,0,0,22,0,1,2,0,3 +,48,8,6,196,0,5,7,104,0,19,48,0,1,48,0,0,30,0,0,3,0,3,128,0,2,192,0,0 +,8,16,0,0,120,0,0,8,128,1,0,1,176,252,8,33,0,0,128,2,128,66,10,0,0,9, +0,4,48,0,0,22,64,4,1,0,4,32,132,0,19,66,0,0,16,0,0,26,0,0,82,0,3,16,0 +,2,192,16,24,1,0,0,104,0,0,4,129,33,0,1,74,255,0,0,4,0,1,3,0,0,2,12,0 +,0,1,0,4,144,32,70,128,4,0,4,65,2,8,2,0,17,48,17,0,0,192,8,24,0,0,1,0 +,3,8,2,0,1,128,4,88,32,0,0,96,0,0,44,0,0,1,2,0,0,40,252,224,65,0,0, +128,4,240,32,18,192,0,0,2,0,3,60,128,7,242,32,0,4,3,96,0,19,60,0,1, +224,32,28,0,0,3,0,2,96,0,3,112,64,22,0,1,112,0,0,15,232,0,2,8,251,132 +,64,0,1,4,64,32,16,0,0,128,0,4,48,8,6,128,32,0,7,1,0,17,48,32,0,0,208 +,0,0,24,0,0,1,0,7,192,128,24,0,1,96,0,0,12,128,1,0,1,185,248,128,1,0, +1,2,192,2,8,0,0,8,0,4,176,0,0,22,194,0,5,137,48,0,19,56,1,0,0,192,0,0 +,24,0,0,3,0,3,17,1,0,2,2,16,33,0,0,96,0,0,64,4,0,0,2,0,1,253,0,7,128, +0,16,64,0,22,32,4,132,0,9,32,132,0,2,16,2,0,4,80,254,32,0,0,4,128,0,0 +,16,0,0,2,0,1,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,3,4,0,15, +32,0,0,4,128,0,1,64,0,0,72,0,0,8,0,0,1,32,0,0,4,128,0,2,2,64,0,1,32,1 +,32,0,0,4,0,0,232,251,0,74,152,255,40,0,0,4,128,0,0,16,0,0,2,64,0,0,8 +,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,40,0,0,4,0,15,32,0,0, +4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8, +0,0,1,32,0,0,4,0,0,35,252,0,3,1,0,1,4,128,0,0,16,0,12,129,2,64,0,23, +130,64,32,0,9,66,0,3,1,0,3,1,33,254,32,0,0,4,0,1,16,0,1,64,0,2,1,32,0 +,0,4,128,0,2,2,64,0,3,32,0,0,4,0,15,32,0,0,4,128,0,3,64,0,0,8,0,0,1, +32,0,0,4,128,0,2,2,64,0,1,32,1,32,0,1,32,176,249,4,0,49,32,0,11,32,0, +3,16,0,4,217,248,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4, +128,0,0,16,132,2,64,0,0,8,33,1,32,0,0,4,0,15,32,0,0,4,128,0,0,16,8,2, +69,0,0,8,0,0,1,32,0,0,4,128,0,0,16,2,2,64,0,0,8,1,1,32,0,0,4,17,248, +248,0,0,1,0,12,32,8,0,2,16,0,4,4,0,31,64,0,11,1,0,1,96,250,0,1,1,0,12 +,32,0,1,192,0,47,66,64,0,2,1,0,0,128,252,0,1,2,0,25,64,0,17,64,0,1,2, +64,0,10,2,0,3,32,0,0,16,0,0,130,0,0,176,252,0,5,32,0,1,8,1,0,1,16,0,3 +,16,0,5,32,16,4,2,0,34,32,0,9,240,248,0,14,16,0,51,32,0,5,136,253,0,0 +,1,2,0,3,1,0,9,128,0,40,2,0,1,128,0,7,1,0,1,136,252,0,4,1,0,1,4,0,1, +16,4,0,2,128,0,0,128,0,3,32,0,0,4,2,0,19,1,0,19,64,0,0,1,2,64,0,1,80, +249,0,4,2,128,0,0,16,128,0,2,4,0,3,2,0,6,32,0,1,8,0,18,1,0,12,64,0,3, +2,0,3,16,0,0,104,250,0,4,134,129,8,24,0,0,2,48,6,8,0,2,1,36,0,3,16,0, +0,6,36,0,1,40,0,15,128,0,0,128,0,13,80,0,3,18,0,0,2,4,128,4,8,8,252,0 +,0,1,0,0,8,4,0,1,72,4,160,0,0,176,160,22,1,0,2,16,0,0,16,0,0,128,0,0, +8,120,52,2,0,0,1,0,15,64,0,3,128,0,0,2,64,0,1,4,20,0,2,64,10,0,1,21,0 +,2,128,20,8,36,5,160,252,0,2,16,0,2,8,4,128,0,0,16,0,0,2,0,8,1,0,22,1 +,0,8,8,0,7,4,0,6,128,0,0,248,40,0,1,128,0,8,64,0,5,8,0,2,64,4,0,26,16 +,0,0,2,0,16,16,8,32,253,0,1,1,0,5,64,0,5,32,0,0,16,0,46,64,0,1,64,4,0 +,1,1,0,0,248,248,128,0,3,16,0,22,32,0,17,32,0,1,16,0,0,2,0,3,128,0,4, +1,0,3,136,0,2,64,0,0,200,249,0,0,128,0,3,64,0,4,32,0,10,128,16,2,4,0, +0,16,0,37,128,0,5,136,251,0,24,4,0,21,4,0,8,4,32,0,14,216,249,0,0,2,0 +,12,64,0,2,96,0,43,32,0,3,16,0,1,2,0,1,168,251,0,26,2,0,23,32,0,21, +152,255,0,8,1,0,15,16,0,22,64,0,11,136,0,4,1,0,4,16,250,0,74,152,255, +0,15,4,0,7,10,8,0,26,8,0,19,152,249,0,14,4,0,11,4,0,23,64,0,10,4,0,8, +152,251,0,52,64,0,15,8,0,3,16,251,0,65,32,0,3,32,0,2,184,253,0,8,4,0, +39,32,0,0,4,0,11,1,0,1,16,0,5,140,248,8,0,3,32,0,8,8,0,2,1,0,4,8,0,0, +1,0,18,64,0,3,4,0,16,16,0,3,16,252,0,9,1,0,1,4,0,60,152,250,0,8,4,0, +16,32,0,43,32,0,1,216,251,0,73,8,24,255,0,4,64,0,8,16,0,2,2,0,4,1,0, +20,16,0,2,2,0,21,128,32,251,0,47,4,0,0,16,16,0,10,16,0,5,1,32,0,2,216 +,249,0,4,128,0,1,128,0,5,32,0,0,4,0,56,248,255,0,53,64,0,19,216,255,0 +,7,64,0,3,4,0,3,96,0,0,8,0,4,1,128,0,18,8,64,0,4,1,0,9,1,0,4,80,0,0,2 +,0,0,40,249,0,5,2,0,7,128,0,0,128,0,0,18,0,0,2,0,24,128,0,23,32,0,1, +40,252,0,14,128,0,9,128,0,22,16,0,23,144,254,0,0,64,0,2,64,0,0,8,4,0, +0,1,0,6,16,0,9,16,0,11,1,0,3,16,0,6,1,0,3,32,0,0,1,0,10,8,160,254,0,0 +,128,8,16,1,0,3,128,0,3,128,0,2,68,0,4,16,0,0,72,0,17,32,0,3,64,0,2,1 +,0,8,32,0,8,128,0,0,249,0,0,128,5,160,0,0,32,32,4,8,1,3,0,1,2,0,0,1,0 +,1,52,0,3,192,80,64,41,0,1,16,0,11,1,0,1,32,0,0,8,5,0,0,16,0,0,8,64, +128,1,0,3,8,0,0,1,64,128,0,1,1,0,1,4,128,0,1,21,216,251,64,65,0,1,2, +65,106,9,132,1,0,1,4,1,33,4,0,1,16,18,0,1,2,0,1,1,0,0,33,0,0,34,0,16, +48,0,1,32,0,1,40,136,0,0,8,0,0,64,0,3,139,0,0,8,4,8,64,0,0,146,20,0,0 +,16,0,0,224,249,0,0,128,0,1,1,65,32,8,68,0,2,1,0,33,16,0,6,2,0,6,1,0, +0,4,8,0,5,8,0,0,168,253,64,0,11,40,32,0,3,128,0,0,64,0,3,128,64,0,18, +8,0,7,32,0,5,16,0,3,32,0,5,96,255,16,0,7,8,0,8,128,0,54,204,251,2,0, +21,32,0,25,64,0,0,8,0,3,16,0,4,64,0,3,32,0,4,128,232,249,0,17,192,0, +34,1,0,19,72,254,16,0,18,1,0,3,2,12,0,26,64,0,19,92,249,16,0,5,1,0,7, +64,0,7,32,0,26,32,0,3,16,0,6,32,0,7,216,251,0,9,2,0,35,32,0,2,1,0,15, +128,0,6,254,0,4,64,0,20,128,0,18,16,0,1,128,0,0,24,0,9,32,0,3,64,0,0, +2,64,0,2,40,249,0,8,2,0,5,8,0,1,48,0,2,64,0,25,128,0,0,17,0,4,1,0,3, +32,16,0,0,2,0,0,16,0,0,32,2,0,2,136,251,0,16,8,0,0,1,0,4,5,0,45,64,0, +1,88,251,0,24,16,0,27,2,0,16,128,0,1,40,252,32,0,13,4,0,9,1,0,19,64,0 +,13,128,64,16,0,2,8,0,1,128,0,2,56,254,0,69,2,0,0,64,0,1,216,253,0,2, +128,6,0,4,40,130,133,40,16,0,4,10,0,31,64,32,0,2,160,1,0,1,32,208,36, +128,8,0,7,168,255,0,3,6,0,4,64,0,0,8,0,0,128,0,4,16,0,32,130,0,2,128, +1,0,1,6,2,0,10,160,252,0,2,128,1,0,7,128,128,0,4,22,4,0,30,192,0,3, +128,1,0,1,1,2,0,0,30,0,8,248,252,0,2,128,0,6,129,128,8,17,0,4,138,0, +31,64,82,0,2,128,137,0,0,128,38,0,0,20,26,5,0,7,88,251,0,3,32,8,0,4, +33,32,4,64,0,4,12,1,0,31,1,0,3,16,2,128,38,64,136,64,8,0,7,72,250,0,3 +,1,0,4,120,0,0,15,224,1,0,4,18,8,0,30,128,128,0,2,224,1,0,0,128,1,180 +,0,0,30,0,8,48,250,0,3,6,1,0,6,128,64,0,4,20,0,31,64,131,0,2,128,1,0, +1,6,0,2,4,0,7,72,255,0,3,6,0,5,34,64,132,17,0,4,136,4,0,30,64,35,0,2, +128,5,1,0,2,68,24,1,0,7,32,252,0,9,104,129,0,2,4,0,3,2,0,15,34,0,6,17 +,0,0,52,0,3,10,66,136,0,1,64,164,133,0,1,32,18,0,0,128,0,6,4,0,0,192, +251,0,9,64,0,25,12,0,6,6,0,0,48,0,9,128,1,0,5,8,0,5,48,0,0,16,249,0,9 +,96,0,4,16,0,2,22,4,0,14,12,0,6,6,0,0,48,0,3,30,192,129,0,1,15,130,0, +1,128,7,0,0,32,6,0,6,48,0,0,216,250,8,0,9,132,0,2,128,0,3,138,0,15,10 +,0,6,5,0,0,48,32,0,2,24,32,0,2,141,0,0,1,1,128,38,1,0,0,2,0,6,48,32, +19,253,0,9,32,1,0,3,2,0,2,12,1,0,14,10,0,6,5,0,0,176,16,0,2,66,96,16, +1,0,0,32,4,8,0,1,16,2,32,88,0,6,176,0,0,97,249,0,9,88,32,0,2,12,16,0, +2,18,8,0,24,12,0,3,22,192,0,2,15,224,129,0,0,128,7,48,0,0,30,4,0,5,60 +,32,176,254,4,0,18,20,0,25,48,0,3,24,16,128,0,7,193,32,24,0,6,48,0,0, +209,249,0,10,68,0,2,48,32,0,2,8,4,0,24,48,17,0,2,152,64,18,0,1,45,66, +129,0,1,6,0,0,2,24,0,6,48,17,200,250,0,2,128,6,0,4,40,130,0,2,4,137, +66,0,1,18,1,0,5,180,16,0,16,52,0,1,144,128,138,80,0,2,64,36,136,0,1,6 +,0,1,128,0,6,4,0,0,184,251,0,3,6,0,4,64,0,5,4,4,0,0,8,8,0,5,32,0,17, +48,0,1,192,0,10,6,4,0,0,24,8,0,5,48,0,0,96,250,0,2,128,1,0,4,96,0,4,8 +,0,2,22,0,7,16,0,19,160,64,24,192,0,2,15,128,1,0,0,128,7,0,1,4,16,0,6 +,32,0,0,250,8,0,1,128,0,6,129,0,2,128,0,0,16,2,0,0,10,0,7,2,0,16,48,5 +,0,0,208,0,0,8,66,0,2,45,132,41,0,0,128,6,0,1,26,1,0,5,128,0,0,202, +250,0,3,16,0,5,68,0,3,8,16,2,0,0,20,4,0,5,16,0,17,48,34,0,0,208,0,0, +16,1,32,4,0,0,32,4,4,0,1,64,0,1,154,0,7,2,176,253,0,3,1,4,0,3,24,0,3, +12,128,7,0,1,18,0,6,52,0,15,18,0,0,60,0,1,112,128,30,200,0,2,15,96, +128,0,0,128,1,4,0,0,6,4,0,5,12,16,224,252,4,0,2,6,0,5,64,0,3,8,0,2,16 +,0,25,48,32,0,0,192,0,0,16,4,3,2,0,1,128,0,5,24,0,7,32,1,253,0,3,70,8 +,0,4,2,0,2,32,0,0,32,2,0,0,16,0,23,1,0,0,48,1,0,0,64,0,0,24,0,0,11,0, +1,13,144,73,0,0,128,0,11,2,32,249,16,0,0,20,128,194,0,1,26,32,0,0,40, +130,0,0,32,16,180,0,12,2,0,14,132,9,4,0,3,2,64,10,0,1,13,160,9,0,2,16 +,0,0,128,64,144,0,4,20,8,248,254,0,1,32,16,0,5,64,0,2,128,48,8,0,11, +32,0,14,128,129,48,0,4,16,128,0,1,12,128,1,1,0,4,8,0,5,48,0,0,136,254 +,0,1,48,160,7,1,0,0,24,0,1,96,0,1,128,128,32,16,0,10,48,0,15,233,1,0, +0,16,0,2,8,4,2,0,2,128,0,3,192,32,6,0,0,128,0,4,16,32,192,253,12,0,2, +70,0,1,24,9,0,1,129,0,1,17,176,0,11,32,16,0,14,164,1,0,0,1,0,2,16,1,9 +,1,0,2,9,1,0,3,2,0,0,8,0,4,32,2,98,254,4,0,1,145,16,0,1,128,8,0,1,128 +,0,1,80,48,2,0,28,8,0,0,2,0,3,8,0,2,128,2,8,0,3,32,24,5,128,0,4,144,0 +,0,176,251,0,1,12,0,0,5,1,0,0,22,0,1,24,0,1,224,1,60,16,0,27,112,0,0, +13,16,0,2,6,192,128,0,1,3,224,129,0,2,48,0,0,30,192,0,5,44,16,16,254, +4,0,2,6,0,1,24,0,4,128,64,48,0,11,16,0,15,1,0,5,8,8,0,0,2,0,1,2,0,4, +32,24,0,0,128,0,4,16,32,217,249,0,2,5,38,2,0,0,16,32,0,1,128,0,0,128, +5,48,32,0,10,48,0,15,1,0,1,18,0,2,24,1,8,0,1,64,64,129,0,3,2,24,0,0,2 +,0,4,168,0,0,48,249,0,1,20,128,22,0,1,2,0,1,40,8,0,0,32,32,16,2,0,8, +160,133,0,0,1,0,14,8,0,0,148,0,3,66,80,3,0,1,64,32,136,0,0,128,38,1,2 +,129,8,1,2,0,3,4,33,24,249,0,1,32,16,4,2,0,1,16,0,5,32,8,0,8,128,1,0, +0,32,0,14,10,0,0,48,8,0,7,12,4,0,3,192,0,2,2,0,4,16,0,0,32,249,0,1,48 +,32,6,0,4,120,0,3,45,0,10,129,48,32,0,16,16,0,3,14,0,0,3,0,1,2,128,1, +0,0,128,7,33,0,0,30,196,2,0,4,48,32,0,0,249,8,0,3,4,0,1,5,0,0,96,16,0 +,0,128,0,0,20,64,0,10,160,0,7,128,4,0,5,1,0,0,32,18,0,3,16,11,1,0,0, +77,129,41,0,0,128,36,16,32,26,64,9,2,0,3,176,0,0,59,254,0,2,64,18,2,0 +,1,5,0,0,8,0,1,128,8,24,0,9,128,1,0,16,16,0,0,144,0,3,66,8,8,1,0,0,45 +,0,0,4,0,1,64,216,128,64,136,1,0,5,66,57,250,0,1,12,128,5,0,1,14,0,1, +80,64,0,0,96,128,36,0,9,160,1,0,8,64,0,8,44,16,0,2,6,192,0,2,3,100, +128,0,1,7,48,0,0,30,64,2,0,4,12,0,0,184,254,4,0,5,8,4,0,0,96,16,0,0, +128,1,40,0,11,16,0,8,1,0,7,16,16,0,5,2,0,0,12,128,65,0,5,132,2,0,4,48 +,0,0,225,250,0,2,64,64,4,0,0,152,0,1,96,1,0,1,4,18,0,9,128,0,0,48,0, +17,40,1,0,2,80,16,8,0,1,1,0,0,5,0,1,134,16,132,152,0,0,1,0,4,48,8,48, +252,16,0,0,4,128,0,2,154,0,1,8,4,0,0,160,132,0,0,2,0,2,10,0,5,17,48,1 +,0,6,64,2,0,7,4,1,0,3,64,1,0,1,64,160,1,0,2,64,66,128,8,0,0,2,0,0,1,0 +,1,132,64,128,251,0,6,24,8,0,1,32,0,1,1,0,0,8,0,2,16,0,6,33,16,0,6,64 +,2,0,7,16,16,0,4,2,0,2,132,1,0,2,128,0,10,240,252,0,1,48,0,1,4,0,0,24 +,0,1,32,32,0,0,128,1,44,0,3,22,16,0,3,128,1,48,32,0,16,48,16,0,3,192, +2,0,1,3,128,1,0,2,176,0,0,30,192,2,0,1,12,0,2,16,64,248,12,0,1,4,16,0 +,1,136,16,0,0,64,4,0,1,132,20,64,0,2,74,0,4,128,41,32,0,8,4,0,7,48,1, +0,3,64,1,0,1,1,128,137,0,2,80,66,90,68,9,2,0,0,128,4,0,0,128,0,0,210, +254,4,0,0,48,8,0,0,4,0,0,88,0,2,2,0,1,16,25,0,3,12,0,6,16,0,7,64,0,9, +66,0,3,128,1,4,0,0,76,130,17,2,0,1,96,0,0,64,136,1,0,1,44,0,1,32,1,72 +,251,0,1,60,128,1,0,1,22,8,0,0,120,16,0,0,96,0,0,36,0,3,18,0,4,128,0, +0,48,0,7,64,0,8,12,0,5,2,0,1,15,224,1,0,2,128,0,0,30,64,2,0,1,3,4,0,0 +,60,8,208,252,4,0,0,48,8,0,0,2,0,0,16,0,1,32,0,3,40,0,3,20,0,4,128,1, +16,0,8,2,0,7,48,0,5,130,0,1,12,0,4,160,0,1,128,2,0,1,12,8,0,0,48,0,0, +225,251,0,1,48,0,0,70,0,1,16,8,0,0,96,17,0,1,40,16,0,3,8,0,4,128,1,48 +,0,7,128,2,0,7,48,8,0,3,64,9,0,1,13,128,5,1,0,1,64,0,0,152,4,1,0,1,44 +,0,1,184,8,56,251,0,1,52,162,2,2,0,0,64,32,0,0,104,65,0,0,160,132,0,0 +,2,0,2,18,0,5,9,0,18,132,64,0,0,16,0,0,26,81,0,2,137,162,132,0,1,32,2 +,66,128,0,1,42,2,0,2,4,33,24,254,0,1,32,0,3,24,0,5,1,0,0,8,0,2,8,0,6, +1,0,7,64,0,18,4,0,6,24,8,0,1,64,0,2,16,0,0,192,253,0,1,48,0,0,1,1,0,0 +,30,0,1,96,0,1,128,1,44,0,3,22,16,0,3,128,129,0,9,4,0,12,24,192,2,0,1 +,7,128,1,0,0,128,7,176,0,0,4,208,2,96,0,3,48,32,24,253,8,0,1,145,16,0 +,1,152,32,0,0,96,65,0,1,132,20,64,0,2,74,0,4,128,9,0,16,6,0,1,34,0,1, +72,24,81,1,0,1,9,0,0,16,1,128,70,84,66,90,64,9,2,66,0,2,176,0,0,171, +251,0,1,144,144,128,0,1,154,16,0,0,32,0,2,48,24,0,3,12,0,25,32,9,0,0, +192,24,8,137,1,4,0,0,8,128,8,1,0,0,16,98,0,0,26,160,1,32,1,0,3,1,41, +255,0,1,44,0,0,5,0,1,6,0,1,120,16,0,0,96,0,0,36,0,3,18,0,4,128,0,19, +60,0,1,240,0,0,30,0,0,2,0,1,5,96,1,0,0,128,7,128,0,0,6,64,2,88,32,0,2 +,12,16,40,251,4,0,5,24,4,0,0,96,0,3,40,0,3,12,0,4,128,1,0,18,48,0,3, +24,0,0,130,0,1,4,128,1,1,0,1,164,0,0,24,128,2,96,64,0,2,48,16,225,250 +,0,2,34,0,0,8,0,0,88,0,1,96,64,0,2,18,0,3,16,0,4,128,1,0,18,56,10,0,0 +,192,68,152,72,1,0,1,8,192,9,0,1,6,64,0,2,1,112,2,0,2,48,2,232,254, +160,1,4,130,34,16,8,26,32,0,0,40,2,0,0,32,16,34,2,0,2,26,0,1,104,8,0, +1,9,0,18,4,1,0,0,16,2,146,80,66,0,1,9,160,49,0,2,128,66,152,8,2,106, +32,0,0,160,5,4,0,0,64,253,128,1,0,0,16,0,0,2,64,24,0,2,32,0,2,16,8,0, +2,24,0,1,64,0,2,128,0,16,9,0,0,16,16,0,1,32,0,1,1,0,1,4,128,1,0,2,68, +0,0,24,0,0,1,96,0,2,128,48,0,0,56,252,128,1,16,32,6,128,64,0,2,96,32, +0,2,44,0,4,4,0,0,96,64,0,1,1,0,18,48,16,0,0,64,64,24,192,2,0,1,11,128 +,1,0,0,128,7,178,0,0,30,192,2,96,0,1,96,64,48,0,0,16,251,132,1,32,1,2 +,66,2,24,9,0,0,32,0,1,128,32,20,64,0,2,24,0,1,96,1,0,1,16,2,0,0,4,0,5 +,16,2,0,5,8,0,0,48,1,0,2,16,73,1,0,1,5,128,17,2,0,0,32,80,66,26,64,9, +98,34,0,0,32,8,48,5,122,254,12,48,0,0,9,36,192,2,73,16,0,0,64,18,0,0, +128,8,24,0,3,88,4,0,0,96,4,0,4,2,0,5,16,1,0,5,8,0,1,65,0,0,192,40,16, +129,1,0,1,6,0,0,5,2,128,16,96,0,0,64,136,1,64,12,0,1,17,50,34,32,255, +96,0,0,60,128,7,49,0,0,30,0,1,120,0,1,96,128,36,0,3,30,0,1,120,32,0,0 +,128,0,2,7,0,5,144,3,0,5,8,0,0,12,0,1,240,0,0,14,4,1,0,1,9,224,0,1, +128,1,129,0,0,6,64,2,56,0,1,192,1,60,0,0,48,255,136,1,16,0,0,4,192,0, +0,8,16,0,0,64,16,0,0,128,1,24,0,3,24,0,1,96,32,0,3,128,5,0,5,208,2,0, +5,8,0,0,48,16,0,0,192,0,0,24,0,0,1,0,1,4,128,1,1,0,1,98,0,0,24,128,1, +96,0,2,129,48,32,241,251,128,1,50,10,22,72,72,128,0,1,96,0,2,4,34,0,3 +,88,32,0,0,96,4,0,0,128,0,2,4,0,5,8,2,0,5,4,0,0,48,2,0,0,192,68,88,72 +,1,0,1,8,0,0,4,0,0,128,22,128,0,0,152,32,2,0,0,128,0,0,128,4,48,1,32, +251,0,29,4,0,6,2,0,14,16,0,19,232,251,32,0,0,4,128,0,0,16,0,0,2,64,0, +0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,7,2,0,6 +,33,0,0,4,128,0,0,16,0,0,2,0,1,10,0,1,32,0,0,4,0,3,2,64,0,0,8,0,0,1, +32,0,0,4,0,0,128,251,0,54,1,0,1,4,0,3,4,0,10,216,254,36,0,0,4,128,0,0 +,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32, +0,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,0,1,8,0,0,1,32,0,0,4,128,64,16, +128,2,64,0,0,8,0,0,1,32,0,0,4,0,0,193,250,12,0,2,32,4,0,4,12,0,41,16, +0,6,16,4,130,0,6,4,1,0,0,91,248,32,0,0,4,0,1,16,0,1,64,0,2,1,32,0,1, +128,0,0,16,0,1,64,0,0,8,0,0,1,32,0,0,4,0,17,4,128,0,3,64,128,8,0,0,1, +32,0,0,4,0,6,8,0,0,1,0,1,4,0,0,40,248,8,0,9,64,0,42,1,0,1,4,0,4,64,0, +2,2,0,2,128,0,1,82,248,32,0,0,4,0,1,24,0,0,2,80,0,1,4,1,32,0,0,132, +144,0,0,16,0,0,66,72,0,0,8,0,0,1,32,0,0,4,0,15,32,132,4,128,0,0,16, +128,130,32,0,0,8,0,0,1,32,0,0,4,0,0,16,2,0,0,66,72,32,8,0,0,1,0,1,4,0 +,0,88,254,0,1,4,128,0,2,64,8,0,11,2,0,28,64,0,11,64,0,9,184,253,0,1,1 +,32,0,5,8,64,0,2,1,0,6,8,0,27,2,0,15,64,0,2,16,0,0,224,249,0,10,128,0 +,16,4,0,16,8,0,2,2,16,48,128,0,6,128,0,0,16,0,6,32,0,0,4,152,254,4,0, +0,64,0,0,4,0,6,32,0,0,1,0,1,4,0,32,64,0,0,64,0,2,1,0,0,32,0,1,16,0,4, +64,0,5,248,249,0,1,16,0,0,2,64,0,19,64,0,20,16,0,8,128,0,13,16,16,144 +,252,0,9,64,32,0,15,2,0,9,2,0,1,8,0,3,4,0,24,4,0,0,176,253,0,4,128,0, +1,128,0,5,17,0,1,128,0,0,8,4,0,3,64,0,0,16,0,15,32,0,0,16,0,0,1,0,2,4 +,2,0,1,2,0,1,16,8,0,1,128,0,0,64,0,6,32,120,253,0,5,128,0,0,80,0,3,2, +1,0,9,1,0,2,32,0,19,64,0,0,8,0,9,17,0,3,66,0,5,160,250,0,4,32,128,0,0 +,208,6,0,2,40,128,8,0,0,20,32,0,0,4,8,0,2,1,64,0,0,8,32,0,14,64,0,0,8 +,0,0,1,16,0,0,130,138,0,0,192,0,0,2,0,1,8,21,20,20,96,0,0,128,0,0,10, +0,4,16,184,248,0,1,32,4,6,128,1,8,0,0,129,0,3,3,240,0,4,4,0,1,24,0,0, +128,1,0,0,8,0,14,128,0,0,128,0,1,64,32,144,40,65,34,0,0,5,131,0,0,128 +,1,0,0,27,32,34,4,32,34,0,1,2,0,0,32,0,0,168,254,0,3,2,0,1,16,128,0,0 +,1,0,3,8,0,4,4,0,1,32,0,0,64,0,1,16,0,14,32,0,3,32,128,0,0,64,0,0,64, +0,0,4,130,0,3,4,32,0,0,4,0,0,8,0,1,8,0,2,224,250,4,0,0,8,144,0,0,64,0 +,6,128,0,0,16,0,7,64,0,0,32,0,24,8,0,0,128,0,2,8,0,13,32,0,0,116,251, +32,0,1,32,0,6,64,0,0,32,0,1,16,0,34,64,8,0,13,8,0,5,232,252,0,51,4,0, +8,128,0,3,64,0,6,80,255,0,3,128,0,1,16,2,0,3,2,0,6,32,0,30,4,0,9,2,0, +0,18,0,7,240,252,0,1,128,128,2,0,1,8,0,2,128,0,62,144,253,0,2,8,0,0,1 +,1,0,3,16,0,35,8,0,9,64,0,14,152,251,0,74,152,255,0,59,2,128,0,12,176 +,253,0,73,128,16,255,0,3,16,2,0,6,128,0,3,2,0,7,64,0,0,8,0,16,64,0,3, +12,0,5,2,0,10,1,0,0,64,0,0,184,248,0,3,8,0,1,16,2,0,41,1,0,4,8,0,5,64 +,0,8,4,56,251,0,19,32,0,18,8,0,33,84,249,0,15,32,0,10,128,0,13,16,0, +12,4,0,3,2,0,1,8,0,8,64,248,0,14,16,0,37,1,0,1,4,0,3,2,0,1,8,0,4,128, +0,1,128,120,250,0,9,128,0,0,16,0,3,8,0,28,64,0,10,2,0,12,64,0,0,96, +255,0,26,128,0,0,16,0,21,2,0,9,2,0,2,8,0,6,176,254,0,4,8,0,46,8,2,0, +10,2,0,4,1,0,1,136,254,0,74,152,255,0,1,16,0,7,1,0,1,4,0,24,1,0,2,1,0 +,1,128,0,1,32,0,1,16,0,3,128,0,13,128,0,0,80,252,0,7,32,0,17,1,96,0, +28,32,0,5,1,0,1,16,0,5,216,249,0,27,16,0,9,4,0,0,4,16,0,31,152,250,0, +1,128,0,1,128,0,0,1,0,1,8,32,0,1,1,2,0,33,16,0,3,2,0,2,1,0,2,1,0,8,32 +,0,1,254,0,3,128,0,4,32,16,0,0,128,0,8,32,0,22,16,64,0,2,48,0,1,2,0,6 +,4,0,8,1,0,0,136,251,0,10,9,0,11,8,0,21,128,0,3,32,0,19,128,0,0,160, +253,0,1,4,0,9,32,0,11,64,0,12,16,0,2,16,0,6,64,0,4,32,0,10,8,0,4,255, +0,1,16,0,2,128,0,7,8,0,3,8,0,0,2,0,2,1,64,0,18,16,4,0,0,34,0,0,2,0,3, +4,2,0,0,32,16,1,1,0,6,8,0,2,80,255,16,0,0,8,16,2,64,0,11,4,0,4,64,4,8 +,0,19,1,0,5,1,0,2,8,0,0,8,0,4,64,0,7,88,248,0,0,48,12,160,2,16,64,128 +,2,0,1,10,0,2,8,0,1,4,0,0,84,128,0,1,64,1,12,128,0,13,4,0,3,169,16,0, +0,34,0,0,132,66,0,0,192,0,0,2,12,5,12,16,1,2,0,0,80,64,0,0,64,1,0,0,4 +,0,3,254,128,64,128,4,2,128,2,16,0,0,224,64,0,0,8,1,0,0,48,8,0,0,128, +16,0,0,20,130,0,1,32,0,2,12,0,2,8,0,8,32,0,0,128,32,0,0,8,4,80,0,1,4, +8,0,2,2,0,0,16,0,0,33,65,1,24,4,128,32,8,8,131,80,33,0,0,8,251,0,0, +129,0,1,1,0,4,1,0,3,4,16,0,3,4,0,0,1,0,4,16,0,2,16,0,8,64,0,0,32,0,1, +32,0,0,128,0,1,2,0,3,2,0,0,8,0,1,66,0,0,2,4,0,0,10,0,1,136,64,0,1,136 +,254,0,2,8,0,0,64,0,0,2,0,0,128,32,0,0,1,8,0,0,8,0,1,16,128,0,0,64,0, +6,4,0,16,1,0,0,4,0,14,4,0,2,8,1,2,0,0,8,0,0,72,255,16,0,2,8,0,33,4,0, +1,16,0,31,20,255,0,37,2,0,1,8,0,9,8,0,10,2,0,9,176,253,16,0,6,16,0,16 +,128,0,0,16,0,16,65,0,5,2,64,0,1,8,0,0,4,0,1,5,64,0,0,16,0,2,1,0,4,60 +,254,0,4,5,0,1,16,0,1,8,0,34,32,0,5,1,0,2,8,1,0,6,128,0,4,32,0,0,232, +255,6,0,40,1,0,31,232,248,0,62,2,0,10,184,253,0,3,4,0,4,96,0,0,4,0,3, +2,0,19,128,0,2,2,0,3,16,0,21,8,0,3,184,250,0,14,32,0,3,16,0,24,1,0,5, +130,0,2,2,0,0,64,0,1,4,48,0,0,16,0,4,64,0,1,8,192,252,0,1,64,0,0,1,8, +0,3,128,0,2,2,0,7,128,0,22,32,64,0,0,128,0,7,128,0,8,16,0,3,64,232, +252,0,7,8,0,38,32,0,9,128,3,0,1,128,0,3,128,32,0,3,32,168,254,16,0,5, +32,0,6,64,0,42,32,0,14,232,255,0,9,16,0,14,32,0,25,4,0,9,1,0,9,200, +253,0,1,20,2,0,0,16,8,131,0,16,32,32,144,0,18,4,8,0,3,64,3,0,1,9,4,0, +2,36,4,0,0,2,2,0,2,1,0,3,40,249,0,2,32,0,0,64,0,1,8,0,15,12,132,0,26, +3,0,1,4,0,6,24,0,1,1,0,0,4,8,0,2,24,253,0,1,56,8,0,1,128,24,16,0,15, +14,0,27,3,0,1,12,0,3,4,4,0,0,16,208,0,2,7,0,3,40,255,0,1,20,1,0,0,64, +4,88,0,16,141,132,16,2,0,18,4,0,4,3,0,1,76,16,0,2,32,0,1,24,64,0,3,1, +0,2,176,252,0,1,4,17,0,0,128,4,0,17,141,0,0,133,0,28,136,8,0,5,24,1, +139,0,1,137,0,3,208,248,0,1,44,0,1,112,128,6,16,0,15,3,228,0,19,12,16 +,0,3,192,0,0,1,0,0,3,0,3,2,0,1,22,208,3,0,1,2,4,0,2,168,254,0,1,32,0, +1,192,0,0,16,4,0,15,12,128,1,0,25,3,0,1,12,0,6,24,0,0,3,0,6,168,248,0 +,1,48,33,0,0,224,64,24,0,16,77,208,9,2,0,17,160,16,0,4,139,0,1,10,8,0 +,2,2,0,1,156,8,3,0,1,136,4,0,2,128,252,0,1,4,1,0,0,208,128,0,0,64,1,0 +,4,4,66,0,5,96,34,0,0,160,9,2,0,7,40,0,6,20,0,5,26,66,0,2,13,16,0,3, +16,36,26,2,16,1,0,0,141,16,0,2,120,252,0,2,8,0,0,128,0,2,2,0,4,48,0,6 +,96,0,2,1,0,8,12,0,6,6,0,2,6,2,0,5,8,0,4,66,0,5,12,0,3,48,248,0,1,12, +0,1,192,0,1,192,2,0,4,32,0,6,112,64,0,0,128,129,0,8,12,0,6,6,0,1,128, +1,0,1,24,8,0,2,12,4,0,1,128,1,0,0,32,24,208,0,2,12,0,3,216,254,8,0,0, +132,16,0,0,128,0,0,1,64,1,0,4,16,17,0,5,8,2,0,1,1,0,8,10,0,6,5,0,2, +160,0,1,8,1,19,4,0,0,72,0,2,128,0,1,2,16,64,0,2,68,2,0,2,123,250,0,1, +16,0,1,192,68,0,0,128,97,0,4,32,6,0,5,104,4,0,0,128,9,1,0,7,10,0,6,5, +0,1,128,70,0,1,136,16,8,0,1,140,0,3,70,1,32,16,9,96,0,1,72,0,3,49,255 +,0,1,12,32,0,0,240,0,2,2,0,4,28,0,6,120,32,0,0,224,1,0,19,128,1,4,0,0 +,30,192,128,0,1,15,4,0,1,128,7,48,0,0,30,192,0,2,7,2,0,2,208,249,4,0, +3,64,64,0,1,2,0,4,32,0,7,64,0,0,128,0,22,2,0,0,24,16,3,2,0,0,4,0,3,6, +0,0,32,24,0,0,131,0,1,8,0,3,201,249,0,1,4,17,0,0,192,4,0,1,129,0,4, +144,16,0,5,104,0,1,128,33,0,20,16,0,1,156,0,0,3,0,1,44,8,0,2,6,0,1,88 +,4,11,0,1,36,8,0,2,224,254,0,1,4,2,0,0,16,8,1,64,0,14,17,0,0,32,144,0 +,18,4,128,18,1,0,0,26,96,3,4,0,0,137,16,0,2,16,24,8,18,1,3,0,6,32,249 +,0,1,48,32,0,0,64,0,19,128,0,9,4,0,6,2,0,0,16,32,0,2,24,0,0,3,0,1,4,0 +,5,128,8,8,3,1,0,5,72,250,0,5,128,0,0,192,2,0,12,24,0,12,8,0,6,4,0,1, +144,3,0,1,24,192,1,0,1,12,0,2,128,7,50,0,0,24,144,0,0,2,0,5,120,252,4 +,0,0,144,32,0,0,64,4,0,0,64,1,0,12,8,0,1,128,16,2,0,18,128,0,0,1,0,0, +24,97,162,0,1,140,8,0,1,128,70,16,32,152,64,3,0,6,210,250,12,0,0,16,0 +,1,128,4,0,0,128,97,0,12,96,4,0,1,133,0,8,4,0,6,2,0,0,128,0,0,22,0,1, +144,8,11,0,1,8,0,3,192,0,0,130,144,96,3,0,6,8,255,0,1,12,32,0,0,112, +128,0,1,2,0,12,112,16,0,0,224,0,19,12,144,7,1,0,0,14,192,131,0,1,3,8, +0,1,128,7,48,0,0,6,192,131,0,6,232,253,8,0,1,8,0,0,192,0,2,2,0,12,104 +,0,1,128,1,0,8,4,0,6,2,0,1,16,0,2,24,0,0,3,2,0,0,12,8,0,5,24,16,3,0,6 +,241,255,0,2,1,0,0,224,64,0,1,137,0,12,96,0,1,192,9,2,0,7,8,0,6,4,0,0 +,136,0,0,20,4,0,0,128,2,2,0,1,42,0,3,6,130,68,84,0,0,32,4,0,5,120,252 +,0,1,52,4,0,0,208,128,2,67,0,0,8,36,0,9,32,1,0,1,162,9,2,0,7,2,0,6,1, +0,0,4,18,0,3,64,144,0,1,77,0,3,16,216,8,26,16,16,1,0,0,13,0,3,104,254 +,0,1,16,0,1,128,0,20,1,0,8,10,0,6,5,0,0,16,0,8,8,8,0,3,192,32,16,0,8, +184,250,0,1,56,0,1,192,0,0,24,192,2,0,0,32,0,8,128,3,0,1,3,128,129,0, +19,16,0,4,128,0,1,12,0,2,128,7,129,0,0,24,192,3,0,6,72,251,8,0,0,20, +34,0,0,128,0,0,153,96,1,32,1,0,8,64,0,0,2,0,0,1,0,0,1,0,8,8,0,6,4,0,0 +,128,0,5,16,0,1,8,16,0,1,128,6,192,16,16,72,147,0,1,64,4,0,2,26,248,0 +,1,36,65,0,0,192,0,0,1,161,97,0,0,65,0,8,64,32,0,1,12,128,9,0,25,160, +0,1,140,0,3,192,192,66,88,0,0,96,0,1,64,2,0,2,96,248,0,1,60,0,1,240,0 +,0,6,0,0,2,56,0,9,192,0,0,1,0,0,14,226,1,1,0,7,2,0,6,1,0,0,12,16,0,3, +192,0,2,15,4,0,1,128,7,240,0,0,30,200,3,0,1,3,0,3,56,249,4,0,0,32,0,1 +,64,64,24,0,0,2,64,0,11,2,0,0,13,128,0,9,16,0,6,8,0,7,128,0,1,4,0,4, +192,128,8,0,8,193,251,0,1,48,0,1,192,4,8,16,161,32,128,0,8,64,3,0,1, +12,128,33,0,1,1,0,5,148,0,6,10,0,0,128,16,0,4,10,0,1,140,4,0,2,22,193 +,2,24,9,131,0,1,32,8,0,2,104,255,0,1,4,130,22,18,8,91,64,0,0,40,1,0,9 +,136,0,2,32,144,0,1,2,0,6,1,0,13,64,1,0,1,9,4,0,2,16,88,0,0,2,32,0,2, +1,0,3,80,251,0,1,32,32,2,64,0,0,16,8,0,0,64,64,0,13,128,0,9,20,0,6,10 +,0,7,2,0,1,4,0,4,128,0,0,24,0,1,1,0,5,168,250,0,1,40,0,0,7,0,0,128,24 +,200,2,0,10,192,0,7,1,0,5,128,0,14,192,2,0,1,12,0,2,128,7,177,0,0,16, +192,0,3,2,0,2,40,254,8,0,0,52,132,66,68,4,152,64,1,0,0,8,0,8,64,0,3, +128,16,2,0,7,2,0,6,1,0,6,64,129,0,1,76,16,0,1,128,22,80,0,0,24,66,0,7 +,251,250,0,1,20,160,36,128,4,24,128,97,0,0,33,0,9,19,0,3,133,0,1,1,0, +5,136,0,6,4,0,6,128,9,0,1,136,8,0,2,192,96,8,89,8,11,0,1,32,2,0,2,1, +252,0,1,12,128,7,114,128,30,4,2,120,0,9,128,131,0,2,224,0,2,2,0,6,1,0 +,14,2,1,0,0,3,0,2,128,7,144,0,0,22,192,131,0,1,3,0,3,58,249,4,0,0,48, +0,0,4,192,0,0,24,0,0,130,0,0,32,0,8,64,3,0,2,128,1,0,0,128,0,6,64,0, +14,128,130,0,1,12,0,4,129,32,24,0,0,3,0,1,12,2,0,2,196,248,0,1,16,33, +6,224,64,92,32,33,0,11,3,0,2,192,9,2,128,2,0,5,64,1,0,14,33,0,1,10,8, +0,2,38,64,8,28,32,3,0,1,64,0,3,120,248,0,1,4,9,0,0,208,128,18,64,98, +96,4,0,8,64,99,40,1,12,162,9,2,0,18,128,0,0,16,68,24,72,0,2,13,176, +137,0,2,16,0,0,138,0,0,3,0,1,4,4,0,2,168,250,0,4,128,0,0,24,8,1,96,64 +,0,9,2,64,64,12,0,0,1,0,1,2,0,6,1,0,12,24,0,3,8,128,1,0,1,6,2,0,1,16, +3,1,0,0,8,0,3,208,252,0,1,12,0,1,192,0,0,16,192,2,16,64,0,9,3,96,0,0, +15,128,129,0,21,192,128,4,192,2,0,1,12,4,1,0,1,7,176,0,0,24,128,0,0,1 +,0,0,11,0,3,72,254,4,0,0,132,16,0,0,128,0,0,73,72,1,104,0,10,8,2,8,13 +,0,0,1,0,0,128,0,6,64,0,11,194,4,154,66,129,0,1,72,0,0,4,2,128,166,80 +,0,0,128,80,3,0,1,133,2,0,2,74,255,12,0,3,192,136,80,160,2,104,4,0,9, +9,1,128,12,128,17,0,1,4,0,6,2,0,9,32,0,0,2,91,128,9,0,1,44,128,1,0,0, +128,70,96,8,73,96,11,4,0,0,6,0,3,120,250,0,1,12,32,0,0,240,0,0,14,0,0 +,2,120,32,0,8,192,2,24,0,0,14,224,1,1,0,0,5,0,5,128,2,0,8,128,1,50,0, +0,30,8,2,1,0,0,15,164,1,0,0,128,1,145,0,0,22,192,3,0,1,8,0,3,224,251, +8,0,0,16,0,1,64,64,16,8,2,96,0,13,12,128,0,22,192,0,0,24,136,130,0,1, +4,0,3,6,128,32,24,0,0,3,1,0,0,11,0,3,49,250,0,1,4,17,0,0,192,4,136,0, +0,2,8,132,0,9,32,2,128,12,128,33,0,1,5,0,5,128,2,0,9,134,64,0,0,1,1,9 +,0,1,44,136,0,2,38,68,2,88,16,8,0,1,5,0,3,168,252,16,0,0,4,0,1,16,8,3 +,3,0,0,96,18,0,8,64,16,8,132,1,40,144,0,19,128,2,0,1,130,72,0,0,8,65, +65,4,5,0,1,6,16,0,0,2,2,16,1,0,1,4,0,0,20,6,96,255,0,2,8,0,0,64,0,3, +96,0,11,2,0,1,128,0,1,128,0,6,64,0,10,4,0,4,96,0,0,12,0,0,128,0,2,2,0 +,0,24,0,6,48,0,0,160,255,0,1,12,0,2,128,24,0,1,120,0,10,2,1,0,1,4,0,2 +,2,0,6,1,0,8,128,5,4,0,0,24,192,2,64,0,0,8,128,1,0,1,7,176,0,0,16,208 +,3,0,1,11,0,1,16,0,0,240,255,12,0,0,132,16,0,0,64,4,152,32,0,0,104,0, +10,9,32,130,132,128,16,2,0,15,9,0,1,128,34,0,1,152,66,129,96,36,44, +144,41,0,0,128,6,88,0,0,24,64,139,0,1,133,2,0,0,32,5,203,249,4,0,3, +128,4,0,0,33,0,0,96,0,10,35,36,65,36,8,133,0,8,18,0,10,3,0,1,64,160,9 +,96,33,140,4,0,1,128,32,98,8,89,8,96,0,1,6,0,1,144,16,105,253,0,1,12, +32,0,0,112,128,6,0,1,112,0,9,192,0,0,24,0,0,3,224,0,20,128,4,0,1,6,0, +0,2,89,0,0,11,128,0,1,128,7,144,0,0,22,192,3,0,1,8,0,1,44,0,0,96,254, +4,0,3,192,0,0,16,8,0,0,96,0,10,3,98,32,12,128,1,0,20,5,0,1,16,132,130 +,96,0,0,12,128,1,0,1,6,128,32,24,0,3,11,0,1,16,0,0,49,252,0,1,36,17,0 +,0,224,64,24,1,0,0,96,0,10,9,0,0,2,0,0,208,9,2,0,19,2,0,1,152,0,0,1, +112,128,78,132,1,0,1,38,72,0,0,28,32,163,0,1,5,0,1,32,17,88,251,0,1,4 +,128,32,209,128,130,0,2,18,0,0,32,0,0,2,0,5,139,96,17,37,160,9,2,0,15 +,160,1,4,128,4,0,1,26,64,10,40,1,77,4,17,1,0,0,16,152,8,27,2,16,1,0,0 +,8,4,0,2,64,249,0,4,128,0,1,8,0,3,128,1,0,6,3,96,0,0,8,8,1,0,8,4,0,6, +130,1,0,0,32,2,0,1,24,8,1,1,32,0,5,64,0,5,4,0,3,88,249,0,2,144,1,192, +0,0,24,16,0,0,24,0,2,129,0,5,192,3,120,0,0,12,128,129,0,8,16,0,6,136, +1,28,144,5,4,0,0,30,200,2,96,0,0,12,128,1,0,0,128,7,176,0,0,24,208, +131,0,1,11,0,3,216,252,8,0,0,48,128,16,130,0,0,89,0,1,8,0,1,128,4,0,5 +,64,3,104,0,1,1,1,0,1,4,0,5,16,2,0,5,136,1,0,0,128,34,0,1,72,64,129,0 +,0,32,40,144,33,0,0,128,6,81,0,0,16,64,35,0,1,133,2,0,2,18,255,0,2,16 +,0,0,192,8,0,2,96,17,0,1,17,0,6,3,96,0,0,64,132,137,0,1,2,0,5,16,1,0, +5,8,132,4,1,3,0,1,90,132,2,32,34,8,0,3,192,160,0,0,144,8,96,0,1,6,0,3 +,248,248,0,1,60,128,5,244,128,6,16,0,0,112,0,1,224,0,0,1,0,4,128,3, +112,0,0,3,224,1,0,1,7,0,5,144,3,0,5,104,0,0,12,144,4,0,1,30,0,0,2,88, +0,0,15,130,0,1,128,7,144,0,0,30,192,3,0,1,8,0,3,176,252,4,0,0,48,32,0 +,0,68,64,24,0,1,104,0,2,1,0,6,3,96,0,1,136,0,1,128,5,0,5,208,2,0,5, +136,1,0,0,16,3,0,1,16,128,2,96,64,12,128,1,0,2,128,0,0,24,16,128,0,1, +7,0,3,41,254,0,1,48,128,0,0,192,4,8,5,0,0,96,0,1,128,40,0,6,3,96,0,0, +64,128,33,0,1,4,0,5,8,2,0,5,132,41,160,0,0,4,0,1,26,16,2,96,2,44,130, +1,0,1,70,129,0,0,24,1,3,0,1,9,0,3,112,250,0,1,8,0,0,1,0,4,16,64,0,8, +128,0,0,18,33,34,4,0,2,4,0,6,2,0,30,32,0,3,184,253,32,0,3,16,0,0,2,64 +,0,2,1,32,0,0,4,128,0,0,16,0,0,2,0,4,32,0,0,4,0,7,8,0,6,36,0,0,4,128, +0,0,16,0,1,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,1,40,0 +,0,4,0,0,88,249,0,70,4,0,2,216,255,36,0,0,4,128,0,0,16,0,0,2,64,0,0,8 +,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,15,32,0,0, +4,128,0,0,16,0,0,2,81,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8, +0,0,1,32,0,0,4,0,0,217,251,12,0,0,8,0,0,1,0,3,16,0,0,4,0,9,32,1,34,32 +,0,25,4,0,17,1,0,2,51,255,32,0,0,4,128,0,0,16,0,0,2,0,1,1,64,1,32,0,0 +,4,128,0,0,16,0,0,2,0,4,36,0,0,4,0,15,32,0,3,16,0,2,128,8,0,0,1,32,0, +0,4,0,3,2,0,1,8,0,1,32,0,0,4,0,0,136,248,8,0,8,2,0,10,128,0,0,16,0,0, +2,0,22,2,0,3,1,0,6,2,64,0,2,2,0,1,8,0,2,106,248,32,0,0,4,128,0,0,16,0 +,0,2,0,0,8,8,20,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0 +,15,32,0,0,4,162,0,0,16,0,0,2,0,1,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2, +64,8,8,0,1,32,0,0,4,0,0,88,253,0,1,4,0,4,16,0,47,2,0,7,16,0,7,232,252 +,0,23,64,0,0,64,0,20,16,0,13,4,0,1,2,0,7,168,253,0,2,16,0,18,16,0,0,8 +,128,0,34,16,0,4,4,0,0,16,0,3,216,254,0,1,64,16,16,2,0,4,64,0,8,128,0 +,0,2,0,1,8,0,25,2,0,3,4,0,2,2,0,0,128,0,0,32,0,7,176,250,0,5,32,0,14, +1,0,51,184,254,0,54,64,0,0,16,0,6,32,0,8,200,249,32,0,0,16,8,0,7,1,8, +0,30,128,128,0,0,8,2,0,0,32,8,0,0,130,8,0,1,8,0,0,8,0,1,64,0,8,8,128, +232,255,0,4,64,128,2,16,1,0,15,128,64,0,34,16,128,0,0,64,0,0,2,0,5, +184,249,64,0,0,8,21,160,16,128,130,82,10,0,1,2,4,3,0,8,10,0,0,32,0,0, +1,0,15,64,128,0,0,16,21,0,0,64,4,128,0,0,209,0,1,4,0,0,8,0,1,48,128, +80,64,0,0,2,10,0,2,8,0,0,160,252,0,0,1,20,40,36,0,2,64,66,2,16,4,130, +0,1,32,0,2,34,0,0,3,160,74,128,130,0,18,4,0,0,4,0,1,4,80,4,145,0,1,8, +0,2,4,0,0,65,0,0,64,4,5,64,2,0,0,136,0,0,16,0,0,8,254,8,0,0,32,8,0,6, +64,1,72,0,6,128,0,0,32,0,1,2,1,0,24,80,0,0,2,0,6,68,0,1,2,1,0,2,64,0, +0,32,128,120,249,32,0,1,128,0,4,129,0,10,64,0,1,64,0,22,32,0,2,16,0,3 +,1,0,2,16,0,5,8,0,4,128,144,255,0,6,2,0,15,64,0,29,32,0,6,4,0,0,10,0, +8,24,251,0,46,8,0,26,24,255,0,26,64,1,0,18,8,0,3,4,0,0,2,0,1,32,0,15, +176,254,0,5,2,0,43,128,0,1,4,0,17,64,0,0,56,253,0,21,128,0,2,8,0,19, +16,0,6,128,0,1,8,0,15,144,254,0,10,1,0,15,2,0,36,4,8,0,6,64,249,0,6, +16,0,46,64,0,1,16,0,5,32,0,8,216,249,16,0,4,128,0,50,8,0,11,8,0,1,128 +,136,255,0,5,128,0,0,32,0,13,1,0,22,32,0,8,16,0,5,80,0,9,72,250,0,1, +128,0,23,32,0,16,32,0,1,128,0,4,8,0,3,1,0,3,1,0,5,2,0,0,4,0,0,168,250 +,0,8,64,0,0,8,0,0,128,0,7,64,0,0,8,0,0,1,0,24,1,32,0,12,64,0,6,72,252 +,0,48,1,0,2,128,0,7,1,32,0,5,2,0,3,32,252,0,3,2,0,9,1,0,58,204,248,0, +1,32,0,0,4,0,4,16,0,40,32,0,11,8,128,0,7,168,250,0,10,33,0,9,8,32,0,0 +,4,0,31,4,0,16,255,0,2,8,0,2,16,0,6,32,0,35,16,0,21,176,255,0,7,64,0, +0,8,0,9,64,0,0,8,0,0,1,0,4,32,0,2,32,0,2,16,0,2,16,0,2,4,0,12,128,0,0 +,16,0,1,64,0,5,4,0,0,232,255,0,1,8,0,7,128,0,11,1,4,0,23,65,0,0,8,0, +11,64,0,1,4,0,5,88,250,0,6,4,0,6,4,0,14,64,0,2,64,0,2,32,0,2,32,0,11, +1,0,17,136,253,0,28,128,0,0,129,0,0,2,4,128,0,0,64,128,64,0,0,1,2,64, +0,30,72,250,0,1,8,0,0,4,0,0,65,0,18,32,128,0,20,12,2,0,18,8,0,3,232, +252,0,10,16,0,9,128,32,16,0,0,2,0,21,8,0,3,2,0,2,128,0,2,8,0,1,4,0,0, +4,0,2,4,0,2,128,250,0,7,8,0,14,1,32,0,4,16,1,0,1,16,1,0,1,136,0,2,136 +,0,6,2,0,22,16,255,0,7,8,0,12,8,0,6,128,0,2,2,0,2,64,0,2,1,0,8,2,0,1, +32,0,8,2,0,8,34,250,0,1,17,8,0,0,1,0,3,32,0,0,4,0,8,128,64,0,0,1,0,18 +,64,0,0,8,32,0,0,4,0,2,129,8,0,1,2,0,0,32,0,1,1,0,0,2,0,0,128,0,0,16, +0,2,16,0,0,88,254,0,0,128,0,2,64,32,0,0,16,128,0,2,8,0,3,4,0,6,8,0,19 +,4,0,0,2,2,0,0,8,0,1,16,32,2,0,3,2,0,2,128,0,2,8,0,0,1,32,32,154,254, +0,0,131,169,21,0,0,18,128,128,18,80,18,0,0,2,8,0,3,4,0,3,17,0,0,2,8,5 +,0,5,16,0,6,8,0,1,64,0,0,12,144,20,6,0,0,2,128,80,57,64,5,4,0,0,8,128 +,20,2,0,0,132,66,0,0,1,32,1,32,0,0,12,32,16,253,0,0,80,17,132,130,0,0 +,32,4,0,0,65,2,8,40,193,0,2,2,0,0,32,0,0,2,67,96,0,1,2,0,0,96,0,12,1, +0,1,128,0,0,40,128,4,64,16,20,4,147,32,0,2,32,16,0,0,4,69,0,0,40,21, +160,32,10,0,0,1,1,0,1,112,252,0,0,64,8,0,0,2,0,0,64,0,1,2,0,2,64,0,2, +4,0,0,128,0,1,1,32,0,1,2,0,17,128,0,3,128,0,1,2,129,16,0,3,8,0,1,20,0 +,0,8,4,128,8,0,5,168,252,0,2,32,0,0,4,0,2,128,0,0,16,1,8,0,6,80,0,0,9 +,0,3,16,0,12,1,0,3,4,128,0,1,32,2,64,0,4,64,0,0,128,0,6,8,0,0,33,0,2, +208,255,16,0,3,32,0,59,8,0,7,196,249,2,0,6,16,0,24,8,0,21,2,0,11,1,0, +2,128,152,255,0,1,128,0,10,128,0,32,128,0,2,68,0,9,8,0,5,1,0,3,80,254 +,8,0,1,64,0,0,64,0,0,32,0,6,64,0,9,128,0,29,8,0,0,4,0,1,128,0,1,16,0, +0,1,0,1,16,0,3,202,250,2,0,1,8,0,44,16,0,7,1,0,6,6,0,7,192,251,0,6,8, +0,22,32,0,2,32,0,2,16,0,2,16,0,2,32,0,9,2,0,15,48,254,0,9,32,0,22,4,0 +,6,3,0,8,8,0,12,32,1,0,6,32,251,0,29,16,0,1,64,0,3,8,0,1,32,0,4,64,0, +26,72,249,8,0,7,2,0,34,128,0,2,2,0,2,24,0,2,8,0,1,2,0,0,8,64,0,0,16,0 +,3,2,0,1,16,0,0,72,254,0,1,16,0,9,32,0,1,32,0,7,8,0,26,32,0,8,2,0,1,8 +,0,2,32,0,3,24,252,0,4,1,2,0,0,2,0,0,128,0,10,4,128,0,0,16,0,29,8,0,0 +,2,0,5,64,0,8,152,254,0,1,4,0,52,64,36,32,0,1,128,0,3,16,0,7,128,253, +0,6,26,1,0,38,128,0,7,69,0,1,4,1,0,3,3,0,3,32,1,0,1,224,252,0,7,4,0, +48,4,0,0,48,16,0,8,128,64,0,1,48,250,0,6,6,0,48,15,4,0,1,8,0,2,6,0,4, +224,0,2,128,252,0,6,130,4,0,39,64,1,0,5,132,0,1,176,0,3,2,0,4,32,1,0, +1,192,254,0,6,16,2,0,39,16,0,6,33,2,0,0,48,65,0,2,24,4,0,4,1,0,1,40, +253,0,6,28,0,39,128,1,1,0,5,10,0,1,12,0,3,30,0,4,160,0,2,152,254,0,6, +16,0,48,8,0,1,48,8,0,2,24,0,4,128,0,2,48,255,0,6,10,5,0,39,6,1,0,5, +141,8,0,0,32,0,3,24,0,5,1,0,1,176,254,0,6,26,1,0,9,16,0,2,8,16,0,11, +40,0,6,20,0,0,4,128,2,0,2,64,32,0,1,13,0,1,4,0,4,16,0,3,32,0,2,128, +254,0,7,4,0,27,12,0,6,6,0,2,4,0,4,1,0,0,12,0,16,120,252,0,6,30,0,9, +240,32,0,16,12,0,6,6,0,1,128,5,1,0,1,192,0,2,3,0,2,8,0,2,30,0,4,96,1, +0,1,104,252,8,0,5,82,4,0,8,208,4,0,3,130,0,11,10,0,6,5,0,0,48,194,34, +0,2,64,8,4,0,0,1,0,6,90,8,0,3,160,0,2,242,252,0,7,2,0,9,66,0,3,2,0,11 +,10,0,6,5,0,0,128,0,0,131,0,3,16,0,9,64,8,0,3,192,0,2,16,255,0,6,28,0 +,9,240,0,3,24,32,0,21,60,144,4,0,2,192,0,0,1,0,0,2,8,0,0,12,16,0,2,30 +,0,4,32,1,0,1,136,252,4,0,6,8,0,9,32,0,26,48,0,0,5,0,6,12,0,13,1,0,1, +49,251,0,6,26,0,9,192,2,0,2,64,34,0,21,48,17,2,1,0,2,34,2,0,0,141,2,0 +,0,48,65,0,2,24,17,0,3,128,0,2,112,250,0,4,16,72,0,5,32,0,5,2,73,3,0, +2,160,1,4,0,17,4,128,0,5,8,0,0,13,0,7,16,0,0,96,8,0,0,32,0,2,24,248,0 +,7,16,0,12,3,0,33,12,0,9,96,0,5,208,255,0,6,30,0,5,64,0,10,128,65,0,0 +,8,0,6,18,0,6,9,0,1,128,5,1,0,4,16,3,0,6,30,4,0,0,120,0,1,96,1,0,1, +192,253,8,0,4,4,129,4,0,4,8,0,4,128,32,16,1,0,2,16,0,8,4,0,6,2,0,0,48 +,194,34,0,5,1,1,0,6,154,0,1,104,0,1,160,0,2,66,250,0,5,4,130,0,5,4,2, +0,3,8,0,0,35,0,3,4,0,0,8,0,6,32,0,6,16,0,1,66,131,0,5,16,128,2,0,5,64 +,8,0,1,33,0,0,192,0,2,184,255,0,4,48,64,6,8,0,3,224,1,0,4,6,200,3,2,0 +,1,224,129,12,0,7,16,0,6,8,0,0,60,128,4,0,4,24,0,0,2,0,6,30,0,1,24,0, +1,32,1,0,1,168,250,4,0,24,128,1,48,8,0,6,2,0,6,1,0,0,48,0,0,5,0,5,16, +12,0,9,96,64,0,1,1,0,1,233,255,0,4,128,68,26,5,0,4,8,1,0,4,9,163,0,2, +128,9,130,0,17,48,16,18,1,0,3,96,0,0,77,8,0,5,24,4,0,0,96,1,0,0,128,0 +,2,88,251,32,144,0,4,2,1,0,10,2,64,3,9,16,0,2,4,0,7,16,0,6,8,0,1,128, +132,16,0,5,133,16,0,0,4,0,1,208,136,0,0,16,0,3,32,0,0,52,0,0,48,250,0 +,0,1,0,5,4,0,12,3,0,13,2,0,6,1,0,2,2,0,9,48,0,1,192,0,10,56,252,0,6,8 +,0,12,8,1,33,0,3,48,8,0,6,16,0,6,8,0,1,128,5,192,0,5,2,0,4,128,0,0,30 +,4,0,3,96,1,0,1,184,255,8,8,2,0,3,16,17,0,12,34,0,0,130,0,11,12,0,6,6 +,0,1,128,2,192,68,0,4,33,4,0,0,128,64,0,0,192,66,26,0,4,160,0,1,17,50 +,250,0,6,128,4,0,10,128,32,3,2,2,0,3,8,0,18,5,1,72,0,4,129,4,0,1,2,0, +0,192,66,64,8,0,3,192,0,1,34,16,248,96,128,0,4,6,0,11,30,192,0,0,24, +32,0,2,12,0,18,128,4,240,0,5,10,0,1,12,32,0,0,176,0,0,30,0,4,32,1,60, +0,0,72,255,4,0,5,8,16,0,12,1,0,5,8,0,6,8,0,6,4,0,2,4,0,0,128,0,5,8,0, +3,192,0,1,4,0,4,1,48,0,0,161,252,0,0,144,0,4,24,0,11,128,160,8,2,34,0 +,2,128,0,7,8,0,6,4,0,2,4,192,4,0,4,1,0,2,33,0,0,32,128,24,1,0,3,128,0 +,0,48,66,128,248,0,6,2,33,0,11,64,3,0,2,32,4,2,128,4,0,5,66,2,0,5,1,0 +,1,128,2,0,6,33,4,0,0,52,0,1,208,136,0,0,80,0,0,8,0,0,13,32,0,2,248, +255,0,6,16,0,13,3,0,6,1,0,5,164,0,6,18,0,2,4,0,12,192,0,10,64,252,0,6 +,6,0,13,3,2,0,5,8,0,6,4,0,8,128,5,1,0,5,8,8,0,3,192,0,0,30,0,2,32,0,0 +,100,1,0,1,176,249,8,0,5,146,8,0,12,32,0,3,8,1,0,0,4,0,5,2,2,0,5,1,0, +1,128,2,0,6,128,0,2,10,0,0,64,66,154,4,0,0,1,2,32,160,0,2,57,248,0,6, +136,4,0,12,32,4,0,2,8,2,128,0,6,72,0,6,4,0,2,3,0,6,12,0,4,64,130,64,8 +,96,0,0,1,0,0,196,0,2,179,254,0,6,4,0,12,192,0,3,96,0,20,128,4,0,6,15 +,2,0,0,12,16,0,0,240,0,0,30,192,0,0,24,32,3,32,1,0,1,152,249,4,0,5,24 +,4,0,16,128,0,2,4,0,6,2,0,9,5,0,7,4,0,9,64,0,1,1,0,1,154,252,0,6,26,0 +,13,8,4,0,2,8,2,128,0,6,64,0,10,2,0,6,68,0,2,65,0,0,192,16,88,4,19,97 +,0,0,128,144,0,2,216,252,0,2,128,128,16,0,0,3,64,0,0,8,36,0,0,160,1,0 +,0,128,0,1,16,0,0,64,3,0,3,4,16,1,4,0,6,2,0,5,160,33,0,0,128,4,0,1,2, +0,0,131,40,0,0,129,16,0,0,52,0,1,80,4,1,3,0,2,1,32,0,3,254,0,21,3,1,0 +,2,64,32,16,3,0,5,128,1,0,5,128,1,0,1,2,0,3,3,64,0,0,8,0,1,48,0,1,192 +,0,10,200,248,0,3,2,0,1,6,0,1,32,0,2,64,0,1,6,240,0,3,1,0,1,96,0,0,44 +,0,16,129,0,0,128,5,1,0,1,192,3,88,0,0,2,8,0,0,48,0,2,64,6,0,3,12,100 +,1,0,1,8,254,8,0,2,130,0,0,132,2,0,2,130,0,1,8,0,1,6,208,136,0,1,35,0 +,2,32,0,0,148,64,0,14,128,5,0,0,128,2,0,1,24,97,3,40,0,0,9,0,1,48,10, +0,0,64,0,0,2,0,3,32,160,0,2,17,250,0,3,6,4,4,1,2,11,0,0,2,0,1,4,2,0,2 +,66,0,1,66,0,3,4,24,0,0,2,0,6,1,0,5,128,145,0,1,3,0,1,128,8,136,48,0, +0,133,0,1,48,0,1,192,8,25,5,0,3,196,0,2,19,252,0,2,128,7,112,0,0,6, +192,3,25,32,0,0,96,0,1,128,1,242,0,1,192,1,0,2,64,128,32,0,0,2,0,6,1, +0,5,224,1,0,0,128,4,0,1,30,192,0,0,64,32,2,2,0,0,60,16,0,0,240,0,0,30 +,0,3,3,32,1,0,1,184,249,4,0,2,4,4,0,0,24,0,10,32,0,1,2,2,0,1,128,1,40 +,128,0,6,64,0,6,128,1,0,1,3,0,1,24,0,1,64,16,4,0,1,48,0,1,192,64,24,0 +,5,1,0,1,226,253,0,3,4,0,0,2,153,4,16,4,34,0,1,8,1,0,0,64,194,0,1,128 +,8,0,2,128,9,18,0,0,9,0,5,128,4,0,5,128,5,2,0,0,4,0,1,24,9,0,0,32,1,1 +,0,2,65,0,0,224,8,24,0,3,128,144,0,2,80,253,0,2,128,194,0,1,26,0,1,8, +128,33,36,0,0,52,0,2,16,0,0,64,10,40,16,0,0,160,72,0,0,1,0,14,32,0,1, +128,6,0,4,8,0,0,13,32,0,0,52,128,0,0,208,2,24,3,0,2,1,32,0,0,4,0,0, +120,248,0,3,4,0,9,48,16,0,4,3,2,0,2,1,0,0,144,0,6,64,0,10,6,0,6,12,0, +4,192,128,0,9,192,255,0,6,24,0,3,3,0,0,64,0,2,240,0,2,2,0,4,44,0,0,2, +0,6,1,0,6,128,0,1,6,0,4,88,0,0,15,128,1,0,2,194,0,0,28,0,3,12,96,1,48 +,0,0,96,248,8,0,2,166,0,1,24,4,0,1,66,65,4,8,48,65,0,0,208,72,0,1,35, +2,130,0,1,8,150,64,0,14,2,4,0,1,6,0,4,40,0,0,13,128,129,128,64,32,192 +,2,3,8,0,2,64,164,0,1,66,137,250,0,3,4,4,0,0,128,0,2,130,64,0,0,4,34, +17,0,1,66,0,1,11,4,2,0,0,128,4,24,0,7,18,0,6,4,144,0,1,70,2,0,3,48,0, +0,128,0,0,144,0,0,2,64,66,8,3,0,3,140,200,0,0,176,16,219,248,0,2,128, +3,0,1,6,4,0,0,88,0,0,3,100,0,0,28,0,1,240,0,1,192,1,24,32,0,0,224,129 +,32,0,15,96,0,1,128,7,0,4,64,32,3,232,1,12,160,1,176,0,0,30,4,0,2,15, +32,1,12,0,0,48,248,4,0,2,6,4,0,8,32,16,0,1,64,0,7,40,0,20,4,0,3,64,16 +,0,2,1,0,10,1,48,0,0,82,254,0,6,128,4,0,1,129,136,136,9,9,0,1,192,0,1 +,128,8,1,34,0,2,17,0,15,128,5,2,0,0,32,0,4,32,0,1,128,5,0,0,33,22,200 +,66,24,0,3,140,144,0,0,48,34,168,248,16,0,0,4,0,3,82,4,0,2,1,160,1,52 +,0,1,192,0,1,64,16,12,0,0,1,160,69,32,1,0,16,4,128,6,16,0,0,2,64,32, +72,1,13,32,0,0,180,160,0,0,16,64,0,0,67,0,3,32,1,0,1,208,250,0,14,48, +32,0,1,128,0,1,3,0,2,128,1,16,16,0,6,10,0,6,5,0,2,6,0,4,33,64,0,2,48, +0,3,24,0,4,128,0,2,200,248,0,6,16,0,3,12,0,1,48,0,1,224,0,3,96,0,1, +128,129,44,0,17,48,0,1,193,0,0,24,0,1,88,0,0,3,0,1,48,16,6,192,0,0,4, +0,4,96,1,0,1,152,253,12,0,1,33,0,2,8,4,0,2,140,4,8,130,16,0,0,16,66,0 +,1,3,100,0,1,128,1,148,64,4,0,5,16,2,0,5,8,0,1,66,22,0,0,8,1,33,8,44, +0,0,1,129,17,50,0,0,64,200,40,154,2,35,4,0,1,160,0,2,74,248,4,0,0,48, +65,0,2,128,4,0,2,64,16,8,144,64,0,0,16,4,0,1,2,0,0,129,32,144,9,26,0, +0,2,0,5,16,1,0,5,8,0,0,176,0,0,38,193,66,152,8,16,48,0,0,140,2,132,48 +,65,70,72,132,90,0,0,8,1,0,1,192,0,2,192,248,0,1,12,0,3,6,0,3,15,96, +128,44,0,1,240,128,0,0,192,0,0,26,0,0,3,224,1,32,0,0,7,0,5,144,3,0,5, +8,0,0,12,144,7,48,0,0,6,192,0,0,33,0,0,15,224,1,60,128,1,48,0,0,6,200 +,3,0,2,32,1,0,1,192,253,4,0,11,4,0,1,32,0,4,3,0,1,12,128,1,24,128,5,0 +,5,208,2,0,5,8,0,0,48,0,0,6,192,0,0,24,0,1,32,0,0,12,128,1,48,0,0,6, +64,128,24,0,0,3,0,2,128,0,2,185,255,0,1,128,64,0,2,128,4,0,2,12,0,0, +136,32,1,0,0,192,0,2,16,4,66,76,136,8,34,0,0,4,0,5,8,2,0,5,4,0,0,48, +17,38,196,16,24,9,34,34,0,0,65,136,33,16,32,6,2,4,0,1,35,2,0,2,1,0,1, +184,255,0,29,4,0,6,2,0,35,248,251,32,0,0,4,128,0,0,16,0,1,64,0,0,8,0, +0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,7,8,0,6,36,0, +0,4,128,0,0,16,0,0,2,64,0,0,8,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8, +0,0,1,32,0,0,4,0,0,64,248,0,7,16,0,48,8,0,15,16,254,40,0,0,4,128,0,0, +16,0,0,2,65,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0 +,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0, +16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,145,254,0,7,1,0,17,32,0,0,2,0,25 +,132,0,0,1,0,15,115,253,32,0,0,4,128,0,0,16,0,0,2,72,0,0,8,0,1,32,0,0 +,4,128,0,2,2,64,0,0,8,0,0,1,0,2,16,0,14,32,0,0,4,0,1,16,0,0,2,0,3,1, +32,0,0,4,128,0,0,16,0,1,64,0,2,1,0,1,4,0,0,176,255,4,0,6,16,0,46,64,0 +,17,250,252,32,0,0,4,128,0,0,16,0,1,65,0,0,8,0,0,65,40,0,0,4,128,0,0, +16,68,2,64,0,0,8,0,0,1,0,1,1,17,0,14,32,0,0,4,128,32,18,0,0,2,64,16,2 +,4,128,48,0,0,4,128,0,0,16,0,0,130,72,0,0,8,34,1,32,8,5,0,0,192,248,0 +,12,2,0,7,64,0,5,64,0,1,64,0,2,64,0,2,32,0,2,32,0,8,128,0,3,32,0,6, +128,0,5,8,176,251,0,12,4,0,3,32,0,35,1,0,15,128,0,1,56,250,0,21,128,0 +,25,16,0,6,2,0,11,4,0,3,160,248,0,57,16,0,4,128,0,4,16,0,1,64,0,0,208 +,251,0,60,4,0,12,152,251,0,7,16,0,21,8,0,1,32,0,3,4,0,1,16,0,31,96, +248,0,1,16,0,0,2,0,4,16,0,9,64,0,3,8,0,22,1,0,9,128,0,1,64,0,3,32,0,0 +,128,64,8,0,0,112,249,0,4,16,0,19,128,0,1,32,0,16,16,0,6,16,0,5,4,0,0 +,128,0,1,1,0,4,16,0,0,88,252,0,1,24,0,0,3,16,0,3,16,0,8,8,128,0,3,164 +,0,1,32,0,16,4,0,0,2,2,32,0,2,8,0,0,4,2,0,1,133,1,0,0,192,0,0,64,0,1, +32,0,0,192,128,28,0,0,232,249,0,1,128,0,0,16,0,1,16,64,166,0,5,34,0,1 +,80,75,0,0,160,13,64,0,0,64,6,0,0,82,0,17,132,0,0,80,4,0,0,41,64,0,1, +142,3,0,1,80,0,2,8,0,0,72,0,1,128,2,64,160,0,0,8,248,0,8,128,0,9,4,0, +0,128,0,26,32,0,5,1,4,0,5,2,0,4,2,64,0,0,128,136,248,0,6,8,0,0,1,0,8, +64,0,27,8,0,5,2,0,0,4,2,0,8,2,0,3,16,0,0,56,255,0,69,2,0,3,152,253,0, +7,2,0,8,128,1,0,7,64,0,19,8,0,5,8,0,7,32,0,1,128,0,5,248,248,0,14,128 +,64,0,1,32,0,2,4,0,2,128,0,18,64,0,1,16,0,6,32,2,0,1,8,0,2,68,4,0,6, +56,254,16,0,5,2,0,6,64,0,5,132,4,0,20,32,0,10,8,0,16,236,253,0,61,1,0 +,11,136,255,8,0,5,96,0,47,16,0,17,210,250,0,6,32,0,19,64,0,45,248,249 +,0,0,2,0,3,1,0,2,128,0,2,2,0,1,8,0,1,32,0,1,128,0,5,128,0,2,2,0,2,64, +0,2,1,0,16,64,0,13,90,251,0,68,8,0,4,144,255,0,57,4,0,15,152,251,0,0, +1,0,0,64,0,0,128,0,0,1,0,1,64,128,0,1,1,2,0,0,4,0,1,16,0,1,64,128,0,0 +,16,0,0,2,0,31,96,0,12,8,249,0,20,64,0,25,32,0,13,36,0,10,152,251,0, +17,64,0,25,128,0,11,2,0,5,8,0,1,32,0,5,216,255,0,62,64,0,10,216,255,0 +,56,4,4,0,15,216,255,0,8,2,0,12,1,0,2,1,0,18,64,0,1,2,1,0,14,4,0,6, +136,253,0,74,152,255,0,12,16,0,15,2,0,1,8,0,3,1,0,1,4,0,6,1,32,0,6,64 +,0,15,176,251,0,1,1,0,2,128,0,2,2,64,0,2,1,0,4,16,0,0,2,64,0,2,1,0,25 +,4,0,4,16,0,12,120,252,64,0,1,16,0,0,32,64,0,2,16,32,16,0,0,128,0,4,4 +,0,2,32,0,0,68,128,0,2,128,0,2,128,0,2,64,0,2,64,0,11,64,0,2,8,16,0,0 +,128,0,3,64,0,5,184,255,0,56,8,0,16,144,255,0,3,16,0,10,16,0,4,2,0,21 +,64,0,1,64,0,2,1,32,0,5,2,0,0,1,8,0,0,17,0,1,4,0,1,16,0,1,64,240,248, +0,29,1,0,0,32,4,0,1,32,128,0,1,16,2,0,1,16,0,17,32,0,0,64,0,1,16,0,5, +240,253,0,17,16,0,3,2,0,6,1,0,1,4,0,2,128,0,2,2,0,4,128,0,8,1,0,8,8,0 +,6,249,0,3,2,16,0,3,32,0,9,16,0,0,2,0,0,2,0,14,4,0,4,4,0,1,17,0,1,64, +0,1,16,0,15,4,4,216,252,0,4,4,0,21,8,0,4,8,0,6,4,0,0,8,0,2,8,0,5,16, +32,0,3,8,2,0,3,128,0,2,130,64,0,0,8,200,248,0,3,3,36,0,3,48,0,0,104,1 +,0,0,16,8,0,3,8,0,0,33,0,0,2,0,0,64,20,0,4,4,0,5,8,2,0,0,16,0,1,8,32, +0,0,35,0,1,128,0,0,8,96,0,2,16,168,0,5,2,0,0,40,40,5,169,56,168,253, +128,0,0,16,4,0,0,75,128,24,105,5,176,0,0,72,128,0,1,83,128,138,16,0,1 +,64,197,0,3,160,86,0,2,24,4,64,32,0,3,4,2,0,3,20,211,8,1,0,0,2,6,128, +0,0,2,1,129,81,8,162,2,16,96,3,2,34,2,0,0,25,40,65,0,0,1,104,253,32,0 +,0,16,0,0,128,32,0,0,16,128,0,0,16,0,2,1,0,17,16,2,128,16,0,3,8,1,0,3 +,8,0,1,1,0,1,16,128,0,3,65,0,1,1,0,0,64,0,7,1,0,0,96,255,0,2,32,0,2,8 +,0,3,1,0,4,65,128,0,2,33,0,3,4,4,0,2,8,0,18,4,0,3,130,0,6,4,1,0,1,4, +128,0,2,160,250,0,62,64,0,2,1,0,4,16,0,0,200,255,2,0,24,32,0,6,8,0,21 +,5,0,5,16,0,4,32,0,1,128,128,208,249,0,2,128,16,0,15,128,0,34,1,0,6, +33,0,8,136,253,2,0,10,2,0,1,40,0,5,64,0,34,8,0,4,32,2,0,7,128,240,249 +,0,6,16,4,0,2,4,0,4,128,0,34,4,0,9,2,0,7,128,164,250,0,7,8,0,9,64,0, +36,2,0,16,120,249,0,32,8,0,6,12,0,17,32,0,13,112,255,0,6,4,0,22,4,0,1 +,16,0,3,2,0,1,8,0,20,2,0,3,1,0,4,176,255,0,15,32,0,10,32,0,17,2,0,14, +8,2,0,9,176,253,4,0,1,128,0,17,1,0,31,128,0,0,32,0,16,112,250,0,11,8, +0,8,8,1,0,25,64,2,16,0,0,2,0,2,128,0,3,16,80,0,9,80,255,0,2,64,0,2,1, +0,2,128,0,2,16,0,4,32,0,5,2,0,0,8,0,1,32,0,3,4,0,1,16,0,4,32,0,3,8,0, +7,64,0,12,192,251,0,2,128,34,194,0,0,25,33,3,105,65,0,0,160,5,49,194, +22,4,0,0,2,33,0,3,160,5,1,0,15,160,8,0,15,192,128,0,1,16,0,6,216,255, +0,3,2,0,3,3,96,0,1,128,1,0,1,6,0,7,128,1,0,16,128,128,0,19,3,2,0,5, +128,250,0,2,128,5,240,0,0,30,192,3,96,64,0,0,128,1,61,0,0,4,4,0,0,8,4 +,0,3,128,1,1,0,15,96,1,0,15,240,0,1,128,3,1,0,5,248,248,0,2,128,2,16, +128,130,66,3,96,0,1,128,1,4,16,2,0,1,8,1,0,3,128,1,0,16,160,0,16,16, +68,0,0,64,35,0,6,16,251,0,3,69,8,0,2,3,64,129,0,1,33,0,1,22,2,0,0,24, +0,5,5,0,16,64,49,0,18,64,11,0,6,136,253,0,3,4,224,0,0,28,128,3,56,0,1 +,224,0,0,56,128,7,0,1,30,16,0,3,224,128,0,17,1,0,15,224,0,1,128,0,0,1 +,0,5,40,248,0,3,4,4,0,2,3,96,32,0,0,128,129,0,1,6,0,1,16,16,0,3,128,1 +,0,17,1,1,0,18,3,0,6,224,254,0,3,18,192,0,0,24,64,3,0,0,4,0,1,16,48,0 +,0,64,4,0,0,80,0,5,4,2,0,15,128,4,0,15,192,0,2,11,4,0,5,80,251,0,1,1, +128,32,2,0,6,160,5,2,0,2,136,138,4,0,2,12,176,1,0,8,34,0,6,49,8,164, +16,0,4,16,4,0,18,232,248,128,1,0,11,1,0,4,16,0,4,128,1,1,0,7,12,0,6,6 +,128,0,6,3,0,19,64,254,64,0,1,128,5,0,7,128,1,0,2,48,0,5,15,0,1,1,0,7 +,12,0,6,102,1,48,0,4,128,0,20,248,252,168,5,1,128,2,0,7,128,5,1,0,1, +16,0,0,24,32,0,2,65,129,9,0,8,10,0,6,165,0,0,128,8,0,3,64,19,2,0,18, +98,252,160,1,0,1,69,8,0,6,128,1,1,0,1,192,128,16,0,5,17,0,8,10,0,6,69 +,49,176,8,0,3,64,11,0,19,40,255,64,0,0,1,0,0,4,0,7,224,1,0,2,224,0,0, +14,16,0,2,14,224,128,0,17,1,28,0,4,128,0,0,1,0,18,104,252,132,1,0,1,4 +,0,7,128,1,1,0,1,192,0,0,24,16,0,4,129,0,17,1,48,0,5,3,0,19,177,255,0 +,3,34,2,0,6,192,1,0,2,192,0,0,64,0,3,12,64,0,17,128,136,48,10,0,25, +160,254,176,1,48,192,32,2,0,6,32,1,48,66,0,5,104,0,1,160,49,0,16,32,8 +,48,0,1,192,8,1,64,11,4,0,5,6,0,6,13,0,1,48,66,104,249,128,1,0,10,128 +,129,0,7,96,0,1,128,1,0,17,128,0,0,16,0,4,1,0,7,2,0,5,12,0,3,176,254, +224,1,60,128,5,0,8,1,60,0,7,64,0,19,96,1,60,0,1,240,0,2,3,0,5,128,7,0 +,7,4,0,0,60,0,0,136,253,172,1,4,133,2,0,7,128,4,134,16,0,6,1,0,0,128, +9,2,0,15,160,0,0,4,65,0,0,16,64,0,1,3,4,0,4,128,0,0,4,0,5,32,0,1,4,33 +,66,253,4,128,0,1,69,8,0,7,17,1,0,6,96,128,0,1,9,2,0,15,64,49,0,6,146 +,0,14,76,0,3,128,255,64,0,0,56,0,0,4,0,7,224,0,0,56,0,6,120,0,1,224,0 +,18,1,56,0,1,224,0,1,192,3,0,6,7,0,6,3,2,0,0,56,0,0,88,252,36,0,0,4,0 +,0,4,2,0,7,1,0,11,1,0,17,129,0,7,2,0,13,12,0,3,9,248,32,0,0,52,0,0,2, +0,7,128,4,49,0,6,96,32,0,1,40,0,16,128,0,0,48,0,1,192,0,2,3,0,6,6,0,6 +,128,16,0,0,48,0,0,248,255,32,17,48,144,32,194,0,0,1,0,3,12,0,6,26,0, +1,104,64,0,0,160,5,4,0,7,8,0,6,36,8,48,0,1,192,8,1,64,32,0,6,6,0,1,24 +,0,3,12,0,1,48,66,248,255,128,64,48,0,9,4,0,5,24,0,1,64,0,1,128,1,1,0 +,16,128,0,0,16,0,4,128,0,7,2,0,1,8,0,3,4,0,2,176,251,0,1,61,128,5,240 +,0,5,15,8,0,5,30,0,1,96,0,2,1,48,0,7,10,0,6,101,1,60,32,0,0,240,0,2, +128,0,5,128,7,4,0,0,30,0,3,15,4,0,0,60,32,136,249,136,17,52,128,2,16, +20,0,4,33,0,6,26,0,1,96,129,0,0,128,8,49,34,0,14,160,0,0,4,0,1,16,66, +0,1,8,0,5,128,0,2,66,32,0,2,1,0,1,4,2,177,255,128,8,48,0,0,69,8,0,14, +17,0,0,96,0,1,128,17,0,0,18,0,6,6,0,6,67,49,0,6,16,0,19,155,254,96, +129,56,0,0,4,224,0,5,14,0,6,4,0,1,120,32,0,0,96,0,0,61,0,7,32,0,6,16, +1,56,0,1,224,0,1,192,0,0,2,0,5,7,0,1,28,0,3,14,0,1,56,0,0,248,250,132 +,129,48,0,0,4,0,14,2,0,1,96,0,2,1,1,16,0,15,1,0,6,1,0,19,82,248,0,1, +48,0,0,18,194,0,5,12,0,6,2,0,1,96,128,0,0,64,8,48,2,0,6,2,0,6,129,0,0 +,50,0,1,192,0,2,139,0,6,6,0,1,24,0,3,12,0,1,48,0,0,8,255,32,81,0,0, +128,32,2,0,11,192,8,1,32,3,2,0,0,12,168,1,0,8,16,0,6,40,8,148,0,0,6, +196,8,1,64,161,0,6,6,0,2,64,0,5,48,66,152,252,128,0,18,24,0,4,128,1,0 +,8,4,0,6,2,128,0,0,16,0,4,3,0,7,2,0,5,12,4,0,2,224,252,0,1,1,128,5,0, +12,240,0,0,4,192,3,0,1,15,0,10,16,0,6,104,1,24,144,7,242,0,1,192,0,6, +128,7,0,2,192,0,2,2,0,1,60,32,184,252,132,17,0,0,128,2,0,12,16,128,26 +,72,80,0,1,65,129,17,1,0,7,4,0,6,162,0,0,4,129,0,0,16,68,0,0,64,17,4, +0,4,128,160,0,2,64,0,2,77,8,0,0,132,0,0,66,254,140,4,1,0,0,69,8,0,13, +26,2,0,4,16,2,0,7,16,0,6,72,49,4,8,0,4,10,4,0,10,35,1,0,0,141,16,0,2, +168,255,96,1,0,1,4,0,12,224,0,0,4,128,3,0,1,14,96,0,18,1,40,0,0,7,224 +,0,1,192,0,7,7,0,2,192,3,0,1,2,0,1,56,0,0,216,253,136,1,0,1,4,0,14,24 +,0,8,2,0,6,1,0,6,1,0,6,131,0,11,3,0,1,12,0,3,137,253,0,0,68,0,1,34,4, +0,11,192,0,2,3,0,1,12,0,0,8,2,0,15,128,8,37,0,0,6,192,0,1,64,18,0,6,6 +,0,2,64,3,0,4,48,0,0,8,252,0,1,54,128,32,2,0,0,26,64,0,0,96,64,12,16, +0,0,48,194,6,192,4,0,0,16,35,100,36,0,3,128,2,0,5,64,1,0,5,32,8,36,2, +0,0,192,8,1,64,3,8,2,1,0,1,164,0,0,6,0,2,64,0,5,48,66,248,249,128,1,0 +,14,6,0,0,128,24,0,24,128,48,32,0,4,3,0,0,32,0,2,16,32,0,0,2,0,10,248 +,253,64,0,0,49,128,5,0,4,120,0,0,15,0,1,60,0,1,240,0,0,28,192,3,120,0 +,4,128,1,0,5,192,0,6,96,1,44,0,1,240,0,3,2,0,0,12,0,1,44,128,7,0,3,3, +0,4,60,0,0,216,255,168,1,48,145,2,0,1,128,8,80,8,130,1,8,0,0,4,32,32, +18,132,26,81,80,8,64,0,19,160,0,1,10,0,0,16,128,0,1,16,0,0,66,140,16, +0,0,20,128,32,4,0,3,4,0,3,4,5,50,254,160,17,2,18,69,8,0,1,9,19,0,6, +198,0,1,90,0,8,4,0,6,2,0,5,64,49,52,9,0,4,35,2,130,128,4,0,0,32,0,5, +163,0,6,120,254,64,0,0,12,0,0,4,0,1,6,192,3,113,0,0,14,0,1,56,128,7, +224,0,0,4,136,3,112,0,4,128,0,6,64,0,6,8,1,24,0,1,224,0,1,192,0,0,88, +0,0,15,0,1,24,0,0,7,0,2,192,0,5,56,0,0,32,249,132,1,48,0,0,4,0,12,16, +0,0,24,8,0,7,4,0,5,16,2,0,5,1,1,0,6,3,0,4,32,0,5,3,2,0,5,129,248,0,1, +48,33,2,2,0,0,64,8,19,97,0,0,12,0,1,48,0,0,70,200,0,0,152,0,0,3,96,0, +5,1,0,5,132,0,6,128,128,20,16,0,0,192,0,2,8,2,33,12,8,0,0,16,0,0,6,0, +3,11,0,4,48,0,0,136,255,0,1,2,128,32,2,0,2,3,1,0,0,44,16,0,0,48,194,6 +,192,4,1,0,3,44,32,48,48,16,4,0,5,32,2,0,5,41,8,4,0,1,208,36,0,1,19,2 +,0,0,1,0,2,128,38,0,2,64,35,2,0,1,128,9,52,9,96,253,0,8,3,0,6,6,2,0,6 +,8,0,0,48,0,0,1,0,5,148,0,7,128,16,32,0,0,192,0,10,6,1,0,2,1,0,4,49,0 +,0,176,254,64,0,1,128,5,0,2,192,3,0,1,15,0,1,60,32,0,0,240,128,0,4,15 +,128,1,60,0,0,4,0,6,2,0,5,100,1,32,32,0,0,192,0,1,192,3,0,1,12,0,3,6, +1,0,1,192,1,0,2,224,1,48,0,0,144,253,40,0,1,128,2,0,2,64,3,0,1,1,8,0, +0,4,0,0,22,20,2,0,4,65,1,8,53,0,7,8,0,6,166,0,0,16,2,0,0,192,34,0,0, +64,8,1,0,0,76,4,0,2,22,0,3,80,0,2,32,0,0,177,8,202,251,32,0,2,69,8,0, +2,3,0,6,20,8,0,6,128,8,50,0,15,64,49,0,0,2,0,0,192,0,0,1,0,3,128,4,0, +2,20,4,0,1,64,2,0,4,48,64,152,252,64,0,0,1,0,0,4,0,2,128,3,0,1,14,0,1 +,56,128,3,224,0,5,14,96,1,56,0,16,1,12,16,0,0,48,0,1,128,3,0,1,15,0,2 +,128,3,0,2,192,131,0,2,192,1,12,0,0,40,248,4,0,2,4,4,0,2,3,0,1,1,0,3, +4,2,0,5,1,128,128,48,0,16,1,1,0,1,128,64,0,5,8,0,2,6,0,4,2,0,3,32,16, +193,254,0,3,2,0,3,3,0,1,12,0,1,48,0,0,33,192,0,5,12,128,5,48,0,15,128 +,0,0,16,8,0,0,96,0,2,3,0,1,44,0,3,33,8,0,1,64,34,0,2,128,1,24,0,0,200 +,248,160,1,0,0,128,36,194,128,90,16,0,0,104,12,76,176,9,0,0,128,6,0,1 +,26,0,0,3,108,2,0,0,32,0,0,36,4,0,14,32,9,52,0,1,16,4,0,0,64,33,0,2, +128,9,0,0,128,20,0,2,64,0,0,96,2,65,2,0,0,4,1,240,255,128,1,0,1,2,0,1 +,24,0,1,96,0,1,128,1,1,0,0,6,4,0,0,24,0,1,96,64,0,19,128,128,48,0,1, +192,32,0,2,1,0,3,1,0,0,2,1,0,4,64,0,2,48,8,248,252,224,1,0,0,128,5, +240,0,0,24,0,1,96,0,0,15,128,128,0,4,30,192,3,98,0,1,128,1,32,0,7,4,0 +,6,98,1,12,0,1,128,32,0,0,128,0,3,224,1,0,2,1,0,2,3,120,0,3,32,8,32, +253,168,1,0,0,128,2,16,128,136,4,0,0,32,10,1,136,5,0,1,166,0,1,26,64, +0,0,32,132,0,0,128,137,16,17,4,0,5,16,2,0,5,168,0,0,4,0,1,64,2,0,0,64 +,16,1,0,1,32,40,0,1,70,0,3,3,8,10,32,2,0,0,144,0,0,146,248,0,0,48,0,1 +,69,8,0,0,8,17,0,0,32,66,0,0,128,8,1,0,0,4,8,0,0,64,32,0,0,32,68,0,1, +8,161,0,0,2,0,5,16,1,0,5,72,49,128,64,0,0,192,0,0,1,64,8,1,0,5,22,4,0 +,2,144,0,1,32,8,0,0,48,64,152,250,64,0,2,4,224,0,0,30,0,1,120,0,0,14, +224,1,0,0,128,3,0,1,4,128,3,120,0,1,224,1,28,32,7,0,5,144,3,0,5,8,1,8 +,0,1,240,0,1,128,2,0,2,192,1,0,0,128,7,0,2,192,0,0,112,0,0,3,0,1,60,0 +,0,240,252,36,0,2,4,16,0,1,16,0,2,1,128,0,2,4,4,0,0,2,64,0,1,64,0,0, +128,65,32,128,5,0,5,208,2,0,5,8,1,48,0,1,192,64,0,2,1,0,5,6,0,4,2,0,0 +,4,0,1,48,16,57,249,32,0,2,4,196,0,0,28,1,0,0,112,64,12,64,1,1,0,0,32 +,0,1,2,0,0,3,112,4,0,0,128,1,16,33,4,0,5,8,2,0,5,4,1,181,32,0,0,192,0 +,1,64,16,0,2,128,1,0,1,38,8,0,2,16,96,0,0,140,8,0,0,48,0,0,224,248,0, +0,68,0,0,17,0,1,68,0,4,64,4,0,4,68,64,4,136,0,1,64,4,0,2,4,0,6,2,0,35 +,120,254,0,2,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,1, +64,0,0,8,0,0,1,32,0,0,4,0,7,2,0,6,33,0,1,128,0,0,16,0,0,2,0,1,8,0,0,1 +,32,0,0,4,128,0,0,16,0,0,2,0,1,8,0,0,1,32,0,0,4,0,0,200,248,0,1,1,0,6 +,2,0,36,16,0,5,1,0,18,152,252,40,0,1,146,0,2,2,64,8,8,0,1,32,0,0,4, +128,0,2,2,17,0,0,8,0,1,32,0,0,4,0,15,32,0,0,4,129,0,0,16,0,0,2,64,16, +8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,64,8,0,0,1,32,0,0,4,0,0,249,249, +0,0,136,0,0,66,128,0,0,4,128,0,0,32,4,2,64,0,2,4,0,1,4,128,8,16,1,2, +64,0,2,66,0,15,32,0,0,4,32,0,0,16,0,1,64,0,3,8,0,0,1,32,0,0,4,128,0,0 +,128,0,0,2,64,0,0,8,0,0,1,227,248,0,5,64,0,0,8,0,1,32,0,0,36,0,1,128, +0,1,64,0,3,32,0,0,36,0,0,4,0,20,2,0,0,2,0,1,8,0,0,1,0,0,128,0,0,16,0, +0,2,64,0,0,8,0,1,32,0,0,4,128,0,0,16,248,252,4,0,59,16,0,12,234,248,0 +,0,132,128,32,64,2,66,64,8,8,1,33,32,36,0,1,146,0,1,66,0,0,9,32,1,33, +32,36,0,1,18,0,15,132,0,0,18,16,2,72,2,0,0,32,9,0,0,1,0,0,132,0,0,1, +16,2,66,64,8,32,1,33,32,4,132,128,16,16,251,0,1,32,0,5,2,0,4,32,0,3, +16,0,0,2,0,5,8,0,16,112,0,1,128,0,2,2,0,11,2,0,6,176,251,0,0,1,0,2, +128,0,0,16,0,1,64,0,0,8,0,4,128,0,3,64,0,0,8,0,19,1,0,1,4,0,4,64,0,2, +1,0,1,4,128,0,0,16,0,1,64,0,0,8,0,0,1,32,0,0,104,248,0,9,8,0,11,128,0 +,1,128,0,20,64,0,5,4,0,18,80,251,0,12,128,0,3,8,2,0,5,32,0,1,8,0,24,2 +,0,0,16,0,2,8,0,5,2,0,5,160,253,0,25,32,0,6,16,0,6,8,0,15,64,0,6,64,0 +,0,16,0,1,64,0,1,144,252,0,7,64,0,18,4,0,1,2,0,6,1,0,13,64,0,19,200, +252,128,0,0,4,128,0,1,32,0,0,8,128,0,2,64,0,1,8,0,7,4,0,1,16,8,0,22, +16,2,0,4,8,4,0,1,32,0,5,32,0,2,168,249,0,3,2,0,2,4,0,1,64,1,0,48,4,0, +7,64,0,0,4,0,0,136,248,64,5,8,133,1,128,86,128,26,0,0,1,64,1,64,40, +160,16,0,4,10,64,1,130,1,0,0,8,16,0,15,45,0,5,136,0,5,8,144,0,1,84,0, +1,90,0,1,40,96,0,0,4,0,0,96,254,40,5,48,139,10,68,3,16,0,3,9,128,8,0, +0,13,0,1,80,17,68,140,32,92,32,2,3,128,9,0,14,32,0,0,1,32,0,0,128,32, +0,0,67,0,3,2,0,1,8,0,0,128,0,1,4,8,136,0,1,2,0,2,232,251,0,1,16,8,2, +64,0,6,64,0,1,16,0,3,4,0,0,10,16,0,0,8,0,1,32,0,20,128,0,5,4,0,1,32,0 +,3,16,0,3,4,0,2,81,252,8,1,32,0,3,16,0,3,4,0,2,4,0,1,128,2,0,2,8,0,0, +128,0,22,16,0,1,4,0,8,128,0,10,168,252,0,19,4,0,5,2,0,2,2,0,1,8,0,3,1 +,0,1,4,0,14,1,0,10,4,0,3,32,255,0,74,152,255,64,5,1,32,0,1,2,0,5,16,0 +,2,16,4,0,0,64,20,8,0,0,137,0,1,4,33,0,16,1,0,6,128,0,19,56,251,0,0,4 +,64,0,3,32,0,0,4,8,0,1,32,0,2,8,0,7,2,2,64,0,24,128,0,2,16,0,16,252,0 +,74,152,255,0,4,4,0,0,64,0,2,8,0,1,32,0,8,1,0,22,12,0,25,64,252,0,10, +128,0,55,4,0,5,80,255,0,73,128,16,255,0,5,128,0,3,8,0,1,96,0,1,128,1, +0,1,2,0,4,32,0,38,8,0,6,136,250,0,8,2,0,3,2,0,4,64,24,0,25,16,0,1,128 +,0,1,4,0,15,4,0,1,32,16,255,0,10,1,0,12,32,0,22,16,0,13,2,0,9,184,254 +,0,19,1,0,33,4,0,18,136,251,0,47,16,0,4,8,0,10,64,0,7,192,255,0,61,8, +0,7,16,0,2,24,254,0,10,32,0,1,128,0,38,1,0,20,252,0,0,64,0,5,2,0,8,2, +0,4,8,0,41,64,0,6,144,253,0,3,8,0,9,64,0,29,2,0,3,1,0,22,64,252,128,0 +,0,28,0,1,64,0,0,4,0,3,4,0,4,64,0,0,8,64,1,0,1,4,0,1,8,0,13,32,0,12,2 +,32,0,1,128,0,12,184,253,0,3,128,2,64,0,3,64,0,0,5,0,1,16,0,1,80,0,3, +32,0,5,1,0,1,4,0,2,128,0,2,2,0,2,160,0,0,32,0,1,64,0,10,2,0,1,32,0,4, +128,0,0,4,176,253,0,0,128,0,1,25,18,0,0,2,0,5,64,128,0,2,64,2,0,0,8,0 +,1,1,0,0,64,0,4,64,0,0,32,64,1,0,2,16,4,0,1,64,134,128,0,0,1,0,0,1,0, +9,16,2,1,0,1,2,8,0,0,2,0,1,4,20,112,250,0,1,8,0,0,4,0,2,128,0,10,32,0 +,2,16,0,0,8,0,0,10,0,15,32,0,28,168,251,0,0,32,0,1,2,0,5,1,0,1,4,0,0, +32,16,0,4,16,0,2,4,0,21,32,0,14,64,0,5,8,0,0,64,251,0,18,32,0,10,128, +1,0,1,128,1,0,1,192,0,2,192,0,22,128,0,6,184,248,0,11,16,0,9,2,64,0,2 +,1,0,17,64,0,16,32,0,3,16,0,3,248,249,66,0,1,136,0,3,8,1,0,2,1,0,1,32 +,0,0,64,0,2,129,8,0,1,2,0,0,17,0,17,4,0,0,1,1,0,8,4,0,5,1,0,3,1,0,0, +32,56,249,0,3,2,0,3,128,8,0,1,4,0,2,1,1,0,1,128,0,34,4,0,2,32,0,12, +112,254,64,64,0,0,144,161,128,2,0,0,136,0,0,10,0,0,40,12,0,0,16,144, +180,164,22,128,194,80,17,16,92,5,128,8,0,3,2,16,16,128,0,3,1,8,8,64,0 +,0,45,24,5,1,131,2,0,1,10,0,1,65,1,0,0,8,32,0,3,128,0,2,68,65,0,0,160 +,16,72,251,32,80,16,167,136,0,0,50,10,4,145,72,64,9,170,0,0,32,88,164 +,128,148,16,68,73,77,2,72,32,1,4,0,3,8,4,64,0,4,4,0,2,32,0,0,1,8,2,0, +2,64,0,0,2,12,68,32,0,1,44,0,1,72,1,128,130,138,0,0,32,128,0,1,34,16, +249,0,0,64,8,0,2,128,16,80,128,0,2,66,0,1,32,0,3,4,1,0,9,8,4,64,0,4,4 +,0,5,8,1,0,6,1,0,2,8,0,4,64,0,2,32,0,2,240,248,0,2,8,0,0,1,16,0,2,64, +0,0,4,0,1,8,0,0,1,36,32,4,0,0,128,16,0,0,2,64,0,28,16,0,3,4,0,4,1,0,6 +,128,250,0,4,128,0,0,16,0,1,64,0,0,8,0,3,1,136,0,3,64,64,8,0,0,128,0, +20,4,0,7,4,1,32,0,0,4,128,0,0,16,0,1,64,0,0,8,0,0,1,32,0,0,208,248,0, +1,1,144,4,0,9,36,0,1,1,0,0,16,0,5,160,16,16,0,13,8,32,0,0,5,0,1,144,0 +,1,64,2,1,0,14,8,0,3,249,36,0,11,136,4,0,1,2,0,2,32,0,0,2,0,30,2,0,5, +128,0,11,129,248,64,0,1,32,0,5,2,0,12,128,0,0,64,1,0,0,32,0,35,128,0, +7,232,250,0,32,2,0,6,1,0,28,3,0,2,152,253,0,30,16,32,0,1,16,32,0,1,8, +16,0,1,8,16,0,29,56,253,0,54,64,0,18,216,251,0,74,152,255,0,0,32,0,6, +64,0,4,2,0,2,2,0,6,64,0,18,8,0,2,128,0,0,128,4,0,4,8,0,1,4,0,9,32,24, +255,0,2,8,0,3,16,0,3,16,0,1,128,0,1,128,0,2,128,0,3,2,0,17,32,0,5,8,0 +,0,32,0,9,8,0,6,136,253,0,7,2,0,6,128,0,57,176,255,0,9,32,0,44,128,0, +9,1,0,6,48,252,8,0,2,2,0,6,1,0,1,4,128,0,1,128,0,1,128,0,1,33,128,0,1 +,8,0,16,144,0,1,68,0,0,72,0,1,10,1,33,32,0,3,16,0,0,128,64,8,8,0,1,32 +,0,2,154,251,0,17,128,0,0,18,0,1,72,0,2,1,32,0,17,160,0,0,4,128,0,0, +16,0,0,2,0,10,8,0,7,176,252,0,66,4,0,6,152,251,0,14,128,0,0,16,0,0,2, +64,0,0,8,0,0,1,32,0,0,4,0,18,128,0,8,16,0,16,120,255,0,0,21,160,2,184 +,128,10,80,1,42,64,5,176,0,0,45,128,2,80,0,0,10,64,1,40,0,0,5,160,0,0 +,20,192,2,0,15,22,128,2,88,0,0,11,224,2,44,128,5,160,0,0,22,160,2,88, +0,0,11,208,1,40,128,11,176,0,0,22,160,2,112,248,160,9,52,1,146,213,4, +154,64,19,104,2,100,160,97,149,129,50,80,6,202,128,25,40,3,101,160,12 +,144,1,0,14,128,12,148,1,50,64,6,72,22,25,32,3,102,128,12,60,1,50,64, +6,154,132,25,32,89,100,128,12,52,1,200,252,255,255,0};static const +unsigned char l543[]={79,231,255,255,98,255,57,0,0,213,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,192,9 +,52,1,38,64,6,154,64,19,0,0,25,96,10,76,128,140,134,85,6,200,0,0,25, +96,2,100,128,97,144,1,0,15,12,48,1,50,0,0,114,76,70,19,112,2,76,128,9 +,48,9,39,208,4,64,22,152,96,2,100,128,12,56,1,96,248,0,0,21,160,2,84, +0,0,11,80,1,42,128,10,80,0,0,26,64,5,180,0,0,10,96,1,44,64,5,176,0,0, +45,192,2,0,15,18,160,2,88,0,0,21,192,2,42,64,5,168,0,0,21,160,3,84, +128,10,160,2,52,64,5,176,0,0,22,160,2,80,252,0,74,152,255,0,11,128,0, +5,1,0,31,32,0,21,56,252,0,4,160,0,5,64,1,0,3,128,66,20,128,2,0,1,10,0 +,1,32,0,19,4,2,0,0,84,0,7,4,0,3,64,64,0,6,136,252,0,11,68,0,5,2,0,4, +32,0,2,4,0,8,64,0,8,16,0,1,64,0,6,4,1,0,4,16,0,2,1,0,2,168,250,160,48 +,0,0,128,0,8,32,32,20,128,6,0,1,10,64,32,40,0,27,66,32,35,0,1,129,16, +0,10,141,1,0,1,2,176,250,0,3,6,0,9,32,0,0,6,0,1,16,0,1,65,32,0,28,131 +,0,18,8,216,255,128,64,0,2,4,0,8,44,0,0,6,0,1,22,192,0,0,96,0,27,24, +192,3,0,1,12,2,0,10,12,4,0,0,12,0,0,152,248,0,0,5,0,1,32,0,8,145,20,0 +,0,6,0,1,10,64,16,4,68,0,27,68,3,0,1,32,0,11,136,0,1,4,0,0,112,251, +128,9,0,1,32,0,8,17,152,32,32,1,0,0,12,17,160,0,0,2,0,28,3,0,1,64,0, +11,40,0,1,48,1,56,255,224,65,0,0,128,1,2,0,6,96,0,0,33,128,1,0,1,16, +192,0,0,24,32,0,26,6,144,3,0,1,3,4,0,10,15,4,0,0,56,8,200,251,128,65, +0,2,4,0,6,128,1,32,0,3,16,0,32,3,0,14,12,8,0,0,52,0,0,40,251,128,17,0 +,1,70,0,8,132,16,9,0,2,136,4,18,1,132,0,26,72,4,3,0,1,36,2,0,10,44,0, +1,48,0,0,208,251,160,16,1,0,1,16,4,26,64,3,8,1,13,33,136,4,0,0,64,18, +128,2,64,3,8,4,1,0,1,52,0,7,48,0,6,56,132,0,4,66,80,3,0,1,13,160,1,2, +128,6,16,4,0,0,64,35,0,2,160,17,52,0,0,4,253,0,0,1,0,2,128,128,24,16, +3,0,0,64,12,0,4,64,0,2,131,0,0,32,0,2,48,32,0,6,12,0,6,134,0,5,8,0,0, +3,0,1,12,128,1,0,1,6,0,0,64,0,1,3,2,0,1,128,1,49,0,1,254,128,1,0,2,48 +,0,0,16,0,0,3,96,16,8,128,0,0,45,128,1,0,1,22,192,1,32,32,0,2,32,0,7, +12,0,6,6,0,0,1,0,4,16,3,0,1,12,128,0,2,6,192,0,2,2,0,3,129,48,0,0,16, +249,8,128,0,2,16,132,72,8,3,0,0,1,68,16,5,20,128,0,0,192,64,10,64,10, +68,0,0,128,2,0,0,16,5,0,6,10,0,6,133,5,0,4,24,1,3,0,1,12,0,0,1,1,0,0, +70,4,34,0,1,17,2,0,1,128,16,48,0,0,235,250,0,0,8,0,3,8,88,0,0,96,0,0, +8,44,16,4,154,32,198,128,64,12,17,35,0,0,65,32,2,0,0,48,1,0,6,10,0,6, +5,1,0,4,16,1,160,0,1,12,0,0,48,0,1,70,0,0,16,0,1,11,4,0,1,128,1,2,9, +169,251,96,128,0,2,48,128,6,208,0,0,24,0,0,3,224,1,32,128,7,112,0,0, +16,192,131,120,0,0,3,0,1,12,16,0,14,224,128,0,4,14,208,0,2,15,228,1,0 +,0,128,7,50,0,1,192,0,3,96,0,0,12,0,0,8,254,4,0,4,128,16,0,0,3,0,0,16 +,8,128,0,0,32,0,0,6,192,0,0,16,0,0,3,32,64,0,0,2,0,0,32,0,15,128,1,0, +4,24,0,6,1,0,0,6,0,0,32,0,1,2,0,3,1,0,1,241,251,0,0,16,2,0,3,4,8,11, +34,4,66,132,5,17,136,6,224,0,0,9,4,138,96,4,140,0,1,8,16,0,14,128,9,2 +,0,3,152,32,0,2,64,16,17,0,2,68,4,0,0,128,16,1,0,1,64,132,0,1,232,252 +,32,16,2,0,3,26,97,144,104,2,41,160,133,4,128,134,16,132,2,64,3,108, +33,129,32,0,0,53,64,0,6,18,0,6,169,1,0,0,128,2,80,4,27,64,0,2,13,160, +16,0,2,144,132,0,0,64,2,1,0,0,65,168,33,48,2,160,248,0,6,24,0,1,96,64 +,4,136,1,0,1,6,64,0,2,3,96,0,1,130,0,0,48,0,15,128,1,0,1,4,128,0,0,24 +,0,3,12,0,0,64,0,2,64,0,2,1,0,2,128,1,48,8,184,249,128,128,0,4,8,0,0, +128,64,32,0,0,128,1,44,0,0,4,0,0,64,22,0,0,2,98,0,2,128,16,0,7,10,0,6 +,133,1,0,0,128,5,192,0,0,24,192,0,2,12,128,64,0,9,4,128,1,60,0,0,216, +253,4,9,0,4,144,8,16,32,4,140,136,65,20,0,0,34,200,0,0,10,0,0,11,96, +16,32,144,9,32,17,0,14,128,1,0,0,128,2,0,0,4,25,64,0,2,12,0,0,4,0,2, +192,68,0,1,83,0,1,8,8,145,52,0,0,122,254,12,4,1,0,4,1,160,96,128,44,8 +,144,152,32,38,128,40,12,17,67,0,0,8,0,0,2,1,0,0,32,0,6,8,0,6,132,5,0 +,1,67,8,4,24,2,3,0,1,12,16,4,2,0,1,192,128,0,1,11,2,0,0,32,0,0,9,49,0 +,0,168,254,224,1,0,4,30,208,0,0,24,0,0,15,96,1,32,128,1,116,0,0,16, +192,3,88,0,0,3,224,128,60,0,7,10,0,6,229,129,0,1,4,48,64,30,192,131,0 +,1,15,96,1,0,2,240,0,1,192,3,0,1,15,232,1,56,0,0,192,253,136,0,0,1,0, +5,128,64,0,0,12,128,0,0,32,0,0,4,192,32,16,0,0,131,32,0,1,130,1,0,20, +4,0,3,3,0,7,192,0,2,3,1,0,0,4,0,1,48,0,0,113,254,128,17,0,4,16,2,10, +16,10,12,1,73,144,8,1,226,8,72,4,3,64,18,8,128,1,34,64,0,6,2,0,6,1,0, +0,1,0,0,18,1,20,0,0,73,3,0,1,64,8,8,1,0,1,192,2,1,0,0,3,0,1,12,144,33 +,48,0,0,128,250,160,133,4,2,70,2,0,0,26,64,3,72,33,13,33,16,6,128,22, +24,2,2,64,3,8,4,5,160,17,54,0,7,16,0,6,40,16,2,128,0,0,80,64,90,32,32 +,0,1,45,176,145,4,0,1,208,4,0,0,64,32,0,1,1,161,1,0,0,17,176,248,128, +1,0,0,32,0,2,24,0,0,3,32,0,0,12,0,3,6,64,128,0,1,3,0,0,32,8,128,1,48, +0,7,8,0,6,4,0,5,24,0,0,128,0,5,16,0,0,192,64,0,1,1,1,0,1,128,129,0,1, +152,251,128,1,12,128,7,0,1,24,0,0,3,0,1,8,128,0,0,44,0,0,6,0,1,22,0,1 +,32,32,11,128,0,0,48,0,15,128,1,0,0,128,5,64,32,16,192,0,2,12,136,1,1 +,0,1,128,0,7,1,12,0,0,224,249,136,69,4,161,64,8,0,0,24,0,0,3,96,32,68 +,16,137,20,0,0,66,194,20,10,0,1,64,0,0,5,0,0,137,48,0,16,64,0,0,128,2 +,128,4,8,73,0,2,68,128,4,0,0,5,0,0,64,66,0,1,35,4,0,0,136,132,4,6,0,0 +,43,253,0,1,129,16,0,2,88,8,8,98,2,76,8,4,154,32,2,132,136,12,17,64,0 +,0,1,38,16,4,1,10,0,6,32,0,6,16,0,2,67,200,34,24,33,19,2,0,0,68,132, +136,0,0,2,0,0,192,68,0,1,2,4,0,0,136,132,1,178,16,9,251,96,1,12,0,0,7 +,0,1,30,192,0,0,120,32,3,224,1,32,128,7,112,0,0,16,192,0,0,120,64,8, +224,1,12,0,7,20,0,6,106,0,0,1,0,0,4,240,0,0,6,128,3,0,1,15,224,1,12, +32,0,0,48,0,1,192,1,0,1,3,96,0,0,60,0,0,112,250,132,0,0,16,0,5,3,96,0 +,0,8,128,0,0,32,0,1,192,0,0,16,0,1,32,0,0,8,0,2,128,4,0,5,64,2,0,9,4, +192,32,16,64,3,0,1,12,128,129,0,0,32,0,0,128,0,2,3,1,0,0,12,0,0,1,48, +0,0,145,248,0,0,65,0,0,17,6,0,1,128,2,11,98,129,2,136,5,17,10,6,200,4 +,9,5,128,96,129,132,2,1,1,0,7,2,0,6,129,68,0,1,66,193,0,0,68,16,3,0,1 +,14,200,9,32,1,0,0,32,128,0,0,128,35,0,2,68,132,52,0,0,216,255,32,16, +22,10,0,2,74,68,1,104,0,0,41,32,0,0,166,160,22,210,0,0,18,81,0,0,104, +36,1,160,1,48,129,2,0,5,96,1,0,5,176,5,0,0,130,0,0,16,0,0,146,80,3,0, +1,1,48,16,2,0,1,144,132,0,0,64,16,106,2,45,164,145,52,4,240,251,0,8,2 +,96,0,0,4,136,0,0,16,0,0,6,192,64,8,0,1,96,0,1,128,1,48,8,0,6,12,0,6, +132,1,1,32,0,1,128,8,0,0,3,1,0,0,4,128,0,3,64,0,2,1,96,32,12,128,1,48 +,0,0,8,249,128,128,12,0,3,8,192,2,96,0,3,45,0,0,4,128,0,0,22,0,1,64,0 +,0,11,128,1,60,0,0,2,0,6,1,0,5,1,1,12,128,5,64,0,1,16,2,0,12,66,0,0, +12,128,1,32,0,0,176,249,4,9,4,33,0,3,69,1,98,0,0,140,8,0,0,20,0,0,66, +72,2,11,0,0,147,32,32,5,128,1,52,128,2,0,5,68,1,0,5,130,128,4,128,2, +128,130,88,0,0,1,4,0,0,140,132,5,1,0,1,192,68,0,1,3,32,10,44,2,9,17, +65,129,255,4,0,0,128,16,0,2,128,144,17,96,128,76,0,0,16,40,0,0,6,200, +66,20,0,0,32,96,1,38,144,33,48,0,7,32,0,6,144,33,48,8,67,8,130,152,8, +11,4,0,0,8,1,33,0,2,192,64,0,1,2,98,0,0,64,0,0,9,49,33,27,249,224,129 +,12,0,3,22,0,0,130,120,0,0,15,100,0,0,33,128,1,48,0,0,16,192,128,24, +32,8,224,1,56,0,15,96,0,0,56,0,0,4,240,0,0,30,192,0,2,7,224,0,3,240,0 +,1,192,1,24,32,11,232,1,12,0,0,208,254,132,0,6,128,130,0,0,64,12,0,1, +32,0,0,4,128,0,0,16,0,0,3,64,0,0,8,2,0,0,48,128,1,0,5,192,0,7,1,48,0, +0,4,65,128,24,0,0,2,0,1,12,128,1,0,2,192,0,2,3,64,0,0,4,0,1,32,0,0,42 +,255,128,5,2,17,0,3,9,33,0,0,4,140,80,16,34,0,0,161,32,66,16,0,0,139, +16,130,132,0,0,8,50,0,0,2,0,6,1,0,5,64,144,52,0,0,66,192,8,24,130,16, +2,0,0,140,136,17,1,0,1,192,8,1,128,131,16,65,136,130,33,8,32,56,253, +160,16,1,128,0,0,16,2,90,96,0,0,72,32,1,40,16,1,128,16,208,24,0,0,64, +17,10,2,1,160,8,4,0,15,32,9,2,128,0,0,208,66,2,80,99,0,1,41,168,1,0,0 +,128,6,208,8,1,64,8,104,129,33,48,0,0,133,0,0,156,251,0,0,1,0,3,64,24 +,0,1,32,0,0,4,128,0,2,6,194,0,3,32,64,0,1,64,0,16,128,0,3,192,0,0,8,0 +,0,3,0,1,4,128,1,0,2,192,0,2,1,98,0,1,128,0,0,48,32,24,252,128,1,0,2, +68,0,0,24,208,2,0,0,64,0,4,4,196,0,1,192,1,0,1,11,128,64,12,0,0,8,0,6 +,4,0,7,1,128,5,192,32,0,1,3,1,0,1,132,1,0,1,6,128,0,3,96,64,4,0,1,32, +16,120,252,8,128,0,1,32,128,68,144,64,1,98,2,12,4,16,2,0,0,2,128,132, +0,0,64,160,96,34,5,0,1,4,0,0,5,0,5,128,2,0,5,128,17,0,0,128,2,192,8, +24,8,33,0,1,44,128,1,0,1,134,64,132,0,1,3,36,2,72,132,129,16,0,0,19, +254,0,0,136,0,1,32,0,0,2,17,137,17,96,2,8,0,0,8,1,0,0,38,128,8,0,1, +139,64,4,38,16,8,49,9,0,14,128,1,1,0,0,67,8,136,80,8,33,2,0,0,12,136, +1,0,1,70,196,68,0,1,18,32,66,32,0,0,9,50,16,193,250,96,0,1,128,1,242, +0,0,30,0,0,130,120,32,7,104,0,1,128,7,242,128,0,0,192,3,56,64,8,96,1, +60,128,0,6,64,0,6,224,1,0,1,4,176,0,0,14,192,3,0,1,15,224,129,0,0,128 +,7,48,0,1,192,1,121,0,0,15,232,0,0,60,0,0,48,248,4,128,0,2,68,64,0,0, +144,130,96,0,0,12,4,0,2,6,0,4,98,0,0,8,2,0,0,48,0,0,8,0,6,4,0,5,128,1 +,0,1,4,65,0,0,24,0,3,12,0,3,6,130,0,2,3,0,1,4,128,129,48,0,0,249,253, +0,3,70,192,4,88,0,0,9,96,129,142,0,1,1,0,0,22,200,136,0,1,10,96,128, +36,0,0,8,53,0,0,2,0,6,1,0,5,128,5,2,0,0,18,128,34,156,8,3,1,0,0,44,16 +,132,0,1,70,32,128,0,1,67,96,32,12,208,5,48,66,24,255,176,129,4,0,1, +16,4,154,64,0,0,104,36,1,36,48,4,8,0,0,208,130,0,0,64,0,0,40,32,1,160 +,1,180,144,0,6,64,0,6,160,5,0,0,134,68,24,0,0,2,72,67,104,0,0,45,176, +16,0,2,144,130,2,0,1,104,0,0,5,36,128,52,2,128,250,128,1,0,3,64,24,8, +0,0,96,0,0,4,0,4,193,0,2,1,2,0,1,128,1,48,0,0,1,0,5,128,0,6,128,1,1,0 +,0,2,0,0,128,8,0,0,3,0,1,12,0,1,1,0,1,64,0,3,96,64,0,0,128,0,0,48,32, +104,252,0,0,1,12,0,3,16,192,2,64,64,0,0,4,0,1,160,1,128,64,0,2,33,16, +11,128,1,32,0,0,8,0,6,4,0,6,1,12,128,5,64,0,1,8,2,96,0,0,12,136,1,0,3 +,64,0,2,64,0,0,4,2,0,0,33,32,56,252,140,0,0,6,0,3,137,66,1,34,0,0,12, +0,0,9,129,128,0,0,64,8,0,1,32,64,2,5,128,1,16,66,0,6,12,0,6,128,128,4 +,128,2,128,130,24,0,0,17,100,8,72,0,0,8,2,0,1,192,2,0,2,32,33,72,128, +1,16,2,121,255,132,33,176,0,2,132,88,128,17,96,128,72,0,0,17,0,0,9,70 +,192,66,0,1,8,96,1,38,144,133,48,4,0,14,136,5,176,16,5,0,1,144,32,35, +100,132,72,136,136,0,2,192,64,152,0,1,96,0,0,76,2,17,176,64,51,252,96 +,0,0,60,32,0,0,48,0,0,6,16,130,24,0,0,7,98,0,0,13,0,0,7,49,0,1,192,0, +0,122,16,8,224,1,12,0,15,96,128,60,0,0,4,240,64,14,192,0,0,120,0,0,15 +,96,1,0,2,240,0,0,30,8,0,0,24,32,15,224,64,12,0,0,48,249,4,1,48,0,3, +16,128,130,64,0,0,12,128,1,0,0,128,6,128,0,3,98,0,0,8,2,0,0,32,0,16,1 +,48,0,0,4,64,0,0,24,0,0,2,96,0,1,128,129,0,2,192,0,3,64,0,0,12,130,1, +32,0,0,10,248,64,8,53,0,1,128,20,4,8,1,16,10,14,2,132,32,10,6,32,66,0 +,0,128,0,0,96,20,4,0,0,40,8,33,0,14,64,8,49,0,0,4,192,0,0,29,133,16, +97,32,12,193,9,0,2,192,8,65,32,0,0,16,65,44,192,81,8,33,176,254,32,16 +,4,146,16,16,66,90,96,18,72,0,0,129,168,128,4,0,0,6,208,4,1,64,16,41, +0,0,41,48,4,132,0,15,32,8,1,34,0,0,80,4,3,81,16,12,0,0,133,34,4,4,0,1 +,208,0,0,26,67,8,108,128,129,33,4,52,65,64,249,128,128,0,2,2,0,0,24,0 +,0,129,32,32,4,0,3,6,193,0,2,1,64,32,4,0,1,17,16,0,14,128,0,3,128,0,0 +,8,0,0,3,0,2,128,128,0,2,192,0,0,16,0,0,1,96,0,1,128,0,0,49,0,0,144, +253,0,1,13,0,3,24,208,2,0,2,128,64,0,0,128,7,192,0,3,98,0,0,11,128,1, +0,8,6,0,6,3,0,0,12,0,1,192,0,2,2,1,0,0,4,0,1,12,0,1,192,0,0,24,8,0,0, +32,0,1,4,0,0,48,16,144,250,136,1,4,33,32,4,8,137,64,1,98,66,12,16,1,0 +,0,137,6,128,72,0,3,68,5,0,0,68,48,34,4,0,5,16,2,0,5,136,17,6,0,2,4, +25,17,1,0,2,130,9,5,0,1,192,0,0,24,1,19,65,64,136,128,1,18,1,154,253, +0,0,17,128,16,16,4,130,8,129,2,96,2,40,132,5,128,0,0,6,128,8,0,1,32,4 +,34,10,0,1,32,0,0,2,0,5,16,1,0,5,8,1,176,16,0,1,68,80,0,0,19,1,0,0,32 +,0,0,33,48,6,0,0,192,136,24,16,10,1,66,136,4,5,17,34,136,252,224,0,0, +13,128,1,48,0,0,30,16,2,120,32,7,224,65,12,8,7,240,128,0,0,192,0,0,24 +,0,0,8,96,0,0,29,16,7,0,5,144,3,0,5,232,128,60,0,1,48,0,0,14,200,3,24 +,0,0,11,228,0,0,60,0,1,240,0,0,30,192,1,120,0,0,3,224,0,0,60,0,0,96, +249,132,1,0,5,128,2,96,0,0,12,128,1,0,1,6,0,6,8,0,0,64,48,128,5,0,5, +208,2,0,5,136,1,48,0,3,24,0,0,3,0,2,128,1,48,0,3,24,0,0,3,0,1,12,128, +1,0,1,113,255,128,9,34,17,36,136,4,25,2,2,96,129,44,132,81,48,8,6,192 +,136,0,1,8,2,8,8,128,16,48,65,4,0,5,8,2,0,5,132,9,50,0,2,16,152,4,67, +0,1,128,132,17,49,0,2,66,24,136,11,65,32,0,0,132,17,49,16,64,255,0,1, +8,0,13,17,0,9,8,0,0,4,0,6,2,0,13,128,8,0,17,8,6,136,250,32,0,0,4,128, +0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,1,20,0,0,2,64,0,0,8,0,0,1,32,0 +,0,4,0,7,16,0,6,40,0,0,4,128,0,0,16,0,0,2,64,0,0,10,0,0,1,32,0,0,4, +128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,2,200,252,0,47,16,0,25,136,255, +36,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64 +,0,0,8,0,0,1,32,0,0,4,0,15,32,0,0,4,130,0,0,16,0,0,2,64,0,0,8,0,0,1, +32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,203,250,12,0,0, +8,0,1,34,0,2,32,0,5,16,64,2,0,0,128,32,0,2,64,4,0,1,34,0,16,136,0,6,1 +,0,3,8,0,12,17,233,249,32,0,5,2,0,0,128,8,0,0,1,32,0,1,128,0,0,16,0,3 +,8,0,1,32,0,0,4,0,15,32,0,1,32,0,0,20,0,0,2,64,0,0,8,0,0,1,32,0,0,4, +128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,28,251,8,0,3,2,0,14,16,0 +,3,8,0,26,128,0,18,8,32,255,32,0,0,4,0,0,64,16,0,0,2,0,0,8,12,0,0,1, +32,0,0,128,192,16,17,0,0,130,64,32,12,0,1,32,0,0,4,8,0,14,32,0,0,4, +128,64,20,0,0,2,64,32,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0, +1,32,0,0,4,0,0,136,252,128,0,0,1,0,0,1,0,4,4,0,1,128,0,1,64,0,5,32,0, +4,32,0,15,128,1,0,1,64,0,0,16,16,0,0,4,0,1,2,64,1,0,7,64,4,0,2,64,24, +249,0,3,4,2,0,1,16,0,13,4,64,0,2,1,0,28,4,0,2,2,128,64,8,0,1,1,0,3,16 +,0,0,216,250,0,5,16,0,0,2,0,7,2,0,0,32,0,2,4,0,2,32,16,0,37,2,0,6,216 +,254,0,1,64,16,2,0,0,82,0,0,2,0,3,64,0,3,128,0,7,32,0,26,1,0,0,1,32,0 +,4,2,0,1,2,0,5,16,8,252,0,0,4,2,0,8,1,48,0,3,16,0,0,1,0,1,136,192,0, +22,16,0,0,16,0,0,2,64,0,13,4,0,0,1,16,64,2,0,0,64,252,64,128,0,5,8,0, +1,1,0,0,2,0,0,1,0,5,8,0,3,128,0,0,16,0,15,128,0,3,128,0,0,24,0,0,2,0, +1,64,128,1,0,4,128,0,1,32,8,64,0,2,228,251,0,1,4,128,0,0,4,128,2,0,0, +129,0,0,64,0,9,1,0,4,4,0,15,32,0,2,2,0,1,2,0,3,1,2,0,0,16,0,2,32,0,0, +8,0,3,136,0,2,8,252,0,3,4,0,2,16,0,0,34,0,1,2,0,0,16,8,0,0,16,64,8,4, +0,0,16,0,3,8,0,17,4,0,2,64,8,64,0,4,128,0,6,2,2,64,0,0,32,0,2,88,253, +2,40,8,128,161,2,64,4,144,0,0,11,32,0,0,8,0,0,4,32,0,0,16,152,2,144,0 +,0,200,0,0,40,0,1,12,0,15,64,0,0,4,0,0,1,0,0,128,6,64,0,2,2,4,48,9,0, +2,64,1,75,0,0,2,192,0,0,100,0,1,5,200,251,0,0,1,32,0,0,2,64,16,8,2,81 +,0,1,72,160,2,0,0,8,0,0,64,32,18,6,200,194,16,0,0,130,65,32,12,0,14, +128,64,0,0,8,130,144,0,0,98,0,0,2,192,0,1,1,0,0,184,6,192,192,84,0,1, +2,32,32,4,128,36,0,0,8,64,248,0,3,2,16,0,0,2,64,0,3,128,0,1,8,0,0,128 +,32,0,0,16,128,0,0,64,0,0,40,0,0,1,32,0,14,128,128,0,0,32,2,0,9,8,0,1 +,64,0,3,16,0,0,1,32,0,1,32,128,251,64,0,0,16,0,2,32,0,0,16,0,0,2,0,0, +1,0,6,2,4,0,0,34,0,1,64,0,0,16,8,0,19,20,0,1,64,0,0,32,0,1,8,0,0,4,8, +0,0,17,16,0,1,1,0,3,32,0,1,57,252,0,6,65,0,1,64,0,5,4,0,12,64,0,2,64, +0,2,32,0,2,32,0,1,4,0,9,32,0,3,8,0,0,2,16,0,2,1,0,4,40,250,0,3,1,0,6, +32,0,5,32,0,7,128,0,17,144,0,18,128,0,3,64,0,1,80,253,0,17,32,0,2,4,2 +,0,4,8,0,14,128,0,6,2,0,2,4,68,0,0,4,0,1,64,0,10,184,251,0,8,128,0,6, +16,0,1,64,0,0,4,0,1,4,0,25,16,0,6,68,0,2,1,0,0,64,0,7,72,254,0,4,32,0 +,8,1,0,0,8,0,9,64,0,38,1,0,5,88,248,32,2,0,3,128,16,0,3,16,0,0,2,0,3, +1,0,2,65,16,32,32,0,0,4,0,16,1,3,0,2,65,3,4,12,0,2,8,65,0,3,128,0,1,4 +,64,0,0,16,0,0,2,128,0,0,248,253,0,4,128,128,0,2,16,0,0,4,0,12,64,0, +16,32,0,0,34,0,5,32,0,3,1,0,3,128,16,0,9,112,254,2,0,5,1,0,37,64,0,3, +32,0,14,1,0,6,216,249,0,1,16,0,1,4,64,0,5,8,0,2,16,1,0,0,64,0,6,161,0 +,21,128,0,1,4,0,7,2,0,6,1,0,0,64,0,0,152,251,0,1,1,0,1,16,0,3,32,24,1 +,0,7,32,1,0,3,64,0,17,32,0,5,96,0,18,4,0,0,120,253,0,4,64,0,68,152, +251,0,1,8,0,1,128,0,11,8,0,9,64,0,21,64,2,0,9,16,0,9,232,254,0,10,64, +0,5,4,0,38,8,0,6,128,0,7,208,255,0,6,2,0,36,32,0,21,8,0,5,41,252,0,51 +,8,0,12,64,0,7,80,255,0,5,1,0,0,4,0,4,64,0,6,128,0,26,2,0,2,64,4,0,17 +,8,32,254,64,0,9,16,0,17,8,0,1,32,0,3,4,0,1,16,0,30,4,0,0,176,251,8,0 +,16,1,0,28,8,0,4,128,0,19,8,254,32,0,1,16,0,7,32,64,0,4,2,0,2,16,0,22 +,4,0,1,32,0,0,64,128,0,0,136,0,4,128,0,2,66,0,0,4,0,1,2,0,0,4,0,1,168 +,248,0,11,8,0,0,32,0,13,128,0,5,32,64,0,5,16,0,23,8,2,0,3,112,250,0,3 +,4,0,0,32,0,0,64,64,1,0,7,128,0,32,4,0,12,8,128,0,0,16,0,0,32,0,1,128 +,255,0,2,8,0,8,4,0,6,64,0,35,1,32,0,8,16,0,0,2,32,2,0,0,192,250,0,0, +128,0,4,34,0,3,2,0,1,2,0,7,32,0,24,1,0,0,4,8,0,4,128,0,6,1,0,0,32,0,0 +,64,0,2,236,250,0,6,32,0,5,1,0,2,20,16,0,6,2,64,32,0,1,66,1,0,1,66,1, +0,1,161,0,2,161,0,0,2,0,19,64,0,6,40,253,0,6,8,16,0,0,32,0,10,128,0,1 +,4,2,0,0,32,8,0,15,64,16,8,0,4,128,0,1,8,0,2,128,0,6,16,0,1,32,0,1,64 +,255,136,64,0,1,1,32,64,16,4,1,2,64,0,0,4,64,32,0,2,128,0,0,4,0,5,4, +32,0,16,8,32,0,0,1,0,5,4,32,0,1,32,0,0,4,0,1,128,0,1,32,2,64,0,0,1,0, +0,40,251,32,0,0,1,128,2,16,128,6,88,0,0,18,64,0,0,8,40,165,0,0,20,0,0 +,128,128,18,0,0,1,0,0,6,4,0,0,12,48,0,4,32,0,6,16,0,1,128,12,53,0,0,4 +,0,3,1,0,0,43,176,0,1,32,1,4,20,0,0,64,0,0,64,97,1,32,128,1,0,0,224, +254,0,0,43,0,0,128,16,33,128,40,2,128,32,20,4,64,40,72,0,0,6,0,0,40,0 +,1,129,210,28,148,8,1,32,9,0,10,4,0,2,128,0,0,48,14,128,4,184,16,0,0, +82,0,1,164,15,0,0,32,4,64,129,20,2,0,0,97,2,1,132,3,64,0,1,96,249,0,4 +,1,0,0,8,0,0,128,8,16,1,0,3,2,0,0,32,0,0,128,128,0,0,16,4,0,2,8,0,10, +8,0,2,32,0,0,8,8,0,1,32,0,4,4,1,0,3,1,0,2,1,0,1,2,2,64,0,1,56,254,128 +,0,0,1,0,4,16,0,4,128,0,1,4,0,4,32,32,0,0,128,0,0,4,0,17,4,32,0,0,1, +128,2,64,0,0,1,0,1,1,0,0,16,32,0,0,32,64,0,1,128,0,2,4,0,2,128,248,16 +,0,5,16,32,0,1,128,16,0,4,8,65,0,6,128,0,17,1,2,0,3,32,0,3,8,16,0,1, +16,0,2,33,32,0,0,66,128,0,1,2,0,1,52,250,0,3,128,0,1,4,0,1,8,0,4,128, +4,0,9,32,0,1,64,0,2,32,0,2,32,0,2,32,0,5,4,0,11,16,0,3,4,0,5,32,253, +16,0,2,16,0,2,8,0,0,32,0,2,128,8,0,9,16,0,43,2,0,2,220,249,0,0,4,0,2, +8,0,7,4,0,6,64,8,0,26,2,32,0,3,4,128,0,15,208,251,0,0,32,0,10,4,32,0, +3,16,0,3,8,0,25,16,0,7,2,0,2,64,0,5,4,128,0,0,16,16,253,0,0,32,2,0,8, +2,177,0,3,96,0,0,1,0,1,2,136,0,24,16,16,4,0,3,8,0,3,16,64,0,0,1,0,0,8 +,128,0,0,1,169,5,0,0,68,24,251,0,15,4,0,4,64,0,0,16,0,5,160,0,0,1,0,0 +,160,0,0,1,0,0,80,128,0,1,80,128,0,9,2,0,0,1,32,0,11,32,0,1,160,64, +251,0,9,16,32,0,10,16,0,6,4,0,0,8,16,16,0,2,2,0,1,8,8,0,30,48,251,0,3 +,128,0,1,8,0,9,64,0,6,128,0,35,1,0,6,128,0,2,72,254,0,9,128,0,0,4,0,1 +,2,0,2,128,0,2,128,0,28,128,0,18,8,0,0,112,249,0,0,3,0,7,128,1,8,3,1, +0,0,128,0,0,128,0,3,64,0,2,4,0,18,16,0,1,128,0,7,32,128,0,1,32,0,2,64 +,0,1,8,0,0,1,25,0,0,56,249,128,0,11,8,128,0,1,1,0,0,66,0,2,32,0,25,64 +,0,0,8,0,0,1,0,0,64,16,0,0,2,0,7,2,0,0,4,0,0,128,1,0,0,64,255,0,1,52, +128,70,4,0,3,8,0,1,160,1,0,2,16,64,0,5,128,65,36,0,17,4,4,0,2,26,0,1, +104,1,0,0,160,137,20,132,134,208,0,0,154,16,0,0,8,0,5,200,253,0,1,48, +0,0,6,0,7,128,1,0,2,64,0,6,128,1,16,8,0,16,16,0,3,24,16,0,0,96,16,0,0 +,128,1,48,0,0,6,192,0,0,24,0,2,32,0,2,1,0,0,24,252,0,3,6,2,0,3,96,0,1 +,128,1,0,2,64,64,0,5,224,1,28,0,17,16,0,3,8,0,1,64,0,2,1,48,0,0,4,192 +,0,0,16,16,0,0,32,32,0,0,96,0,2,152,249,0,1,48,34,68,0,4,96,0,1,128,1 +,0,2,192,0,6,160,1,36,0,17,48,17,0,2,144,32,0,0,32,34,0,0,128,144,48, +4,34,200,0,0,72,0,1,64,1,0,0,32,0,2,8,248,0,1,48,2,198,0,5,20,0,1,72, +0,2,128,4,0,5,128,1,32,0,17,160,0,3,64,16,0,0,96,132,0,0,128,17,50,2, +70,8,36,24,33,0,1,132,0,0,128,5,0,1,128,253,0,1,60,144,1,0,4,24,0,1, +96,0,3,112,64,0,5,192,1,20,0,17,28,16,0,2,30,0,1,24,0,1,96,0,0,44,160 +,1,48,0,0,6,0,1,24,0,1,192,65,0,1,96,253,0,1,48,0,0,2,1,0,4,16,0,5, +192,128,0,5,128,1,16,0,17,48,32,0,3,16,0,0,64,32,0,1,129,48,0,0,4,2,0 +,0,16,8,0,0,96,64,0,0,160,1,0,1,176,253,0,1,48,4,32,0,5,2,0,5,224,8,0 +,5,128,1,32,0,17,184,0,3,16,1,0,1,2,0,1,8,40,34,32,0,1,128,0,1,64,0,1 +,128,1,0,1,184,252,0,2,128,64,208,0,0,2,64,19,1,0,0,13,128,1,0,2,208, +72,2,64,0,0,8,0,0,1,32,0,0,4,0,17,52,128,22,8,0,8,52,4,64,210,0,1,64, +0,5,4,0,0,216,250,0,4,4,0,0,24,0,0,3,0,1,12,128,65,0,2,128,0,27,32,16 +,4,0,9,32,0,1,192,0,3,1,0,5,64,251,0,4,241,32,0,0,8,1,0,2,224,1,0,2, +192,64,0,2,97,0,0,12,96,0,0,44,0,17,48,0,0,2,0,9,48,128,1,192,0,2,1,0 +,6,144,249,8,0,2,64,16,0,0,128,0,0,19,2,0,0,76,168,1,0,2,128,4,24,17, +19,0,0,33,32,36,0,0,20,0,17,32,5,68,2,0,8,48,132,0,0,192,0,2,2,1,0,5, +251,253,0,3,32,192,8,64,0,0,2,2,0,0,76,128,1,0,2,192,0,0,129,16,160, +96,4,0,0,132,1,24,0,17,48,1,0,0,4,0,8,144,0,0,38,1,2,0,1,16,0,5,1,137 +,250,0,2,128,3,244,32,6,200,3,0,1,15,196,1,0,2,240,0,0,30,192,3,24,64 +,3,224,65,36,0,17,60,160,1,0,9,60,16,7,48,32,0,0,192,0,0,2,0,3,12,16, +0,0,252,4,0,2,2,0,0,32,0,0,8,2,1,0,0,12,132,1,0,2,64,0,0,24,0,0,3,96, +0,1,130,1,32,0,17,16,16,0,10,16,128,6,0,3,3,2,0,3,48,0,0,57,253,0,3, +38,209,4,0,1,10,0,1,44,128,1,0,2,192,130,24,16,11,100,128,32,160,1,16 +,0,17,48,1,16,4,0,8,56,10,6,0,3,2,0,4,176,64,40,254,16,0,1,128,0,2,2, +64,9,104,0,3,52,0,1,16,64,0,4,5,160,133,4,0,17,4,4,0,0,16,72,0,2,8,0, +0,65,16,0,0,132,0,0,70,210,2,90,96,0,0,104,130,0,1,4,4,0,0,240,252,0, +6,24,0,0,2,97,0,2,64,48,0,1,64,0,5,8,128,1,0,18,16,0,8,4,0,1,16,32,6, +192,128,16,0,1,64,0,2,128,0,1,120,252,0,4,1,0,0,24,0,0,3,96,0,1,96,0, +1,32,0,0,64,64,0,4,11,2,1,44,0,17,16,0,9,4,0,1,128,7,128,128,8,0,0,3, +96,0,1,96,0,2,96,249,12,0,2,16,0,1,152,2,18,97,0,1,32,0,0,128,0,1,192 +,0,5,5,128,40,20,0,17,48,17,0,1,16,0,4,36,0,1,48,192,6,64,2,80,16,3, +64,10,0,0,32,0,2,194,252,4,0,2,64,1,0,0,152,0,0,11,100,4,0,0,128,49, +48,18,0,0,128,4,0,4,6,130,5,26,0,17,160,0,1,128,40,0,3,8,0,0,4,0,0,32 +,8,6,192,2,0,1,144,96,1,0,0,128,129,48,4,24,251,0,2,128,1,0,1,30,200, +2,120,32,0,0,192,1,12,0,1,112,64,0,4,9,96,0,0,36,0,17,28,16,0,0,240,0 +,3,24,0,0,3,0,1,28,0,0,7,48,64,6,200,0,0,120,64,0,0,224,1,60,0,0,56, +252,4,0,3,1,0,0,24,0,0,3,0,2,160,1,48,32,0,0,192,128,0,4,10,0,0,1,32, +0,17,48,32,0,0,192,32,0,2,96,0,0,8,0,1,48,8,6,128,0,3,32,0,1,128,1,0, +1,9,251,0,3,38,0,1,88,32,35,2,66,0,0,128,1,0,0,2,0,0,224,8,0,4,36,66, +136,16,0,17,184,0,1,224,2,0,2,96,8,128,4,0,0,48,2,6,32,132,128,16,8, +97,36,0,0,160,1,0,0,4,184,250,48,4,0,0,128,70,0,1,2,64,10,8,0,0,1,32, +0,1,128,2,208,72,0,0,64,0,0,104,0,0,1,32,4,36,0,15,32,0,0,52,0,1,80,2 +,27,0,3,33,16,0,0,52,18,0,0,16,4,27,80,0,0,2,0,1,128,1,0,1,184,248,0, +0,128,0,1,6,4,0,0,24,0,1,2,0,5,4,130,0,3,97,0,1,128,129,16,0,17,33,16 +,0,0,192,0,0,16,8,0,5,32,0,1,64,0,0,16,0,4,128,1,1,0,0,80,248,128,129 +,0,1,6,2,0,0,24,0,1,1,0,0,12,96,0,1,128,3,192,64,0,1,1,120,0,0,11,2,1 +,45,0,15,128,0,0,48,0,1,64,0,0,24,8,0,2,4,0,1,48,16,0,1,64,8,0,0,1,0, +2,224,1,0,1,8,252,12,16,0,1,66,0,1,24,17,0,2,64,36,0,1,128,4,128,4,0, +1,32,108,0,0,5,128,0,0,20,0,16,133,32,5,0,0,128,68,144,0,3,8,4,0,0,32 +,1,0,0,192,0,0,80,16,10,4,0,1,160,1,0,1,154,254,4,5,1,0,0,70,8,0,0,24 +,1,32,0,0,20,140,128,17,0,1,2,192,8,1,0,0,97,0,0,130,6,130,17,24,0,16 +,64,48,66,0,0,64,0,0,153,0,3,128,4,0,0,48,33,0,0,128,8,0,0,32,16,0,2, +128,1,0,1,56,252,96,0,1,128,5,0,1,30,200,131,24,0,0,3,232,65,0,0,128, +5,240,0,1,192,2,24,0,0,9,224,129,36,0,15,224,1,60,0,1,176,0,0,30,8,0, +2,3,0,1,60,0,1,112,128,6,192,0,0,2,0,1,192,1,0,1,192,253,4,1,0,1,4,1, +0,0,24,0,1,98,16,12,128,1,0,1,2,64,0,2,129,0,1,10,128,1,16,0,15,128, +64,16,16,0,0,64,0,0,8,8,0,2,12,8,0,0,16,16,0,0,192,0,2,3,2,0,1,128,1, +0,1,121,250,128,17,2,0,0,4,0,1,24,2,0,0,96,2,140,168,1,0,1,4,192,130, +0,1,34,0,1,132,130,33,32,0,15,128,5,48,1,0,0,128,20,24,1,0,2,8,0,1,48 +,2,0,0,192,16,0,0,2,10,0,2,128,1,0,1,168,255,32,1,132,144,70,20,0,0, +10,81,32,10,0,1,160,1,134,144,66,18,64,26,64,3,9,0,0,9,162,1,132,0,15 +,32,144,4,4,0,3,64,32,2,0,0,1,1,0,0,52,32,192,208,2,26,73,0,2,1,168, +33,0,1,200,250,0,1,1,0,3,24,0,4,128,1,0,1,4,64,0,0,24,0,3,4,128,129,0 +,0,16,0,14,128,0,0,16,0,5,3,0,4,32,0,1,192,128,16,0,4,128,1,0,1,80, +249,128,65,16,0,0,2,50,0,0,8,8,1,97,16,0,1,1,16,160,3,64,64,24,0,0,3, +98,0,0,11,0,0,1,28,0,17,17,0,8,4,8,0,0,16,160,1,128,128,24,208,0,2,4, +0,0,129,0,2,251,4,5,0,0,17,64,16,0,0,16,0,0,2,0,0,2,0,0,128,40,0,0, +129,4,192,0,0,24,0,0,34,96,0,0,5,128,4,134,8,0,14,128,0,0,48,17,0,4,1 +,2,0,0,72,0,1,32,130,0,0,64,2,16,64,0,2,40,144,16,0,1,185,248,140,65, +128,0,0,22,192,68,136,16,161,0,0,20,0,0,128,9,129,0,0,2,128,4,24,1,10 +,100,32,138,130,9,0,0,1,0,15,128,160,0,5,9,4,0,0,128,4,0,1,64,6,196, +68,88,0,0,139,0,1,64,128,5,2,0,0,211,255,224,1,12,144,7,244,0,0,22, +192,3,24,0,1,96,0,0,12,144,5,112,64,30,200,3,120,0,0,9,96,128,12,8,0, +14,96,0,0,28,16,0,3,192,0,2,3,0,1,12,128,7,48,0,0,30,208,3,0,1,3,104, +0,2,144,251,136,1,16,0,0,6,193,0,0,8,8,1,0,3,1,16,0,0,2,192,128,0,0,8 +,131,96,0,0,8,0,0,1,0,17,129,48,32,0,5,2,0,0,12,8,0,2,6,128,0,0,8,0,0 +,3,0,1,12,8,1,0,1,82,248,128,81,32,5,20,192,0,0,148,0,0,139,0,0,34,0, +0,64,0,0,33,33,4,224,8,128,0,0,3,96,8,8,64,16,1,8,0,15,16,184,0,5,16, +0,1,40,0,2,194,6,32,20,24,33,3,0,1,40,64,16,2,0,0,208,249,48,4,4,128, +2,208,0,0,2,73,11,72,16,137,33,16,6,132,6,208,72,146,64,2,2,36,1,160, +49,4,4,0,14,32,32,52,0,1,16,0,1,64,0,2,137,33,0,0,20,162,6,24,4,139, +64,0,2,1,160,133,52,0,0,128,255,128,129,0,0,32,4,192,0,0,8,0,1,98,0,1 +,128,1,0,1,6,128,0,0,8,8,1,0,2,128,1,0,16,128,0,0,32,16,0,0,192,0,8, +32,0,0,6,192,0,0,24,8,0,3,128,1,32,16,16,255,0,0,128,16,128,5,240,0,0 +,24,8,1,97,0,1,4,1,17,32,6,192,64,0,2,25,0,1,130,1,12,0,16,129,48,0,4 +,192,0,2,8,128,1,49,0,0,4,128,64,24,200,0,3,128,1,49,16,80,252,12,16, +0,0,145,162,208,0,0,152,0,0,32,96,10,64,128,0,1,1,6,128,4,8,17,17,8,0 +,0,128,128,128,132,8,0,14,128,8,32,5,0,1,20,0,0,64,0,2,36,2,0,1,16, +162,64,0,0,88,64,0,2,12,132,8,160,0,0,178,250,132,5,0,0,64,67,192,0,1 +,33,19,100,20,32,136,129,0,0,64,64,193,2,0,0,1,8,100,64,64,128,4,17,1 +,0,14,128,1,50,64,0,1,2,0,1,11,2,0,0,76,128,5,50,4,22,200,128,24,1,3, +4,0,0,64,144,16,49,33,72,255,224,0,0,13,128,4,226,0,0,6,192,3,120,0,0 +,15,224,1,12,128,1,240,64,14,208,1,120,0,0,3,226,1,12,8,0,14,224,1,60 +,0,1,48,64,0,0,192,3,0,1,15,104,0,0,60,128,1,240,0,0,22,208,3,0,1,15, +224,1,60,0,0,224,250,4,128,16,16,5,193,0,0,24,0,0,3,97,32,0,0,128,1, +16,0,1,64,0,1,16,0,0,97,0,20,128,1,16,16,0,4,3,0,1,12,128,1,49,0,0,4, +192,0,0,24,0,0,3,0,1,12,4,128,16,32,65,248,128,8,32,2,18,192,0,0,24,5 +,18,96,2,128,144,17,34,18,0,0,192,130,0,0,1,8,104,0,0,44,130,1,2,8,0, +14,128,17,50,1,0,1,68,0,1,3,0,1,12,136,9,56,4,33,196,2,21,17,3,0,1, +140,128,1,48,0,0,80,248,48,136,52,136,0,0,16,0,0,66,72,0,0,40,0,0,13, +160,17,4,160,6,16,64,10,64,0,1,34,13,0,0,64,132,0,15,32,17,4,132,134, +80,4,0,0,64,0,2,33,0,1,52,129,38,82,136,154,64,16,1,0,0,1,160,16,0,1, +64,250,0,1,32,0,6,66,0,0,12,128,1,1,0,0,6,68,0,0,16,0,3,12,0,2,32,0, +16,17,0,0,4,192,64,0,4,4,4,0,0,48,16,6,0,1,16,8,1,0,2,4,129,0,1,112, +252,0,1,48,144,5,48,0,2,128,88,0,1,8,1,17,0,0,6,64,64,22,4,0,0,24,0,1 +,96,0,0,12,0,16,65,16,0,0,2,64,0,1,192,0,5,16,16,2,192,128,24,8,0,2,4 +,132,1,1,0,0,240,254,12,9,49,129,162,16,0,0,128,8,8,40,17,0,0,128,16, +0,0,34,38,200,0,0,10,1,3,9,0,0,44,36,0,0,164,8,0,14,128,16,48,17,68, +130,68,0,0,64,0,2,76,16,0,0,160,0,0,4,4,8,88,0,0,83,0,1,40,0,0,16,0,1 +,25,251,4,8,177,8,67,192,34,144,4,16,48,0,0,12,132,9,0,0,66,68,128,4, +12,0,0,8,98,64,12,132,9,2,1,0,14,128,9,160,0,1,72,4,0,1,11,1,0,0,72,2 +,0,0,128,0,0,32,68,24,72,0,0,18,0,1,64,128,1,1,0,0,19,248,224,0,0,60, +128,4,242,0,0,30,192,129,72,0,0,3,96,128,12,128,3,116,64,18,192,3,120 +,0,0,15,192,1,12,8,0,14,224,65,28,144,1,176,128,0,0,192,3,0,1,7,0,1, +60,160,7,176,0,0,30,200,129,0,1,3,232,1,0,1,224,255,132,0,0,48,8,5, +193,0,0,24,0,0,129,80,0,0,12,0,0,1,0,1,6,196,128,20,0,0,3,96,0,0,12, +160,1,0,16,128,1,48,32,0,0,64,0,2,3,0,1,12,0,4,192,0,0,8,4,3,0,1,12, +136,129,0,1,154,254,128,128,48,2,2,208,0,0,28,4,19,32,0,0,64,65,128, +48,17,33,224,8,8,0,0,11,105,0,0,140,144,1,0,0,8,0,14,128,5,186,0,0, +128,160,20,0,1,3,0,1,142,2,0,0,32,64,4,226,128,28,129,131,0,1,8,192,5 +,0,1,240,248,32,0,0,4,128,68,16,0,0,74,64,11,72,0,0,13,160,9,54,138,6 +,212,72,18,64,16,4,0,0,1,160,1,4,32,0,14,32,0,0,52,128,66,20,0,0,26,3 +,0,0,104,129,5,32,16,180,192,38,216,4,2,66,11,9,64,0,0,160,9,176,0,0, +88,252,0,2,16,2,2,0,0,24,4,3,34,0,0,12,128,1,32,0,0,6,128,0,0,8,0,0,1 +,0,2,128,1,0,16,128,128,32,16,4,64,64,24,0,1,96,0,1,132,1,33,0,0,6, +192,64,8,0,4,128,129,0,0,16,152,255,0,1,16,128,5,0,1,8,8,3,89,0,1,128 +,129,48,16,6,192,64,22,4,1,0,1,12,128,1,12,0,16,129,48,0,0,6,196,0,0, +24,0,1,96,0,0,12,128,1,17,32,6,64,0,1,8,3,32,0,1,128,0,0,60,0,0,64, +250,8,0,1,162,2,0,1,16,0,0,34,40,17,0,0,128,8,48,1,2,132,4,10,1,3,4,0 +,0,12,128,1,132,8,0,14,128,8,32,5,64,192,20,136,2,0,0,32,36,0,0,129,1 +,32,2,66,130,4,25,1,34,65,129,0,1,9,6,32,42,253,0,0,80,0,0,66,133,0,0 +,8,8,32,99,48,0,0,12,132,4,177,8,34,193,4,12,0,0,34,0,2,4,4,0,0,1,0, +14,128,1,49,18,6,2,8,137,0,1,32,2,68,136,8,0,1,34,0,1,80,0,0,34,4,132 +,0,1,32,0,1,192,255,96,0,0,12,128,4,48,128,22,192,0,0,72,0,0,15,224,1 +,60,128,7,240,128,18,192,1,2,0,0,3,96,64,44,8,0,14,224,1,60,128,7,48, +0,0,30,16,0,0,120,64,11,96,0,0,13,144,7,244,128,14,196,3,24,0,1,224,1 +,56,0,0,232,253,132,1,0,1,4,192,128,8,8,1,48,0,0,12,0,1,48,8,0,0,64,0 +,0,12,0,0,131,0,21,128,1,16,16,6,192,64,0,0,16,0,1,64,12,132,0,3,4,0, +0,24,0,0,3,97,64,0,1,128,0,1,25,249,128,133,176,64,4,192,4,144,0,1,66 +,0,0,44,144,17,49,2,70,193,130,16,0,0,11,0,1,32,4,0,1,8,0,14,128,5,49 +,1,71,200,8,28,0,1,112,0,0,140,64,33,0,0,33,7,128,66,24,5,19,64,1,0,1 +,17,48,0,0,24,254,16,0,3,32,0,6,64,4,0,7,16,0,1,64,4,0,33,17,0,7,64,4 +,0,1,152,249,32,0,0,4,128,0,2,2,64,0,0,8,0,0,1,32,0,0,5,128,0,0,16,0, +0,2,64,0,2,1,32,0,0,5,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1, +32,0,0,4,0,1,20,0,0,2,64,0,0,8,0,0,1,0,1,5,0,0,64,249,0,74,152,255,44 +,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0 +,0,8,0,0,1,32,0,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32, +0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,227,248,4,0,4,8,0, +6,136,0,12,10,0,23,128,0,7,192,0,8,4,128,32,9,250,32,0,0,4,0,2,32,2, +64,0,2,1,32,0,0,4,0,1,16,0,1,64,0,3,32,0,17,32,0,0,4,128,0,0,16,0,0,2 +,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,0,1,8,0,0,1,32,128,0,1,216, +255,4,0,12,64,0,10,8,64,0,34,1,0,3,2,0,2,64,0,1,121,255,32,0,0,4,128, +16,24,130,2,64,0,0,8,129,1,32,0,0,4,128,16,18,0,0,2,68,0,0,8,36,33,32 +,16,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,16, +16,0,0,2,64,32,8,0,0,1,32,16,0,0,64,48,254,0,2,8,0,0,8,0,1,4,0,1,128, +0,3,8,0,45,8,0,8,2,0,0,88,253,0,69,4,0,2,32,152,249,0,9,16,0,0,2,1,0, +0,1,0,3,16,64,0,0,16,0,1,128,0,17,64,0,2,4,16,0,0,16,16,0,2,3,32,0,0, +16,0,1,16,128,0,7,1,4,120,249,8,96,0,15,2,0,3,2,0,27,64,0,0,8,0,0,1,0 +,1,4,0,1,19,2,0,8,34,0,0,216,252,0,1,4,64,0,2,2,0,10,32,0,5,32,0,0,2, +0,16,4,0,0,8,16,0,0,32,2,0,1,8,0,1,8,0,0,4,0,1,4,0,6,2,2,4,0,0,128, +254,0,7,2,0,6,16,0,28,128,0,1,16,64,0,8,192,32,0,1,66,32,0,8,16,253,0 +,0,1,9,0,0,2,64,32,4,8,0,1,16,1,8,0,4,128,0,0,8,0,2,4,40,0,23,64,2,0, +1,8,32,1,0,2,8,2,1,32,0,1,1,0,5,16,240,248,0,2,8,0,1,128,0,5,128,0,0, +16,128,0,0,1,0,9,8,0,24,64,0,11,10,0,1,128,64,32,0,0,152,248,64,128,8 +,32,3,32,192,4,8,0,1,48,2,36,0,0,20,128,0,0,68,64,0,0,8,0,2,2,68,0,0, +16,32,0,14,128,64,0,1,2,0,0,64,4,0,0,10,24,32,2,0,2,16,1,2,64,0,0,128 +,10,10,0,1,160,0,0,5,16,32,254,128,0,0,32,0,0,64,75,38,8,0,1,40,12,9, +128,1,0,0,86,32,65,0,0,24,42,66,13,176,4,54,67,0,0,88,0,15,76,0,1,144 +,132,0,0,8,0,0,9,0,1,128,23,0,0,48,0,0,32,128,36,8,4,1,0,0,8,145,130, +20,1,84,144,251,32,0,3,17,64,16,0,1,16,0,1,128,0,3,132,0,0,2,0,2,16,4 +,2,64,0,0,8,0,15,128,0,4,4,64,0,3,4,0,0,8,0,2,32,2,80,0,3,130,0,2,8, +248,8,0,0,32,0,7,16,4,64,0,1,8,0,2,4,4,129,0,2,128,0,22,20,0,6,2,0,0, +4,0,1,16,0,4,64,0,3,8,12,250,0,6,16,0,1,4,0,0,8,4,0,6,136,0,0,4,32,0, +29,84,0,1,64,0,0,2,0,0,1,0,0,2,20,0,0,2,0,3,4,32,0,0,104,254,0,1,16,0 +,19,64,0,33,128,0,3,64,0,0,8,0,0,65,0,2,128,0,2,152,255,0,3,8,0,12,4, +0,2,8,9,0,23,128,0,7,4,0,1,64,0,3,2,4,0,5,16,0,0,184,250,0,0,128,0,2, +64,0,3,129,0,1,48,4,0,7,4,0,1,32,4,0,18,6,0,0,128,16,0,9,64,0,1,16,0, +2,8,0,2,160,0,1,240,251,0,13,2,0,11,64,0,46,248,255,0,1,4,0,11,64,0, +10,2,0,17,1,0,7,128,0,0,8,0,2,136,128,128,0,7,4,0,1,112,248,0,2,128,0 +,9,32,0,6,64,0,2,1,32,0,46,104,249,0,16,8,0,52,16,0,2,24,254,0,5,64,0 +,6,1,0,0,4,0,0,2,0,0,4,0,5,1,0,25,65,0,6,8,0,11,104,249,0,5,32,0,3,32 +,0,3,4,5,0,7,16,0,33,4,0,1,32,0,1,2,0,2,64,0,1,4,136,248,0,6,4,0,9,32 +,0,32,5,0,6,8,0,13,244,250,0,1,2,0,5,8,0,35,4,0,17,64,0,1,2,0,5,144, +255,0,74,152,255,4,0,5,4,128,0,5,8,0,1,32,0,8,32,0,15,64,0,5,32,0,6,8 +,0,3,4,4,0,1,16,0,4,32,251,0,4,2,0,2,1,0,1,1,0,61,184,255,0,3,16,0,3, +2,0,18,8,0,27,1,0,5,1,0,8,56,253,0,1,64,0,3,32,0,18,2,0,46,152,251,16 +,0,12,64,0,11,64,0,23,2,0,1,8,0,0,32,0,1,4,0,1,1,0,2,8,0,0,1,32,0,0, +64,4,0,0,200,251,0,1,8,0,6,128,0,8,32,0,0,4,0,26,8,0,6,16,0,1,64,0,3, +32,0,2,16,0,2,16,240,252,0,1,64,0,18,4,0,22,2,0,19,4,128,0,0,16,0,0,1 +,0,1,16,249,0,4,1,0,1,128,0,12,1,0,4,1,0,28,5,0,1,24,0,3,136,64,2,8,0 +,0,1,0,2,104,255,128,1,0,6,129,0,1,1,0,8,64,16,192,0,30,64,0,2,1,0,1, +4,0,1,16,0,7,88,250,0,1,16,0,3,8,0,5,64,144,0,29,128,0,11,128,160,0,1 +,130,64,64,0,0,8,0,0,1,32,0,0,1,0,1,232,250,0,6,32,0,1,4,0,16,1,0,15, +160,0,1,128,0,0,32,0,0,8,8,0,2,17,0,1,16,0,4,32,0,7,160,251,32,64,0,0 +,32,128,0,0,32,0,3,32,0,3,16,0,0,16,0,0,8,0,1,32,16,8,32,0,0,16,8,0, +14,128,0,0,17,136,0,0,2,0,1,4,0,0,16,0,4,16,0,5,1,0,4,16,16,249,26,0, +3,16,128,16,0,0,128,32,16,4,4,128,0,1,1,1,0,1,8,0,0,2,0,1,128,0,0,32, +0,15,32,0,1,16,0,4,1,0,2,32,0,0,8,8,0,0,32,128,0,0,128,0,5,1,0,0,240, +255,64,133,2,16,0,0,18,192,2,0,0,80,42,112,5,8,0,0,97,144,2,36,32,12, +16,0,0,18,32,2,96,0,0,28,24,0,14,96,128,8,48,21,2,0,1,72,0,0,16,0,0,4 +,32,0,0,4,56,0,0,80,128,0,0,64,1,33,0,1,146,0,0,1,16,160,254,0,0,196, +16,8,0,0,64,0,2,160,173,16,4,130,0,0,36,0,0,50,0,0,4,8,4,130,168,18, +25,0,0,51,4,6,0,15,1,0,1,2,0,0,16,138,0,0,66,8,172,4,33,48,0,0,133, +128,128,0,1,40,65,64,25,0,0,5,0,0,36,8,24,254,0,0,128,4,32,0,0,32,0,2 +,128,16,16,2,66,0,1,128,0,2,8,4,0,0,65,16,0,23,2,0,1,4,0,3,1,0,7,64,0 +,1,64,0,3,8,88,254,0,14,8,0,5,1,0,1,4,128,64,0,0,8,0,14,64,0,4,128,0, +0,64,128,0,0,32,0,0,8,64,0,0,32,0,0,20,0,3,33,8,0,0,2,0,0,16,0,0,72, +253,0,7,32,0,2,4,0,1,32,0,4,4,0,5,128,0,23,4,0,1,144,0,1,65,0,2,1,0,0 +,9,0,0,1,0,2,128,0,1,64,96,252,2,0,3,1,0,0,64,0,0,4,0,1,16,0,1,1,0,10 +,1,0,17,64,0,2,1,0,9,16,0,0,16,0,0,2,72,0,3,32,0,1,128,8,250,0,7,64,8 +,0,4,8,0,1,128,0,3,64,0,25,128,0,2,8,0,3,4,0,14,216,255,2,0,1,128,0,8 +,128,0,4,16,0,1,2,32,0,22,32,0,25,128,168,254,0,2,32,0,3,16,0,4,128,0 +,0,32,0,1,128,0,3,1,0,21,2,32,0,1,128,0,0,2,0,2,16,0,3,16,0,2,2,132, +32,0,0,4,64,0,2,144,248,8,0,3,4,0,7,32,2,0,33,8,0,1,2,0,5,32,0,1,40,0 +,0,16,2,0,7,120,252,2,2,0,6,128,0,2,2,0,40,1,0,0,32,0,5,16,0,2,4,128, +0,0,16,0,2,200,252,0,1,32,32,0,2,16,16,0,5,32,32,0,0,128,128,0,7,4,0, +17,8,32,0,0,128,128,0,4,2,0,10,64,0,4,232,249,64,32,0,3,2,0,2,1,0,1, +48,0,2,16,0,6,2,0,20,9,4,0,0,4,0,5,8,2,0,1,32,0,3,16,0,0,64,0,5,64, +254,0,3,2,0,4,8,0,0,32,0,5,32,0,4,8,0,1,2,0,17,64,0,2,1,0,5,16,0,9, +128,0,2,192,128,216,253,0,12,64,0,34,1,0,10,128,4,0,11,144,250,0,2,16 +,0,2,2,0,4,4,0,0,4,0,4,2,0,34,4,0,16,168,251,0,1,6,0,3,130,68,3,0,1,1 +,40,0,0,52,128,64,1,0,0,2,0,1,8,0,3,2,0,22,2,0,1,104,0,0,1,0,2,128,6, +16,0,0,26,64,16,0,1,140,0,4,251,0,8,3,0,1,8,0,1,48,0,3,24,0,7,32,0,25 +,16,0,7,24,0,1,2,0,0,12,4,0,1,16,120,250,96,0,0,12,0,4,196,0,2,3,132, +65,48,0,0,2,1,0,0,24,0,4,96,0,0,60,8,0,24,120,16,0,0,4,0,1,128,1,48,0 +,1,8,3,0,1,15,0,1,60,8,8,248,32,0,0,4,0,3,64,64,0,2,41,0,1,48,0,0,36, +0,1,152,8,0,3,32,0,0,52,1,0,24,72,1,64,0,2,128,64,18,0,2,80,0,1,13,0, +1,52,2,184,253,128,17,176,0,4,4,0,0,4,0,0,4,0,0,64,0,0,17,16,0,1,128, +0,2,130,0,0,128,17,128,32,0,26,128,1,0,2,22,193,32,88,32,138,0,4,128, +32,0,0,254,224,65,56,8,0,2,6,128,0,2,2,98,0,0,12,128,1,4,0,0,6,8,0,0, +24,0,1,224,65,60,0,22,6,8,0,0,112,64,3,0,2,128,7,224,0,0,6,192,0,2,3, +4,0,0,60,0,0,224,250,128,1,48,0,4,4,131,0,1,12,0,0,64,0,1,2,0,4,96,0, +1,128,1,0,23,24,0,8,6,192,0,0,24,0,0,2,2,0,4,8,0,0,251,128,1,48,0,3, +16,0,0,19,0,1,45,2,4,0,1,166,0,1,24,2,0,0,96,8,0,0,128,1,48,64,0,21, +24,4,0,0,96,64,44,8,0,1,128,0,0,200,0,0,128,32,35,0,4,176,0,0,208,252 +,0,1,54,0,3,26,64,0,2,1,160,1,52,1,0,2,2,0,1,40,4,13,0,1,2,0,7,48,0,6 +,24,0,0,4,34,0,0,16,0,0,2,0,3,65,162,1,0,0,128,0,3,64,16,0,1,128,160, +1,0,0,2,184,253,0,6,24,0,4,128,1,48,8,0,6,64,12,0,2,32,0,6,12,0,6,6,0 +,11,128,1,0,6,3,2,0,1,132,1,0,0,16,96,249,96,0,0,12,16,0,2,24,192,0,3 +,128,1,32,32,0,2,24,8,0,0,96,16,12,96,0,0,60,8,0,6,12,0,6,6,0,4,32,24 +,4,0,3,98,0,1,128,1,0,6,3,0,1,12,0,0,232,250,40,0,0,4,1,0,2,24,64,0,3 +,128,1,176,0,3,128,0,1,32,2,12,32,0,0,52,0,7,10,0,6,5,0,1,65,0,1,2,0, +4,32,32,0,1,128,0,4,80,0,1,1,0,1,4,0,0,33,253,128,5,176,64,0,2,128,16 +,3,0,2,2,8,48,1,0,2,24,0,1,96,0,0,128,144,5,128,32,0,6,10,0,6,5,0,1,6 +,0,1,32,0,0,4,0,3,2,8,1,0,0,6,1,0,2,19,0,1,12,0,1,50,34,131,252,224, +65,60,0,3,6,128,131,0,1,3,96,128,60,16,0,2,6,4,0,0,120,16,3,224,65,60 +,0,17,12,0,1,48,0,0,6,0,3,3,64,0,2,7,0,2,192,129,0,1,15,98,0,0,60,0,0 +,184,249,132,1,48,0,5,3,0,1,12,2,0,0,48,0,3,24,4,0,0,96,16,0,0,128,1, +0,18,16,8,0,1,32,0,0,4,0,3,130,1,0,1,6,0,4,1,0,0,12,0,1,49,0,0,194, +249,128,1,0,0,9,0,4,3,0,1,12,0,1,48,66,0,2,88,0,1,96,0,1,128,1,48,9,0 +,16,48,0,1,192,0,0,64,0,3,8,160,1,2,128,6,0,3,17,0,1,12,0,0,4,48,0,0, +232,255,0,1,6,0,3,2,64,0,2,13,160,1,4,0,3,64,64,0,0,8,0,0,1,0,1,2,0,7 +,18,0,6,9,0,0,52,0,1,144,36,26,0,3,13,32,0,0,36,146,0,3,64,0,2,128,40 +,0,1,2,200,248,0,12,128,1,0,5,8,0,6,32,0,6,16,0,6,8,0,0,48,0,3,24,0,3 +,12,0,1,16,0,0,6,0,10,16,48,251,96,0,0,12,0,4,192,0,2,12,130,1,0,0,32 +,0,2,6,0,0,3,0,0,16,0,0,96,0,0,60,0,17,12,0,1,128,0,0,24,0,3,12,96,0, +0,44,0,0,6,0,3,128,0,1,15,130,1,12,0,0,72,248,36,0,0,4,0,4,96,0,2,44, +128,1,128,0,3,2,0,0,3,0,0,1,128,34,0,0,52,10,0,6,4,0,6,2,0,0,4,0,1,64 +,64,24,0,3,12,32,0,0,20,0,0,38,2,0,2,8,0,1,141,128,1,4,0,0,178,253, +140,17,48,1,0,4,35,0,2,2,16,0,0,1,0,2,152,0,0,144,0,0,18,32,130,9,128 +,32,0,6,16,0,6,8,0,1,18,0,2,1,0,3,32,136,17,32,0,0,16,4,0,2,144,0,1, +32,8,4,48,2,232,249,224,1,57,8,0,2,6,136,131,0,1,3,96,128,12,16,0,2, +30,196,0,0,24,0,0,3,224,65,60,0,7,4,0,6,5,0,0,8,0,1,48,0,0,6,8,0,2,3, +192,65,24,128,1,0,2,192,0,2,15,96,0,0,61,8,16,255,136,1,48,0,5,3,0,2, +2,0,5,24,0,0,128,0,2,130,1,0,8,4,0,8,48,0,2,128,0,5,128,1,32,0,9,2,0, +0,48,0,0,169,249,128,1,48,0,3,24,8,3,0,4,48,66,0,2,24,0,0,8,96,20,140 +,128,1,48,8,0,14,1,0,0,48,32,0,1,2,0,5,160,1,16,0,0,38,1,0,2,163,0,1, +76,0,0,132,48,0,0,232,251,0,0,4,5,0,3,26,64,3,40,33,73,34,0,0,4,9,0,0 +,16,8,64,64,0,0,40,0,0,5,0,1,130,0,7,6,0,6,16,0,0,4,0,1,208,0,0,26,64 +,0,0,8,0,0,141,32,0,1,128,0,2,138,80,1,0,1,128,0,3,112,248,0,6,24,4,3 +,64,0,7,128,0,0,8,0,0,64,0,0,8,0,2,32,0,6,4,0,6,2,0,3,192,0,0,24,0,3, +12,2,0,5,16,0,0,2,0,2,4,0,1,16,128,248,224,1,12,0,3,16,192,0,0,56,0,0 +,8,2,0,1,8,0,0,128,0,0,6,0,0,131,88,0,0,11,96,0,0,12,0,7,8,0,6,4,0,0, +12,0,1,192,0,0,24,0,0,3,0,0,64,8,100,0,1,128,1,0,1,14,192,2,0,1,3,0,1 +,60,8,48,255,172,73,4,0,3,24,96,0,0,72,0,0,36,0,1,128,0,2,4,3,0,0,8, +40,36,5,32,0,0,4,0,17,4,0,1,192,0,0,24,0,0,80,0,0,1,76,32,0,1,128,0,2 +,18,64,17,2,0,0,1,0,1,52,1,114,254,4,16,50,9,0,2,24,0,0,128,32,0,2,8, +0,0,8,0,0,64,0,0,24,2,144,48,65,134,128,133,48,10,0,6,32,0,6,16,0,0, +176,0,2,66,0,0,32,11,2,12,140,129,5,0,1,38,1,0,0,8,128,33,2,0,0,140,0 +,1,128,32,224,248,224,1,56,0,3,30,136,0,0,88,0,0,3,98,128,12,0,1,48, +128,30,192,0,0,72,0,0,8,226,1,60,0,0,1,0,5,128,0,8,56,8,0,0,48,0,0,6, +192,0,0,24,0,0,15,192,65,0,1,7,0,1,22,64,2,0,1,15,2,0,0,60,0,0,208, +255,4,64,48,0,3,24,0,0,3,32,0,1,130,1,0,0,8,0,0,64,0,0,24,0,1,80,0,0, +8,128,1,48,0,0,2,0,5,8,1,0,5,4,0,0,48,0,5,3,0,1,12,128,1,0,1,6,0,1,8, +128,2,0,1,12,0,3,1,253,128,17,48,0,3,24,8,139,72,0,1,128,73,32,0,1,64 +,68,24,0,0,8,34,20,132,130,1,48,0,0,4,0,5,2,2,0,7,48,0,5,3,98,65,44, +168,1,0,0,128,6,0,1,18,0,0,161,0,1,12,0,1,48,9,144,250,0,0,4,53,0,0,6 +,16,0,0,72,64,0,2,1,32,0,0,144,0,1,16,0,1,64,1,8,0,0,1,0,0,4,1,0,7,32 +,0,6,162,1,4,0,1,16,0,0,2,0,1,104,0,0,4,32,0,1,128,0,3,64,0,2,128,160 +,17,0,0,2,176,248,0,1,48,0,0,6,4,0,0,16,4,0,5,32,8,0,3,16,2,0,5,32,1, +0,5,136,0,6,132,1,0,9,8,2,0,11,4,128,0,0,16,168,252,224,1,12,128,7, +192,0,0,22,192,0,2,3,0,0,64,44,0,2,64,30,192,130,88,0,0,11,224,1,60,8 +,4,0,6,2,0,7,12,0,1,48,0,1,4,0,0,96,0,0,11,96,0,1,128,1,0,2,192,2,0,1 +,3,96,64,12,0,0,120,251,164,65,4,128,6,0,0,16,10,68,0,2,1,0,1,20,9,0, +1,8,26,69,17,40,36,5,160,65,180,0,0,1,0,5,132,0,6,130,1,5,0,1,16,0,3, +96,18,37,34,0,1,128,0,3,64,17,2,0,0,1,32,16,4,0,0,65,250,12,16,2,0,0, +16,196,34,12,0,0,19,0,1,128,1,64,24,0,2,4,64,144,1,48,65,134,0,0,16, +130,32,1,0,5,160,0,6,144,145,48,1,0,3,4,0,1,16,6,128,65,0,1,70,1,0,1, +128,33,2,0,0,76,0,0,1,176,0,0,99,255,224,1,8,136,1,48,0,0,18,128,131, +0,1,3,96,0,0,36,0,1,48,64,30,64,2,72,0,0,8,226,1,60,0,15,224,1,56,8,0 +,0,48,128,6,0,1,24,0,0,9,192,1,0,1,7,0,2,64,2,0,1,15,194,1,61,8,184, +251,8,64,48,8,6,193,64,20,0,0,3,0,1,12,130,65,40,0,4,136,2,80,16,8,2, +64,0,0,128,1,0,5,192,0,6,128,1,48,0,1,192,128,24,4,0,1,64,10,128,1,0, +1,6,0,2,128,130,0,1,12,0,0,129,48,0,0,122,251,128,9,176,0,0,38,192,4, +8,0,0,3,0,1,12,0,0,4,16,0,1,192,8,25,0,0,1,32,4,132,128,5,176,8,1,0,5 +,128,0,6,128,129,48,0,1,192,2,64,0,2,1,4,128,1,0,0,128,6,0,3,33,0,1, +12,128,8,48,0,0,224,251,16,4,5,0,1,16,0,0,64,64,0,2,45,130,4,128,128, +0,3,64,2,72,65,137,16,4,129,0,0,2,0,6,1,0,7,4,128,6,80,0,0,136,0,1,8, +0,1,160,8,0,0,128,6,16,0,1,64,34,2,0,0,140,8,0,2,16,248,0,4,4,0,1,4,0 +,4,65,0,0,8,0,3,16,1,32,0,0,4,0,2,32,0,18,6,128,0,0,16,4,0,3,130,129, +0,1,6,0,3,1,0,1,12,0,2,16,176,255,224,65,12,128,7,193,0,0,22,192,0,2, +15,96,1,44,0,3,30,192,130,88,0,0,11,224,1,12,0,0,8,0,6,4,0,7,12,0,0,6 +,176,0,0,22,0,3,11,96,0,1,128,7,48,0,1,192,2,0,1,15,0,1,60,0,0,216, +252,172,1,4,128,6,0,1,11,68,0,2,9,162,64,20,9,0,2,90,68,17,40,0,0,5, +160,69,4,0,17,4,0,0,6,80,0,0,74,4,0,2,37,162,32,0,0,128,6,16,0,1,64,1 +,0,1,13,0,1,180,8,130,253,4,16,50,10,16,196,8,12,0,0,147,0,1,128,193, +0,0,24,0,3,64,144,1,80,2,6,0,0,16,50,1,2,0,6,1,0,7,48,9,70,96,4,12,0, +2,16,6,0,0,9,1,0,0,16,196,24,0,0,128,2,0,1,32,8,0,0,128,32,24,253,224 +,1,56,128,7,48,128,18,128,3,0,1,14,0,0,1,36,128,1,1,0,0,30,64,2,72,32 +,4,224,1,60,136,0,6,64,0,8,56,128,7,130,32,16,0,1,24,0,0,9,96,0,1,128 +,1,224,0,1,64,2,2,0,0,3,0,1,60,0,0,112,248,4,0,0,48,0,1,193,0,0,20,0, +0,3,0,2,64,1,40,0,0,6,4,0,1,132,1,64,0,0,4,0,0,64,48,0,0,8,0,6,4,0,7, +48,0,1,128,32,20,0,1,96,64,10,128,65,0,2,192,0,2,2,0,1,12,0,2,8,241, +249,128,81,48,0,0,70,192,64,8,0,0,3,0,1,13,144,0,0,16,0,0,70,0,1,24,1 +,2,64,0,0,4,128,1,48,0,0,2,0,6,1,0,7,48,0,0,64,82,2,8,0,1,96,1,4,32,1 +,0,2,208,0,2,2,0,1,76,2,0,0,48,0,0,128,254,0,1,6,0,0,16,16,0,0,64,64, +3,8,0,0,45,2,4,128,128,70,1,0,0,2,0,1,8,12,13,0,0,4,129,0,15,32,0,0, +52,146,2,16,0,0,128,64,18,10,1,0,0,32,0,0,52,128,6,16,0,0,88,64,0,0,8 +,8,128,8,0,2,96,255,0,4,4,128,0,0,4,0,4,64,0,0,8,0,5,96,0,0,12,4,0,1, +32,1,0,5,128,0,6,128,1,16,0,0,4,0,2,4,1,64,32,0,0,2,0,0,48,0,0,6,0,2, +16,0,6,16,144,250,96,0,0,12,128,1,128,128,22,192,0,0,26,0,0,3,98,1,44 +,128,7,1,0,1,16,0,2,8,224,1,12,0,0,8,0,6,4,0,5,128,1,48,128,5,177,0,0 +,22,192,2,24,32,11,96,0,1,128,1,48,0,0,30,16,3,0,1,15,0,1,60,0,0,56, +254,36,0,0,4,128,0,1,2,10,68,8,8,0,0,1,160,64,20,137,20,0,2,1,0,1,130 +,68,168,81,4,0,15,128,1,177,144,18,80,0,0,74,68,1,72,1,37,34,0,0,176, +144,0,0,16,0,0,2,1,8,65,128,13,2,0,0,52,8,115,251,140,1,48,8,6,193,32 +,12,0,0,3,100,4,136,193,0,0,24,0,0,16,2,0,1,1,0,0,96,2,76,4,16,50,8,0 +,6,16,0,6,131,145,32,8,3,96,4,12,0,0,2,32,20,6,128,9,48,16,16,193,34, +0,2,1,4,32,8,0,0,128,32,97,250,224,65,56,128,7,240,0,0,18,192,3,120, +64,14,0,0,1,36,0,0,7,0,1,30,4,0,0,56,16,3,224,1,60,0,15,224,1,60,128, +4,128,32,16,128,1,16,0,0,9,192,65,60,0,0,1,224,0,0,30,192,0,0,56,64, +15,0,1,60,0,0,16,249,136,1,48,0,0,6,192,128,20,0,0,131,96,0,0,8,66,1, +40,0,3,24,0,2,64,8,8,128,48,0,15,128,1,0,1,5,128,32,20,0,0,2,96,16,10 +,128,1,48,0,0,6,192,0,3,32,0,1,2,0,2,57,254,128,1,48,0,0,6,192,4,8,0, +0,16,96,0,0,69,128,0,0,16,0,0,38,8,0,0,152,8,0,0,32,0,0,2,128,17,48,0 +,15,128,129,176,64,2,80,0,0,8,0,0,1,96,4,4,160,1,48,161,6,216,0,0,24, +0,0,136,32,8,44,0,1,176,32,72,250,144,5,53,0,0,22,16,0,0,80,64,0,0,8, +128,33,2,5,160,128,0,0,208,0,0,130,80,3,8,12,77,0,0,4,129,0,15,32,16, +20,129,4,144,66,144,0,1,8,0,0,8,32,0,1,128,6,16,0,1,64,34,12,0,0,128, +8,0,1,2,112,251,128,1,48,0,0,6,4,0,0,8,4,0,3,128,64,16,8,0,0,192,0,2, +3,0,1,12,4,0,1,32,0,6,4,0,6,2,0,0,49,16,2,64,0,0,8,4,0,1,16,4,2,0,2,6 +,0,10,16,192,255,224,1,12,128,7,0,1,22,192,0,0,32,0,0,4,96,1,44,0,1,4 +,0,0,16,0,0,3,96,0,0,8,224,1,12,0,7,8,0,6,132,0,0,12,128,5,177,0,0,22 +,0,1,32,0,0,11,96,0,1,128,1,48,0,2,3,0,1,15,0,1,12,0,0,208,255,172,1, +4,128,6,0,0,132,10,68,0,1,10,72,164,64,20,9,64,0,1,64,16,3,0,0,130,4, +161,73,4,0,0,4,0,5,16,2,0,5,8,136,20,145,18,80,0,0,74,4,0,0,64,20,37, +34,0,1,128,0,0,16,0,2,130,0,1,141,2,0,0,4,0,0,178,255,4,16,130,64,32, +0,0,36,12,0,0,139,0,0,66,0,0,192,0,0,24,0,2,8,24,5,35,64,17,64,0,0,16 +,50,6,2,0,5,16,1,0,5,8,8,33,18,3,96,0,0,12,0,2,20,6,128,129,0,1,64, +200,8,1,0,0,35,0,0,20,32,8,0,0,48,9,192,251,96,0,0,8,128,1,242,0,0,18 +,128,3,24,0,0,3,2,1,36,128,1,50,64,30,192,3,25,0,0,15,232,1,60,0,0,7, +0,5,144,3,0,5,104,0,0,12,128,4,64,0,0,16,0,1,24,0,0,9,192,1,0,1,1,224 +,0,1,192,3,26,0,0,15,0,1,60,0,0,232,254,132,1,48,0,1,192,0,0,12,0,0,3 +,32,32,4,200,0,0,24,0,3,24,0,1,64,32,0,0,4,64,48,128,5,0,5,208,2,0,5, +136,128,48,8,3,64,0,0,12,0,1,32,32,6,128,1,0,1,6,192,0,2,3,96,0,1,2,0 +,0,48,0,0,25,253,128,69,48,9,0,0,192,0,0,17,0,0,3,64,0,0,12,0,0,1,32, +0,0,6,2,0,0,25,8,8,100,1,68,128,17,48,0,0,4,0,5,8,2,0,5,4,17,160,0,0, +4,80,0,0,16,0,1,96,0,0,8,128,1,0,0,128,70,193,0,2,147,96,68,12,0,1,48 +,0,0,96,251,0,29,4,0,6,2,0,35,248,251,32,0,0,4,128,0,0,16,0,0,2,64,0, +3,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,7,16,0,6,40,0,0 +,4,128,0,2,2,64,0,0,8,0,0,1,0,1,4,0,4,64,0,0,8,0,0,1,32,0,0,4,0,1,252 +,0,59,1,0,1,2,0,10,168,252,36,0,0,4,128,0,0,16,0,0,2,64,0,0,8,33,33, +36,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,15,32,0,0,4,128,0 +,0,16,0,0,3,64,0,0,8,0,0,1,32,0,0,4,128,32,16,8,131,66,0,0,8,0,0,1,32 +,0,0,4,0,0,201,253,12,0,1,6,0,4,96,0,2,4,128,0,1,192,0,6,128,0,21,32, +0,1,2,0,0,2,96,0,0,8,0,2,1,6,192,0,0,128,0,6,32,0,1,155,255,0,4,16,0, +5,1,0,4,16,0,6,8,0,17,32,0,3,16,32,0,15,8,0,5,152,254,8,0,8,1,32,0,8, +16,0,45,1,0,5,178,254,32,144,0,0,160,16,18,0,0,2,9,16,8,2,32,4,132, +132,16,64,18,0,0,130,64,32,9,68,32,36,144,132,16,0,14,32,0,1,194,0,0, +8,0,0,1,32,32,1,128,1,16,4,1,66,16,2,72,130,80,8,8,0,0,1,16,0,0,6,64, +80,250,0,11,32,0,61,184,255,0,74,152,255,0,0,32,0,11,2,0,3,1,0,3,8,0, +0,4,32,0,18,4,32,0,5,1,0,1,64,0,10,16,0,1,64,0,0,128,252,0,5,128,0,13 +,6,0,2,32,0,27,64,0,3,32,0,5,8,8,0,1,32,0,1,64,8,120,255,0,43,128,0, +29,16,255,0,10,8,0,18,16,0,2,16,0,2,8,0,5,32,128,0,26,168,253,32,0,9, +8,0,0,2,0,0,16,0,1,33,128,4,0,0,1,32,64,8,34,0,20,128,0,1,16,0,0,4,0, +0,8,16,1,0,1,16,32,2,129,32,0,4,4,0,2,8,208,248,0,7,8,0,15,4,0,26,64, +0,5,8,0,6,8,64,0,4,208,255,64,0,6,16,0,1,32,104,5,0,0,8,0,0,160,34,64 +,4,128,0,0,16,32,67,69,0,21,1,0,0,64,0,0,72,0,0,16,32,2,0,1,12,16,1, +34,64,0,1,1,8,64,2,0,2,16,184,250,128,112,0,1,128,0,0,32,8,0,0,1,0,1, +36,0,1,128,12,0,0,64,0,0,42,4,0,0,64,16,64,2,64,0,0,8,0,17,32,64,1,0, +0,34,0,0,3,160,0,2,1,16,8,36,0,0,4,8,64,141,0,0,8,0,1,64,16,11,136, +248,32,64,0,3,64,8,0,0,2,0,1,4,0,2,8,0,0,64,0,0,8,16,0,1,64,0,0,8,0,0 +,1,16,0,19,1,0,2,2,32,0,3,32,32,0,2,2,0,0,1,2,0,3,17,8,12,250,0,0,128 +,0,2,4,0,9,32,0,5,8,0,28,64,0,3,32,0,2,1,0,5,64,0,5,251,0,25,2,0,47, +184,255,0,74,152,255,0,1,1,0,1,16,16,0,2,16,0,4,128,0,10,1,0,21,1,0,6 +,1,0,1,132,0,2,16,0,4,2,0,1,120,253,16,0,0,1,0,4,18,0,2,32,0,2,128, +128,1,0,8,1,0,18,64,0,2,34,64,0,0,8,0,3,1,64,0,2,1,4,0,2,16,32,0,2, +180,252,18,0,8,2,0,13,2,0,47,128,100,249,0,9,64,0,53,2,0,8,248,251,0, +1,4,0,4,64,0,0,32,0,11,4,0,10,128,0,6,64,0,2,128,0,0,4,0,2,64,0,4,4,4 +,128,0,1,2,0,9,240,251,0,42,8,0,30,16,255,0,0,1,8,0,2,1,16,0,0,64,0,1 +,1,0,3,4,4,0,0,64,0,0,2,0,0,16,0,1,1,0,25,64,0,0,32,0,5,16,0,10,24, +254,0,3,4,0,6,8,8,1,32,0,5,128,0,0,128,8,0,1,32,0,17,64,0,2,64,0,2,64 +,32,0,10,2,64,0,1,128,0,1,232,251,0,11,2,64,0,5,4,0,53,184,249,0,74, +152,255,0,74,152,255,0,19,32,0,25,32,0,26,152,255,0,18,64,0,2,8,32,0, +0,128,0,20,16,0,25,224,251,0,5,64,0,17,16,0,29,16,0,0,2,0,1,16,0,12, +216,252,0,74,152,255,16,0,30,128,0,2,128,0,2,64,0,2,64,0,19,4,0,8,128 +,255,0,5,2,0,3,64,0,7,32,0,0,4,0,1,8,0,19,128,0,1,8,0,24,176,255,0,45 +,2,8,0,11,8,0,4,2,0,7,48,255,4,0,1,80,132,0,6,4,0,0,1,0,0,4,0,2,16,2, +0,5,4,4,0,16,32,0,2,16,0,2,8,8,1,1,0,7,129,8,48,0,5,251,0,4,1,0,3,16, +0,0,16,0,5,192,16,0,2,1,0,0,136,0,1,8,0,19,4,128,0,0,16,0,1,64,0,0,8, +0,11,8,0,0,1,32,144,252,0,30,128,1,0,2,1,0,1,192,0,2,128,0,30,88,254, +0,9,8,0,21,1,0,1,64,1,0,1,128,0,2,160,0,29,192,253,8,1,1,0,1,64,0,0,4 +,16,1,0,1,4,4,64,4,0,1,16,32,2,8,128,0,2,36,64,0,20,2,2,0,0,8,4,0,0, +32,0,3,16,32,0,0,64,0,2,129,0,1,4,2,0,0,5,128,152,252,20,0,2,1,32,64, +16,0,10,128,0,32,128,0,0,32,0,0,2,0,0,64,0,1,1,128,0,10,136,253,64, +128,0,0,128,0,0,48,128,6,136,0,2,2,4,128,8,0,1,32,192,4,8,90,1,0,0,40 +,68,128,0,5,8,0,6,4,0,2,45,0,1,21,2,0,0,4,72,0,0,24,0,0,1,0,1,9,144,0 +,0,48,24,8,128,1,1,0,0,2,4,128,8,0,0,80,252,0,0,64,16,14,2,65,40,0,0, +4,128,16,0,0,132,2,0,2,10,0,0,136,0,1,8,34,0,0,28,128,120,0,13,2,0,1, +64,0,0,48,0,0,2,1,32,64,0,0,128,32,0,1,129,1,1,8,4,0,2,64,1,0,0,16,32 +,0,1,112,8,136,251,0,0,64,8,8,1,129,32,0,0,16,0,0,2,0,0,4,2,0,2,2,0,4 +,8,0,0,4,128,64,0,13,4,0,3,8,0,0,2,2,64,0,2,34,0,1,64,0,1,32,0,4,1,0, +0,64,0,2,16,32,112,249,0,2,16,0,20,1,0,0,128,0,18,32,0,9,40,0,1,128,0 +,10,4,0,0,168,250,16,0,28,16,32,0,0,64,0,0,32,0,1,8,16,0,0,32,0,0,16, +0,30,60,248,2,0,28,8,0,1,32,0,3,4,0,1,16,0,31,128,88,252,0,4,32,0,10, +2,0,1,2,0,1,64,0,21,2,0,0,64,0,7,2,0,7,32,0,0,1,0,1,65,0,1,4,152,253, +16,0,3,2,0,8,16,64,0,0,64,0,0,3,8,0,6,48,0,24,16,0,5,4,0,3,64,0,4,128 +,0,0,220,249,8,0,29,1,0,1,4,0,2,128,0,2,2,0,30,128,176,248,0,44,128,0 +,16,4,0,10,88,251,0,32,1,8,0,1,1,0,1,128,1,0,32,24,255,0,74,152,255,0 +,0,128,0,3,64,32,128,0,1,32,0,2,32,0,0,8,128,128,0,2,32,64,1,0,23,64, +128,0,0,16,2,32,0,1,32,0,0,8,0,0,1,128,0,1,128,0,4,32,1,0,0,136,250,0 +,6,32,0,8,8,0,0,1,4,0,4,4,0,17,64,0,12,68,32,0,0,8,0,0,128,0,0,64,2,9 +,0,2,65,0,1,16,251,0,30,16,0,2,16,0,2,8,0,2,32,0,30,160,253,0,24,4,0, +48,152,251,0,2,128,4,208,0,0,26,64,11,104,33,0,8,4,0,2,1,0,1,20,1,0, +14,160,0,0,1,0,3,26,0,3,13,160,0,0,52,33,0,2,26,67,11,0,1,13,32,8,1,0 +,0,88,250,0,3,2,193,0,0,24,0,0,2,1,0,16,16,32,0,15,1,0,8,64,12,0,0,1, +48,0,3,24,0,0,3,2,0,0,12,128,0,2,96,255,0,2,128,3,192,0,2,3,24,0,8,6, +0,4,2,0,0,44,0,15,128,1,0,4,24,0,1,120,16,0,0,96,65,48,0,3,16,8,1,0,1 +,12,0,1,1,0,0,240,253,0,2,128,4,192,0,2,19,10,18,0,7,2,0,6,20,0,16, +137,0,4,64,16,0,0,104,4,0,0,176,0,0,16,17,0,2,24,0,0,35,2,0,0,12,128, +5,0,1,168,250,0,3,4,0,2,5,11,65,68,0,7,24,0,4,2,0,0,168,16,0,14,128,5 +,2,0,3,24,16,0,1,1,12,192,48,48,1,0,2,152,0,0,2,0,2,1,133,0,1,32,250, +0,2,128,2,48,128,6,192,3,112,0,8,30,16,0,2,3,0,1,32,0,15,96,1,0,4,30, +0,1,120,64,3,4,1,60,16,0,2,30,196,3,2,0,0,3,224,0,3,252,0,3,2,0,2,4,3 +,65,0,8,24,0,3,12,2,0,0,32,0,15,128,1,0,5,8,0,2,12,64,1,48,0,3,24,0,0 +,2,2,0,0,12,128,1,0,1,56,251,0,3,4,0,1,128,0,0,3,32,66,0,7,24,0,3,32, +0,1,16,64,0,14,128,69,0,4,24,0,1,96,16,64,144,72,48,5,0,2,88,16,34,0, +1,76,196,33,0,1,64,255,0,1,4,128,0,0,16,36,0,5,32,0,8,96,18,0,2,4,1,0 +,6,34,0,6,49,0,1,128,6,16,0,1,64,0,3,32,0,0,4,0,3,26,64,11,108,0,0,33 +,160,9,2,0,0,192,250,0,4,128,0,16,96,0,4,32,0,6,12,0,6,6,0,2,6,0,5,64 +,0,7,24,0,0,3,96,32,0,0,2,0,2,120,255,0,2,128,5,48,0,16,120,0,3,44,0, +7,12,0,6,134,1,0,1,6,0,2,192,0,0,120,0,1,96,65,0,0,8,0,2,24,0,0,3,96, +32,0,0,130,1,0,1,200,249,8,0,0,48,145,2,144,132,0,6,4,2,0,6,104,0,3, +20,0,7,10,0,6,5,136,0,1,6,0,0,4,1,64,0,0,104,20,0,0,160,0,0,128,0,3, +24,0,0,10,98,2,32,0,0,145,0,1,43,249,0,2,4,3,64,8,0,6,8,2,0,7,2,0,2, +168,16,0,6,10,0,6,133,5,2,0,0,70,0,0,66,0,1,19,0,0,1,0,0,192,48,0,0, +10,0,2,128,0,0,99,96,132,0,0,2,1,2,0,0,81,254,0,1,60,128,4,32,32,0,5, +96,0,8,24,32,0,2,32,0,15,96,0,1,128,7,242,0,1,192,131,120,64,0,1,1,12 +,0,3,6,196,0,0,88,0,0,3,224,1,0,1,48,250,4,0,0,48,32,4,208,0,7,128,0, +12,32,0,15,128,1,0,2,192,0,2,3,0,2,64,1,0,0,8,0,2,24,8,1,64,0,1,130,1 +,0,1,25,253,0,1,48,1,2,192,34,0,5,128,17,0,12,16,17,0,14,128,69,0,1, +16,200,68,0,1,3,96,17,0,0,128,64,48,1,0,2,88,0,0,80,16,32,8,128,9,1,0 +,0,80,248,0,1,20,134,0,0,208,0,0,2,0,3,140,2,0,0,176,0,1,208,0,0,2,0, +2,18,1,32,0,0,4,1,0,14,32,0,10,1,32,0,0,4,0,3,26,64,10,44,65,1,160,9, +2,0,0,32,251,0,1,32,0,8,12,0,2,16,0,0,192,0,9,32,0,19,4,128,0,3,64,12 +,0,6,24,0,1,64,0,5,8,255,0,1,28,128,5,192,64,6,0,3,15,0,1,60,32,0,2,6 +,0,1,24,0,0,12,130,1,45,0,18,128,7,48,0,3,120,32,0,0,96,65,48,0,6,96, +0,1,128,1,0,1,232,255,4,0,0,36,128,2,192,2,2,0,3,13,0,1,4,2,0,2,2,0,1 +,8,0,1,128,5,20,0,15,128,129,0,0,128,70,17,0,3,104,1,0,0,161,0,0,48,0 +,5,16,1,33,32,136,144,0,1,210,251,12,0,0,16,0,0,3,0,0,8,25,5,0,2,32,0 +,5,2,152,0,1,96,0,1,2,16,168,16,0,15,8,2,0,0,16,0,0,2,0,3,1,64,192,48 +,0,0,1,0,2,128,0,1,96,132,64,130,136,0,2,252,0,1,44,128,4,48,0,0,30,0 +,3,3,2,0,0,60,0,1,48,128,30,4,0,0,120,64,3,224,129,32,0,15,224,1,0,0, +128,7,52,128,0,2,120,64,3,4,1,12,16,0,2,6,196,131,120,0,0,3,224,1,0,1 +,184,252,8,0,0,16,0,0,4,0,1,24,0,11,24,0,1,96,0,1,2,0,0,32,16,0,6,16, +0,6,136,1,0,2,193,32,0,5,68,1,0,0,32,0,3,8,0,0,97,0,1,128,129,0,1,201 +,255,0,1,32,0,0,2,0,0,64,26,0,6,48,0,2,132,26,0,1,96,0,0,32,128,17,18 +,0,15,128,1,1,0,0,6,192,8,0,2,96,8,140,128,68,0,0,2,0,2,64,0,0,8,96, +132,140,194,9,0,1,104,255,32,0,1,128,0,0,144,4,1,0,1,72,2,0,2,176,0,1 +,16,0,0,24,68,10,8,0,0,13,0,1,4,1,0,6,6,0,6,35,72,0,1,32,0,0,4,0,1, +139,0,0,2,1,32,49,4,128,6,0,1,2,64,11,76,0,0,5,32,8,37,2,160,254,0,9, +32,16,0,3,16,0,2,24,0,0,1,1,0,0,12,0,2,32,0,14,128,0,3,2,64,0,1,3,0,0 +,32,0,0,128,0,9,64,8,128,0,0,48,32,24,251,128,1,0,0,128,5,128,64,0,2, +56,0,3,60,0,1,48,0,0,30,0,0,2,24,0,0,12,0,1,44,0,7,8,0,6,4,64,0,0,128 +,1,48,0,1,192,3,24,0,1,96,65,0,5,4,1,0,1,11,0,1,49,0,0,64,254,8,136,0 +,0,128,2,64,2,0,2,72,0,3,4,5,0,0,16,0,0,26,0,0,1,8,0,0,12,0,1,20,0,7, +16,0,6,8,4,0,0,128,0,0,16,0,1,64,3,8,0,1,161,0,2,160,0,3,8,2,129,5, +128,5,176,32,217,252,128,49,0,1,3,0,0,8,0,2,64,0,7,66,128,0,0,2,96,4, +32,0,1,168,16,0,15,64,0,1,38,194,40,0,1,16,96,33,64,64,1,0,0,2,16,8,0 +,0,64,4,35,2,18,38,0,0,145,48,65,51,248,96,0,1,128,4,48,32,0,2,32,0,3 +,60,0,1,48,0,0,6,200,1,120,16,3,8,0,0,32,0,7,12,0,6,102,0,1,128,7,240 +,0,1,192,0,0,121,0,0,3,4,1,12,136,1,0,1,6,192,3,56,0,0,8,232,0,0,60,0 +,0,184,251,132,1,0,1,4,0,4,40,0,6,192,0,2,2,96,0,3,32,32,0,15,64,0,1, +6,192,0,3,96,0,1,68,1,48,0,3,24,4,3,96,0,0,8,128,1,48,16,26,249,128, +133,0,1,2,0,0,64,0,2,72,0,3,48,0,1,192,64,0,1,1,104,0,3,16,0,7,2,0,6, +1,0,2,6,192,0,1,64,0,0,96,0,0,140,0,0,1,176,8,32,2,0,0,128,0,0,2,97, +128,132,130,17,49,0,0,8,250,0,2,128,0,0,16,0,3,72,0,0,1,0,1,4,134,0,3 +,5,0,0,8,0,0,1,0,1,4,1,0,6,16,0,6,168,0,1,128,2,192,4,0,1,136,0,0,2, +65,160,1,4,134,0,2,26,64,8,9,0,0,1,160,1,0,1,80,248,0,9,32,0,3,48,0, +12,32,0,15,1,0,1,4,0,0,64,0,3,32,0,0,130,1,0,4,24,0,5,129,0,1,192,250 +,0,2,128,5,0,0,32,0,2,88,0,3,48,0,0,6,0,1,6,0,3,12,0,1,44,0,7,10,0,6, +101,1,0,0,128,5,240,0,1,192,0,0,24,0,0,3,0,1,12,0,3,24,0,0,1,96,0,0, +11,128,1,0,1,184,255,8,0,1,128,2,0,0,2,0,2,40,0,3,176,8,22,2,0,0,2,0, +2,130,12,0,1,20,0,7,8,0,6,164,0,1,128,2,17,66,0,0,64,0,0,8,0,0,141,16 +,0,0,132,32,0,2,24,0,0,18,1,34,5,0,0,41,0,1,75,249,0,3,3,0,0,32,0,2, +48,0,0,12,4,0,0,32,17,32,0,1,24,0,1,96,8,64,0,1,168,16,4,0,5,2,2,0,5, +193,8,0,1,3,0,3,3,96,2,36,128,69,128,0,0,64,4,0,1,16,137,96,2,38,128, +17,0,1,101,249,0,2,128,4,48,0,3,64,0,0,15,0,1,28,128,7,4,0,0,30,16,0, +0,24,0,0,3,8,0,0,32,0,15,32,129,0,0,128,4,240,0,1,192,3,122,16,11,232 +,1,12,136,1,0,1,6,192,3,24,64,8,232,129,0,1,144,255,4,0,2,4,0,0,32,0, +2,40,0,3,48,0,0,6,2,0,0,24,0,2,64,0,2,32,128,1,0,5,192,0,7,65,0,1,5,0 +,3,3,96,0,0,12,130,1,1,0,0,6,4,0,2,1,96,0,0,8,130,0,0,1,0,0,64,249,0, +3,2,192,0,3,72,0,0,128,16,0,0,184,64,6,0,1,24,0,3,32,2,0,0,16,33,0,14 +,128,16,0,1,2,192,0,1,64,3,96,0,0,136,128,9,32,8,70,0,3,35,100,65,132 +,128,1,0,1,96,249,32,0,0,4,128,0,0,80,0,1,64,0,3,32,0,0,52,129,0,0,16 +,0,0,24,69,0,0,104,1,68,32,0,0,4,1,2,0,6,1,0,5,32,0,0,4,128,4,0,2,64, +0,1,2,13,161,1,20,128,16,16,0,0,136,68,16,8,129,1,160,8,0,1,116,254,0 +,4,128,0,8,48,8,0,2,24,0,1,96,32,8,2,0,1,32,4,0,6,2,0,9,2,0,0,128,0,3 +,32,12,128,129,32,0,1,2,0,0,16,0,1,2,0,1,128,129,0,1,160,248,0,1,1, +128,5,176,0,2,3,2,0,1,128,1,0,0,136,1,192,128,30,0,0,3,64,64,11,0,1, +44,0,15,96,1,12,128,5,240,32,0,2,26,0,0,12,224,64,44,128,1,192,0,0,22 +,0,1,96,16,11,128,1,0,1,144,252,4,4,48,145,2,80,0,2,3,0,3,136,48,129, +0,0,192,2,26,0,0,19,34,4,133,136,137,20,0,0,3,0,5,128,1,0,5,160,0,0,4 +,128,2,209,0,2,8,8,0,0,36,34,9,20,137,64,4,66,74,8,160,96,0,0,5,128, +17,2,0,0,171,248,12,144,0,0,64,3,96,0,2,32,0,2,128,1,50,17,38,8,128, +128,0,0,8,97,129,6,0,0,48,168,16,0,14,192,8,48,65,3,0,0,2,0,1,64,96, +18,40,128,69,152,0,0,32,192,68,12,0,0,8,32,68,38,128,17,0,1,97,253, +224,1,60,128,4,128,32,0,0,192,3,1,0,1,96,0,0,60,128,7,240,0,0,6,200,3 +,24,0,0,8,224,1,32,128,0,6,98,0,6,48,129,60,128,4,240,128,0,0,192,3, +120,0,0,7,228,1,36,136,1,242,0,0,16,192,129,24,0,0,8,104,1,1,0,0,102, +253,136,1,49,32,4,128,32,0,5,128,1,33,0,0,6,0,3,3,64,0,0,10,128,129, +32,32,4,0,6,2,0,6,65,48,0,0,3,0,4,98,0,0,8,132,129,40,8,0,0,4,0,0,20, +0,0,1,32,0,0,8,130,65,0,1,120,250,128,1,176,0,0,2,64,2,0,1,19,1,0,1, +128,5,144,64,6,192,2,1,0,0,67,16,132,4,128,17,16,2,0,6,20,0,6,134,4, +48,0,0,4,192,34,0,2,96,0,0,36,0,0,17,144,0,0,20,192,68,8,0,0,131,0,0, +20,36,64,17,0,1,80,251,0,2,128,0,0,16,0,0,18,69,0,2,129,176,4,4,194, +18,0,1,2,64,0,0,104,0,0,64,160,5,4,129,2,0,5,64,1,0,5,32,0,0,4,0,2,4, +2,64,8,0,0,2,1,40,0,0,4,0,1,208,0,0,128,68,0,0,108,34,1,160,9,4,0,0, +240,252,0,6,8,0,5,128,0,2,2,0,3,96,0,1,130,129,0,0,32,2,0,5,8,1,0,5,2 +,0,3,4,64,0,2,1,32,0,9,1,96,0,2,129,0,1,136,253,0,2,128,5,176,0,0,14, +0,4,128,128,12,0,0,2,0,2,16,0,0,1,0,0,11,0,0,1,44,128,0,6,66,0,6,104, +1,48,128,7,50,0,0,24,192,0,0,24,0,3,44,0,2,128,22,0,1,98,0,0,11,128,1 +,48,0,0,72,249,4,0,1,128,2,80,0,0,18,0,3,32,4,8,132,16,16,8,0,0,64,0, +0,32,0,0,8,133,136,8,21,0,15,161,0,1,145,70,16,0,0,64,72,32,10,0,0,64 +,130,137,20,9,0,1,2,74,8,8,64,132,5,128,17,2,17,219,252,12,0,2,3,96,0 +,0,16,0,1,1,0,0,64,0,0,132,0,0,1,32,4,0,0,64,0,1,96,33,6,128,17,169, +16,0,6,32,0,6,208,8,176,16,16,192,36,64,16,32,100,17,32,2,68,152,0,2, +2,13,0,0,96,64,128,38,128,4,48,33,9,255,0,2,128,4,128,32,10,192,0,2,3 +,100,1,12,144,5,0,1,6,200,0,0,25,0,0,8,96,0,0,32,0,15,32,129,12,128,7 +,244,0,0,6,192,0,0,120,0,0,3,96,0,0,36,8,0,0,240,0,0,16,192,0,0,120,0 +,0,8,232,129,12,0,0,32,252,8,0,2,4,128,32,8,0,0,3,0,2,136,1,0,0,32,6, +0,1,24,16,0,0,2,32,10,0,0,1,32,0,16,65,48,0,1,196,0,3,98,0,0,4,130, +129,40,8,0,0,192,0,0,20,0,2,32,8,130,0,0,48,32,65,251,0,3,2,64,0,0,16 +,0,0,35,4,0,0,40,128,9,161,0,0,38,4,0,2,19,0,1,4,64,144,16,5,0,14,128 +,0,0,48,18,22,192,0,0,128,8,34,96,0,0,76,128,17,16,0,1,192,68,8,128, +32,113,1,4,192,5,178,0,0,248,248,32,0,0,4,128,4,144,0,0,18,64,0,2,129 +,48,0,0,176,128,0,0,16,0,0,2,64,9,8,0,0,72,160,5,36,1,0,14,32,9,4,128 +,0,0,16,0,0,27,64,0,2,77,40,0,0,164,128,0,0,16,0,0,144,68,8,106,34,41 +,32,4,53,0,0,96,252,0,3,2,64,128,8,0,7,16,0,5,1,0,0,4,130,1,17,32,0,6 +,2,0,6,129,128,0,8,64,4,0,0,64,16,8,0,2,8,0,0,1,96,0,0,4,136,0,0,48,0 +,0,192,248,128,1,48,128,5,176,0,0,22,0,0,3,2,0,0,3,128,1,61,0,0,6,192 +,0,1,16,1,25,0,0,11,0,0,1,45,0,7,8,0,6,100,1,0,2,128,0,1,208,0,0,120, +16,12,0,1,44,0,1,192,128,22,0,1,32,0,0,11,0,1,1,0,0,48,249,132,133,48 +,146,2,80,0,0,10,0,0,11,0,1,33,132,9,4,65,38,4,68,64,0,1,8,0,0,133, +136,8,20,0,0,4,0,5,16,2,0,5,168,0,0,48,17,0,1,136,0,0,64,0,0,104,1,76 +,1,80,20,0,0,38,2,2,74,8,32,97,132,5,128,17,0,1,66,254,12,16,0,0,2,3, +96,0,0,12,0,0,32,0,1,64,0,0,16,0,2,192,16,64,0,0,64,96,1,6,128,145, +168,16,2,0,5,16,1,0,5,72,1,0,0,33,0,0,196,8,128,8,147,0,0,1,8,4,4,40, +0,0,16,194,2,13,0,1,96,8,10,0,0,1,49,18,80,253,224,129,60,144,4,64,0, +0,18,192,3,1,0,0,3,228,129,60,128,7,50,0,0,6,200,2,120,16,8,96,0,0,32 +,0,0,7,0,5,144,3,0,5,40,1,60,128,1,240,32,30,192,3,120,64,15,96,64,36 +,136,7,240,0,0,16,192,0,0,58,0,0,8,224,0,0,60,0,0,40,253,8,128,0,0,16 +,2,64,0,0,8,0,4,8,128,0,1,6,193,0,1,16,3,96,0,0,6,0,0,129,32,128,5,0, +5,208,2,0,5,8,1,48,32,6,192,0,0,24,0,0,3,0,4,32,0,0,6,0,1,12,0,1,96, +64,8,128,1,48,0,0,73,255,128,5,48,1,4,64,0,0,16,0,0,35,2,0,0,40,128,1 +,48,0,0,70,192,66,24,0,0,19,106,0,0,8,0,0,4,32,32,4,0,5,8,2,0,5,4,1, +176,0,0,22,193,64,152,8,3,96,18,76,4,65,32,0,0,70,194,68,16,0,0,64,0, +0,4,8,128,5,177,32,40,249,0,5,24,0,2,16,1,0,17,4,0,6,2,0,13,128,0,20, +104,250,32,0,0,4,128,0,0,16,0,1,64,0,1,32,1,32,0,0,4,128,0,0,16,0,1, +64,0,2,1,32,0,0,4,0,7,2,0,6,33,0,0,4,128,0,0,16,0,0,2,0,1,8,0,0,1,32, +0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,160,248,0,20,8,0,1 +,64,0,49,208,255,36,0,0,4,128,0,2,2,97,0,2,1,32,0,0,4,128,0,0,16,0,0, +2,64,0,0,8,1,1,32,0,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1 +,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,65,248,12,0,4, +4,0,3,130,0,7,4,0,1,16,0,0,64,16,0,1,6,0,28,72,0,4,64,8,0,7,227,248, +32,0,4,32,2,64,0,3,32,0,3,16,0,1,64,0,3,32,0,24,2,0,9,16,0,1,64,0,0,8 +,0,1,34,0,0,4,0,0,24,253,8,0,3,2,0,6,4,0,1,16,0,0,4,0,9,16,0,17,16,0, +0,2,64,0,2,1,32,0,0,4,128,0,0,16,0,0,2,0,6,4,0,2,74,249,32,0,0,132, +144,0,1,72,2,97,0,1,36,1,32,0,0,4,128,16,16,72,2,64,0,0,8,0,0,128,36, +0,1,2,0,14,32,64,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,0,1,4,128,0,0,16,0 +,0,2,72,0,0,8,0,1,32,0,0,4,0,0,88,249,0,12,1,0,1,36,0,1,16,0,27,4,0,8 +,8,0,2,128,0,8,64,0,0,4,232,253,0,0,2,64,0,10,2,0,3,1,0,6,2,0,18,64,0 +,3,32,0,0,64,0,6,8,0,0,1,0,2,128,0,3,64,0,0,176,249,0,26,5,16,0,25,32 +,0,1,32,0,9,8,0,1,2,2,0,0,240,251,0,8,4,0,13,128,0,2,2,0,16,2,0,2,128 +,0,6,1,0,9,32,0,0,64,0,1,128,120,254,0,22,8,0,42,128,0,6,16,255,0,74, +220,251,0,3,2,1,0,4,16,0,2,32,32,0,0,4,0,4,16,0,0,32,0,0,16,8,0,16,1, +0,3,16,4,2,8,0,3,16,8,4,0,0,64,0,0,68,128,0,2,8,0,0,4,16,176,255,0,4, +64,0,0,8,4,0,2,4,0,12,128,0,0,8,0,21,128,0,0,64,0,16,2,0,2,176,251,0, +1,160,0,0,1,18,0,0,210,18,80,0,0,60,1,0,1,8,16,0,0,130,2,208,2,0,1,32 +,4,96,0,0,12,16,0,15,128,0,3,128,4,200,0,0,208,10,0,2,8,16,1,0,0,88,0 +,0,136,0,0,1,0,1,12,0,0,8,16,8,248,32,16,1,0,0,128,1,162,8,0,1,72,0,2 +,32,1,0,1,64,0,1,2,1,0,0,18,32,160,67,16,40,0,14,128,64,81,8,0,0,65,0 +,0,16,0,0,131,32,2,0,0,2,1,148,143,0,0,128,0,0,8,0,0,176,168,20,64,32 +,2,80,6,112,250,0,4,1,32,16,0,9,64,0,2,1,0,0,64,0,0,128,0,0,5,8,0,14, +128,64,16,32,128,64,0,2,130,8,0,1,4,0,0,16,8,0,2,2,0,0,128,32,16,0,2, +16,0,0,192,254,0,4,4,0,3,32,0,2,64,0,5,16,0,3,32,0,24,2,64,0,3,32,0,1 +,32,0,0,128,0,9,136,96,253,0,46,2,0,26,184,255,0,7,128,0,7,1,0,4,16,0 +,1,64,0,46,8,128,250,0,2,4,0,0,16,1,0,1,64,0,3,32,0,3,1,0,28,16,0,0, +32,64,0,3,8,0,8,1,0,2,64,0,2,240,248,64,1,0,3,128,0,3,160,0,6,32,0,1, +5,0,2,146,0,29,1,130,0,11,32,128,0,0,64,192,255,0,0,32,0,6,1,0,9,16,0 +,1,96,0,1,128,0,26,2,0,20,249,0,1,32,0,6,64,0,8,16,0,1,8,0,5,8,0,1,32 +,0,3,4,0,1,16,0,9,16,64,0,6,128,0,12,40,252,0,27,4,0,20,8,0,16,16,0,5 +,24,250,4,0,0,4,0,4,32,8,0,7,16,0,0,64,64,0,1,1,0,21,2,0,3,64,0,0,8,0 +,7,128,0,3,8,0,4,128,116,252,128,0,0,128,0,1,128,0,3,64,0,2,4,4,0,1, +128,0,2,8,0,1,8,0,19,1,0,5,2,0,2,1,0,4,8,0,0,32,0,1,2,0,2,4,0,0,16, +128,248,0,5,64,1,0,7,4,0,0,128,64,0,28,1,34,64,0,2,16,32,6,64,0,0,12, +0,6,4,0,0,3,0,3,64,251,0,16,128,0,5,8,0,28,128,0,7,1,0,10,136,254,0,3 +,1,0,6,10,0,1,40,0,3,4,0,25,8,0,4,128,0,7,1,0,11,192,252,0,45,128,0,2 +,64,0,23,144,251,0,8,2,0,3,1,0,1,4,0,3,2,64,0,2,1,0,29,8,0,15,112,250 +,0,4,64,0,3,32,0,48,4,0,3,2,0,8,216,253,0,28,4,0,19,1,32,0,0,4,0,1,16 +,0,0,16,0,6,4,0,3,2,0,2,216,251,0,1,32,0,8,8,0,1,32,0,14,32,0,2,32,0, +2,16,0,2,16,64,0,1,32,0,2,128,0,9,4,0,11,80,250,0,26,64,128,0,13,32,0 +,10,2,0,18,240,255,0,0,2,68,0,5,4,0,3,2,0,3,2,0,6,2,0,0,16,0,11,20,0, +2,2,0,1,8,0,0,1,0,22,80,251,0,27,76,16,0,0,1,0,1,4,64,144,0,0,128,0,2 +,2,0,31,104,253,0,8,128,0,7,1,0,1,64,0,32,8,0,0,4,0,6,8,0,0,2,4,0,2, +128,0,1,192,248,0,12,64,0,0,4,0,4,128,0,45,1,0,5,8,255,0,74,220,251,0 +,14,2,0,13,1,0,0,66,4,0,1,66,128,0,1,33,2,0,1,33,0,21,128,0,0,192,0,4 +,120,255,0,0,1,0,7,16,0,3,4,0,1,32,0,6,2,0,0,16,8,0,12,16,0,4,4,1,0,3 +,32,16,4,0,1,16,8,0,0,1,32,0,1,129,8,16,4,8,0,2,136,254,0,1,16,0,0,2, +64,32,8,0,0,64,0,0,16,0,0,2,0,0,16,136,0,4,1,0,2,64,0,8,32,0,19,2,0,0 +,64,0,4,2,0,6,5,0,0,192,253,64,0,0,4,128,20,144,150,10,0,1,18,74,64, +137,0,0,12,160,2,96,20,0,0,68,0,2,104,165,0,0,8,16,0,5,32,0,4,8,64,0, +2,160,0,0,161,2,0,0,80,0,0,10,16,32,7,0,1,9,16,20,66,64,2,128,80,17, +42,42,4,5,5,0,0,200,252,0,0,128,162,32,0,0,128,39,112,0,0,64,0,1,6,0, +0,4,161,82,13,128,54,52,16,2,69,160,40,128,66,1,8,0,2,8,6,192,0,4,4,3 +,32,16,0,1,8,80,2,97,32,100,0,0,42,34,2,0,1,41,16,13,144,20,134,0,2, +32,26,5,10,68,36,8,136,249,0,5,64,0,4,2,0,5,128,0,5,128,0,0,1,8,0,2,8 +,4,64,0,4,4,2,32,16,0,3,2,17,32,0,2,32,0,3,16,8,0,5,16,64,4,2,64,0,0, +32,24,251,0,1,16,0,1,64,0,0,8,0,0,128,0,4,8,0,0,1,32,32,4,128,0,0,16, +0,0,2,0,7,2,32,0,5,1,0,9,128,0,3,64,0,0,1,32,0,0,1,0,4,16,0,2,4,0,0, +160,248,0,15,64,0,6,128,0,39,1,0,2,16,0,4,88,251,0,12,136,0,1,32,128, +0,8,4,0,19,4,0,4,2,0,6,4,0,4,32,25,0,3,4,152,252,0,1,8,0,9,64,0,3,72, +0,0,1,0,7,8,0,18,132,128,0,3,64,0,0,32,0,7,64,4,0,2,128,0,2,168,255,0 +,10,1,0,48,12,128,0,1,4,0,1,64,0,1,128,0,2,64,255,2,0,11,128,0,32,16, +0,13,2,0,4,32,0,2,32,1,0,0,176,255,0,0,4,0,7,4,0,1,16,0,44,2,0,11,33, +10,0,0,16,253,0,14,2,0,4,2,0,1,64,0,1,32,0,2,128,0,1,32,128,0,2,64,0, +2,64,0,9,64,0,1,2,0,5,16,0,3,128,0,4,168,250,0,28,32,0,0,16,0,2,16,0, +2,8,0,2,8,0,30,8,253,0,25,2,0,18,4,0,11,4,32,0,3,64,0,0,64,0,2,32,0,2 +,152,249,0,9,1,0,2,128,0,2,2,0,3,1,8,0,1,128,16,0,19,2,0,0,1,4,0,3,24 +,0,1,64,0,0,16,0,1,16,64,76,0,1,16,0,0,70,0,1,106,255,32,0,1,32,0,3, +128,0,2,2,0,1,1,0,5,1,0,2,32,0,40,128,64,0,1,1,0,1,248,254,0,14,16,0, +0,8,8,0,1,8,0,1,32,0,9,128,0,6,64,0,3,64,0,2,8,0,1,1,0,6,64,0,10,104, +250,160,81,0,0,128,6,0,1,18,64,1,72,32,140,0,1,52,0,2,132,26,0,2,2,0, +2,128,16,0,16,4,128,6,208,2,2,0,3,1,0,6,64,16,0,0,104,0,1,160,1,4,9, +248,252,128,1,0,1,6,0,1,8,16,2,32,0,1,8,0,0,48,0,3,24,0,2,32,0,23,6, +192,64,0,15,96,0,1,128,1,16,0,0,200,252,224,0,2,6,0,1,22,192,2,88,0,0 +,15,4,0,0,48,0,1,240,32,24,0,1,24,0,3,60,8,0,16,48,16,6,192,0,6,2,0,5 +,6,0,1,96,0,4,8,192,254,32,33,0,1,6,0,1,10,64,1,40,0,0,65,0,1,48,0,1, +208,2,24,0,1,8,0,3,52,2,0,17,1,6,64,68,0,4,64,0,6,2,0,1,96,0,3,128,0, +0,112,251,128,1,0,1,64,4,0,0,16,128,9,65,0,3,128,0,2,72,0,2,96,128,0, +2,128,32,0,17,4,64,128,2,0,0,4,0,2,32,2,0,5,64,0,2,20,0,1,16,1,8,16, +254,224,65,0,0,128,1,0,1,12,0,0,2,48,0,0,15,0,1,12,16,0,0,240,0,0,6,8 +,0,0,120,0,3,60,0,17,12,128,1,116,32,6,0,3,3,0,6,6,16,0,0,24,0,1,96,0 +,0,12,0,0,200,252,128,65,0,1,6,2,0,0,16,0,0,2,64,0,3,48,0,3,24,0,1,96 +,0,4,8,0,17,16,6,128,0,0,24,0,4,2,0,5,24,8,0,5,1,8,48,249,0,0,5,0,1,6 +,0,1,8,0,0,145,32,0,0,12,0,1,48,33,0,0,192,32,152,16,0,0,96,0,3,48,1, +0,17,2,70,66,72,24,2,0,2,12,0,6,152,0,5,16,0,1,208,254,0,2,128,38,0,1 +,2,64,0,0,8,0,0,64,8,0,1,128,6,0,0,132,130,68,3,0,0,2,0,0,32,32,48,1, +0,14,32,0,5,26,0,3,1,0,2,160,0,0,16,0,0,64,80,0,0,8,2,13,0,3,120,254, +0,3,2,4,0,15,3,0,0,32,0,3,16,0,21,24,0,3,12,0,10,32,0,4,8,250,0,3,6,0 +,1,6,192,2,24,0,0,15,2,0,3,244,32,0,0,196,0,0,24,0,1,128,0,0,60,0,22, +24,0,4,2,0,0,12,0,0,6,0,0,64,30,4,0,1,64,0,0,4,0,2,32,255,8,0,2,134,0 +,1,2,64,1,8,0,0,45,0,3,32,208,0,0,128,64,0,0,8,0,2,32,4,33,0,15,80,0, +4,24,0,3,64,0,1,4,0,0,6,0,0,8,90,0,3,64,0,3,1,255,0,3,20,4,0,0,88,128 +,9,97,0,0,128,4,0,2,32,1,72,0,0,5,16,96,0,2,144,0,17,68,0,4,24,4,0,2, +32,2,0,0,48,9,32,8,136,64,0,0,96,0,0,33,0,0,1,0,2,147,248,0,2,128,7,0 +,1,28,4,2,112,16,15,0,2,128,1,240,0,0,6,128,0,0,122,16,0,0,96,0,0,60, +0,15,96,0,5,30,0,3,3,0,1,60,128,1,240,0,0,30,208,0,0,24,0,0,3,0,4,251 +,4,0,5,24,0,0,2,96,0,9,4,131,96,0,3,1,0,16,64,0,10,2,0,0,48,0,2,64,0, +1,3,33,16,0,0,4,0,2,26,255,0,3,6,8,0,0,24,0,0,129,96,0,0,140,2,0,2,32 +,196,34,80,0,0,19,96,0,3,48,0,15,128,17,0,5,32,0,2,12,0,1,48,0,1,4,0, +0,152,4,11,96,4,128,0,3,24,251,0,1,4,0,3,2,64,0,0,8,0,0,64,8,0,0,48, +194,6,0,0,132,2,64,0,1,2,1,0,2,1,0,14,32,16,0,0,128,18,208,0,1,64,0,0 +,40,0,0,13,0,2,160,64,0,1,64,16,0,0,40,0,5,184,252,0,16,6,0,5,32,0,3, +16,0,15,64,0,1,6,4,0,3,64,0,0,12,0,4,1,0,3,64,64,0,4,128,249,0,2,8,0, +2,6,192,2,24,0,0,15,2,0,0,60,16,6,240,32,0,0,196,0,0,24,0,3,12,0,19,2 +,0,3,3,89,16,12,0,1,12,128,1,0,1,30,4,0,0,56,0,5,88,255,4,0,1,2,0,2,2 +,64,1,8,0,0,13,0,1,132,0,0,6,208,4,128,64,0,0,8,0,3,4,0,16,4,1,0,0,68 +,2,132,0,1,8,40,1,12,0,1,4,128,64,2,0,0,26,1,0,0,72,0,5,50,253,12,0,0 +,128,8,0,2,152,128,9,97,4,128,4,0,2,16,0,0,72,64,4,35,96,4,128,0,1,48 +,2,0,15,64,0,1,34,2,36,0,1,16,52,0,0,64,4,0,0,48,2,64,1,0,0,64,0,1,32 +,0,5,96,255,0,1,12,0,3,28,4,2,112,16,15,0,1,60,128,1,242,0,0,6,128, +131,120,16,3,8,0,0,60,8,0,14,96,0,1,128,5,48,0,1,192,0,0,72,0,0,3,0,1 +,60,136,1,0,1,30,16,0,0,88,0,5,208,250,8,0,1,8,0,2,24,0,0,2,96,0,9,4, +3,96,0,0,12,4,0,0,48,0,16,64,0,1,2,0,4,80,0,0,12,0,1,48,0,6,32,0,5, +129,248,0,1,48,0,3,24,0,0,137,96,0,0,12,2,0,0,48,0,1,192,132,24,0,0,3 +,96,0,0,140,0,1,48,0,16,1,0,1,4,4,72,0,1,64,32,0,0,140,4,0,0,48,0,0, +132,0,1,24,4,0,0,64,0,5,224,253,160,1,0,0,128,0,0,82,130,2,64,0,0,104 +,0,0,64,40,0,1,128,6,2,8,2,64,0,1,2,65,2,8,0,0,1,0,14,160,0,1,128,0,0 +,208,0,0,2,0,1,72,0,0,65,34,0,0,128,160,38,16,0,1,16,0,0,40,66,1,32,0 +,2,188,251,128,1,0,2,192,0,3,96,0,5,6,0,0,128,24,0,2,32,4,0,1,1,16,0, +15,1,0,2,192,0,3,32,0,5,6,2,0,3,64,0,5,208,248,0,4,64,0,0,6,192,2,24, +0,0,15,2,0,2,6,52,0,1,196,0,0,24,0,1,98,0,0,12,0,15,96,1,0,2,192,0,1, +8,0,0,88,16,0,0,2,128,60,0,0,4,0,1,6,0,1,56,0,5,136,248,8,0,2,64,136, +132,2,64,1,8,0,0,77,0,0,32,0,1,18,16,0,0,128,64,0,0,8,0,0,32,32,32,4, +0,15,160,0,3,200,0,1,1,0,0,40,1,64,0,1,52,4,166,0,1,3,0,1,72,0,2,40,0 +,1,147,249,0,0,8,0,1,32,68,4,152,132,9,1,32,128,4,16,0,1,68,192,34,64 +,4,11,96,1,0,0,2,8,178,0,15,192,4,0,1,64,2,68,24,4,0,0,48,0,0,128,2,8 +,129,0,0,70,4,136,152,4,0,0,32,0,0,64,4,8,1,0,0,177,252,96,128,0,0, +128,1,176,64,28,0,0,2,16,0,0,15,96,0,0,1,128,3,241,0,0,6,128,131,120, +16,3,64,0,0,60,8,0,15,1,1,128,7,48,0,0,6,0,1,72,0,0,3,224,1,60,160,7, +240,0,0,30,0,1,88,0,0,3,96,0,2,32,251,4,0,3,64,0,0,24,0,0,2,96,0,1,2, +0,2,4,192,0,1,4,3,96,0,1,2,0,0,48,0,16,1,0,2,4,0,3,48,0,1,2,0,0,1,16, +6,1,64,24,0,1,32,0,0,12,0,3,137,249,0,0,72,0,1,18,132,66,24,0,0,161, +96,17,140,128,41,0,1,34,196,0,0,24,0,0,3,96,0,1,128,41,48,0,15,128,80 +,0,4,128,2,0,0,64,0,0,40,0,1,48,0,0,6,0,1,24,0,1,64,0,0,76,129,33,0,1 +,96,254,160,0,0,20,0,1,16,0,0,26,64,10,9,0,0,64,40,0,0,4,128,0,1,132, +10,64,3,0,0,33,5,160,1,0,0,1,0,14,32,0,3,16,0,5,5,0,2,160,22,0,2,80, +64,104,0,3,20,0,0,8,253,0,0,128,32,0,3,24,0,0,1,0,9,16,0,0,3,0,1,8, +128,1,0,0,16,0,26,8,0,3,6,1,0,3,32,64,0,2,32,0,0,16,254,224,0,0,44,8, +0,2,6,192,2,24,0,0,3,128,1,48,0,1,241,0,0,22,192,0,0,120,0,0,11,0,1, +13,0,15,96,1,0,3,32,0,4,11,8,0,0,12,128,3,4,0,0,6,0,0,2,96,32,0,2,44, +0,0,112,254,44,80,20,1,0,2,2,64,1,8,0,0,1,128,1,48,0,1,208,40,10,80,0 +,0,104,18,5,128,17,4,0,15,160,0,10,69,0,1,4,128,36,0,1,2,0,1,100,2,0, +2,20,0,0,25,253,132,73,152,16,0,1,40,0,0,128,2,96,2,128,4,16,1,18,16, +1,72,12,0,0,128,0,0,65,38,128,17,48,1,0,14,192,4,0,3,34,0,4,6,16,0,0, +48,6,38,1,0,0,88,4,32,65,132,0,2,24,4,43,250,224,1,36,0,1,48,0,0,4,16 +,2,112,16,3,96,0,0,12,128,1,240,0,0,16,132,0,0,120,0,0,9,232,1,61,8,0 +,15,1,1,0,1,48,0,5,8,0,1,60,128,7,0,1,30,192,0,0,120,0,3,36,0,0,232, +251,4,0,0,41,8,0,0,192,32,24,4,2,96,0,0,12,0,3,6,1,0,0,20,4,3,0,1,8, +130,129,48,0,16,65,0,2,192,32,0,4,10,2,0,0,48,0,0,6,0,1,24,0,1,2,0,3, +32,8,122,249,0,0,5,16,2,0,0,192,4,88,0,0,2,96,0,0,76,2,4,2,66,32,192, +36,8,1,163,96,32,132,128,5,48,0,15,128,16,0,3,4,0,4,132,0,1,48,0,0,68 +,1,0,0,24,0,1,96,34,0,2,16,2,152,250,160,9,5,128,2,212,0,0,2,0,1,8,0, +0,128,160,81,4,0,0,18,0,0,8,2,64,0,1,33,1,160,16,128,16,0,14,32,0,0,4 +,0,1,64,4,138,16,32,108,0,0,1,0,0,8,128,160,0,0,208,0,1,80,64,40,2,0, +0,32,32,4,0,0,160,250,128,1,0,1,6,192,0,6,8,1,0,1,4,1,128,0,6,65,0,21 +,128,32,16,0,1,96,0,3,1,0,6,64,64,0,4,136,254,0,0,1,44,8,2,192,0,0,6, +0,1,24,0,0,3,128,1,12,128,5,48,0,0,22,192,0,0,120,0,0,11,128,129,12,0 +,15,96,1,0,2,176,0,1,192,3,96,0,0,11,232,1,60,8,0,1,128,6,0,0,1,56,0, +3,44,0,0,56,252,136,5,22,1,20,200,0,0,2,0,1,8,0,0,1,128,81,4,128,2,17 +,0,0,10,80,0,0,104,16,5,0,0,17,4,0,15,160,0,1,9,0,0,80,34,0,0,96,3,96 +,0,0,69,160,1,52,2,22,1,8,2,0,1,76,0,2,32,20,0,0,121,250,128,9,152,16 +,34,192,8,24,5,0,0,96,18,12,130,65,48,33,3,192,40,12,0,0,147,0,0,65, +38,128,16,128,32,0,14,192,4,0,0,18,0,0,96,0,0,8,4,32,98,64,6,16,16, +129,0,0,32,1,0,0,25,8,32,33,0,2,8,25,4,67,253,224,129,36,128,5,242,64 +,28,0,1,112,0,0,15,224,1,60,0,0,4,240,0,0,16,132,3,120,0,0,9,104,129, +12,0,16,1,13,0,1,128,0,0,30,128,0,0,120,0,0,8,64,0,0,60,160,1,48,0,0, +30,192,0,0,88,0,1,96,0,0,36,0,0,32,253,132,1,41,8,2,0,1,24,0,1,96,0,0 +,12,128,65,48,0,0,5,192,0,0,20,4,3,0,0,16,8,130,0,0,49,0,16,65,0,0,32 +,0,0,160,0,1,16,0,0,1,0,0,10,2,0,2,6,0,0,128,24,0,1,34,0,3,33,8,66, +252,128,5,144,0,0,164,0,0,2,25,0,1,96,0,0,12,128,17,48,0,0,2,192,0,0, +72,0,0,3,96,4,36,0,0,1,48,8,0,14,128,4,48,0,1,64,0,0,24,0,0,32,0,0, +129,36,0,1,49,10,70,1,0,0,24,0,1,64,0,1,128,0,0,144,0,0,168,249,48, +132,164,16,0,0,80,0,0,2,64,0,0,8,0,0,128,32,0,0,4,0,0,16,0,0,8,2,64,0 +,1,33,1,160,1,128,16,0,14,32,0,0,4,0,2,4,0,0,64,3,40,4,1,32,32,128, +160,0,0,8,4,0,0,80,17,105,65,1,0,1,4,0,0,176,251,0,1,16,0,1,128,0,6,8 +,0,3,1,128,0,5,128,1,0,19,32,0,1,32,0,1,3,0,0,32,0,4,2,0,0,128,0,2,96 +,0,6,249,96,0,0,45,0,1,176,32,6,0,1,24,0,0,3,0,2,128,5,48,0,0,22,192, +0,0,120,0,0,11,128,1,60,0,15,96,1,0,0,16,0,0,176,0,2,131,56,16,11,8,0 +,0,60,0,1,48,0,0,6,0,1,98,16,12,0,1,44,0,0,176,249,44,16,20,0,1,80,2, +2,0,0,80,8,0,0,1,0,0,40,0,0,128,2,17,0,0,10,80,0,0,104,17,5,128,81, +180,8,0,14,160,0,1,1,0,0,80,34,0,1,11,8,2,69,0,1,182,8,16,18,20,2,0,1 +,96,1,12,0,1,20,0,0,17,255,4,0,0,42,8,0,0,96,0,0,24,0,0,32,97,17,44,2 +,16,0,0,34,3,192,32,12,0,0,139,0,0,65,38,128,17,129,32,0,14,192,4,0,0 +,18,0,0,96,0,2,35,98,20,6,16,8,129,0,0,16,2,8,152,0,0,32,64,1,64,4,0, +0,24,4,75,250,120,0,0,36,0,1,144,0,0,28,196,0,0,112,0,0,15,96,0,0,13, +0,0,4,240,0,0,16,132,3,120,0,0,9,232,1,60,0,16,1,13,0,1,128,0,1,192,3 +,120,0,0,8,224,0,0,60,160,1,32,128,30,196,0,0,57,32,3,0,1,36,0,0,112, +252,0,1,32,0,1,160,0,0,24,0,1,96,0,0,12,0,1,48,16,5,192,0,0,20,4,3,0, +0,16,8,130,1,0,0,8,0,15,65,16,0,1,160,0,2,3,0,1,10,2,0,0,1,8,0,0,2,0, +0,24,0,1,96,0,3,32,8,218,251,0,0,5,34,0,1,64,0,0,24,0,0,3,100,0,0,12, +128,1,50,2,2,192,0,0,8,0,0,3,96,1,4,0,0,4,178,0,15,128,0,1,4,0,0,64,0 +,3,66,65,4,0,1,48,1,33,192,8,25,0,0,16,20,130,64,1,0,0,16,0,0,160,254 +,32,0,0,180,128,6,144,0,0,74,16,0,0,40,0,0,128,32,0,2,20,0,0,8,18,64, +0,1,33,41,32,0,0,128,16,0,14,32,5,0,0,128,128,128,4,2,64,0,0,104,0,0, +9,176,1,128,160,16,0,1,64,16,0,0,72,1,1,32,0,0,36,4,112,249,0,1,48,16 +,0,0,64,0,0,24,0,1,96,64,0,0,8,0,2,2,1,128,8,4,0,2,4,8,0,17,128,0,0,1 +,0,1,64,32,0,2,96,0,0,4,128,1,0,1,2,2,0,3,32,16,0,2,16,0,0,8,253,0,0, +64,48,0,1,176,32,6,0,1,24,0,0,3,128,1,0,0,128,5,48,0,0,22,192,0,0,120 +,0,0,11,128,1,60,0,15,96,1,0,1,4,176,0,5,11,136,65,60,0,1,2,0,0,30,0, +5,128,44,0,0,240,252,132,1,16,17,32,82,2,138,4,0,0,40,18,1,128,1,0,0, +128,2,17,0,0,10,80,0,0,104,20,5,0,0,132,52,10,0,14,160,0,2,128,80,34, +0,4,69,128,5,52,8,32,0,1,26,5,0,0,96,20,0,2,20,0,0,234,255,12,0,0,48, +18,128,96,0,0,16,0,1,64,32,12,0,0,16,1,0,0,3,192,68,20,0,0,163,0,0,65 +,10,0,0,4,128,32,0,14,64,1,0,1,64,98,0,0,24,1,11,2,4,10,128,17,129,0, +0,16,0,1,64,0,1,96,1,128,0,0,8,41,0,0,96,250,96,64,60,128,1,144,0,0,6 +,16,0,0,24,0,0,15,98,0,2,4,240,0,0,16,128,3,120,0,0,9,96,0,0,61,0,16, +1,0,0,128,1,128,0,0,30,208,3,24,64,8,224,1,60,160,1,4,0,0,30,16,0,0, +120,32,3,104,0,0,36,0,0,64,252,136,65,48,32,0,0,96,0,0,24,0,1,96,16, +12,0,0,128,0,1,3,192,0,0,20,0,0,3,0,0,16,8,0,2,8,0,15,1,0,2,100,0,1,8 +,3,0,1,10,128,1,0,0,8,0,0,2,0,3,96,0,0,12,0,1,33,0,0,49,251,128,5,48, +0,0,16,136,0,0,16,4,0,0,64,0,0,12,0,0,16,0,1,4,192,0,0,16,0,0,3,96,0, +0,8,0,0,8,50,0,16,1,0,2,128,0,0,128,0,0,3,0,0,36,8,0,1,177,0,0,16,0,1 +,88,4,0,0,96,130,12,144,1,32,0,0,96,254,0,74,152,255,32,0,0,4,128,0,0 +,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32, +0,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0, +16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,152,255,0,74,152,255,40,0,0,4, +128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0, +0,1,32,0,0,4,0,15,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4, +128,0,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,0,0,129,254,0,7,16,16,0,0,64 +,0,7,128,0,1,2,0,3,1,0,16,4,1,0,2,4,0,2,2,0,0,32,0,0,48,0,3,24,0,9, +251,248,0,2,128,0,5,1,0,1,32,0,3,4,0,1,8,0,24,4,128,0,1,64,2,0,4,2,0, +6,64,0,2,1,32,0,2,176,251,4,0,6,8,0,1,32,0,0,8,0,4,128,0,0,16,0,0,2,0 +,1,8,0,47,74,251,32,0,0,5,160,0,0,16,128,0,0,64,0,0,1,4,65,32,0,0,4, +133,0,0,20,4,128,0,1,8,64,65,0,1,6,32,0,15,8,5,128,0,0,16,8,3,0,0,16, +12,66,64,8,8,6,161,32,4,4,131,80,0,0,8,10,1,32,0,0,4,33,16,250,0,4,8, +0,48,2,0,3,1,0,2,128,0,2,2,0,5,32,252,0,27,1,0,45,152,254,32,128,0,0, +16,0,1,64,0,1,1,0,6,128,2,0,0,64,0,1,128,32,32,0,2,16,0,27,8,0,2,20,0 +,5,8,0,4,16,250,0,0,32,128,0,0,16,4,0,12,64,0,5,2,0,18,128,0,2,4,1,1, +0,2,32,0,0,4,0,1,16,0,0,2,128,0,0,8,0,1,8,0,0,8,0,0,4,16,224,248,0,3, +1,0,8,128,0,10,4,0,19,8,0,3,4,8,0,9,64,0,2,32,0,0,2,4,0,2,80,254,0,7, +64,0,3,32,0,11,32,0,0,2,0,18,128,0,8,32,0,3,16,0,1,64,0,1,1,0,0,32,0, +2,88,248,32,64,16,0,3,4,0,3,4,0,2,8,0,1,128,8,0,0,129,0,0,64,2,32,0,1 +,8,0,16,16,8,2,0,1,8,0,1,32,16,1,0,3,4,0,2,128,0,6,8,128,250,0,5,128, +0,0,8,0,5,4,0,1,64,0,35,16,0,11,10,0,5,40,250,64,128,8,0,0,12,65,148, +12,20,0,2,2,0,1,164,16,0,0,16,64,4,128,0,0,1,32,6,64,0,1,16,0,16,24, +16,1,64,20,12,0,0,1,56,32,2,0,1,16,0,0,1,128,33,0,0,128,0,0,10,16,0,0 +,2,0,1,16,208,250,0,3,138,64,6,192,105,0,0,96,0,0,4,2,64,0,1,4,0,0,2, +0,1,216,0,1,4,0,0,128,2,0,15,128,0,0,128,10,0,0,64,3,64,104,13,40,2,4 +,2,1,128,128,72,10,4,0,1,128,5,8,72,33,65,96,0,0,88,253,0,3,2,16,0,3, +8,0,0,1,8,128,0,7,2,0,0,4,0,18,32,0,1,8,0,0,64,0,2,2,32,0,0,4,2,0,7, +128,0,4,1,0,0,4,254,0,4,4,0,3,16,0,5,4,0,4,1,0,33,32,0,9,64,4,130,0,0 +,16,0,0,64,249,0,14,2,0,11,2,0,25,1,0,2,128,0,14,48,254,0,4,9,0,3,2,0 +,2,4,129,0,10,4,0,18,128,0,0,16,0,1,64,16,8,0,3,4,1,0,2,2,1,0,0,8,2,0 +,2,4,0,1,224,251,0,1,1,128,0,7,32,0,5,2,16,0,1,32,0,3,17,0,25,128,0,3 +,128,4,0,0,4,0,0,64,66,0,7,144,248,16,2,0,3,64,0,8,16,0,0,2,0,1,8,0, +32,4,0,6,8,0,10,188,254,0,8,4,0,64,216,251,0,24,4,0,31,64,0,3,64,0,3, +8,0,1,64,0,2,24,251,8,0,5,65,0,2,1,0,2,16,0,5,8,0,3,4,0,25,8,0,0,128, +0,0,32,0,3,16,0,10,138,254,0,7,8,0,19,16,0,16,16,0,3,8,0,14,64,32,4,0 +,2,128,124,251,0,7,2,0,3,4,0,4,64,0,33,65,0,7,2,0,2,1,0,6,136,253,0, +10,32,0,2,4,32,0,28,64,0,2,1,0,4,16,0,3,136,0,3,4,0,7,121,251,0,16,1, +0,49,16,0,5,136,254,0,74,152,255,0,74,152,255,0,1,64,0,0,1,0,44,128,0 +,16,128,0,5,152,250,0,20,8,0,30,64,0,6,128,2,0,11,184,251,0,4,128,0,8 +,32,0,0,4,0,34,2,0,7,4,0,0,16,0,10,254,0,4,1,0,3,16,0,0,2,0,55,16,0,4 +,168,252,0,46,4,0,3,2,0,16,1,0,3,216,252,0,0,32,0,3,17,0,1,2,0,13,8,0 +,0,128,2,0,0,4,0,25,1,0,9,4,0,6,104,248,0,3,128,0,2,128,0,16,64,0,19, +8,0,0,1,0,8,32,0,2,32,0,1,128,0,1,64,0,1,32,0,1,88,248,128,0,0,16,0, +18,128,0,0,64,0,1,128,0,17,32,0,2,2,0,4,32,32,0,1,4,0,0,1,0,11,160, +250,0,2,128,8,0,16,8,0,3,32,0,19,16,0,12,16,1,0,10,56,255,0,12,32,0, +11,32,64,0,18,4,128,0,2,2,0,5,64,0,3,32,0,5,32,0,2,24,249,0,54,2,0,18 +,152,253,0,1,16,0,1,65,128,0,2,8,64,4,0,0,64,0,2,1,32,0,8,8,0,16,16,8 +,0,1,32,0,2,32,0,1,128,0,3,1,0,0,4,16,1,0,5,128,184,254,8,0,5,8,0,2, +32,0,3,8,0,52,4,0,3,144,249,128,0,0,8,8,0,0,98,64,10,0,0,128,16,96,2, +0,0,128,16,40,0,0,2,64,0,6,64,160,16,0,16,8,24,0,0,64,64,8,0,1,48,0,1 +,64,0,0,160,0,0,2,2,0,0,12,136,128,0,1,1,0,0,48,0,0,8,128,249,0,0,4, +212,208,32,65,32,80,0,1,32,0,0,4,2,8,16,9,0,3,64,64,32,0,2,129,130,82 +,0,14,160,144,86,91,0,1,2,64,40,3,64,0,2,4,128,34,144,1,64,65,17,168, +136,0,1,32,0,0,48,1,128,254,0,1,16,0,1,65,128,0,2,32,0,0,1,8,0,0,32,8 +,0,5,32,0,20,128,0,0,16,8,0,3,64,0,8,1,0,2,128,0,4,8,0,1,255,0,6,8,0, +14,1,0,1,128,0,26,1,8,0,6,2,0,8,4,0,0,48,248,16,0,2,4,0,69,204,255,0, +74,152,255,0,0,1,0,1,128,128,0,10,16,0,30,4,128,0,3,64,0,0,8,0,16,216 +,255,16,0,0,40,0,3,4,0,4,1,0,0,8,64,0,0,64,16,32,0,5,65,0,31,8,0,13, +12,250,12,0,73,242,249,0,12,128,0,0,16,0,9,128,0,26,1,0,11,1,0,6,24, +255,0,68,64,0,4,216,255,8,0,73,144,255,0,1,2,0,0,16,0,17,64,0,3,32,0, +35,4,0,1,64,0,5,200,252,0,9,32,0,0,2,0,4,32,0,29,2,64,64,0,4,4,0,16, +184,253,0,74,152,255,0,15,4,0,57,152,251,128,5,0,4,64,0,6,4,0,0,16, +192,130,2,64,144,96,65,0,19,160,1,0,2,208,0,1,64,0,7,38,2,0,5,5,0,3, +144,250,0,1,1,0,4,8,0,8,4,0,25,128,129,0,2,192,0,18,4,4,0,2,8,250,224 +,1,0,4,6,0,6,48,128,7,240,64,0,0,4,128,120,64,0,19,128,1,0,6,3,0,5, +128,7,0,6,11,0,3,72,254,32,40,0,4,2,0,7,193,6,17,0,0,128,0,0,8,8,0,21 +,9,1,0,5,8,2,0,4,128,32,8,0,5,5,0,3,40,255,0,6,24,9,0,5,176,32,0,3,5, +128,0,21,128,1,1,0,1,192,32,0,1,35,0,14,74,0,3,184,249,192,1,0,4,30,0 +,6,12,128,7,228,0,0,6,192,0,0,112,0,20,96,0,3,240,0,1,192,3,1,0,5,7,0 +,6,8,4,0,2,24,255,0,6,24,0,6,48,8,0,0,1,0,1,4,128,0,21,128,64,0,2,192 +,32,0,1,128,0,14,8,0,3,128,251,128,1,0,4,26,0,6,48,1,38,192,0,0,88,0, +0,2,104,0,21,8,0,2,192,0,2,19,0,6,6,0,6,4,16,0,2,80,253,0,2,128,0,2, +10,64,0,3,128,5,1,0,0,16,0,0,2,2,0,3,1,32,0,0,52,0,7,34,0,6,177,1,48, +2,0,0,16,0,0,2,0,0,3,2,0,0,1,128,1,0,2,192,2,2,0,1,96,1,1,128,17,0,1, +40,248,0,6,16,0,9,2,64,0,0,8,0,5,48,0,7,12,0,6,6,128,0,0,32,0,9,128,0 +,3,128,0,3,64,0,0,4,0,0,1,0,0,144,248,0,3,6,0,1,22,0,0,128,0,2,224,1, +1,128,1,48,0,0,24,0,4,128,1,0,8,12,0,6,134,0,0,60,0,3,24,196,3,0,2, +224,129,0,2,240,0,0,24,0,1,120,64,11,224,1,0,1,200,250,8,0,2,6,0,1,10 +,0,0,8,0,2,32,0,1,128,0,0,16,0,0,128,16,0,2,128,136,1,0,8,10,0,6,5,8, +5,65,0,3,64,32,2,0,0,12,36,16,0,2,16,4,1,32,0,0,8,4,5,32,4,2,0,0,9, +251,0,3,128,0,1,12,2,128,0,6,38,192,16,16,4,0,2,128,8,8,128,0,7,10,0, +6,133,49,0,3,32,88,32,0,2,32,8,0,5,88,32,0,2,74,0,3,163,255,0,2,128,1 +,0,1,16,192,0,3,192,1,0,0,128,7,241,0,0,6,0,3,3,96,128,12,16,0,14,224 +,1,56,0,1,48,0,0,6,128,3,0,1,15,192,1,0,2,224,0,0,6,0,1,112,0,0,8,196 +,1,0,2,251,4,0,5,16,0,0,128,0,6,6,192,0,0,16,0,4,4,0,17,128,65,0,2, +192,32,24,0,3,12,0,6,24,0,3,8,0,3,58,252,0,3,16,1,0,0,8,4,3,0,2,128,1 +,0,1,6,208,0,0,88,8,0,2,76,0,1,2,18,0,15,5,48,0,1,192,0,0,24,9,3,0,1, +76,129,1,0,2,192,0,0,24,16,0,0,96,0,0,36,144,1,0,1,224,255,128,5,4, +137,0,2,2,64,3,0,2,128,5,129,0,0,16,192,130,66,80,0,2,1,128,5,1,0,15, +32,4,49,2,6,8,0,0,66,68,2,96,128,1,128,1,48,2,0,0,16,0,1,64,147,96,1, +1,0,1,52,10,240,248,0,1,17,0,5,3,0,5,16,0,0,2,0,28,32,0,5,1,0,2,128,0 +,0,32,0,4,3,0,0,64,0,0,4,0,0,48,0,0,48,253,224,129,0,0,8,6,1,0,0,22,0 +,0,3,0,2,224,1,12,128,1,240,0,0,16,0,4,224,1,0,18,60,160,7,0,2,4,0,0, +122,0,1,224,1,60,16,0,0,192,0,2,131,120,0,0,11,0,1,48,8,176,254,44,16 +,128,0,3,10,0,0,3,0,2,32,136,4,128,0,0,16,0,0,129,16,16,2,0,1,32,136, +0,17,64,4,128,0,0,8,0,0,16,0,1,8,128,12,48,40,4,2,0,1,72,0,1,19,8,34, +5,0,1,48,2,82,248,4,0,1,8,0,0,1,0,0,12,2,16,0,4,48,18,22,2,0,0,8,5,8, +1,0,1,2,0,18,32,0,4,16,1,16,0,1,128,0,4,192,2,1,0,0,3,1,0,0,74,0,1,32 +,65,248,248,192,1,12,128,1,0,1,16,192,0,0,1,0,1,192,1,60,128,7,224,0, +0,6,192,0,2,3,192,1,0,16,224,0,0,56,0,0,7,0,1,14,196,3,113,0,0,15,194 +,1,56,0,1,240,0,1,192,0,0,112,0,0,8,4,0,0,28,0,0,24,253,4,0,1,8,0,0,1 +,0,0,16,0,6,48,0,0,6,0,1,8,8,0,0,1,0,0,12,0,18,132,0,5,24,0,3,12,0,5, +32,0,1,2,2,0,0,8,8,0,0,48,16,169,252,128,1,0,1,16,0,1,72,4,0,3,128,1, +48,0,0,6,192,0,0,72,0,0,19,0,1,140,136,1,0,16,129,73,48,0,0,6,0,1,8,8 +,16,100,0,0,44,144,1,48,0,1,192,0,1,128,17,96,0,0,132,0,1,8,1,176,252 +,128,5,1,128,6,16,0,0,2,64,3,104,0,1,128,5,129,0,0,16,0,1,74,80,3,8,0 +,0,45,36,68,48,1,0,14,40,0,0,48,2,6,24,0,0,2,0,1,8,0,0,141,144,145,48 +,34,0,0,80,8,24,96,160,0,1,1,0,1,36,8,216,254,0,3,6,0,4,96,0,4,16,0,0 +,2,0,2,3,0,1,12,0,1,48,32,0,14,17,0,1,32,0,14,64,0,1,3,0,2,4,0,0,16,0 +,0,64,253,224,1,0,1,6,192,32,22,0,0,3,96,0,1,224,1,12,128,1,0,1,24,0, +0,3,24,0,0,8,2,0,0,60,0,16,64,60,128,7,0,2,4,0,0,96,0,0,12,228,1,60,0 +,2,32,30,0,0,130,0,1,11,0,2,8,0,0,254,40,8,2,0,0,6,0,0,2,10,0,0,3,98, +0,1,32,8,6,128,0,2,8,4,3,8,0,0,76,0,0,4,54,0,15,2,4,4,145,160,0,1,88, +0,2,8,136,32,16,5,5,0,1,4,130,8,9,0,1,5,0,1,176,0,0,185,253,0,3,16,0, +0,36,12,2,0,1,2,0,2,176,0,0,22,0,1,24,32,16,96,130,140,8,64,0,0,1,0, +14,8,80,0,2,192,32,0,0,2,0,0,96,1,40,16,0,3,192,2,0,1,3,1,0,0,74,0,1, +48,65,99,250,192,1,0,0,128,1,50,0,0,16,192,0,0,26,32,0,0,192,1,60,136 +,7,1,0,0,30,192,0,0,122,0,0,15,96,0,0,8,8,0,14,100,0,0,56,0,0,7,240,0 +,0,30,0,1,24,64,15,192,1,56,0,1,176,32,28,192,3,0,1,8,4,0,0,60,0,0, +232,255,4,0,5,16,0,6,48,0,0,6,0,1,24,4,0,0,96,0,0,12,132,0,0,4,0,16, +64,0,3,32,24,8,0,0,96,0,0,12,32,0,3,192,32,0,1,3,2,0,0,8,4,0,0,48,16, +114,253,128,1,0,3,68,8,5,32,2,0,1,128,1,48,0,0,6,0,1,24,1,0,0,96,0,0, +76,128,33,4,0,15,137,9,48,0,0,6,0,1,88,0,1,96,64,12,130,1,48,0,3,24,0 +,0,19,0,1,132,0,1,48,1,56,251,176,1,20,128,0,0,80,0,0,2,64,32,8,0,0, +13,32,0,0,128,0,0,22,0,1,2,0,0,9,0,1,1,0,1,4,0,15,160,5,5,128,22,0,1, +24,32,0,0,8,0,0,41,128,1,49,2,38,210,0,0,88,0,0,3,4,0,0,1,128,5,49,66 +,152,249,128,1,32,0,1,128,0,2,130,0,5,16,6,4,0,0,24,8,130,0,21,129,1, +0,1,6,1,0,5,4,4,0,1,32,0,3,16,0,3,4,0,2,48,252,0,1,45,0,1,177,32,22, +192,0,1,16,3,128,1,12,128,7,0,2,192,2,0,1,3,0,18,132,1,48,0,0,6,1,0,0 +,30,0,1,96,0,1,224,1,60,128,7,192,64,30,200,3,0,1,11,224,1,60,0,0,224 +,252,140,17,20,0,1,80,4,10,64,34,1,0,0,65,4,68,4,128,6,0,1,128,80,161 +,0,1,1,0,18,128,8,1,10,38,0,1,2,16,0,1,8,4,48,8,6,192,160,0,0,2,2,65, +16,1,0,0,5,32,40,4,33,170,250,132,133,24,0,1,97,0,0,12,2,145,0,0,17, +44,130,5,50,1,0,2,88,132,1,0,2,8,0,1,16,0,7,1,0,5,145,5,176,64,6,2,0, +3,96,2,32,16,0,4,32,0,4,74,0,3,248,251,248,1,36,160,1,144,0,0,16,128, +0,0,24,0,0,15,96,0,0,60,136,1,4,0,0,14,64,2,0,1,3,0,1,12,0,7,128,0,6, +96,129,12,128,1,0,1,28,0,1,24,64,7,192,1,56,0,0,7,48,0,0,28,128,3,0,1 +,8,196,1,56,0,0,72,255,128,1,32,8,6,161,0,0,16,68,3,96,16,12,128,1,48 +,0,0,6,2,0,1,144,2,0,1,12,0,1,48,0,8,1,0,6,65,48,0,0,4,4,0,3,96,0,1,8 +,0,3,192,0,5,8,0,3,33,255,128,1,18,2,16,64,0,0,8,1,163,0,0,2,129,144, +145,48,0,0,6,0,1,8,0,0,1,0,1,140,8,0,0,48,17,0,6,64,4,0,6,1,48,18,35, +0,1,24,0,1,96,36,128,128,1,48,0,0,6,192,20,24,0,0,3,0,1,68,136,1,48,0 +,0,152,248,144,5,4,0,0,34,144,0,0,18,66,1,32,2,1,160,8,128,0,0,16,0,1 +,10,0,0,8,8,0,0,73,130,5,53,6,0,14,160,0,0,132,128,64,17,0,0,24,32,3, +10,0,0,1,0,1,176,32,0,0,80,8,10,17,3,100,128,1,128,145,48,66,136,252, +0,1,1,0,0,4,65,0,0,8,0,0,2,64,16,0,1,64,0,0,32,0,0,4,0,0,16,0,0,128,0 +,13,128,0,7,1,0,0,8,6,0,13,32,0,5,4,0,2,120,254,224,1,44,128,5,176,32 +,22,192,2,88,0,0,3,0,0,64,60,128,7,2,0,0,22,200,2,24,0,0,8,226,1,13,8 +,0,7,2,0,5,96,129,32,0,0,4,192,0,0,30,208,3,97,0,0,12,0,1,60,0,2,32,8 +,192,3,120,64,11,224,1,60,0,0,72,255,44,136,20,128,162,80,4,10,64,1, +40,33,1,0,0,8,180,136,22,0,1,10,64,161,8,0,0,4,32,0,0,132,0,8,1,0,5, +160,4,16,10,66,193,0,0,2,64,32,0,0,8,12,0,1,4,65,0,1,8,24,66,0,0,10,4 +,5,32,0,0,6,17,42,250,4,0,0,24,0,0,3,96,0,0,20,128,9,48,0,0,12,1,81,0 +,4,76,128,1,96,132,32,0,1,32,32,0,14,192,16,18,2,6,194,32,0,2,96,0,0, +140,8,0,3,128,4,152,16,0,2,74,0,3,24,252,192,1,36,32,4,144,0,0,16,0,0 +,130,64,0,0,15,224,1,60,160,7,4,0,0,18,80,2,120,0,0,3,196,1,56,0,7,64 +,2,0,5,32,1,12,144,7,240,0,0,28,128,3,24,32,15,0,1,56,0,1,240,32,22, +128,3,112,0,0,8,196,1,56,0,0,8,250,4,0,0,32,8,5,96,0,0,16,0,0,130,80, +0,0,12,0,0,1,0,2,1,0,0,20,132,2,96,0,3,32,0,15,64,65,48,8,6,196,32,0, +2,96,64,12,0,4,128,32,24,0,3,8,32,0,2,169,248,128,1,144,0,0,2,128,0,0 +,16,0,0,9,32,0,0,12,128,68,48,64,70,0,1,72,0,0,1,96,0,0,128,136,1,16, +33,0,6,64,0,6,128,4,16,2,38,192,0,0,24,0,0,3,96,1,76,16,0,0,48,0,1,64 +,0,0,16,17,3,96,0,0,132,136,1,48,0,0,104,255,16,0,0,4,0,0,32,16,0,1, +64,0,1,2,1,36,16,128,0,0,16,192,132,2,0,0,8,8,66,141,130,9,1,0,8,1,0, +5,32,0,0,20,2,6,200,72,24,32,0,2,33,2,0,0,48,162,0,0,192,2,10,0,0,3, +100,64,1,128,1,48,66,128,253,0,4,1,0,4,16,0,1,64,0,0,32,0,0,4,0,2,128 +,0,24,8,0,14,128,0,0,16,0,3,4,128,0,1,48,252,0,1,44,128,5,192,0,1,192 +,2,88,0,2,1,60,128,7,240,128,22,200,2,64,16,15,224,1,0,8,64,4,0,5,96, +129,0,0,136,7,244,0,0,30,0,3,4,0,1,60,0,0,6,240,0,0,8,192,3,121,0,0, +11,224,1,60,0,1,249,12,0,0,20,128,162,192,0,1,64,1,40,33,0,0,144,68, +52,138,22,17,0,0,10,64,161,0,0,1,41,34,16,1,0,15,166,4,0,0,129,64,16, +4,131,8,0,2,64,16,0,0,4,65,128,16,68,24,66,32,8,10,5,32,8,6,5,225,248 +,4,0,0,24,0,0,3,0,0,36,0,0,128,9,48,0,0,76,128,16,0,4,76,128,1,96,34, +0,0,8,0,17,192,16,162,8,0,7,132,4,0,2,70,8,0,0,152,16,0,2,74,0,3,99, +248,0,1,36,32,4,48,0,2,130,64,0,0,15,100,128,60,160,7,228,0,0,18,80,2 +,120,0,0,14,192,1,0,16,32,1,60,0,0,7,224,0,0,28,0,3,11,0,1,56,128,1, +224,0,0,22,128,3,112,0,0,8,196,1,56,0,0,232,250,4,0,0,32,8,5,0,0,32,0 +,1,130,80,0,0,12,136,65,0,0,8,0,0,1,0,0,20,132,2,96,0,20,64,65,32,0,8 +,4,0,3,6,0,1,24,8,0,2,8,0,3,194,251,0,1,16,0,0,2,0,0,2,0,1,1,32,0,0, +40,128,16,176,0,0,22,192,0,0,8,0,0,1,96,32,141,130,1,0,16,128,0,0,16, +10,6,192,0,0,24,0,3,136,2,0,0,48,0,0,38,196,0,0,144,0,0,3,96,0,0,68, +129,1,48,0,0,176,252,0,1,36,0,0,36,208,0,1,64,18,64,2,1,32,0,0,128,0, +0,16,192,2,82,0,0,10,8,0,0,129,162,5,4,0,15,32,17,6,0,0,6,200,72,138, +4,35,9,0,0,1,144,1,0,1,22,192,2,0,1,3,100,128,9,128,17,48,66,168,250, +0,1,16,32,2,193,0,2,1,33,16,0,3,32,0,0,4,128,8,16,129,0,2,128,65,0,16 +,130,0,10,4,0,0,128,0,2,4,128,0,4,4,4,0,0,1,0,0,88,250,0,1,44,128,5, +192,0,1,192,2,88,0,0,12,4,0,0,60,136,7,240,0,0,22,192,2,24,0,0,4,128, +129,0,16,100,1,0,0,128,7,240,0,1,192,3,96,0,0,4,232,1,0,0,128,7,244, +128,0,0,192,3,120,32,11,224,1,61,0,0,96,248,8,0,0,20,128,162,192,0,1, +64,1,40,33,0,0,128,65,52,130,70,17,4,11,64,161,8,0,0,8,130,16,0,1,4,0 +,5,16,2,0,5,168,0,0,176,136,32,20,20,0,0,69,16,2,8,12,32,16,1,128,0,0 +,16,0,1,64,32,10,4,5,32,16,4,65,218,253,0,1,40,0,0,3,192,128,0,0,128, +1,48,0,0,12,1,32,0,4,20,137,1,96,12,32,0,0,5,48,2,2,0,5,16,1,0,5,72, +133,0,0,4,0,2,80,0,1,96,33,8,8,0,10,74,0,3,72,253,0,1,36,0,0,4,240,0, +2,1,64,0,0,3,224,1,60,160,7,228,0,0,18,64,2,120,0,0,3,228,128,60,32,7 +,0,5,144,3,0,5,40,1,60,0,0,7,224,0,0,30,132,3,24,0,0,7,192,1,0,1,7, +224,0,1,128,3,112,0,0,8,196,1,56,0,0,200,249,4,0,0,32,0,0,3,0,3,1,48, +0,0,12,130,129,0,0,8,0,0,1,0,0,16,128,1,96,0,0,4,0,0,1,0,0,128,5,0,5, +208,2,0,5,8,1,48,16,0,2,16,68,0,0,96,64,12,2,0,10,8,0,3,113,254,0,1, +32,0,0,4,0,0,132,0,1,1,64,0,0,140,128,5,48,0,0,6,192,0,0,16,0,0,2,96, +0,0,76,144,16,2,5,4,0,5,8,2,0,5,4,1,176,0,0,6,192,0,0,8,0,0,3,96,4, +140,128,1,0,1,6,192,0,2,3,96,0,0,72,144,1,48,0,0,40,249,16,0,8,4,0,17 +,18,4,0,6,2,0,15,1,0,2,128,0,11,128,0,1,192,255,32,0,0,4,128,0,0,16,0 +,1,64,0,0,8,0,1,32,0,0,4,128,0,2,2,64,0,3,32,0,9,2,0,6,33,0,0,4,128,0 +,0,16,0,0,2,64,0,0,8,0,0,1,32,0,0,4,128,0,0,16,0,0,2,64,0,0,8,0,0,1, +32,0,0,4,0,0,8,250,0,12,8,0,60,16,255,44,0,0,4,128,0,0,16,0,0,2,17,0, +0,8,0,0,1,32,0,0,4,128,0,0,16,136,2,64,0,0,8,36,1,36,0,1,5,0,14,32,0, +0,4,128,0,0,16,0,0,2,0,1,8,0,0,1,0,1,4,128,0,0,16,0,0,2,64,0,0,8,0,0, +1,0,1,4,0,0,1,251,4,48,0,2,8,0,0,64,0,2,129,0,1,48,0,3,24,0,3,64,0,0, +1,0,0,1,64,0,17,6,192,0,0,24,0,0,3,96,0,0,64,0,1,8,0,0,6,0,0,4,24,0,0 +,16,96,0,0,12,128,1,48,0,0,6,3,255,0,7,16,0,0,1,0,13,1,0,30,1,0,0,64, +0,14,136,251,4,0,11,8,0,60,114,249,0,0,144,132,32,64,20,136,2,9,0,0,9 +,65,65,0,0,132,4,162,64,4,72,2,81,0,0,1,65,0,0,4,144,0,0,16,0,14,32, +16,130,16,64,2,72,64,8,8,1,33,1,0,0,144,0,0,18,64,2,66,0,0,9,32,1,36, +32,4,144,0,0,18,104,249,0,0,33,0,8,128,8,128,0,3,128,0,3,64,8,0,1,1,0 +,18,16,0,0,4,128,0,0,8,128,0,3,64,1,32,0,0,4,64,0,0,16,0,0,2,64,0,1, +64,1,32,0,0,96,248,0,13,1,0,3,16,0,0,8,0,4,32,10,0,16,128,32,0,3,16,0 +,0,2,64,0,6,128,0,5,8,0,3,72,249,0,13,32,0,3,16,0,5,40,32,0,26,32,0, +18,8,252,0,0,64,0,4,4,0,8,1,0,0,32,16,0,25,3,0,5,128,0,0,8,2,0,16,248 +,254,0,11,2,0,61,184,253,0,5,1,0,20,4,0,45,136,250,0,3,4,18,16,4,8,0, +0,1,32,0,5,1,0,5,1,0,25,8,0,1,8,0,0,4,0,1,4,0,2,128,0,3,16,4,0,3,32, +249,0,0,128,0,17,8,4,0,27,16,0,1,68,0,12,130,0,6,24,252,0,0,45,161,0, +0,1,34,88,4,8,80,1,32,0,3,5,20,2,20,2,16,0,1,10,2,0,0,5,16,5,0,19,16, +32,4,80,0,0,16,0,0,42,0,1,24,5,0,1,64,0,0,64,90,66,33,2,0,1,160,0,0, +184,249,34,0,0,32,0,1,81,0,0,2,0,0,55,2,0,5,16,1,32,152,2,198,32,16,0 +,1,81,132,1,0,14,32,0,1,10,64,84,0,0,192,4,64,64,0,0,128,52,1,4,35,2, +17,1,2,0,0,16,0,0,66,4,130,32,1,0,0,232,254,0,4,65,0,1,64,0,8,1,32,2, +0,1,34,64,0,1,64,0,19,8,0,0,32,0,1,16,0,6,128,0,0,4,0,5,4,66,0,2,201, +248,2,0,0,32,0,5,1,0,9,8,16,1,1,0,1,32,0,26,128,32,0,1,128,0,12,64,0, +1,192,255,0,14,2,0,12,8,0,17,64,0,3,32,0,3,16,0,5,1,32,0,7,88,254,0, +52,128,0,3,64,0,11,64,0,2,80,255,0,12,1,0,14,16,0,14,32,0,28,184,255, +0,2,8,0,2,2,0,2,16,0,3,32,0,6,8,0,0,128,0,37,64,0,8,48,250,0,4,1,32,0 +,0,4,4,0,5,8,2,1,32,0,0,4,4,0,1,16,0,1,64,0,45,32,253,0,74,152,255,32 +,0,11,32,0,3,16,0,4,1,0,1,4,8,0,9,4,0,1,16,0,3,4,128,0,0,16,0,0,2,64, +0,1,1,0,0,1,0,0,4,0,0,16,16,0,0,64,64,0,0,8,0,0,1,32,0,0,4,0,0,64,252 +,0,38,64,0,2,64,0,29,128,16,251,0,6,16,0,16,32,0,1,128,0,15,128,0,23, +8,0,3,168,252,0,5,64,0,7,8,0,7,16,0,19,32,0,3,32,0,7,2,0,5,8,0,4,2,0, +1,232,255,0,11,32,0,11,4,0,30,32,0,16,152,251,0,54,128,0,18,144,255,0 +,4,4,0,3,2,0,2,2,0,0,32,0,11,32,0,16,64,0,3,32,0,1,2,0,1,8,0,4,1,0,9, +112,248,0,6,16,0,6,32,0,0,4,128,0,5,1,0,48,104,255,0,45,4,0,18,8,0,7, +144,251,0,57,1,0,0,128,0,13,24,254,0,13,1,0,31,32,0,3,16,0,1,8,0,4, +128,0,0,128,0,0,2,0,8,184,252,144,0,11,32,0,9,1,0,1,4,0,18,4,0,3,2,0, +0,1,0,1,1,128,0,0,16,0,1,16,0,0,8,0,0,1,32,0,0,4,0,3,176,253,0,1,1,0, +2,2,0,7,1,0,2,128,0,2,128,0,13,128,0,2,2,0,4,32,0,1,128,0,0,8,0,2,16, +0,1,1,32,0,0,4,128,0,2,1,0,1,24,0,0,3,32,72,249,32,0,0,1,0,4,4,0,4,4, +0,2,32,2,0,6,2,0,12,4,0,4,128,128,128,18,0,0,64,0,1,1,0,1,32,0,0,4, +128,0,1,2,32,0,0,4,136,8,1,37,32,4,16,144,255,8,0,7,128,0,10,16,128,0 +,2,2,0,20,16,0,3,16,0,0,64,64,0,3,16,0,2,4,20,0,1,64,0,1,128,0,1,184, +251,0,0,32,0,7,1,0,0,32,0,2,16,0,0,2,0,0,64,0,1,33,0,3,1,16,0,15,1,0, +10,8,0,2,2,2,0,1,16,0,7,32,250,0,74,152,255,2,0,54,16,0,8,2,0,6,64, +152,250,2,0,2,4,65,32,2,0,1,2,0,0,1,0,1,8,32,0,7,4,0,1,1,8,0,15,64,16 +,0,1,16,0,3,8,0,4,8,0,1,64,0,2,18,16,4,0,2,32,0,0,252,26,0,2,1,32,64, +0,1,128,0,7,32,0,1,2,0,0,2,0,1,64,0,1,32,0,25,16,0,1,64,0,1,2,1,0,0,8 +,0,1,32,0,3,16,0,0,224,253,0,0,40,0,0,128,1,50,212,132,2,0,0,35,0,0,2 +,0,1,8,24,0,0,144,2,0,0,16,0,0,2,128,2,32,133,0,0,48,0,10,1,0,3,128,8 +,0,1,32,0,3,48,192,0,1,5,1,152,160,68,64,130,2,0,0,25,32,2,0,0,40,164 +,24,200,248,0,0,192,2,0,0,2,128,128,0,0,16,0,0,160,1,17,8,1,48,129,12 +,0,1,16,4,195,96,52,140,3,3,0,0,8,0,10,4,0,2,128,64,0,0,8,0,0,16,129, +4,68,66,66,41,1,74,4,0,0,40,192,20,19,8,6,0,0,48,66,4,130,0,0,160,35, +248,251,0,0,32,0,0,128,0,5,32,0,3,4,0,4,72,0,0,34,16,4,2,0,1,8,0,10,4 +,0,2,32,0,0,1,32,0,3,16,0,3,4,0,1,4,0,2,4,2,0,0,8,0,0,4,34,0,2,16,248 +,0,4,32,0,7,1,8,0,0,1,0,1,4,128,0,0,17,0,0,2,132,0,26,129,32,16,0,5,2 +,128,0,0,4,0,5,4,0,0,80,254,0,9,64,0,9,2,0,4,64,0,17,32,0,1,1,0,3,128 +,0,3,64,0,5,128,128,0,2,2,0,0,8,0,0,56,254,2,2,0,11,2,0,31,64,0,3,32, +0,10,1,0,7,64,128,112,252,4,0,8,1,0,4,4,0,2,8,0,0,1,0,4,6,0,20,4,0,2, +10,0,0,32,0,1,4,0,0,4,0,5,2,1,0,1,32,0,1,113,253,0,12,16,0,1,8,0,0,1, +0,1,4,0,1,64,32,0,36,1,32,0,0,4,0,1,16,0,3,32,80,252,128,0,35,128,2,2 +,0,0,2,8,0,31,26,255,0,3,4,0,6,2,0,6,32,0,3,8,0,1,96,0,12,2,0,2,2,0,6 +,12,0,1,40,0,16,16,249,0,22,8,0,13,64,0,2,1,64,0,4,16,0,5,16,0,9,8,0, +6,208,254,0,11,16,0,5,128,0,29,4,0,4,64,0,3,32,16,0,7,8,0,0,1,0,0,96, +249,0,8,2,0,10,128,0,2,2,0,1,32,0,24,4,0,0,8,0,17,216,249,0,2,144,0,4 +,4,64,0,0,1,8,0,3,16,0,0,4,0,5,1,0,28,4,0,4,4,0,5,16,0,3,192,254,0,74 +,152,255,0,23,128,0,13,128,0,2,128,0,30,144,255,8,0,8,8,0,1,32,4,128, +136,16,16,2,72,0,0,136,0,0,17,1,32,4,0,18,128,136,0,0,64,2,72,0,2,16, +1,32,4,0,2,16,0,1,66,0,1,1,0,0,32,0,2,242,255,0,9,64,0,2,5,160,0,0,20 +,128,2,80,0,0,10,0,0,1,32,0,0,4,32,32,0,16,160,0,0,4,128,0,0,20,2,0,0 +,64,0,12,16,0,4,80,255,0,13,2,0,31,64,0,26,184,251,0,14,128,0,0,16,0, +0,2,64,0,0,8,0,0,1,32,0,0,4,0,28,16,0,8,8,0,6,120,255,0,0,21,160,2, +180,128,10,80,1,42,128,5,168,0,0,44,128,2,80,0,0,10,64,1,40,0,0,5,160 +,0,0,20,192,2,0,15,22,128,2,88,0,0,11,224,1,42,128,5,160,0,0,22,160,2 +,88,0,0,11,208,1,40,128,11,176,0,0,22,160,2,232,254,128,9,52,1,134, +211,4,156,0,0,19,32,3,77,160,100,148,129,50,112,6,202,64,25,40,3,101, +192,12,144,1,0,14,128,12,148,1,50,64,6,200,68,19,32,3,100,128,12,56,1 +,50,64,6,152,4,25,32,89,100,128,12,48,1,24,252,255,255,0};typedef +struct{const unsigned char*l85;unsigned char l112;unsigned char l143; +}l148;static unsigned short l682(l148*l32,const unsigned char*l85){ +unsigned short s;s= *l85++;s|= *l85++<<8;l32->l85=l85;l32->l112=0;l32 +->l143=0;return s;}static unsigned char l272(l148*l32){{if(!(l32-> +l143>0))goto l629;{--l32->l143;return l32->l112;}l629:;}l32->l112= * +l32->l85++;{if(!(l32->l112==0))goto l624;l32->l143= *l32->l85++;l624: +;}return l32->l112;}static char l192(t*b,const unsigned char*l304){ +unsigned short l151;unsigned char o,n;l148 l32; * (volatile unsigned +short* )((b)->f+1028)=36; * (volatile unsigned short* )((b)->f+1024)= +39; * (volatile unsigned short* )((b)->f+1028)=(n=4);{o=0;l608:if(!(o +<255))goto l595;goto l593;l600:++o;goto l608;l593:outb(128,0);goto +l600;l595:;} * (volatile unsigned short* )((b)->f+1028)=(n&=~4);{o=0; +l588:if(!(o<2*3))goto l584;goto l338;l586:++o;goto l588;l338:outb(128 +,0);goto l586;l584:;}{if(!(( * (volatile unsigned short* )((b)->f+ +1028)&8)))goto l336;{; * (volatile unsigned short* )((b)->f+1028)=(n +|=4);return 0;}l336:;} * (volatile unsigned short* )((b)->f+1028)=(n +|=4);{o=0;l334:if(!(o<5*3))goto l331;goto l325;l332:++o;goto l334; +l325:{ * (volatile unsigned short* )((b)->f+1028)=(n|=4);outb(128,0); +}goto l332;l331:;}l151=l682(&l32,l304);{;l323:if(!(l151>0))goto l320; +goto l318;l322:--l151;goto l323;l318:{o=l272(&l32);{if(!(( * ( +volatile unsigned short* )((b)->f+1028)&8)==0))goto l294;{;goto l174; +}l294:;}{if(!(( * (volatile unsigned short* )((b)->f+1028)&16)))goto +l290;{{o=0;l286:if(!(o<50))goto l285;goto l283;l282:++o;goto l286; +l283:( * (volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile +unsigned short* )((b)->f+1028)=n);goto l282;l285:;}{if(!(( * ( +volatile unsigned short* )((b)->f+1028)&8)==0))goto l278;{;goto l174; +}l278:;};return 1;}l290:;}{{if(!(o&1))goto l277;n|=1;goto l275;l277:; +n&=~1;l275:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&2))goto l274;n|=1;goto l228;l274: +;n&=~1;l228:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&4))goto l226;n|=1;goto l230;l226: +;n&=~1;l230:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&8))goto l231;n|=1;goto l235;l231: +;n&=~1;l235:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&16))goto l222;n|=1;goto l234;l222 +:;n&=~1;l234:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&32))goto l238;n|=1;goto l236;l238 +:;n&=~1;l236:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&64))goto l237;n|=1;goto l205;l237 +:;n&=~1;l205:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};{{if(!(o&128))goto l251;n|=1;goto l252; +l251:;n&=~1;l252:;} * (volatile unsigned short* )((b)->f+1028)=n;( * ( +volatile unsigned short* )((b)->f+1028)=(n|2), * (volatile unsigned +short* )((b)->f+1028)=n);};}goto l322;l320:;};l174:;return 0;}static +unsigned char l27(t*b,unsigned char l26){unsigned short l82=l26|65280 +|b->l144;unsigned char o; * (volatile unsigned short* )((b)->f+1028)= +l82; * (volatile unsigned short* )((b)->f+1024)=255; * (volatile +unsigned short* )((b)->f+1028)=l82^128;outb(128,0);o= * (volatile +unsigned short* )((b)->f+1028)>>8; * (volatile unsigned short* )((b)-> +f+1028)=l82; * (volatile unsigned short* )((b)->f+1024)=65535;return o +;}static void k(t*b,unsigned char l26,unsigned char o){unsigned short +l82=l26|o<<8|b->l144; * (volatile unsigned short* )((b)->f+1028)=l82; + * (volatile unsigned short* )((b)->f+1028)=l82^64; * (volatile +unsigned short* )((b)->f+1024)=65535; * (volatile unsigned short* )(( +b)->f+1028)=l82;}static unsigned char l55(d*a,unsigned char l26){k(a +->e,a->l40,l26);return l27(a->e,a->e->l75);}static void h(d*a, +unsigned char l26,unsigned char o){k(a->e,a->l40,l26);k(a->e,a->e-> +l75,o);}static unsigned char l102(d*a,unsigned char l26,unsigned char +l176){unsigned char o;k(a->e,a->l40,l26);k(a->e,a->e->l75,l176);k(a-> +e,a->l40,l26);o=l27(a->e,a->e->l75)&l176;k(a->e,a->l40,l26);k(a->e,a +->e->l75,o);return o;}static void l147(t*b,unsigned char o,unsigned +char x){int c;k(b,40,x);{c=0;l253:if(!(c<8))goto l738;goto l734;l748: +++c;goto l253;l734:{{if(!((o>>c)&1))goto l730;{k(b,40,x|4);k(b,40,x|4 +);k(b,40,x|4);k(b,40,x|4);k(b,40,x|4|8);k(b,40,x|4|8);k(b,40,x|4|8);k +(b,40,x|4|8);}goto l714;l730:;{k(b,40,x);k(b,40,x);k(b,40,x);k(b,40,x +);k(b,40,x|8);k(b,40,x|8);k(b,40,x|8);k(b,40,x|8);}l714:;}}goto l748; +l738:;}k(b,40,x);}static void l139(d*a,unsigned char o){unsigned char +x=16<q;k(a->e,40,0);l147(a->e,32,x);l147(a->e,o,x);k(a->e,40,0);} +static unsigned char l678(d*a){unsigned char x=16<q;unsigned char +o=0;int c;k(a->e,40,0);l147(a->e,33,x);{c=0;l706:if(!(c<8))goto l654; +goto l650;l655:++c;goto l706;l650:{k(a->e,40,x|8);{if(!(l27(a->e,a-> +l35)&128))goto l645;o|=1<e,40,x);}goto l655;l654:;}k(a +->e,40,0);return o;}unsigned long cp_regio(d*a,int l186,int l26, +unsigned long o){switch(l186){case 0:o=l27(a->e,l26);break;case 1:o= +l55(a,l26);break;case 2:o=l102(a,l26,255);break;case 3:o=l678(a); +break;case 4:o=l27(a->e,l26);k(a->e,l26,o);break;case 5:k(a->e,l26,o); +break;case 6:l139(a,o);break;case 7: * (unsigned long* )(a->r+l26)=o; +o= * (unsigned long* )(a->r+l26);break;case 8:h(a,l26,o);o=l55(a,l26); +break;}return o;}void cp_init(t*b,int q,unsigned char*f){unsigned char +l63;d*a;b->f=f;b->q=q;b->l31=0; * (volatile unsigned long* )((b)->f+8 +)=262144; * (volatile unsigned short* )((b)->f+1032)=65535; * ( +volatile unsigned short* )((b)->f+1028)=65535; * (volatile unsigned +short* )((b)->f+1024)=65535;b->l86=4;b->l94=0;b->l144=192;b->l75=38; +l63=l27(b,0);{if(!((l63^128)!=l27(b,0)))goto l638;{switch(l63>>5){ +case 3:l192(b,l513);break;case 7:l192(b,l543);break;}b->l144=224;b-> +l75=30;l63=l27(b,0);}l638:;}switch(l63&56){default:b->g=0;strcpy(b-> +l47,"\x55\x6e\x6b\x6e\x6f\x77\x6e");break;case 56:{if(!(l63&64))goto +l635;{b->g=6;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49\x34");}goto +l634;l635:;{b->g=1;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49");} +l634:;}break;case 8:{if(!(l63&64))goto l623;{b->g=10;strcpy(b->l47,"" +"\x54\x61\x75\x2d\x50\x43\x49\x34\x2d\x45\x31\x2f\x58");}goto l626; +l623:;{b->g=5;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49\x2d\x45\x31" +);}l626:;}break;case 16:{if(!(l63&64))goto l622;{b->g=7;strcpy(b->l47 +,"\x54\x61\x75\x2d\x50\x43\x49\x34\x2d\x47\x37\x30\x33\x2f\x58");} +goto l575;l622:;{b->g=4;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49" +"\x2d\x47\x37\x30\x33");}l575:;}break;case 24:{if(!(l63&64))goto l574 +;{b->g=10;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49\x34\x2d\x32\x45" +"\x31\x2f\x58");}goto l571;l574:;{b->g=9;strcpy(b->l47,"\x54\x61\x75" +"\x2d\x50\x43\x49\x2d\x32\x45\x31");}l571:;}break;case 32:b->g=11; +strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49\x34\x2d\x45\x31");break; +case 40:b->g=2;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43\x49\x2d\x45" +"\x33");break;case 48:b->g=3;strcpy(b->l47,"\x54\x61\x75\x2d\x50\x43" +"\x49\x2d\x48\x53\x53\x49");break;}switch(l63&6){default:break;case 6 +:b->l114=32768000;break;case 4:b->l114=16384000;break;}{a=b->l;l569: +if(!(al+4))goto l565;goto l564;l566:++a;goto l569;l564:{a->e=b; +l170(a);}goto l566;l565:;}}static void l170(d*a){a->q=a-a->e->l;a->u= +0;a->l140=0;a->l131=0;a->l165=0;a->l162=0;a->l58=0;a->l73=0;a->l130=0 +;a->j=~1;a->l146=0;a->l46=0;a->l48=0;a->w=a->q;a->l28=0;a->l34=0;a-> +l29=0;a->l38=0;switch(a->e->g){default:a->g=0;break;case 6:a->g=1; +break;case 11:a->g=3;break;case 8:a->g=2;break;case 10:a->g=a->q<2?3: +1;break;case 9:a->g=a->q<2?3:6;break;case 7:a->g=a->q<2?2:1;break; +case 1:a->g=a->q<2?1:0;break;case 5:a->g=a->q<2?3:0;break;case 4:a->g +=a->q<2?2:0;break;case 2:a->g=a->q==0?4:0;break;case 3:a->g=a->q==0?5 +:0;break;}{if(!(a->g==6))goto l562;a->j=0;l562:;}a->r=a->e->f+a->q* +128+256;switch(a->q){case 0:a->l113=(unsigned long* )(a->e->f+20);a-> +l116=(unsigned long* )(a->e->f+36);a->l72=(unsigned long* )(a->e->f+ +80);a->l103=(unsigned long* )(a->e->f+84);a->l68=(unsigned long* )(a +->e->f+88);a->l115=(unsigned long* )(a->e->f+176);a->l64=4;a->l71=4;a +->l60=32;a->l35=36;a->l40=32;a->l53=12;break;case 1:a->l113=(unsigned +long* )(a->e->f+24);a->l116=(unsigned long* )(a->e->f+40);a->l72=( +unsigned long* )(a->e->f+92);a->l103=(unsigned long* )(a->e->f+96);a +->l68=(unsigned long* )(a->e->f+100);a->l115=(unsigned long* )(a->e-> +f+180);a->l64=5;a->l71=5;a->l60=34;a->l35=38;a->l40=34;a->l53=14; +break;case 2:a->l113=(unsigned long* )(a->e->f+28);a->l116=(unsigned +long* )(a->e->f+44);a->l72=(unsigned long* )(a->e->f+104);a->l103=( +unsigned long* )(a->e->f+108);a->l68=(unsigned long* )(a->e->f+112);a +->l115=(unsigned long* )(a->e->f+184);a->l64=6;a->l71=6;a->l60=48;a-> +l35=52;a->l40=48;a->l53=13;break;case 3:a->l113=(unsigned long* )(a-> +e->f+32);a->l116=(unsigned long* )(a->e->f+48);a->l72=(unsigned long* +)(a->e->f+116);a->l103=(unsigned long* )(a->e->f+120);a->l68=( +unsigned long* )(a->e->f+124);a->l115=(unsigned long* )(a->e->f+188); +a->l64=7;a->l71=7;a->l60=50;a->l35=54;a->l40=50;a->l53=15;break;}{if( +!(a->e->l75==30))goto l560;{a->l38=1;switch(a->q){case 0:a->l60=16;a +->l33=20;a->l40=24;break;case 1:a->l60=18;a->l33=21;a->l40=26;break; +case 2:a->l60=17;a->l33=22;a->l40=25;break;case 3:a->l60=19;a->l33=23 +;a->l40=27;break;}}l560:;}}void cp_hard_reset(t*b){k(b,0,128);}void +cp_reset(t*b,l154*l52,unsigned long l65){d*a;{if(!(!b->f))goto l559; +return;l559:;}{if(!(l52))goto l518;memset(l52,0,sizeof(l154));l518:;} + * (volatile unsigned long* )((b)->f+8)=262144; * (volatile unsigned +short* )((b)->f+1032)=65535; * (volatile unsigned short* )((b)->f+ +1028)=65535; * (volatile unsigned short* )((b)->f+1024)=65535; * ( +volatile unsigned long* )((b)->f+768)=4194304;k(b,0,b->l86&~4);cp_led +(b,0); * (volatile unsigned long* )((b)->f+12)=(128/32-1)<<28|(128/32 +-1)<<24|(128/32-1)<<20|(128/32-1)<<16|(128/32-1)<<12|(128/32-1)<<8|( +128/32-1)<<4|(128/32-1); * (volatile unsigned long* )((b)->f+16)=(128 +/32-1)<<16; * (volatile unsigned long* )((b)->f+68)=1108361216; * ( +volatile unsigned long* )((b)->f+72)=3740719104UL; * (volatile +unsigned long* )((b)->f+52)=404232216; * (volatile unsigned long* )(( +b)->f+76)=7;cp_set_mux(b,b->l31);{if(!(l52))goto l516;{b->l87=l52-> +l87; * (volatile unsigned long* )((b)->f+64)=l65+((char* )b->l87-( +char* )l52);}l516:;}b->l99=0;{a=b->l;l512:if(!(al+4))goto l507; +goto l503;l510:++a;goto l512;l503:{{if(!(a->g==2))goto l501;l160(a); +goto l491;l501:;{if(!(a->g==3))goto l490;l163(a);l490:;}l491:;} * ( +volatile unsigned long* )((a)->r+8)=0; * (volatile unsigned long* )(( +a)->r+16)=0; * (volatile unsigned long* )((a)->r+84)=a->l50=~0; * ( +volatile unsigned long* )((a)->r+28)=520552703; * (volatile unsigned +long* )((a)->r+32)=520552703;{if(!(l52))goto l482;{a->l81=l52->l81[a +->q];a->l88=l52->l88[a->q];( * (a)->l113)=l65+((char* )a->l81-(char* )l52 +);( * (a)->l116)=l65+((char* )a->l88-(char* )l52);;}l482:;}a->l98=0;a +->l109=0;( * (a)->l72)=0;( * (a)->l68)=0;}goto l510;l507:;} * ( +volatile unsigned long* )((b)->f+0)=4279239169UL;}void cp_stop_chan(d + *a){unsigned long l153=0;unsigned long l91=0;int c;{if(!(!a->g))goto +l363;return;l363:;}{if(!( * (volatile unsigned long* )((a)->r+16)& +134217728))goto l346;{; * (volatile unsigned long* )((a)->r+16)&=~ +134217728;l153|=4194304;l91|=65536;}l346:;}{if(!(( * (a)->l68)!=0))goto +l365;{;{c=0;l343:if(!(c<4))goto l341;goto l369;l342:++c;goto l343; +l369: * (volatile unsigned long* )&a->l37[c].s=2147483648UL| +1073741824;goto l342;l341:;}l153|=2097152;l91|=16777216;}l365:;}outb( +128,0); * (volatile unsigned long* )((a)->r+0)=l91;outb(128,0);( * (a +)->l72)=l153;outb(128,0); * (volatile unsigned long* )((a->e)->f+0)= +513;outb(128,0);a->l50=~0;}void cp_start_chan(d*a,int l181,int l180, +l185*l42,unsigned long l65){int c;unsigned long l91=0;{if(!(!a->g))goto +l339;return;l339:;}{if(!(l42))goto l371;{;a->l30=l42->l30;a->l37=l42 +->l37;{c=0;l372:if(!(c<64))goto l395;goto l313;l394:++c;goto l372; +l313:a->l133[c]=l65+((char* )(a->l30+c)-(char* )l42);goto l394;l395:; +}{c=0;l397:if(!(c<4))goto l402;goto l400;l309:++c;goto l397;l400:a-> +l127[c]=l65+((char* )(a->l37+c)-(char* )l42);goto l309;l402:;};{c=0; +l401:if(!(c<64))goto l403;goto l693;l405:++c;goto l401;l693: * ( +volatile unsigned long* )&a->l30[c].l172=a->l133[(c+1)%64];goto l405; +l403:;}{c=0;l446:if(!(c<4))goto l696;goto l697;l434:++c;goto l446; +l697: * (volatile unsigned long* )&a->l37[c].l172=a->l127[(c+1)%4]; +goto l434;l696:;}}l371:;} * (volatile unsigned long* )((a)->r+12)= +574914560;cp_set_phony(a,a->l69); * (volatile unsigned long* )((a)->r ++64)=32768|(1664/32-1);{if(!(a->g==2))goto l699;l160(a);l699:;} * ( +volatile unsigned long* )((a)->r+8)=2147483648UL;cp_set_nrzi(a,a-> +l131);cp_set_dir(a,a->w);cp_set_baud(a,a->u);cp_set_dtr(a,0); +cp_set_rts(a,0);( * (a)->l68)=0;{c=0;l700:if(!(c<64))goto l701;goto +l414;l703:++c;goto l700;l414:{{if(!(l42))goto l716;{a->l126[c]=l42-> +l527[c];a->l178[c]=l65+((char* )a->l126[c]-(char* )l42); * (volatile +unsigned long* )&a->l30[c].s=1664<<16; * (volatile unsigned long* )&a +->l30[c].n=a->l178[c];}l716:;} * (volatile unsigned long* )&a->l30[c] +.y=0;}goto l703;l701:;}{c=0;l717:if(!(c<4))goto l719;goto l359;l358: +++c;goto l717;l359:{{if(!(l42))goto l721;{a->l142[c]=l42->l643[c];a-> +l188[c]=l65+((char* )a->l142[c]-(char* )l42); * (volatile unsigned +long* )&a->l37[c].s=2147483648UL|1073741824; * (volatile unsigned long + * )&a->l37[c].n=a->l188[c];}l721:;} * (volatile unsigned long* )&a-> +l37[c].y=0;a->l67[c]=0;}goto l358;l719:;}{if(!(l42))goto l360;;l360:; +}a->l41=0;a->l39=0;a->l44=a->l39; * (volatile unsigned long* )&a->l30 +[64-1].s|=1073741824;{if(!(l181))goto l723;{{if(!(a->l50!= * ( +volatile unsigned long* )((a)->r+84)))goto l724;{a->l50&=~65536;}goto +l725;l724:;{a->l50&=~65536; * (volatile unsigned long* )((a)->r+84)=a +->l50;}l725:;}l91|=16777216;}l723:;}{if(!(l180))goto l368;{ * ( +volatile unsigned long* )((a)->r+16)|=134217728;{if(!(a->l50!= * ( +volatile unsigned long* )((a)->r+84)))goto l739;{a->l50&=~2;}goto l740 +;l739:;{a->l50&=~2; * (volatile unsigned long* )((a)->r+84)=a->l50;} +l740:;}l91|=65536;{if(!(a->g==2))goto l741;k(a->e,a->l35,255);l741:;} +;( * (a)->l103)=a->l133[a->l41];( * (a)->l72)=1048576; * (volatile +unsigned long* )((a->e)->f+0)=513;}l368:;} * (volatile unsigned long* +)((a)->r+0)=l91;}void cp_stop_e1(d*a){{if(!(a->g!=3))goto l370;return +;l370:;}h(a,23,0);}void cp_start_e1(d*a){{if(!(a->g!=3))goto l743; +return;l743:;}l163(a);h(a,23,16);}void cp_set_dtr(d*a,int p){a->l184= +(p!=0);{if(!(a->l184))goto l744;a->l28|=1;goto l745;l744:;a->l28&=~1; +l745:;}k(a->e,a->l64,a->l28);}void cp_set_rts(d*a,int p){a->l198=(p!= +0);{if(!(a->l198))goto l746; * (volatile unsigned long* )((a)->r+12)|= +1048576;goto l747;l746:; * (volatile unsigned long* )((a)->r+12)&=~ +1048576;l747:;}}int cp_get_dsr(d*a){{if(!(a->g!=1))goto l762;return 0 +;l762:;}return(l27(a->e,a->l71)&1)!=0;}int cp_get_cd(d*a){return( * ( +volatile unsigned long* )((a)->r+4)&2097152)==0;}int cp_get_cts(d*a){ +{if(!(a->g!=1))goto l761;return 0;l761:;}return(l27(a->e,a->l71)&8)!= +0;}int cp_get_txcerr(d*a){{if(!(a->g!=1))goto l760;return 0;l760:;} +return(l27(a->e,a->l71)&16)!=0;}int cp_get_rxcerr(d*a){{if(!(a->g!=1))goto +l618;return 0;l618:;}return(l27(a->e,a->l71)&32)!=0;}void cp_set_baud +(d*a,int u){int l54,l45;unsigned long l120;{if(!(a->g==2||((a->g==3)&& +a->l36)))goto l515;{int l90=(u+32000)/64000*64;{if(!(a->l69))goto l330 +;l90=2048;l330:;}a->l34&=~7;{if(!(!l90||l90>1024))goto l329;{a->l34|= +0;a->u=2048000;}goto l547;l329:;{if(!(l90>512))goto l546;{a->l34|=2;a +->u=1024000;}goto l328;l546:;{if(!(l90>256))goto l429;{a->l34|=3;a->u +=512000;}goto l345;l429:;{if(!(l90>128))goto l319;{a->l34|=4;a->u= +256000;}goto l281;l319:;{if(!(l90>64))goto l312;{a->l34|=5;a->u= +128000;}goto l297;l312:;{a->l34|=6;a->u=64000;}l297:;}l281:;}l345:;} +l328:;}l547:;}k(a->e,a->l60,a->l34);}goto l264;l515:;{if(!((a->g==3|| +a->g==6)&&!a->l69))goto l210;{unsigned long l502=a->j;int c;a->u=0;{c +=0;l225:if(!(c<32))goto l514;goto l480;l217:++c;goto l225;l480:{if(!( +(l502>>c)&1))goto l425;a->u+=64000;l425:;}goto l217;l514:;}}goto l352 +;l210:;{if(!(a->g==3&&a->l69))goto l296;{a->u=2048000;}goto l326;l296 +:;a->u=u;l326:;}l352:;}l264:;}l120= * (volatile unsigned long* )((a)-> +r+8)&~55;{if(!(!a->u||a->g!=1))goto l224;{a->l140=0;{if(!(a->g==1))goto +l315;a->l58=0;l315:;}l45=l54=0;a->l28|=4;}goto l311;l224:;{if(!(a-> +l140))goto l280;{l120|=54;l141(a->e->l114/16,a->u,&l45,&l54);a->l28&= +~4;}goto l754;l280:;{if(!(a->l58))goto l718;{l120|=55;l141(a->e->l114 +,a->u,&l45,&l54);a->l28&=~4;}goto l698;l718:;{l120|=48;l141(a->e-> +l114,a->u,&l45,&l54);a->l28&=~4;}l698:;}l754:;}l311:;}k(a->e,a->l64,a +->l28&~4); * (volatile unsigned long* )((a)->r+8)=l120; * (volatile +unsigned long* )((a)->r+44)=l45<<8|l54;k(a->e,a->l64,a->l28);{if(!(a +->g==1&&a->l58))goto l684; * (volatile unsigned long* )((a)->r+12)|= +256;goto l666;l684:; * (volatile unsigned long* )((a)->r+12)&=~256; +l666:;}}void cp_set_dpll(d*a,int p){{if(!(a->g!=1))goto l656;return; +l656:;}a->l140=p&&(a->u!=0);cp_set_baud(a,a->u);}static void l183(d*a +){unsigned char l118=0;{if(!(a->l36))goto l568;{l118|=1|64;}goto l641 +;l568:;{if(!(a->e->l31&&a->l33))goto l630;{l118|=0;}goto l609;l630:;{ +l118|=1|8;{if(!(!a->l46))goto l476;l118|=32;l476:;}}l609:;}l641:;}h(a +,18,l118);}static void l182(d*a){unsigned char l199=0;{if(!(!a->l36&& +a->l48))goto l455;l199|=2;l455:;}h(a,19,l199);}static void l167(d*a){ +unsigned char l136=64|4;{if(!(!a->l36))goto l420;{l136|=16;{if(!(a-> +l48))goto l386;l136|=1;l386:;}{if(!(a->l46))goto l351;l136|=8;l351:;} +}l420:;}h(a,20,l136);}static void l201(d*a){unsigned char l128=64;{if +(!(!a->l36))goto l348;{l128|=8;l128|=16;}l348:;}{if(!(a->l58&&!a->l38 +))goto l344;l128|=1;l344:;}h(a,26,l128);}static void l335(d*a){ +unsigned char l196=2;{if(!(a->l38&&!a->l36))goto l340;{l196|=4|64;} +l340:;}h(a,27,l196);}static void l191(d*a){unsigned char l138;{if(!(a +->l36))goto l337;l138=2;goto l333;l337:;{if(!(a->e->l31))goto l307; +l138=32;goto l303;l307:;l138=0;l303:;}l333:;}h(a,16,l138);}static void +l658(d*a){unsigned char l156;{if(!(a->e->l31||a->l38))goto l300;l156= +4|2;goto l295;l300:;l156=4;l295:;}h(a,17,l156);}static void l202(d*a){ +unsigned char l106;l106=0;{if(!(a->l146))goto l291;l106|=16;l291:;}{ +if(!(a->l58))goto l287;l106|=8;l287:;}{if(!(l27(a->e,8)>>a->q&16))goto +l284;l106|=96;goto l279;l284:;l106|=64;l279:;}h(a,24,l106);}static int +l190(d*a,int l74){t*b=a->e;d*i;int j;{i=b->l;l276:if(!(il+4))goto +l220;goto l219;l269:++i;goto l276;l219:{j=1;l215:if(!(j<32))goto l212 +;goto l211;l214:++j;goto l215;l211:{if(!(i->v.j[j]==l74&&i->v.l61[j] +==a->q))goto l208;return 1;l208:;}goto l214;l212:;}goto l269;l220:;} +return 0;}static int l637(d*a,int l74){return(a->v.j[l74]!=0);}static +int l688(d*a,int l74){t*b=a->e;d*i;int j;{i=b->l;l207:if(!(il+4))goto +l204;goto l598;l206:++i;goto l207;l598:{j=1;l597:if(!(j<32))goto l592 +;goto l590;l594:++j;goto l597;l590:{if(!(i->v.j[j]==l74&&i->v.l61[j] +==a->q))goto l587;{i->v.j[j]=0;return 1;}l587:;}goto l594;l592:;}goto +l206;l204:;}return 0;}static int l485(d*a,int l74){{if(!(a->v.j[l74]))goto +l585;{a->v.j[l74]=0;return 1;}goto l583;l585:;return 0;l583:;}}static +void l137(d*a){t*b=a->e;d*i;unsigned long l57;int c;{if(!(a->l36))goto +l581;{l57=0;}goto l580;l581:;{if(!(a->l33))goto l542;{l57=~1;{i=b->l; +l540:if(!(il+4))goto l538;goto l536;l539:++i;goto l540;l536:{if(! +(i->g==3&&i->w==a->q))goto l534;l57&=~i->j;l534:;}goto l539;l538:;}{ +if(!(b->l31))goto l533;{c=1;l531:if(!(c<32))goto l529;goto l433;l523: +++c;goto l531;l433:{if(!((l57>>c&1)&&l190(a,c)))goto l416;l57&=~(1<l31))goto +l398;{l57=a->q?(b->l[0].j|b->l[1].j):0;}goto l390;l398:;l57=~a->j; +l390:;}l399:;}l580:;}h(a,38,(unsigned char)(l57&254));h(a,38+1,( +unsigned char)(l57>>8));h(a,38+2,(unsigned char)(l57>>16));h(a,38+3,( +unsigned char)(l57>>24));;}void cp_set_monitor(d*a,int p){{if(!(a->g +!=3||!a->l38))goto l382;return;l382:;}a->l150=(p!=0);{if(!(a->l150))goto +l356;h(a,172,112);goto l355;l356:;h(a,172,0);l355:;}}void cp_set_dir( +d*a,int w){t*b=a->e;d*i;int c;{if(!(a->g!=3&&a->g!=6))goto l353;{{if( +!(a->l33))goto l350;k(a->e,a->l33,a->w);l350:;}return;}l353:;}{if(!(a +->l33&&(b->l+2)->g==3))goto l380;a->w=w&3;goto l381;l380:;a->w=w&1; +l381:;}{i=b->l;l324:if(!(il+4))goto l384;goto l385;l383:++i;goto +l324;l385:{if(!((i->g==3||i->g==6)&&i->q!=a->q&&i->w==a->w))goto l321 +;a->j&=~i->j;l321:;}goto l383;l384:;}{if(!(a->l33))goto l387;{{if(!(b +->l31))goto l388;{c=1;l389:if(!(c<32))goto l412;goto l413;l411:++c; +goto l389;l413:{if(!((a->j>>c&1)&&(l190(a,c)||l637(a,c))))goto l293;a +->j&=~(1<e,a->l33,a->w);}l387 +:;}cp_set_ts(a,a->j);}void cp_set_unfram(d*a,int p){d*i;{if(!(a->g!=3 +))goto l415;return;l415:;}a->l36=a->e->l31?0:(p!=0);{if(!(a->l36))goto +l292;a->l29|=32;goto l417;l292:;a->l29&=~32;l417:;}k(a->e,a->l53,a-> +l29);{i=a->e->l;l418:if(!(ie->l+4))goto l289;goto l268;l419:++i; +goto l418;l268:{if(!((i->g==3||i->g==6)&&i->w==a->q))goto l443; +cp_set_dir(i,i->q);l443:;}goto l419;l289:;}l183(a);l182(a);l167(a); +l201(a);l335(a);l191(a);l137(a);cp_set_baud(a,a->u);{if(!(a->l36))goto +l444;cp_set_gsyn(a,a->l73);l444:;}}void cp_set_lloop(d*a,int p){{if(! +(a->g==1&&a->u==0))goto l445;return;l445:;}a->l58=(p!=0);{if(!(a->g== +3))goto l261;{{if(!(a->l58))goto l447;{a->l29|=16;{if(!(a->l38))goto +l448;h(a,168,64);l448:;}}goto l449;l447:;{a->l29&=~16;{if(!(a->l38))goto +l450;h(a,168,0);l450:;}}l449:;}k(a->e,a->l53,a->l29);l201(a);l202(a); +}goto l451;l261:;{if(!(a->g==2))goto l464;{unsigned char l168=1|4;{if +(!(a->l58))goto l465;l168|=64;l465:;}l139(a,l168);}goto l232;l464:; +cp_set_baud(a,a->u);l232:;}l451:;}}void cp_set_nrzi(d*a,int p){{if(!( +a->g!=1))goto l467;return;l467:;}a->l131=p?1:0;{if(!(a->l131))goto +l233; * (volatile unsigned long* )((a)->r+8)|=2097152;goto l470;l233: +; * (volatile unsigned long* )((a)->r+8)&=~2097152;l470:;}}void +cp_set_invtxc(d*a,int p){{if(!(a->g!=1))goto l473;return;l473:;}a-> +l165=p?1:0;{if(!(a->l165))goto l471;a->l28|=2;goto l472;l471:;a->l28 +&=~2;l472:;}k(a->e,a->l64,a->l28);}void cp_set_invrxc(d*a,int p){{if( +!(a->g!=1))goto l474;return;l474:;}a->l162=p?1:0;{if(!(a->l162))goto +l477;a->l28|=8;goto l478;l477:;a->l28&=~8;l478:;}k(a->e,a->l64,a->l28 +);}int cp_get_rloop(d*a){{if(!(a->g!=2))goto l479;return 0;l479:;} +return(l27(a->e,a->l35)&16)!=0;}int cp_get_cable(d*a){{if(!(a->g!=1))goto +l239;return 0;l239:;}switch(l27(a->e,a->l71)&70){case 0:return 3;case +2:return 2;case 4:return 1;case 6:return 0;case 10:return 4;default: +return 9;}}void cp_led(t*b,int p){{if(!(p))goto l481;b->l86|=16;goto +l483;l481:;b->l86&=~16;l483:;}k(b,0,b->l86);}int cp_get_lq(d*a){ +unsigned char l66,l59,l62;static int l96[]={0,95,195,285};int c;{if(! +(a->g!=2))goto l484;return 0;l484:;}l66=l27(a->e,a->l35)&12;l59=l27(a +->e,a->l35)&12;{c=1;l487:if(!(c<20))goto l486;goto l493;l488:++c;goto +l487;l493:l59=l27(a->e,a->l35)&12;goto l488;l486:;}l62=l27(a->e,a-> +l35)&12;{c=1;l494:if(!(c<20))goto l496;goto l497;l495:++c;goto l494; +l497:l62=l27(a->e,a->l35)&12;goto l495;l496:;}{if(!(l66<=l59&&l59<= +l62))goto l498;return l96[l59>>2];l498:;}{if(!(l59<=l62&&l62<=l66))goto +l499;return l96[l62>>2];l499:;}{if(!(l62<=l66&&l66<=l59))goto l500; +return l96[l66>>2];l500:;}{if(!(l66<=l62&&l62<=l59))goto l504;return +l96[l62>>2];l504:;}{if(!(l62<=l59&&l59<=l66))goto l250;return l96[l59 +>>2];l250:;}return l96[l66>>2];}static void l141(long l194,long u,int + *l45,int*l54){{ *l45=0;l508:if(!(1))goto l735;goto l742;l509:++ *l45 +;goto l508;l742:{ *l54=(((2*l194/u)>> *l45)+1)/2-1;{if(!( *l54<0|| * +l45>15))goto l736;{ *l45=0; *l54=0;return;}l736:;}{if(!( *l54<=63))goto +l707;return;l707:;}}goto l509;l735:;}}static void l160(d*a){{if(!(a-> +g!=2))goto l733;return;l733:;}cp_set_gsyn(a,a->l73);cp_set_precoder(a +,a->l130);l139(a,(32|64));l139(a,1|4);cp_set_lloop(a,a->l58);}static +void l163(d*a){int c;a->l29&=~128;k(a->e,a->l53,a->l29);cp_set_gsyn(a +,a->l73);cp_set_unfram(a,a->l36);cp_set_phony(a,a->l69);cp_set_lloop( +a,a->l58);cp_set_monitor(a,a->l150);h(a,22,0);h(a,23,0);h(a,21,0);h(a +,25,0);h(a,32,155);h(a,33,223);h(a,42,255);{if(!(a->l38))goto l722;{h +(a,170,0);h(a,29,0);h(a,172,0);h(a,160,0);h(a,161,0);h(a,162,0);h(a, +163,0);h(a,164,0);h(a,165,0);h(a,166,0);h(a,167,0);h(a,28,0);h(a,80,0 +);h(a,81,0);h(a,82,0);h(a,83,0);h(a,84,0);h(a,85,0);h(a,86,0);h(a,87, +0);h(a,176,0);h(a,177,0);h(a,178,0);h(a,179,0);h(a,180,0);h(a,181,0); +h(a,182,0);h(a,183,0);h(a,184,0);h(a,185,0);h(a,186,0);h(a,187,0);h(a +,9,0);h(a,10,0);h(a,11,0);h(a,12,0);h(a,13,0);h(a,14,0);h(a,173,0);h( +a,174,0);h(a,175,0);h(a,188,0);h(a,189,0);h(a,190,0);h(a,191,0);k(a-> +e,11,255);}l722:;}h(a,64,11);{c=1;l720:if(!(c<16))goto l644;goto l535 +;l710:++c;goto l720;l535:h(a,(unsigned char)(64+c),255);goto l710; +l644:;}{if(!(a->l38))goto l647;{h(a,170,128);h(a,170,0);}goto l648; +l647:;{h(a,27,2|8);h(a,27,2);}l648:;}{if(!(a->l38))goto l649;{h(a,29, +2|1);h(a,29,0);}goto l532;l649:;{h(a,27,2|16);h(a,27,2);}l532:;}l102( +a,6,255);l102(a,7,255);l102(a,8,255);a->l29|=128;k(a->e,a->l53,a->l29 +);}void cp_set_mux(t*b,int p){d*a;int l189=(p&&!b->l31);{if(!(b->g!=5 +&&b->g!=10&&b->g!=11&&b->g!=9))goto l651;return;l651:;};{if(!(l189))goto +l652;{a=b->l;l653:if(!(al+4))goto l526;goto l524;l528:++a;goto +l653;l524:cp_set_unfram(a,0);goto l528;l526:;}l652:;}b->l31=p;{if(!(b +->l31))goto l659;b->l94|=1;goto l660;l659:;b->l94&=~1;l660:;}k(b,8,b +->l94);{if(!(!b->l->l33))goto l661;{b->l[1].w=b->l31?0:1;cp_set_dir(b +->l+1,b->l[1].w);}l661:;}{a=b->l;l520:if(!(al+4))goto l519;goto +l665;l663:++a;goto l520;l665:{if(!(a->g==3))goto l517;{l191(a);l658(a +);cp_set_ts(a,a->j);}l517:;}goto l663;l519:;}{if(!(l189))goto l667;{ +l145(b);cp_set_ts(b->l,b->l->j);}l667:;}{if(!(p))goto l668; +cp_set_gsyn(b->l,b->l->l73);l668:;}}void cp_set_dxc(d*a,l79*l125){{if +(!((a->e->l+3)->g==3))goto l669;l158(a,l125);l669:;}}void l158(d*a, +l79*l125){t*b=a->e;d*i;int c;{if(!(a->g!=3||!a->l33))goto l511;return +;l511:;}memcpy(&a->v,l125,sizeof(a->v));a->v.j[0]=0;{if(!(!b->l31))goto +l671;memset(&a->v,0,sizeof(a->v));l671:;}{if(!(!a->l46))goto l672;a-> +v.j[16]=0;l672:;}{c=1;l673:if(!(c<32))goto l675;goto l676;l505:++c; +goto l673;l676:{if(!(a->v.j[c]&=31))goto l492;{{if(!((b->l+2)->g!=3))goto +l680;a->v.l61[c]&=1;goto l681;l680:;a->v.l61[c]&=3;l681:;}{i=b->l; +l489:if(!(il+4))goto l129;goto l685;l195:++i;goto l489;l685:{{if( +!(i->g!=3))goto l469;goto l195;l469:;}{if(!(i->q==a->v.l61[c]&&a->v.j +[c]==16&&!i->l46))goto l687;{a->v.j[c]=0;goto l129;}l687:;}{if(!((i-> +w==a->v.l61[c]&&((i->j>>a->v.j[c])&1))||(i->w==a->q&&((i->j>>c)&1))))goto +l468;{a->v.j[c]=0;goto l129;}l468:;}{if(!(i->q==a->q))goto l462;goto +l129;l462:;}}goto l195;l129:;}}l492:;}goto l505;l675:;}k(b,8,b->l94&~ +1);k(b,28,a->q<<5);k(b,31,139);{c=1;l692:if(!(c<32))goto l704;goto +l357;l708:++c;goto l692;l357:k(b,31,(!a->v.j[c])?141:(a->v.l61[c]<<5)| +a->v.j[c]);goto l708;l704:;}k(b,8,b->l94);l137(a);}void cp_set_ts(d*a +,unsigned long j){t*b=a->e;d*i;int c;{if(!(a->g!=3&&a->g!=6))goto l711 +;return;l711:;}a->j=j;{if(!(!b->l[a->w].l46))goto l396;a->j&=~(1<<16); +l396:;}{i=b->l;l712:if(!(il+4))goto l713;goto l354;l709:++i;goto +l712;l354:{if(!(i->g==3&&i->q!=a->q&&i->w==a->w))goto l715;a->j&=~i-> +j;l715:;}goto l709;l713:;}{if(!(b->l31&&b->l->l33))goto l726;{c=1; +l727:if(!(c<32))goto l729;goto l364;l728:++c;goto l727;l364:{if(!((a +->j>>c&1)))goto l731;{l688(b->l+a->w,c);l485(b->l+a->w,c);}l731:;} +goto l728;l729:;}l726:;}{if(!((a->j&65534)==0))goto l732;a->l28|=16; +goto l366;l732:;a->l28&=~16;l366:;}k(a->e,a->l64,a->l28);;{if(!(a-> +l38))goto l367;{int c;k(a->e,0,a->e->l86|8);k(a->e,9,a->q<<6);{c=1; +l737:if(!(c<32))goto l749;goto l374;l373:++c;goto l737;l374:k(a->e,10 +,a->j>>c&1);goto l373;l749:;}k(a->e,10,0);{c=1;l751:if(!(c<32))goto +l753;goto l376;l752:++c;goto l751;l376:k(a->e,10,a->j>>c&1);goto l752 +;l753:;}k(a->e,10,0);k(a->e,0,a->e->l86);}l367:;}{if(!(a->g==3))goto +l758;{h(a,34,(unsigned char)(a->j&254));h(a,34+1,(unsigned char)(a->j +>>8));h(a,34+2,(unsigned char)(a->j>>16));h(a,34+3,(unsigned char)(a +->j>>24));h(a,43,(unsigned char)(a->j&254));h(a,43+1,(unsigned char)( +a->j>>8));h(a,43+2,(unsigned char)(a->j>>16));h(a,43+3,(unsigned char +)(a->j>>24));}l758:;}{if(!(!a->l33))goto l759;{l137(b->l+0);l137(b->l ++1);}goto l218;l759:;{{if(!((b->l+2)->g!=3))goto l432;l145(b);l432:;} +{i=b->l;l266:if(!(il+4))goto l616;goto l265;l756:i++;goto l266; +l265:l158(i,&i->v);goto l756;l616:;}}l218:;}cp_set_baud(a,a->u);} +static void l145(t*b){d*a;unsigned long l149=0,l161=0,l169=0;l79 l117 +,l119;int c;{if(!(!b->l31||!b->l->l33))goto l610;return;l610:;}{a=b-> +l;l327:if(!(al+4))goto l577;goto l545;l173:a++;goto l327;l545:{{ +if(!(a->g!=3&&a->g!=6))goto l596;goto l173;l596:;}{if(!(a->w==0))goto +l755;l149|=a->j;goto l702;l755:;{if(!(a->w==1))goto l670;l161|=a->j; +l670:;}l702:;}}goto l173;l577:;}{if(!(!b->l[0].l46))goto l642;l149|=( +1<<16);l642:;}{if(!(!b->l[1].l46))goto l561;l161|=(1<<16);l561:;}l169 +=~(l149|l161);{c=1;l589:if(!(c<32))goto l544;goto l530;l576:c++;goto +l589;l530:{if(!((l169>>c)&1))goto l256;{l117.j[c]=c;l119.j[c]=c;l117. +l61[c]=1;l119.l61[c]=0;}goto l288;l256:;{l117.j[c]=0;l119.j[c]=0;l117 +.l61[c]=0;l119.l61[c]=0;}l288:;}goto l576;l544:;}memcpy(&b->l[0].v,& +l117,sizeof(l79));memcpy(&b->l[1].v,&l119,sizeof(l79));}void +cp_set_higain(d*a,int p){{if(!(a->g!=3))goto l221;return;l221:;}a-> +l146=(p!=0);l202(a);}void cp_set_use16(d*a,int p){d*i;{if(!(a->g!=3))goto +l273;return;l273:;}a->l46=(p!=0);l167(a);l183(a);{i=a->e->l;l263:if(! +(ie->l+4))goto l213;goto l209;l216:++i;goto l263;l209:{if(!(i->w +==a->q))goto l316;cp_set_ts(i,i->j);l316:;}goto l216;l213:;}}void +cp_set_phony(d*a,int p){{if(!(a->g==3))goto l314;a->l69=(p!=0);l314:; +}{if(!(a->l69))goto l310;{a->l29|=64; * (volatile unsigned long* )((a +)->r+16)=5505033;}goto l308;l310:;{a->l29&=~64; * (volatile unsigned +long* )((a)->r+16)=1310728;}l308:;}{if(!(a->g==3))goto l306;k(a->e,a +->l53,a->l29);l306:;}}void cp_set_crc4(d*a,int p){{if(!(a->g!=3))goto +l305;return;l305:;}a->l48=(p!=0);l167(a);l182(a);}void cp_set_precoder +(d*a,int p){{if(!(a->g!=2&&!(a->g==3&&a->l38)))goto l302;return;l302: +;}{if(!(a->l69))goto l301;p=0;l301:;}a->l130=(p!=0);{if(!(a->l130))goto +l299;a->l34|=16;goto l298;l299:;a->l34&=~16;l298:;}k(a->e,a->l60,a-> +l34);}void cp_set_gsyn(d*a,int l78){switch(a->g){case 3:{unsigned char +l83=0;d*i;t*b=a->e;{if(!(a->l36&&l78!=0))goto l271;l78=1;l271:;} +switch(l78){default:l78=0;l83=0;break;case 1:l78=2+a->q;l83=1+a->q; +break;case 2:l83=1;break;case 3:l83=2;break;case 4:l83=3;break;case 5 +:l83=4;break;}{i=b->l;l270:if(!(il+4))goto l267;goto l262;l175:i +++;goto l270;l262:{{if(!(i->g!=3||(!b->l31&&i!=a)))goto l260;goto l175 +;l260:;}k(b,i->l53,i->l29&~128);i->l29&=~7;i->l29|=l83;i->l73=l78;k(b +,i->l53,i->l29);}goto l175;l267:;}break;}case 2:{if(!(l78))goto l258; +{a->l73=1;a->l34|=8;}goto l257;l258:;{a->l73=0;a->l34&=~8;}l257:;}k(a +->e,a->l60,a->l34);break;}}void cp_register_transmit(d*a,void( *l77)( +d* ,void* ,int)){a->l166=l77;}void cp_register_receive(d*a,void( *l77 +)(d* ,char* ,int)){a->l155=l77;}void cp_register_error(d*a,void( *l77 +)(d* ,int)){a->l56=l77;}static void l689(d*a){unsigned char l70,l124; +unsigned l43,l132,l48,l159,l111,l123;++a->l51;{if(!(!a->l135&&a->l51 +<=1))goto l255;return;l255:;}a->y=0;l70=l102(a,6,255);l123=0;{if(!( +l70&2))goto l229;a->y|=64;l229:;}{if(!(l70&8))goto l240;a->y|=8;l240: +;}l43=(((short)(l55(a,0))<<8)|(l55(a,1)));l132=0;l48=0;l159=0;{if(!(! +a->l36))goto l241;{l124=l55(a,30);{if(!(!a->l46&&(l70&128)))goto l242 +;a->y|=256;l242:;}{if(!(!a->l46&&(l70&64)))goto l243;a->y|=512;l243:; +}{if(!(l70&4))goto l244;a->y|=2;l244:;}{if(!(l124&4))goto l245;{a->y +|=32;++l123;}l245:;}{if(!((!a->l46&&(l124&2))||(a->l48&&(l124&1))))goto +l246;{a->y|=1024;++l123;}l246:;}l132=(((short)(l55(a,2))<<4&4032)|( +l55(a,4))>>2);l48=(((short)(l55(a,2))<<8&768)|(l55(a,3)));l159=((( +short)(l55(a,4))<<8&768)|(l55(a,5)));{if(!(a->e->l31&&(l70&16)))goto +l247;++a->m.l97;l247:;}}l241:;}{if(!(!a->y))goto l248;a->y=1;l248:;}a +->m.l43+=l43;a->m.l101+=l132;{if(!(a->l48))goto l249;{a->m.l92+=l48;a +->m.l104+=l159;}l249:;}l111=l132;{if(!(a->l48))goto l705;l111+=l48; +l705:;}{if(!(l70&(8|2)))goto l695;++a->m.l80;goto l694;l695:;{{if(!( +l43))goto l690;++a->m.l89;l690:;}{if(!(l111||l123||(l70&16)))goto l686 +;++a->m.l110;l686:;}{if(!(l123))goto l683;++a->m.l108;l683:;}{if(!( +l43>=2048||l111>=832))goto l679;++a->m.l100;goto l674;l679:;{{if(!( +l111>1))goto l664;++a->m.l95;l664:;}++a->l107;a->l93+=l43+l111;}l674: +;}}l694:;}{if(!(a->l51/60==0))goto l662;{{if(!(a->l93>a->l107*2048/ +1000))goto l606;++a->m.l84;l606:;}a->l107=0;a->l93=0;}l662:;}{if(!(a +->l51>15*60))goto l602;{int c;{c=47;l550:if(!(c>0))goto l549;goto l578 +;l379:--c;goto l550;l578:a->l105[c]=a->l105[c-1];goto l379;l549:;}a-> +l105[0]=a->m;a->z.l43+=a->m.l43;a->z.l101+=a->m.l101;a->z.l92+=a->m. +l92;a->z.l104+=a->m.l104;a->z.l80+=a->m.l80;a->z.l89+=a->m.l89;a->z. +l110+=a->m.l110;a->z.l95+=a->m.l95;a->z.l100+=a->m.l100;a->z.l108+=a +->m.l108;a->z.l97+=a->m.l97;a->z.l84+=a->m.l84;a->m.l43=0;a->m.l101=0 +;a->m.l92=0;a->m.l104=0;a->m.l80=0;a->m.l89=0;a->m.l110=0;a->m.l95=0; +a->m.l100=0;a->m.l108=0;a->m.l97=0;a->m.l84=0;a->l135+=a->l51;a->l51= +0;}l602:;}}void cp_g703_timer(d*a){unsigned char l76,l134;++a->l51;{ +if(!(!a->l135&&a->l51<=1))goto l556;return;l556:;}a->y=0;l76=l27(a->e +,a->l35);k(a->e,a->l35,l76);l134=cp_get_cd(a);{if(!(l76&1))goto l554; +++a->m.l43;l554:;}{if(!(!l134))goto l552;a->y|=64;l552:;}{if(!(l76&2))goto +l522;a->y|=4096;l522:;}{if(!(l76&16))goto l521;a->y|=2048;l521:;}{if( +!(!a->y))goto l458;a->y=1;l458:;}{if(!(!l134||(l76&16)))goto l525;++a +->m.l80;goto l442;l525:;{{if(!(l76&1))goto l435;++a->m.l89;l435:;}++a +->l107;{if(!(l134&&(l76&1)))goto l475;++a->l93;l475:;}}l442:;}{if(!(a +->l51/60==0))goto l377;{{if(!(a->l93*2>a->l107))goto l466;++a->m.l84; +l466:;}a->l107=0;a->l93=0;}l377:;}{if(!(a->l51>15*60))goto l349;{int c +;{c=47;l454:if(!(c>0))goto l393;goto l404;l362:--c;goto l454;l404:a-> +l105[c]=a->l105[c-1];goto l362;l393:;}a->l105[0]=a->m;a->z.l43+=a->m. +l43;a->z.l101+=a->m.l101;a->z.l92+=a->m.l92;a->z.l104+=a->m.l104;a->z +.l80+=a->m.l80;a->z.l89+=a->m.l89;a->z.l110+=a->m.l110;a->z.l95+=a->m +.l95;a->z.l100+=a->m.l100;a->z.l108+=a->m.l108;a->z.l97+=a->m.l97;a-> +z.l84+=a->m.l84;memset(&a->m,0,sizeof(a->m));a->l135+=a->l51;a->l51=0 +;}l349:;}}static void l621(d*a){int s=(( * (volatile unsigned long* )& +a->l30[a->l41].y)>>16&8191);unsigned char l121;{if(!(s>0))goto l378; +l121=a->l126[a->l41][--s];goto l361;l378:;l121=0;l361:;};{if(!(l121& +64))goto l407;{++a->l193;{if(!(a->l56))goto l408;a->l56(a,4);l408:;}} +goto l375;l407:;{if(!(!(l121&128)))goto l391;{++a->l567;{if(!(a->l56))goto +l392;a->l56(a,1);l392:;}}goto l406;l391:;{if(!(!a->l69&&!(l121&32)))goto +l424;{++a->l537;{if(!(a->l56))goto l317;a->l56(a,2);l317:;}}goto l409 +;l424:;{a->l553+=s;++a->l646;{if(!(a->l155))goto l410;a->l155(a,a-> +l126[a->l41],s);l410:;}}l409:;}l406:;}l375:;} * (volatile unsigned +long* )&a->l30[a->l41].y=0; * (volatile unsigned long* )&a->l30[(a-> +l41+64-1)%64].s&=~1073741824; * (volatile unsigned long* )&a->l30[a-> +l41].s|=1073741824;a->l41=++a->l41%64;}static void l750(d*a){unsigned +long l49;int l187=0;{if(!(!a->l30))goto l428;return;l428:;}++a->l636; +{l171:if(!((l49= * (volatile unsigned long* )&a->l81[a->l98])!=0))goto +l421;{ * (volatile unsigned long* )&a->l81[a->l98]=0;a->l98=++a->l98% +128;{if(!(l49&1073741824))goto l422;{;goto l171;}l422:;}{if(!(l49& +33554432))goto l423;{;{if(!(l49&2))goto l430;++l187;l430:;}}goto l431 +;l423:;{;}l431:;}}goto l171;l421:;}{l426:if(!( * (volatile unsigned +long* )&a->l30[a->l41].y&1073741824))goto l427;l621(a);goto l426;l427 +:;}{if(!(l187))goto l441;{int c;{c=0;l459:if(!(c<64))goto l437;goto +l438;l436:++c;goto l459;l438:{ * (volatile unsigned long* )&a->l30[c] +.s=1664<<16; * (volatile unsigned long* )&a->l30[c].y=0;}goto l436; +l437:;} * (volatile unsigned long* )&a->l30[(a->l41+64-1)%64].s|= +1073741824;outb(128,0); * (volatile unsigned long* )((a)->r+0)=65536; +outb(128,0);( * (a)->l103)=a->l133[a->l41];outb(128,0);( * (a)->l72)= +1048576;outb(128,0); * (volatile unsigned long* )((a->e)->f+0)=513;++ +a->l193;{if(!(a->l56))goto l439;a->l56(a,5);l439:;}}l441:;}}static +void l440(d*a){int s=(( * (volatile unsigned long* )&a->l37[a->l39].s +)>>16&8191);void*l67=a->l67[a->l39];;a->l39=++a->l39%4;{if(!(a->l39!= +a->l44))goto l254;{int l506=(( * (a)->l115)-a->l127[0])/sizeof(l122); +{if(!(l506==(a->l39+4-1)%4))goto l456;{; * (volatile unsigned long* )( +(a->e)->f+0)=1024<q;outb(128,0);}l456:;}}l254:;}{if(!(s>0))goto +l452;{a->l657+=s;++a->l347;{if(!(a->l166))goto l453;a->l166(a,l67,s); +l453:;}}l452:;}}static void l259(d*a){unsigned long l49;int l203=0;++ +a->l691;{l157:if(!((l49= * (volatile unsigned long* )&a->l88[a->l109] +)!=0))goto l460;{ * (volatile unsigned long* )&a->l88[a->l109]=0;a-> +l109=++a->l109%128;{if(!(!(l49&1073741824)))goto l461;{;goto l157;} +l461:;}{if(!(l49&33554432))goto l457;{;{if(!(l49&65536))goto l227;++ +l203;l227:;}goto l157;}l457:;};{if(!(a->l39!=a->l44&&( * (volatile +unsigned long* )&a->l37[a->l39].y&1073741824)))goto l463;l440(a);l463 +:;}}goto l157;l460:;}{if(!(l203))goto l582;{ * (volatile unsigned long + * )((a)->r+0)=16777216;++a->l223;{if(!(a->l56))goto l599;a->l56(a,3); +l599:;}}l582:;}}static void l757(t*b){unsigned long l49;d*a;{l179:if( +!((l49= * (volatile unsigned long* )&b->l87[b->l99])!=0))goto l601;{ * +(volatile unsigned long* )&b->l87[b->l99]=0;b->l99=++b->l99%128;{if(! +((l49&3489660928UL)!=3489660928UL))goto l579;{;goto l179;}l579:;}{a=b +->l;l603:if(!(al+4))goto l605;goto l573;l604:++a;goto l603;l573:{ +if(!(a->g==3&&(l102(a,7,255)&16)))goto l607;{;l689(a);}l607:;}goto +l604;l605:;}}goto l179;l601:;}}void cp_handle_interrupt(t*b){d*a;++b +->l591;{if(!( * (volatile unsigned long* )&b->l87[b->l99]))goto l572; +l757(b);l572:;}{a=b->l;l570:if(!(al+4))goto l612;goto l613;l611: +++a;goto l570;l613:{{if(!(~(a->l50)))goto l614;{{if(!( * (volatile +unsigned long* )&a->l88[a->l109]))goto l615;l259(a);l615:;}{if(!( * ( +volatile unsigned long* )&a->l81[a->l98]))goto l617;l750(a);l617:;}} +l614:;}}goto l611;l612:;}}int cp_interrupt(t*b){int l197=0;{l563:if(! +(cp_interrupt_poll(b,1)!=0))goto l619;{{if(!(++l197>1000))goto l558; +return-1;l558:;}cp_handle_interrupt(b);}goto l563;l619:;}return l197; +}int cp_interrupt_poll(t*b,int l177){unsigned long l200= * (volatile +unsigned long* )((b)->f+4);;{if(!(!l200))goto l557;return 0;l557:;}{ +if(!(l177))goto l625; * (volatile unsigned long* )((b)->f+4)=l200; +l625:;}return 1;}void cp_enable_interrupt(t*b,int p){d*a;{a=b->l;l555 +:if(!(al+4))goto l628;goto l551;l627:++a;goto l555;l551:{if(!(a-> +g))goto l631; * (volatile unsigned long* )((a)->r+84)=p?a->l50:~0; +l631:;}goto l627;l628:;}}int cp_transmit_space(d*a){return(4+a->l39-a +->l44-1)%4;}int cp_send_packet(d*a,char*n,int s,void*l67){{if(!(! +cp_transmit_space(a)))goto l632;return-1;l632:;}{if(!(s<=0||s>1664-1))goto +l633;return-2;l633:;}a->l67[a->l44]=l67;{if(!(n!=(char* )a->l142[a-> +l44]))goto l548;memcpy(a->l142[a->l44],n,s);l548:;} * (volatile +unsigned long* )&a->l37[a->l44].y=0;outb(128,0); * (volatile unsigned +long* )&a->l37[a->l44].s=2147483648UL|1073741824|s<<16;outb(128,0); * +(volatile unsigned long* )&a->l37[(a->l44+4-1)%4].s&=~1073741824;outb +(128,0);;{if(!(( * (a)->l68)==0))goto l541;{;( * (a)->l68)=a->l127[a +->l39];outb(128,0);( * (a)->l72)=524288;outb(128,0); * (volatile +unsigned long* )((a->e)->f+0)=513;}goto l639;l541:;{if(!(a->l39==a-> +l44))goto l640;{; * (volatile unsigned long* )((a->e)->f+0)=1024< +q;}l640:;}l639:;}outb(128,0);a->l44=(a->l44+1)%4;return 0;} diff -u -r -P -N src-old/sys/dev/cp/cpddk.h src/sys/dev/cp/cpddk.h --- src-old/sys/dev/cp/cpddk.h Thu Jan 1 03:00:00 1970 +++ src/sys/dev/cp/cpddk.h Tue Dec 25 19:59:04 2001 @@ -0,0 +1,301 @@ +/* + * Cronyx Tau-PCI DDK definitions. + * + * Copyright (C) 1999-2001 Cronyx Engineering Ltd. + * Author: Serge Vakulenko, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ +#define NBRD 6 /* the maximum number of installed boards */ +#define NCHAN 4 /* the number of channels on the board */ +#define NRBUF 64 /* the number of receive buffers per channel */ +#define NTBUF 4 /* the number of transmit buffers per channel */ +#define BUFSZ 1664 /* i/o buffer size (26*64, min 1601) */ +#define QSZ 128 /* intr queue size (multiple of 32, min 32) */ + +#pragma pack(4) + +typedef struct { + unsigned long bpv; /* bipolar violations */ + unsigned long fse; /* frame sync errors */ + unsigned long crce; /* CRC errors */ + unsigned long rcrce; /* remote CRC errors (E-bit) */ + unsigned long uas; /* unavailable seconds */ + unsigned long les; /* line errored seconds */ + unsigned long es; /* errored seconds */ + unsigned long bes; /* bursty errored seconds */ + unsigned long ses; /* severely errored seconds */ + unsigned long oofs; /* out of frame seconds */ + unsigned long css; /* controlled slip seconds */ + unsigned long dm; /* degraded minutes */ +} cp_gstat_t; + +typedef struct { /* cross-connector parameters */ + unsigned char ts [32]; /* timeslot number */ + unsigned char link [32]; /* E1 link number */ +} cp_dxc_t; + +typedef struct { + unsigned long len; /* data buffer length, fe, hold, hi */ +#define DESC_FE 0x80000000 +#define DESC_HOLD 0x40000000 +#define DESC_HI 0x20000000 +#define DESC_LEN(v) ((v) >> 16 & 0x1fff) + + unsigned long next; /* next descriptor pointer */ + unsigned long data; /* pointer to data buffer */ + unsigned long status; /* complete, receive abort, fe, len */ +#define DESC_RA 0x00000200 +#define DESC_C 0x40000000 + + unsigned long fe; /* pointer to frame end descriptor */ +} cp_desc_t; + +typedef struct { + cp_desc_t tdesc [NTBUF]; /* transmit buffer descriptors */ + cp_desc_t rdesc [NRBUF]; /* receive buffer descriptors */ + unsigned char tbuffer [NTBUF] [BUFSZ]; /* transmit buffers */ + unsigned char rbuffer [NRBUF] [BUFSZ]; /* receive buffers */ +} cp_buf_t; + +typedef struct { + unsigned long iqrx [NCHAN] [QSZ]; /* rx intr queue */ + unsigned long iqtx [NCHAN] [QSZ]; /* tx intr queue */ + unsigned long iqlx [QSZ]; /* LBI intr queue */ +} cp_qbuf_t; + +typedef struct _cp_chan_t { + unsigned char *regs; /* base addr of channel registers */ + volatile unsigned long *RXBAR, *TXBAR, *CFG, *BRDA, *BTDA, *FTDA; + unsigned char CCR, CSR, GMD, GLS, E1CS, E1CR, E1EPS; + + unsigned char num; /* channel number, 0..1 */ + unsigned char type; /* channel type */ +#define T_NONE 0 /* no channel */ +#define T_SERIAL 1 /* V.35/RS */ +#define T_G703 2 /* G.703 */ +#define T_E1 3 /* E1 */ +#define T_E3 4 /* E3 */ +#define T_HSSI 5 /* HSSI */ +#define T_DATA 6 /* no physical interface */ + + struct _cp_board_t *board; /* board pointer */ + + unsigned char dtr; /* DTR signal value */ + unsigned char rts; /* RTS signal value */ + unsigned long baud; /* data rate, bps */ + unsigned char dpll; /* dpll mode */ + unsigned char nrzi; /* nrzi mode */ + unsigned char invtxc; /* invert tx clock */ + unsigned char invrxc; /* invert rx clock */ + unsigned char lloop; /* local loopback mode */ + unsigned char gsyn; /* G.703 clock mode */ +#define GSYN_INT 0 /* internal transmit clock source */ +#define GSYN_RCV 1 /* transmit clock source = receive */ +#define GSYN_RCV0 2 /* tclk = rclk from channel 0 */ +#define GSYN_RCV1 3 /* ...from channel 1 */ +#define GSYN_RCV2 4 /* ...from channel 2 */ +#define GSYN_RCV3 5 /* ...from channel 3 */ + + unsigned char precoder; /* G.703 precoder enable */ + + unsigned long ts; /* E1 timeslot mask */ + unsigned char higain; /* E1 high gain mode */ + unsigned char use16; /* E1 use ts 16 */ + unsigned char crc4; /* E1 enable CRC4 */ + unsigned char phony; /* E1 phony mode */ + unsigned char unfram; /* E1 unframed mode */ + unsigned char monitor; /* E1 monitoring mode */ + unsigned char dir; /* E1 direction mode */ + cp_dxc_t dxc; /* E1 cross-connect params */ + + unsigned long imr; + unsigned char ccr; /* CCR image */ + unsigned char gmd; /* G.703 MDi register image */ + unsigned char e1cr; /* E1 CR register image */ + unsigned char ds21x54; /* new tranceiver flag */ + + unsigned long rintr; /* receive interrupts */ + unsigned long tintr; /* transmit interrupts */ + ulong64 ibytes; /* input bytes */ + ulong64 obytes; /* output bytes */ + unsigned long ipkts; /* input packets */ + unsigned long opkts; /* output packets */ + unsigned long underrun; /* output underrun errors */ + unsigned long overrun; /* input overrun errors */ + unsigned long frame; /* input frame errors */ + unsigned long crc; /* input crc errors */ + + unsigned short status; /* E1/G.703 line status bit mask */ +#define ESTS_NOALARM 0x0001 /* no alarm present */ +#define ESTS_FARLOF 0x0002 /* receiving far loss of framing */ +#define ESTS_AIS 0x0008 /* receiving all ones */ +#define ESTS_LOF 0x0020 /* loss of framing */ +#define ESTS_LOS 0x0040 /* loss of signal */ +#define ESTS_AIS16 0x0100 /* receiving all ones in timeslot 16 */ +#define ESTS_FARLOMF 0x0200 /* receiving alarm in timeslot 16 */ +#define ESTS_LOMF 0x0400 /* loss of multiframe sync */ +#define ESTS_TSTREQ 0x0800 /* test code detected */ +#define ESTS_TSTERR 0x1000 /* test error */ + + unsigned long totsec; /* total seconds elapsed */ + unsigned long cursec; /* total seconds elapsed */ + unsigned long degsec; /* degraded seconds */ + unsigned long degerr; /* errors during degraded seconds */ + cp_gstat_t currnt; /* current 15-min interval data */ + cp_gstat_t total; /* total statistics data */ + cp_gstat_t interval [48]; /* 12 hour period data */ + + unsigned long *iqrx; /* rx intr queue */ + unsigned long *iqtx; /* tx intr queue */ + int irn, itn; + + unsigned char *tbuf [NTBUF]; /* transmit buffers */ + cp_desc_t *tdesc; /* transmit buffer descriptors */ + unsigned long tphys [NTBUF]; /* transmit buffer phys address */ + unsigned long tdphys [NTBUF]; /* transmit descr phys addresses */ + int tn; /* first active transmit buffer */ + int te; /* first empty transmit buffer */ + + unsigned char *rbuf [NRBUF]; /* receive buffers */ + cp_desc_t *rdesc; /* receive buffer descriptors */ + unsigned long rphys [NRBUF]; /* receive buffer phys address */ + unsigned long rdphys [NRBUF]; /* receive descr phys addresses */ + int rn; /* first active receive buffer */ + + void *tag [NTBUF]; /* system dependent data per buffer */ + void *sys; /* system dependent data per channel */ + unsigned char debug; /* debug level, 0..2 */ + + void (*transmit) (struct _cp_chan_t *c, void *tag, int len); + void (*receive) (struct _cp_chan_t *c, char *data, int len); + void (*error) (struct _cp_chan_t *c, int reason); +#define CP_FRAME 1 +#define CP_CRC 2 +#define CP_UNDERRUN 3 +#define CP_OVERRUN 4 +#define CP_OVERFLOW 5 +} cp_chan_t; + +typedef struct _cp_board_t { + unsigned char *base; /* base address of adapter registers */ + unsigned char num; /* board number, 0..5 */ + unsigned char type; /* board type Tau/TauE1/TauG703 */ +#define B_TAUPCI 1 /* 2 channels V.35/RS */ +#define B_TAUPCI_E3 2 /* 1 channel E3 */ +#define B_TAUPCI_HSSI 3 /* 1 channel HSSI */ +#define B_TAUPCI_G703 4 /* 2 channels G703 */ +#define B_TAUPCI_E1 5 /* 2 channels E1 */ +#define B_TAUPCI4 6 /* 4 channels V.35/RS */ +#define B_TAUPCI4_G703 7 /* 2 channels G.703 + 2 channels V.35/RS */ +#define B_TAUPCI4_4G703 8 /* 4 channels G.703 */ +#define B_TAUPCI_2E1 9 /* 2 channels E1, 4 data ports */ +#define B_TAUPCI4_E1 10 /* 2 channels E1 + 2 channels V.35/RS */ +#define B_TAUPCI4_4E1 11 /* 4 channels E1 */ + + unsigned long osc; /* oscillator frequency: 10MHz or 8.192 */ + char name[16]; /* board version name */ + cp_chan_t chan[NCHAN]; /* channel structures */ + unsigned char mux; /* E1 mux mode */ + unsigned char bcr; /* BCR image */ + unsigned char e1cfg; /* E1 CFG register image */ + unsigned char gpidle; /* idle bits of gp port */ + unsigned char E1DATA; + unsigned long intr; /* interrupt counter */ + unsigned long *iqlx; /* LBI intr queue */ + int iln; + void *sys; +} cp_board_t; + +#pragma pack() + +/* PCI device identifiers. */ +extern unsigned short cp_vendor_id; +extern unsigned short cp_device_id; + +/* Initialization. */ +void cp_init (cp_board_t *b, int num, unsigned char *base); +void cp_reset (cp_board_t *b, cp_qbuf_t *buf, unsigned long phys); +void cp_hard_reset (cp_board_t *b); +unsigned long cp_regio (cp_chan_t *c, int op, int reg, unsigned long val); +#define REGIO_INB 0 +#define REGIO_IN 1 +#define REGIO_INS 2 +#define REGIO_INX 3 +#define REGIO_INB_OUTB 4 +#define REGIO_OUTB 5 +#define REGIO_OUTX 6 +#define REGIO_R_W 7 +#define REGIO_OUT_IN 8 + +/* Callback registration. */ +void cp_register_transmit (cp_chan_t *c, void (*func) (cp_chan_t*, void*, int)); +void cp_register_receive (cp_chan_t *c, void (*func) (cp_chan_t*, char*, int)); +void cp_register_error (cp_chan_t *c, void (*func) (cp_chan_t*, int)); + +/* Data transmittion. */ +void cp_start_chan (cp_chan_t *c, int tx, int rx, cp_buf_t *cb, unsigned long phys); +void cp_stop_chan (cp_chan_t *c); +void cp_start_e1 (cp_chan_t *c); +void cp_stop_e1 (cp_chan_t *c); +int cp_transmit_space (cp_chan_t *c); +int cp_send_packet (cp_chan_t *c, char *data, int len, void *tag); + +/* Interrupt control. */ +int cp_interrupt (cp_board_t *b); +int cp_interrupt_poll (cp_board_t *b, int ack); +void cp_handle_interrupt (cp_board_t *b); +void cp_enable_interrupt (cp_board_t *b, int on); + +/* G.703 timer. */ +void cp_g703_timer (cp_chan_t *c); + +/* LED control. */ +void cp_led (cp_board_t *b, int on); + +/* Modem signals. */ +void cp_set_dtr (cp_chan_t *c, int on); +void cp_set_rts (cp_chan_t *c, int on); +int cp_get_dsr (cp_chan_t *c); +int cp_get_cd (cp_chan_t *c); +int cp_get_cts (cp_chan_t *c); +int cp_get_txcerr (cp_chan_t *c); +int cp_get_rxcerr (cp_chan_t *c); + +/* HDLC parameters. */ +void cp_set_baud (cp_chan_t *c, int baud); +void cp_set_dpll (cp_chan_t *c, int on); +void cp_set_nrzi (cp_chan_t *c, int on); +void cp_set_invtxc (cp_chan_t *c, int on); +void cp_set_invrxc (cp_chan_t *c, int on); +void cp_set_lloop (cp_chan_t *c, int on); + +/* Channel status, cable type. */ +int cp_get_rloop (cp_chan_t *c); +int cp_get_lq (cp_chan_t *c); +int cp_get_cable (cp_chan_t *c); +#define CABLE_RS232 0 +#define CABLE_V35 1 +#define CABLE_RS530 2 +#define CABLE_X21 3 +#define CABLE_RS485 4 +#define CABLE_NOT_ATTACHED 9 + +/* E1/G.703 parameters. */ +void cp_set_gsyn (cp_chan_t *c, int syn); +void cp_set_ts (cp_chan_t *c, unsigned long ts); +void cp_set_dir (cp_chan_t *c, int dir); +void cp_set_mux (cp_board_t *b, int on); +void cp_set_dxc (cp_chan_t *c, cp_dxc_t *param); +void cp_set_higain (cp_chan_t *c, int on); +void cp_set_use16 (cp_chan_t *c, int on); +void cp_set_crc4 (cp_chan_t *c, int on); +void cp_set_phony (cp_chan_t *c, int on); +void cp_set_unfram (cp_chan_t *c, int on); +void cp_set_precoder (cp_chan_t *c, int on); +void cp_set_monitor (cp_chan_t *c, int on); diff -u -r -P -N src-old/sys/dev/cp/if_cp.c src/sys/dev/cp/if_cp.c --- src-old/sys/dev/cp/if_cp.c Thu Jan 1 03:00:00 1970 +++ src/sys/dev/cp/if_cp.c Wed Mar 6 18:50:25 2002 @@ -0,0 +1,2363 @@ +/* + * Cronyx-Tau-PCI adapter driver for FreeBSD. + * Supports PPP/HDLC, Cisco/HDLC and FrameRelay protocol in synchronous mode, + * and asyncronous channels with full modem control. + * Keepalive protocol implemented in both Cisco and PPP modes. + * + * Copyright (C) 1999-2002 Cronyx Engineering Ltd. + * Authors: + * Kurakin Roman, + * Serge Vakulenko, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ + +#include "pci.h" +#if NPCI > 0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if __FreeBSD_version >= 400000 +#include +#endif +#include +#include +#include +#include +#include +#include +#if __FreeBSD_version >= 500000 +# include +# include +#else +# include +# include +#endif +#include +#include +#include +#include +#include "opt_ng_cronyx.h" +/*XXX broken for 5.x*/ +# undef NETGRAPH_CRONYX +#ifdef NETGRAPH_CRONYX +# include "opt_netgraph.h" +# ifndef NETGRAPH +# error #option NETGRAPH missed from configuration +# endif +# include +# include +# if __FreeBSD_version >= 500000 +# include +# else +# include +# endif +#else +# if __FreeBSD_version <= 500000 +# include "sppp.h" +# if NSPPP <= 0 +# error The device cp requires sppp or netgraph. +# endif +# endif +# include +# include +# define PP_CISCO IFF_LINK2 +#if __FreeBSD_version < 400000 +# include +# if NBPFILTER > 0 +# include +# endif +#else +# include +# include +# define NBPFILTER NBPF +#endif +#endif + +#define DEBUG(d,s) ({if (d->chan->debug) {\ + printf ("%s: ", d->name); printf s;}}) +#define DEBUG2(d,s) ({if (d->chan->debug>1) {\ + printf ("%s: ", d->name); printf s;}}) + +#define CDEV_MAJOR 134 + +#if __FreeBSD_version >= 400000 +static int cp_probe __P((device_t)); +static int cp_attach __P((device_t)); +static int cp_detach __P((device_t)); + +static device_method_t cp_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, cp_probe), + DEVMETHOD(device_attach, cp_attach), + DEVMETHOD(device_detach, cp_detach), + + {0, 0} +}; + +typedef struct _bdrv_t { + cp_board_t *board; + struct resource *cp_res; + struct resource *cp_irq; + void *cp_intrhand; +} bdrv_t; + +static driver_t cp_driver = { + "cp", + cp_methods, + sizeof(bdrv_t), +}; + +static devclass_t cp_devclass; +#endif + +typedef struct _drv_t { + char name [8]; + cp_chan_t *chan; + cp_board_t *board; + cp_buf_t buf; + int running; +#ifdef NETGRAPH + char nodename [NG_NODELEN+1]; + hook_p hook; + hook_p debug_hook; + node_p node; + struct ifqueue queue; + struct ifqueue hi_queue; + short timeout; + struct callout_handle timeout_handle; +#else + struct sppp pp; +#endif +} drv_t; + +static void cp_receive (cp_chan_t *c, char *data, int len); +static void cp_transmit (cp_chan_t *c, void *attachment, int len); +static void cp_error (cp_chan_t *c, int data); +static void cp_up (drv_t *d); +static void cp_start (drv_t *d); +static void cp_down (drv_t *d); +static void cp_watchdog (drv_t *d); +#ifdef NETGRAPH +extern struct ng_type typestruct; +#else +static void cp_ifstart (struct ifnet *ifp); +static void cp_tlf (struct sppp *sp); +static void cp_tls (struct sppp *sp); +static void cp_ifwatchdog (struct ifnet *ifp); +static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data); +static void cp_initialize (void *softc); +#endif + +static cp_board_t *adapter [NBRD]; +static drv_t *channel [NBRD*NCHAN]; +static cp_qbuf_t queue [NBRD]; +static struct callout_handle led_timo [NBRD]; +static struct callout_handle timeout_handle; + +/* + * Print the mbuf chain, for debug purposes only. + */ +static void printmbuf (struct mbuf *m) +{ + printf ("mbuf:"); + for (; m; m=m->m_next) { + if (m->m_flags & M_PKTHDR) + printf (" HDR %d:", m->m_pkthdr.len); + if (m->m_flags & M_EXT) + printf (" EXT:"); + printf (" %d", m->m_len); + } + printf ("\n"); +} + +/* + * Make an mbuf from data. + */ +static struct mbuf *makembuf (void *buf, unsigned len) +{ + struct mbuf *m; + + MGETHDR (m, M_DONTWAIT, MT_DATA); + if (! m) + return 0; + MCLGET (m, M_DONTWAIT); + if (! (m->m_flags & M_EXT)) { + m_freem (m); + return 0; + } + m->m_pkthdr.len = m->m_len = len; + bcopy (buf, mtod (m, caddr_t), len); + return m; +} + +#if __FreeBSD_version < 400000 +static const char *cp_probe (pcici_t tag, pcidi_t type) +{ + if (tag->vendor == cp_vendor_id && tag->device == cp_device_id) + return "Cronyx-Tau-PCI serial adapter"; + return 0; +} +#else +static int cp_probe (device_t dev) +{ + if ((pci_get_vendor (dev) == cp_vendor_id) && + (pci_get_device (dev) == cp_device_id)) { + device_set_desc (dev, "Cronyx-Tau-PCI serial adapter"); + return 0; + } + return ENXIO; +} +#endif + +static void cp_timeout (void *arg) +{ + drv_t *d; + int s, i; + + for (i=0; ichan->type != T_G703) + continue; + s = splhigh (); + cp_g703_timer (d->chan); + splx (s); + } + timeout_handle = timeout (cp_timeout, 0, hz); +} + +static void cp_led_off (void *arg) +{ + cp_board_t *b = arg; + int s = splhigh (); + + cp_led (b, 0); + led_timo[b->num].callout = 0; + splx (s); +} + +static void cp_intr (void *arg) +{ +#if __FreeBSD_version < 400000 + cp_board_t *b = arg; +#else + bdrv_t *bd = arg; + cp_board_t *b = bd->board; +#endif + int s = splhigh (); + + /* Turn LED on. */ + cp_led (b, 1); + + cp_interrupt (b); + + /* Turn LED off 50 msec later. */ + if (! led_timo[b->num].callout) + led_timo[b->num] = timeout (cp_led_off, b, hz/20); + splx (s); +} + +/* + * Called if the probe succeeded. + */ +#if __FreeBSD_version < 400000 +static void cp_attach (pcici_t tag, int unit) +{ + vm_offset_t pbase; +#else +static int cp_attach (device_t dev) +{ + bdrv_t *bd = device_get_softc (dev); + int unit = device_get_unit (dev); + int rid, error; +#endif + vm_offset_t vbase; + cp_board_t *b; + cp_chan_t *c; + drv_t *d; + int s = splhigh (); + + b = malloc (sizeof(cp_board_t), M_DEVBUF, M_WAITOK); + adapter[unit] = b; + bzero (b, sizeof(cp_board_t)); + +#if __FreeBSD_version < 400000 + if (! pci_map_mem (tag, PCIR_MAPS, &vbase, &pbase)) { + printf ("cp%d: cannot map memory\n", unit); + free (b, M_DEVBUF); + splx (s); + return; + } +#else + bd->board = b; + b->sys = bd; + rid = PCIR_MAPS; + bd->cp_res = bus_alloc_resource (dev, SYS_RES_MEMORY, &rid, + 0, ~0, 1, RF_ACTIVE); + if (! bd->cp_res) { + printf ("cp%d: cannot map memory\n", unit); + free (b, M_DEVBUF); + splx (s); + return (ENXIO); + } + vbase = (vm_offset_t) rman_get_virtual (bd->cp_res); +#endif + + cp_init (b, unit, (u_char*) vbase); + cp_reset (b, queue+unit, vtophys (queue+unit)); + +#if __FreeBSD_version < 400000 + if (! pci_map_int (tag, cp_intr, b, &net_imask)) + printf ("cp%d: cannot map interrupt\n", unit); +#else + rid = 0; + bd->cp_irq = bus_alloc_resource (dev, SYS_RES_IRQ, &rid, 0, ~0, 1, + RF_SHAREABLE | RF_ACTIVE); + if (! bd->cp_irq) { + printf ("cp%d: cannot map interrupt\n", unit); + bus_release_resource (dev, SYS_RES_MEMORY, + PCIR_MAPS, bd->cp_res); + free (b, M_DEVBUF); + splx (s); + return (ENXIO); + } + error = bus_setup_intr (dev, bd->cp_irq, INTR_TYPE_NET, cp_intr, bd, + &bd->cp_intrhand); + if (error) { + printf ("cp%d: cannot set up irq\n", unit); + bus_release_resource (dev, SYS_RES_MEMORY, + PCIR_MAPS, bd->cp_res); + bus_release_resource (dev, SYS_RES_IRQ, 0, bd->cp_irq); + free (b, M_DEVBUF); + splx (s); + return (ENXIO); + } +#endif + printf ("cp%d: %s, clock %ld MHz\n", unit, b->name, b->osc / 1000000); + + for (c=b->chan; cchan+NCHAN; ++c) { + if (! c->type) + continue; + d = contigmalloc (sizeof(drv_t), M_DEVBUF, M_WAITOK, + 0x100000, 0xffffffff, 16, 0); + channel [b->num*NCHAN + c->num] = d; + bzero (d, sizeof(drv_t)); + sprintf (d->name, "cp%d.%d", b->num, c->num); + d->board = b; + d->chan = c; + c->sys = d; +#ifdef NETGRAPH + if (ng_make_node_common (&typestruct, &d->node) != 0) { + printf ("%s: cannot make common node\n", d->name); + continue; + } +#if __FreeBSD_version >= 500000 + d->node->nd_private = d; +#else + d->node->private = d; +#endif + sprintf (d->nodename, "%s%d", NG_CP_NODE_TYPE, + c->board->num*NCHAN + c->num); + if (ng_name_node (d->node, d->nodename)) { + printf ("%s: cannot name node\n", d->nodename); +#if __FreeBSD_version >= 500000 + NG_NODE_UNREF (d->node); +#else + ng_rmnode (d->node); + ng_unref (d->node); +#endif + continue; + } + d->queue.ifq_maxlen = IFQ_MAXLEN; + d->hi_queue.ifq_maxlen = IFQ_MAXLEN; +#else /*NETGRAPH*/ + d->pp.pp_if.if_softc = d; + d->pp.pp_if.if_unit = b->num * NCHAN + c->num; + d->pp.pp_if.if_name = "cp"; + d->pp.pp_if.if_mtu = PP_MTU; + d->pp.pp_if.if_flags = IFF_POINTOPOINT | IFF_MULTICAST; + d->pp.pp_if.if_ioctl = cp_sioctl; + d->pp.pp_if.if_start = cp_ifstart; + d->pp.pp_if.if_watchdog = cp_ifwatchdog; + d->pp.pp_if.if_init = cp_initialize; + sppp_attach (&d->pp.pp_if); + if_attach (&d->pp.pp_if); + d->pp.pp_tlf = cp_tlf; + d->pp.pp_tls = cp_tls; +#if __FreeBSD_version >= 400000 || NBPFILTER > 0 + /* If BPF is in the kernel, call the attach for it. + * The header size of PPP or Cisco/HDLC is 4 bytes. */ + bpfattach (&d->pp.pp_if, DLT_PPP, 4); +#endif +#endif /*NETGRAPH*/ + cp_start_e1 (c); + cp_start_chan (c, 1, 1, &d->buf, vtophys (&d->buf)); + + /* Register callback functions. */ + cp_register_transmit (c, &cp_transmit); + cp_register_receive (c, &cp_receive); + cp_register_error (c, &cp_error); + } + splx (s); +#if __FreeBSD_version >= 400000 + return 0; +#endif +} + +#if __FreeBSD_version >= 400000 +static int cp_detach (device_t dev) +{ + bdrv_t *bd = device_get_softc (dev); + cp_board_t *b = bd->board; + cp_chan_t *c; + int s = splhigh (); + + /* Check if the device is busy (open). */ + for (c=b->chan; cchan+NCHAN; ++c) { + drv_t *d = (drv_t*) c->sys; + + if (! d || ! d->chan->type) + continue; + if (d->running) { + splx (s); + return EBUSY; + } + } + + /* Ok, we can unload driver */ + /* At first we should stop all channels */ + for (c=b->chan; cchan+NCHAN; ++c) { + drv_t *d = (drv_t*) c->sys; + + if (! d || ! d->chan->type) + continue; + cp_stop_chan (c); + cp_stop_e1 (c); + cp_set_dtr (d->chan, 0); + cp_set_rts (d->chan, 0); + } + + /* Reset the adapter. */ + cp_led_off (b); + cp_reset (b, 0 ,0); + if (led_timo[b->num].callout) + untimeout (cp_led_off, b, led_timo[b->num]); + + for (c=b->chan; cchan+NCHAN; ++c) { + drv_t *d = (drv_t*) c->sys; + + if (! d || ! d->chan->type) + continue; +#ifndef NETGRAPH +#if __FreeBSD_version >= 410000 && NBPFILTER > 0 + /* Detach from the packet filter list of interfaces. */ + bpfdetach (&d->pp.pp_if); +#endif + /* Detach from the sync PPP list. */ + sppp_detach (&d->pp.pp_if); + + /* Detach from the system list of interfaces. */ + if_detach (&d->pp.pp_if); +#endif + channel [b->num*NCHAN + c->num] = 0; + /* Deallocate buffers. */ + contigfree (d, sizeof (*d), M_DEVBUF); + } + + /* Disable the interrupt request. */ + bus_teardown_intr (dev, bd->cp_irq, bd->cp_intrhand); + bus_release_resource (dev, SYS_RES_IRQ, 0, bd->cp_irq); + bus_release_resource (dev, SYS_RES_MEMORY, PCIR_MAPS, bd->cp_res); + + adapter [b->num] = 0; + free (b, M_DEVBUF); + splx (s); + return 0; +} +#endif + +#if __FreeBSD_version < 400000 +static u_long cp_count; +static struct pci_device cp_driver = {"cp", cp_probe, cp_attach, &cp_count, 0}; +DATA_SET (pcidevice_set, cp_driver); +#endif + +#ifndef NETGRAPH +static void cp_ifstart (struct ifnet *ifp) +{ + drv_t *d = ifp->if_softc; + + cp_start (d); +} + +static void cp_ifwatchdog (struct ifnet *ifp) +{ + drv_t *d = ifp->if_softc; + + cp_watchdog (d); +} + +static void cp_tlf (struct sppp *sp) +{ + drv_t *d = sp->pp_if.if_softc; + + DEBUG2 (d, ("cp_tlf\n")); +/* cp_set_dtr (d->chan, 0);*/ +/* cp_set_rts (d->chan, 0);*/ + sp->pp_down (sp); +} + +static void cp_tls (struct sppp *sp) +{ + drv_t *d = sp->pp_if.if_softc; + + DEBUG2 (d, ("cp_tls\n")); + sp->pp_up (sp); +} + +/* + * Process an ioctl request. + */ +static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data) +{ + drv_t *d = ifp->if_softc; + int error, was_up, should_be_up; + + was_up = (ifp->if_flags & IFF_RUNNING) != 0; + error = sppp_ioctl (ifp, cmd, data); + if (error) + return error; + + if (! (ifp->if_flags & IFF_DEBUG)) + d->chan->debug = 0; + else if (! d->chan->debug) + d->chan->debug = 1; + + switch (cmd) { + default: DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0; + case SIOCADDMULTI: DEBUG2 (d, ("ioctl SIOCADDMULTI\n")); return 0; + case SIOCDELMULTI: DEBUG2 (d, ("ioctl SIOCDELMULTI\n")); return 0; + case SIOCSIFFLAGS: DEBUG2 (d, ("ioctl SIOCSIFFLAGS\n")); break; + case SIOCSIFADDR: DEBUG2 (d, ("ioctl SIOCSIFADDR\n")); break; + } + + /* We get here only in case of SIFFLAGS or SIFADDR. */ + should_be_up = (ifp->if_flags & IFF_RUNNING) != 0; + if (! was_up && should_be_up) { + /* Interface goes up -- start it. */ + cp_up (d); + cp_start (d); + } else if (was_up && ! should_be_up) { + /* Interface is going down -- stop it. */ + if ((ifp->if_flags & PP_CISCO)) + cp_down (d); + } + return 0; +} + +/* + * Initialization of interface. + * It seems to be never called by upper level? + */ +static void cp_initialize (void *softc) +{ + drv_t *d = softc; + + DEBUG (d, ("cp_initialize\n")); +} +#endif /*NETGRAPH*/ + +/* + * Stop the interface. Called on splimp(). + */ +static void cp_down (drv_t *d) +{ + int s = splhigh (); + + DEBUG (d, ("cp_down\n")); + /* Interface is going down -- stop it. */ + cp_set_dtr (d->chan, 0); + cp_set_rts (d->chan, 0); + d->running = 0; + splx (s); +} + +/* + * Start the interface. Called on splimp(). + */ +static void cp_up (drv_t *d) +{ + int s = splhigh (); + + DEBUG (d, ("cp_up\n")); + cp_set_dtr (d->chan, 1); + cp_set_rts (d->chan, 1); + d->running = 1; + splx (s); +} + +/* + * Start output on the interface. Get another datagram to send + * off of the interface queue, and copy it to the interface + * before starting the output. + */ +static void cp_send (drv_t *d) +{ + struct mbuf *m; + u_short len; + + DEBUG2 (d, ("cp_send, tn=%d te=%d\n", d->chan->tn, d->chan->te)); + + /* No output if the interface is down. */ + if (! d->running) + return; + + /* No output if the modem is off. */ + if (! (d->chan->lloop || d->chan->type != T_SERIAL || + cp_get_dsr (d->chan))) + return; + + while (cp_transmit_space (d->chan)) { + /* Get the packet to send. */ +#ifdef NETGRAPH + IF_DEQUEUE (&d->hi_queue, m); + if (! m) + IF_DEQUEUE (&d->queue, m); +#else + m = sppp_dequeue (&d->pp.pp_if); +#endif + if (! m) + return; +#if (__FreeBSD_version >= 400000 || NBPFILTER > 0) && !defined (NETGRAPH) + if (d->pp.pp_if.if_bpf) + bpf_mtap (&d->pp.pp_if, m); +#endif + len = m->m_pkthdr.len; + if (len >= BUFSZ) + printf ("%s: too long packet: %d bytes: ", + d->name, len); + else if (! m->m_next) + cp_send_packet (d->chan, (u_char*) mtod (m, caddr_t), len, 0); + else { + u_char *buf = d->chan->tbuf[d->chan->te]; + m_copydata (m, 0, len, buf); + cp_send_packet (d->chan, buf, len, 0); + } + m_freem (m); + /* Set up transmit timeout, if the transmit ring is not empty.*/ +#ifdef NETGRAPH + d->timeout = 10; +#else + d->pp.pp_if.if_timer = 10; +#endif + } +#ifndef NETGRAPH + d->pp.pp_if.if_flags |= IFF_OACTIVE; +#endif +} + +/* + * Start output on the interface. + * Always called on splimp(). + */ +static void cp_start (drv_t *d) +{ + int s = splhigh (); + + if (d->running) { + if (! d->chan->dtr) + cp_set_dtr (d->chan, 1); + if (! d->chan->rts) + cp_set_rts (d->chan, 1); + cp_send (d); + } + splx (s); +} + +/* + * Handle transmit timeouts. + * Recover after lost transmit interrupts. + * Always called on splimp(). + */ +static void cp_watchdog (drv_t *d) +{ + int s; + + DEBUG (d, ("device timeout\n")); + if (d->running) { + s = splhigh (); + cp_stop_chan (d->chan); + cp_stop_e1 (d->chan); + cp_start_e1 (d->chan); + cp_start_chan (d->chan, 1, 1, 0, 0); + cp_set_dtr (d->chan, 1); + cp_set_rts (d->chan, 1); + splx (s); + cp_start (d); + } +} + +static void cp_transmit (cp_chan_t *c, void *attachment, int len) +{ + drv_t *d = c->sys; + +#ifdef NETGRAPH + d->timeout = 0; +#else + ++d->pp.pp_if.if_opackets; + d->pp.pp_if.if_flags &= ~IFF_OACTIVE; + d->pp.pp_if.if_timer = 0; +#endif + cp_start (d); +} + +static void cp_receive (cp_chan_t *c, char *data, int len) +{ + drv_t *d = c->sys; + struct mbuf *m; + + if (! d->running) + return; + + m = makembuf (data, len); + if (! m) { + DEBUG (d, ("no memory for packet\n")); +#ifndef NETGRAPH + ++d->pp.pp_if.if_iqdrops; +#endif + return; + } + if (c->debug > 1) + printmbuf (m); +#ifdef NETGRAPH + m->m_pkthdr.rcvif = 0; + ng_queue_data (d->hook, m, 0); +#else + ++d->pp.pp_if.if_ipackets; + m->m_pkthdr.rcvif = &d->pp.pp_if; +#if __FreeBSD_version >= 400000 || NBPFILTER > 0 + /* Check if there's a BPF listener on this interface. + * If so, hand off the raw packet to bpf. */ + if (d->pp.pp_if.if_bpf) + bpf_tap (&d->pp.pp_if, data, len); +#endif + sppp_input (&d->pp.pp_if, m); +#endif +} + +static void cp_error (cp_chan_t *c, int data) +{ + drv_t *d = c->sys; + + switch (data) { + case CP_FRAME: + DEBUG (d, ("frame error\n")); +#ifndef NETGRAPH + ++d->pp.pp_if.if_ierrors; +#endif + break; + case CP_CRC: + DEBUG (d, ("crc error\n")); +#ifndef NETGRAPH + ++d->pp.pp_if.if_ierrors; +#endif + break; + case CP_OVERRUN: + DEBUG (d, ("overrun error\n")); +#ifndef NETGRAPH + ++d->pp.pp_if.if_collisions; + ++d->pp.pp_if.if_ierrors; +#endif + break; + case CP_OVERFLOW: + DEBUG (d, ("overflow error\n")); +#ifndef NETGRAPH + ++d->pp.pp_if.if_ierrors; +#endif + break; + case CP_UNDERRUN: + DEBUG (d, ("underrun error\n")); +#ifdef NETGRAPH + d->timeout = 0; +#else + ++d->pp.pp_if.if_oerrors; + d->pp.pp_if.if_flags &= ~IFF_OACTIVE; + d->pp.pp_if.if_timer = 0; +#endif + cp_start (d); + break; + default: + DEBUG (d, ("error #%d\n", data)); + break; + } +} + +/* + * You also need read, write, open, close routines. + * This should get you started + */ +#if __FreeBSD_version < 500000 +static int cp_open (dev_t dev, int oflags, int devtype, struct proc *p) +#else +static int cp_open (dev_t dev, int oflags, int devtype, struct thread *td) +#endif +{ + int unit = minor (dev); + drv_t *d; + + if (unit >= NBRD*NCHAN || ! (d = channel[unit])) + return ENXIO; + DEBUG2 (d, ("cp_open\n")); + return 0; +} + +/* + * Only called on the LAST close. + */ +#if __FreeBSD_version < 500000 +static int cp_close (dev_t dev, int fflag, int devtype, struct proc *p) +#else +static int cp_close (dev_t dev, int fflag, int devtype, struct thread *td) +#endif +{ + drv_t *d = channel [minor (dev)]; + + DEBUG2 (d, ("cp_close\n")); + return 0; +} + +static int cp_modem_status (cp_chan_t *c) +{ + drv_t *d = c->sys; + int status, s; + + status = d->running ? TIOCM_LE : 0; + s = splhigh (); + if (cp_get_cd (c)) status |= TIOCM_CD; + if (cp_get_cts (c)) status |= TIOCM_CTS; + if (cp_get_dsr (c)) status |= TIOCM_DSR; + if (c->dtr) status |= TIOCM_DTR; + if (c->rts) status |= TIOCM_RTS; + splx (s); + return status; +} + +#if __FreeBSD_version < 500000 +static int cp_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) +#else +static int cp_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +#endif +{ + drv_t *d = channel [minor (dev)]; + cp_chan_t *c = d->chan; + struct serial_statistics *st; + struct e1_statistics *opte1; + int error, s; + char mask[16]; + + switch (cmd) { + case SERIAL_GETREGISTERED: + DEBUG2 (d, ("ioctl: getregistered\n")); + bzero (mask, sizeof(mask)); + for (s=0; spp.pp_if.if_flags & PP_CISCO) ? "cisco" : "ppp"); + return 0; + + case SERIAL_SETPROTO: + DEBUG2 (d, ("ioctl: setproto\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (d->pp.pp_if.if_flags & IFF_RUNNING) + return EBUSY; + if (! strcmp ("cisco", (char*)data)) { + d->pp.pp_flags |= PP_KEEPALIVE; + d->pp.pp_if.if_flags |= PP_CISCO; + } else if (! strcmp ("ppp", (char*)data)) { + d->pp.pp_flags &= ~(PP_KEEPALIVE); + d->pp.pp_if.if_flags &= ~(PP_CISCO); + } else + return EINVAL; + return 0; + + case SERIAL_GETKEEPALIVE: + DEBUG2 (d, ("ioctl: getkeepalive\n")); + if ((d->pp.pp_if.if_flags & PP_CISCO)) + return EINVAL; + *(int*)data = (d->pp.pp_flags & PP_KEEPALIVE) ? 1 : 0; + return 0; + + case SERIAL_SETKEEPALIVE: + DEBUG2 (d, ("ioctl: setkeepalive\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if ((d->pp.pp_if.if_flags & PP_CISCO)) + return EINVAL; + s = splhigh (); + if (*(int*)data) + d->pp.pp_flags |= PP_KEEPALIVE; + else + d->pp.pp_flags &= ~PP_KEEPALIVE; + splx (s); + return 0; +#endif /*NETGRAPH*/ + + case SERIAL_GETMODE: + DEBUG2 (d, ("ioctl: getmode\n")); + *(int*)data = SERIAL_HDLC; + return 0; + + case SERIAL_SETMODE: + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + if (*(int*)data != SERIAL_HDLC) + return EINVAL; + return 0; + + case SERIAL_GETCFG: + DEBUG2 (d, ("ioctl: getcfg\n")); + if (c->type != T_E1 || c->unfram) + return EINVAL; + *(char*)data = c->board->mux ? 'c' : 'a'; + return 0; + + case SERIAL_SETCFG: + DEBUG2 (d, ("ioctl: setcfg\n")); +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_mux (c->board, *((char*)data) == 'c'); + splx (s); + return 0; + + case SERIAL_GETSTAT: + DEBUG2 (d, ("ioctl: getstat\n")); + st = (struct serial_statistics*) data; + st->rintr = c->rintr; + st->tintr = c->tintr; + st->mintr = 0; + st->ibytes = c->ibytes; + st->ipkts = c->ipkts; + st->obytes = c->obytes; + st->opkts = c->opkts; + st->ierrs = c->overrun + c->frame + c->crc; + st->oerrs = c->underrun; + return 0; + + case SERIAL_GETESTAT: + DEBUG2 (d, ("ioctl: getestat\n")); + opte1 = (struct e1_statistics*) data; + opte1->status = c->status; + opte1->cursec = c->cursec; + opte1->totsec = c->totsec + c->cursec; + + opte1->currnt.bpv = c->currnt.bpv; + opte1->currnt.fse = c->currnt.fse; + opte1->currnt.crce = c->currnt.crce; + opte1->currnt.rcrce = c->currnt.rcrce; + opte1->currnt.uas = c->currnt.uas; + opte1->currnt.les = c->currnt.les; + opte1->currnt.es = c->currnt.es; + opte1->currnt.bes = c->currnt.bes; + opte1->currnt.ses = c->currnt.ses; + opte1->currnt.oofs = c->currnt.oofs; + opte1->currnt.css = c->currnt.css; + opte1->currnt.dm = c->currnt.dm; + + opte1->total.bpv = c->total.bpv + c->currnt.bpv; + opte1->total.fse = c->total.fse + c->currnt.fse; + opte1->total.crce = c->total.crce + c->currnt.crce; + opte1->total.rcrce = c->total.rcrce + c->currnt.rcrce; + opte1->total.uas = c->total.uas + c->currnt.uas; + opte1->total.les = c->total.les + c->currnt.les; + opte1->total.es = c->total.es + c->currnt.es; + opte1->total.bes = c->total.bes + c->currnt.bes; + opte1->total.ses = c->total.ses + c->currnt.ses; + opte1->total.oofs = c->total.oofs + c->currnt.oofs; + opte1->total.css = c->total.css + c->currnt.css; + opte1->total.dm = c->total.dm + c->currnt.dm; + for (s=0; s<48; ++s) { + opte1->interval[s].bpv = c->interval[s].bpv; + opte1->interval[s].fse = c->interval[s].fse; + opte1->interval[s].crce = c->interval[s].crce; + opte1->interval[s].rcrce = c->interval[s].rcrce; + opte1->interval[s].uas = c->interval[s].uas; + opte1->interval[s].les = c->interval[s].les; + opte1->interval[s].es = c->interval[s].es; + opte1->interval[s].bes = c->interval[s].bes; + opte1->interval[s].ses = c->interval[s].ses; + opte1->interval[s].oofs = c->interval[s].oofs; + opte1->interval[s].css = c->interval[s].css; + opte1->interval[s].dm = c->interval[s].dm; + } + return 0; + + case SERIAL_CLRSTAT: + DEBUG2 (d, ("ioctl: clrstat\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + c->rintr = 0; + c->tintr = 0; + c->ibytes = 0; + c->obytes = 0; + c->ipkts = 0; + c->opkts = 0; + c->overrun = 0; + c->frame = 0; + c->crc = 0; + c->underrun = 0; + bzero (&c->currnt, sizeof (c->currnt)); + bzero (&c->total, sizeof (c->total)); + bzero (c->interval, sizeof (c->interval)); + return 0; + + case SERIAL_GETBAUD: + DEBUG2 (d, ("ioctl: getbaud\n")); + *(long*)data = c->baud; + return 0; + + case SERIAL_SETBAUD: + DEBUG2 (d, ("ioctl: setbaud\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + cp_set_baud (c, *(long*)data); + splx (s); + return 0; + + case SERIAL_GETLOOP: + DEBUG2 (d, ("ioctl: getloop\n")); + *(int*)data = c->lloop; + return 0; + + case SERIAL_SETLOOP: + DEBUG2 (d, ("ioctl: setloop\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + cp_set_lloop (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETDPLL: + DEBUG2 (d, ("ioctl: getdpll\n")); + if (c->type != T_SERIAL) + return EINVAL; + *(int*)data = c->dpll; + return 0; + + case SERIAL_SETDPLL: + DEBUG2 (d, ("ioctl: setdpll\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + cp_set_dpll (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETNRZI: + DEBUG2 (d, ("ioctl: getnrzi\n")); + if (c->type != T_SERIAL) + return EINVAL; + *(int*)data = c->nrzi; + return 0; + + case SERIAL_SETNRZI: + DEBUG2 (d, ("ioctl: setnrzi\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + cp_set_nrzi (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETDEBUG: + DEBUG2 (d, ("ioctl: getdebug\n")); + *(int*)data = d->chan->debug; + return 0; + + case SERIAL_SETDEBUG: + DEBUG2 (d, ("ioctl: setdebug\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + d->chan->debug = *(int*)data; +#ifndef NETGRAPH + if (d->chan->debug) + d->pp.pp_if.if_flags |= IFF_DEBUG; + else + d->pp.pp_if.if_flags &= ~IFF_DEBUG; +#endif + return 0; + + case SERIAL_GETHIGAIN: + DEBUG2 (d, ("ioctl: gethigain\n")); + if (c->type != T_E1) + return EINVAL; + *(int*)data = c->higain; + return 0; + + case SERIAL_SETHIGAIN: + DEBUG2 (d, ("ioctl: sethigain\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_higain (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETPHONY: + DEBUG2 (d, ("ioctl: getphony\n")); + if (c->type != T_E1) + return EINVAL; + *(int*)data = c->phony; + return 0; + + case SERIAL_SETPHONY: + DEBUG2 (d, ("ioctl: setphony\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_phony (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETUNFRAM: + DEBUG2 (d, ("ioctl: getunfram\n")); + if (c->type != T_E1) + return EINVAL; + *(int*)data = c->unfram; + return 0; + + case SERIAL_SETUNFRAM: + DEBUG2 (d, ("ioctl: setunfram\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_unfram (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETMONITOR: + DEBUG2 (d, ("ioctl: getmonitor\n")); + if (c->type != T_E1) + return EINVAL; + *(int*)data = c->monitor; + return 0; + + case SERIAL_SETMONITOR: + DEBUG2 (d, ("ioctl: setmonitor\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_monitor (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETUSE16: + DEBUG2 (d, ("ioctl: getuse16\n")); + if (c->type != T_E1 || c->unfram) + return EINVAL; + *(int*)data = c->use16; + return 0; + + case SERIAL_SETUSE16: + DEBUG2 (d, ("ioctl: setuse16\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_use16 (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETCRC4: + DEBUG2 (d, ("ioctl: getcrc4\n")); + if (c->type != T_E1 || c->unfram) + return EINVAL; + *(int*)data = c->crc4; + return 0; + + case SERIAL_SETCRC4: + DEBUG2 (d, ("ioctl: setcrc4\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_crc4 (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETCLK: + DEBUG2 (d, ("ioctl: getclk\n")); + if (c->type != T_E1 && c->type != T_G703) + return EINVAL; + switch (c->gsyn) { + default: *(int*)data = E1CLK_INTERNAL; break; + case GSYN_RCV: *(int*)data = E1CLK_RECEIVE; break; + case GSYN_RCV0: *(int*)data = E1CLK_RECEIVE_CHAN0; break; + case GSYN_RCV1: *(int*)data = E1CLK_RECEIVE_CHAN1; break; + case GSYN_RCV2: *(int*)data = E1CLK_RECEIVE_CHAN2; break; + case GSYN_RCV3: *(int*)data = E1CLK_RECEIVE_CHAN3; break; + } + return 0; + + case SERIAL_SETCLK: + DEBUG2 (d, ("ioctl: setclk\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1 && c->type != T_G703) + return EINVAL; + s = splhigh (); + switch (*(int*)data) { + default: cp_set_gsyn (c, GSYN_INT); break; + case E1CLK_RECEIVE: cp_set_gsyn (c, GSYN_RCV); break; + case E1CLK_RECEIVE_CHAN0: cp_set_gsyn (c, GSYN_RCV0); break; + case E1CLK_RECEIVE_CHAN1: cp_set_gsyn (c, GSYN_RCV1); break; + case E1CLK_RECEIVE_CHAN2: cp_set_gsyn (c, GSYN_RCV2); break; + case E1CLK_RECEIVE_CHAN3: cp_set_gsyn (c, GSYN_RCV3); break; + } + splx (s); + return 0; + + case SERIAL_GETTIMESLOTS: + DEBUG2 (d, ("ioctl: gettimeslots\n")); + if (c->type != T_E1 || c->unfram) + return EINVAL; + *(u_long*)data = c->ts; + return 0; + + case SERIAL_SETTIMESLOTS: + DEBUG2 (d, ("ioctl: settimeslots\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_E1) + return EINVAL; + s = splhigh (); + cp_set_ts (c, *(u_long*)data); + splx (s); + return 0; + + case SERIAL_GETINVCLK: + DEBUG2 (d, ("ioctl: getinvclk\n")); +#if 1 + return EINVAL; +#else + if (c->type != T_SERIAL) + return EINVAL; + *(int*)data = c->invtxc; + return 0; +#endif + + case SERIAL_SETINVCLK: + DEBUG2 (d, ("ioctl: setinvclk\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + cp_set_invtxc (c, *(int*)data); + cp_set_invrxc (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETINVTCLK: + DEBUG2 (d, ("ioctl: getinvtclk\n")); + if (c->type != T_SERIAL) + return EINVAL; + *(int*)data = c->invtxc; + return 0; + + case SERIAL_SETINVTCLK: + DEBUG2 (d, ("ioctl: setinvtclk\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + cp_set_invtxc (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETINVRCLK: + DEBUG2 (d, ("ioctl: getinvrclk\n")); + if (c->type != T_SERIAL) + return EINVAL; + *(int*)data = c->invrxc; + return 0; + + case SERIAL_SETINVRCLK: + DEBUG2 (d, ("ioctl: setinvrclk\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + cp_set_invrxc (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETLEVEL: + DEBUG2 (d, ("ioctl: getlevel\n")); + if (c->type != T_G703) + return EINVAL; + s = splhigh (); + *(int*)data = cp_get_lq (c); + splx (s); + return 0; + + case SERIAL_RESET: + DEBUG2 (d, ("ioctl: reset\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + cp_reset (c->board, 0, 0); + splx (s); + return 0; + + case SERIAL_HARDRESET: + DEBUG2 (d, ("ioctl: hardreset\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + /* hard_reset (c->board); */ + splx (s); + return 0; + + case SERIAL_GETCABLE: + DEBUG2 (d, ("ioctl: getcable\n")); + if (c->type != T_SERIAL) + return EINVAL; + s = splhigh (); + *(int*)data = cp_get_cable (c); + splx (s); + return 0; + + case SERIAL_GETDIR: + DEBUG2 (d, ("ioctl: getdir\n")); + if (c->type != T_E1) + return EINVAL; + *(int*)data = c->dir; + return 0; + + case SERIAL_SETDIR: + DEBUG2 (d, ("ioctl: setdir\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + cp_set_dir (c, *(int*)data); + splx (s); + return 0; + + case SERIAL_GETDXC: + DEBUG2 (d, ("ioctl: getdxc\n")); + if (c->type != T_E1) + return EINVAL; + *(cp_dxc_t*)data = c->dxc; + return 0; + + case SERIAL_SETDXC: + DEBUG2 (d, ("ioctl: setdxc\n")); + /* Only for superuser! */ +#if __FreeBSD_version < 400000 + error = suser (p->p_ucred, &p->p_acflag); +#elif __FreeBSD_version < 500000 + error = suser (p); +#else + error = suser_td (td); +#endif + if (error) + return error; + s = splhigh (); + cp_set_dxc (c, (cp_dxc_t*)data); + splx (s); + return 0; + + case TIOCSDTR: /* Set DTR */ + s = splhigh (); + cp_set_dtr (c, 1); + splx (s); + return 0; + + case TIOCCDTR: /* Clear DTR */ + s = splhigh (); + cp_set_dtr (c, 0); + splx (s); + return 0; + + case TIOCMSET: /* Set DTR/RTS */ + s = splhigh (); + cp_set_dtr (c, (*(int*)data & TIOCM_DTR) ? 1 : 0); + cp_set_rts (c, (*(int*)data & TIOCM_RTS) ? 1 : 0); + splx (s); + return 0; + + case TIOCMBIS: /* Add DTR/RTS */ + s = splhigh (); + if (*(int*)data & TIOCM_DTR) cp_set_dtr (c, 1); + if (*(int*)data & TIOCM_RTS) cp_set_rts (c, 1); + splx (s); + return 0; + + case TIOCMBIC: /* Clear DTR/RTS */ + s = splhigh (); + if (*(int*)data & TIOCM_DTR) cp_set_dtr (c, 0); + if (*(int*)data & TIOCM_RTS) cp_set_rts (c, 0); + splx (s); + return 0; + + case TIOCMGET: /* Get modem status */ + *(int*)data = cp_modem_status (c); + return 0; + } + return ENOTTY; +} + +#if __FreeBSD_version < 400000 +static struct cdevsw cp_cdevsw = { + cp_open, cp_close, noread, nowrite, + cp_ioctl, nullstop, nullreset, nodevtotty, + seltrue, nommap, NULL, "cp", + NULL, -1 + }; +#elif __FreeBSD_version < 500000 +static struct cdevsw cp_cdevsw = { + cp_open, cp_close, noread, nowrite, + cp_ioctl, nopoll, nommap, nostrategy, + "taupci", CDEV_MAJOR, nodump, nopsize, + D_NAGGED, -1 + }; +#else +static struct cdevsw cp_cdevsw = { + cp_open, cp_close, noread, nowrite, + cp_ioctl, nopoll, nommap, nostrategy, + "taupci", CDEV_MAJOR, nodump, nopsize, + D_NAGGED, + }; +#endif + +#ifdef NETGRAPH +static int ng_cp_constructor (node_p *nodep) +{ + return EINVAL; +} + +static int ng_cp_newhook (node_p node, hook_p hook, const char *name) +{ +#if __FreeBSD_version >= 500000 + drv_t *d = node->nd_private; +#else + drv_t *d = node->private; +#endif + int s; + + /* Attach debug hook */ + if (strcmp (name, NG_CP_HOOK_DEBUG) == 0) { + hook->private = 0; + d->debug_hook = hook; + return 0; + } + + /* Check for raw hook */ + if (strcmp (name, NG_CP_HOOK_RAW) != 0) + return EINVAL; + + hook->private = d; + d->hook = hook; + cp_up (d); + return 0; +} + +static char *format_timeslots (u_long s) +{ + static char buf [100]; + char *p = buf; + int i; + + for (i=1; i<32; ++i) + if ((s >> i) & 1) { + int prev = (i > 1) & (s >> (i-1)); + int next = (i < 31) & (s >> (i+1)); + + if (prev) { + if (next) + continue; + *p++ = '-'; + } else if (p > buf) + *p++ = ','; + + if (i >= 10) + *p++ = '0' + i / 10; + *p++ = '0' + i % 10; + } + *p = 0; + return buf; +} + +static int print_modems (char *s, cp_chan_t *c, int need_header) +{ + int status = cp_modem_status (c); + int length = 0; + + if (need_header) + length += sprintf (s + length, " LE DTR DSR RTS CTS CD\n"); + length += sprintf (s + length, "%4s %4s %4s %4s %4s %4s\n", + status & TIOCM_LE ? "On" : "-", + status & TIOCM_DTR ? "On" : "-", + status & TIOCM_DSR ? "On" : "-", + status & TIOCM_RTS ? "On" : "-", + status & TIOCM_CTS ? "On" : "-", + status & TIOCM_CD ? "On" : "-"); + return length; +} + +static int print_stats (char *s, cp_chan_t *c, int need_header) +{ + int length = 0; + + if (need_header) + length += sprintf (s + length, " Rintr Tintr Mintr Ibytes Ipkts Ierrs Obytes Opkts Oerrs\n"); + length += sprintf (s + length, "%7ld %7ld %7ld %8lu %7ld %7ld %8lu %7ld %7ld\n", + c->rintr, c->tintr, 0l, (unsigned long) c->ibytes, + c->ipkts, c->overrun + c->frame + c->crc, + (unsigned long) c->obytes, c->opkts, c->underrun); + return length; +} + +static char *format_e1_status (u_char status) +{ + static char buf [80]; + + if (status & E1_NOALARM) + return "Ok"; + buf[0] = 0; + if (status & E1_LOS) strcat (buf, ",LOS"); + if (status & E1_AIS) strcat (buf, ",AIS"); + if (status & E1_LOF) strcat (buf, ",LOF"); + if (status & E1_LOMF) strcat (buf, ",LOMF"); + if (status & E1_FARLOF) strcat (buf, ",FARLOF"); + if (status & E1_AIS16) strcat (buf, ",AIS16"); + if (status & E1_FARLOMF) strcat (buf, ",FARLOMF"); + if (status & E1_TSTREQ) strcat (buf, ",TSTREQ"); + if (status & E1_TSTERR) strcat (buf, ",TSTERR"); + if (buf[0] == ',') + return buf+1; + return "Unknown"; +} + +static int print_frac (char *s, int leftalign, u_long numerator, u_long divider) +{ + int n, length = 0; + + if (numerator < 1 || divider < 1) { + length += sprintf (s+length, leftalign ? "/- " : " -"); + return length; + } + n = (int) (0.5 + 1000.0 * numerator / divider); + if (n < 1000) { + length += sprintf (s+length, leftalign ? "/.%-3d" : " .%03d", n); + return length; + } + *(s + length) = leftalign ? '/' : ' '; + length ++; + + if (n >= 1000000) n = (n+500) / 1000 * 1000; + else if (n >= 100000) n = (n+50) / 100 * 100; + else if (n >= 10000) n = (n+5) / 10 * 10; + + switch (n) { + case 1000: length += printf (s+length, ".999"); return length; + case 10000: n = 9990; break; + case 100000: n = 99900; break; + case 1000000: n = 999000; break; + } + if (n < 10000) length += sprintf (s+length, "%d.%d", n/1000, n/10%100); + else if (n < 100000) length += sprintf (s+length, "%d.%d", n/1000, n/100%10); + else if (n < 1000000) length += sprintf (s+length, "%d.", n/1000); + else length += sprintf (s+length, "%d", n/1000); + + return length; +} + +static int print_e1_stats (char *s, cp_chan_t *c) +{ + struct e1_counters total; + u_long totsec; + int length = 0; + + totsec = c->totsec + c->cursec; + total.bpv = c->total.bpv + c->currnt.bpv; + total.fse = c->total.fse + c->currnt.fse; + total.crce = c->total.crce + c->currnt.crce; + total.rcrce = c->total.rcrce + c->currnt.rcrce; + total.uas = c->total.uas + c->currnt.uas; + total.les = c->total.les + c->currnt.les; + total.es = c->total.es + c->currnt.es; + total.bes = c->total.bes + c->currnt.bes; + total.ses = c->total.ses + c->currnt.ses; + total.oofs = c->total.oofs + c->currnt.oofs; + total.css = c->total.css + c->currnt.css; + total.dm = c->total.dm + c->currnt.dm; + + length += sprintf (s + length, " Unav/Degr Bpv/Fsyn CRC/RCRC Err/Lerr Sev/Bur Oof/Slp Status\n"); + + /* Unavailable seconds, degraded minutes */ + length += print_frac (s + length, 0, c->currnt.uas, c->cursec); + length += print_frac (s + length, 1, 60 * c->currnt.dm, c->cursec); + + /* Bipolar violations, frame sync errors */ + length += print_frac (s + length, 0, c->currnt.bpv, c->cursec); + length += print_frac (s + length, 1, c->currnt.fse, c->cursec); + + /* CRC errors, remote CRC errors (E-bit) */ + length += print_frac (s + length, 0, c->currnt.crce, c->cursec); + length += print_frac (s + length, 1, c->currnt.rcrce, c->cursec); + + /* Errored seconds, line errored seconds */ + length += print_frac (s + length, 0, c->currnt.es, c->cursec); + length += print_frac (s + length, 1, c->currnt.les, c->cursec); + + /* Severely errored seconds, burst errored seconds */ + length += print_frac (s + length, 0, c->currnt.ses, c->cursec); + length += print_frac (s + length, 1, c->currnt.bes, c->cursec); + + /* Out of frame seconds, controlled slip seconds */ + length += print_frac (s + length, 0, c->currnt.oofs, c->cursec); + length += print_frac (s + length, 1, c->currnt.css, c->cursec); + + length += sprintf (s + length, " %s\n", format_e1_status (c->status)); + + /* Print total statistics. */ + length += print_frac (s + length, 0, total.uas, totsec); + length += print_frac (s + length, 1, 60 * total.dm, totsec); + + length += print_frac (s + length, 0, total.bpv, totsec); + length += print_frac (s + length, 1, total.fse, totsec); + + length += print_frac (s + length, 0, total.crce, totsec); + length += print_frac (s + length, 1, total.rcrce, totsec); + + length += print_frac (s + length, 0, total.es, totsec); + length += print_frac (s + length, 1, total.les, totsec); + + length += print_frac (s + length, 0, total.ses, totsec); + length += print_frac (s + length, 1, total.bes, totsec); + + length += print_frac (s + length, 0, total.oofs, totsec); + length += print_frac (s + length, 1, total.css, totsec); + + length += sprintf (s + length, " -- Total\n"); + return length; +} + +static int print_chan (char *s, cp_chan_t *c) +{ + drv_t *d = c->sys; + int length = 0; + + length += sprintf (s + length, "cp%d", c->board->num * NCHAN + c->num); + if (d->chan->debug) + length += sprintf (s + length, " debug=%d", d->chan->debug); + + switch (c->gmode) { + case GCFG_DUAL: length += sprintf (s + length, " cfg=A"); break; + case GCFG_MUX: length += sprintf (s + length, " cfg=C"); break; + default: length += sprintf (s + length, " cfg=unknown"); break; + } + + if (c->baud) + length += sprintf (s + length, " %ld", c->baud); + else + length += sprintf (s + length, " extclock"); + + if (c->type == T_E1 || c->type == T_G703) + switch (c->gsyn) { + case GSYN_INT : length += sprintf (s + length, " syn=int"); break; + case GSYN_RCV : length += sprintf (s + length, " syn=rcv"); break; + case GSYN_XRCV : length += sprintf (s + length, " syn=xrcv"); break; + } + if (c->type == T_SERIAL) { + length += sprintf (s + length, " dpll=%s", c->dpll ? "on" : "off"); + length += sprintf (s + length, " nrzi=%s", c->nrzi ? "on" : "off"); + length += sprintf (s + length, " invclk=%s", c->invtxc ? "on" : "off"); + } + if (c->type == T_E1) + length += sprintf (s + length, " higain=%s", c->higain ? "on" : "off"); + + length += sprintf (s + length, " loop=%s", c->lloop ? "on" : "off"); + + if (c->type == T_E1) + length += sprintf (s + length, " ts=%s", format_timeslots (c->ts)); + if (c->type == T_E1 && c->gmode == GCFG_MUX) + length += sprintf (s + length, " pass=%s", format_timeslots (c->subts)); + if (c->type == T_G703) { + int lq, x; + + x = splhigh (); + lq = cp_get_lq (c); + splx (x); + length += sprintf (s + length, " (level=-%.1fdB)", lq / 10.0); + } + length += sprintf (s + length, "\n"); + return length; +} + +static int ng_cp_rcvmsg (node_p node, struct ng_mesg *msg, + const char *retaddr, struct ng_mesg **resp) +{ +#if __FreeBSD_version >= 500000 + drv_t *d = node->nd_private; +#else + drv_t *d = node->private; +#endif + int error = 0; + + switch (msg->header.typecookie) { + default: + error = EINVAL; + break; + + case NGM_CP_COOKIE: + printf ("Not implemented yet\n"); + error = EINVAL; + break; + + case NGM_GENERIC_COOKIE: + switch (msg->header.cmd) { + default: + error = EINVAL; + break; + + case NGM_TEXT_STATUS: { + char *s; + int l = 0; + int dl = sizeof (struct ng_mesg) + 730; + + MALLOC (*resp, struct ng_mesg *, dl, + M_NETGRAPH, M_NOWAIT); + if (! *resp) { + error = ENOMEM; + break; + } + bzero (*resp, dl); + s = (*resp)->data; + if (d) { + l += print_chan (s + l, d->chan); + l += print_stats (s + l, d->chan, 1); + l += print_modems (s + l, d->chan, 1); + l += print_e1_stats (s + l, d->chan); + } else + l += sprintf (s + l, "Error: node not connect to channel"); + (*resp)->header.version = NG_VERSION; + (*resp)->header.arglen = strlen (s) + 1; + (*resp)->header.token = msg->header.token; + (*resp)->header.typecookie = NGM_CP_COOKIE; + (*resp)->header.cmd = msg->header.cmd; + strncpy ((*resp)->header.cmdstr, "status", NG_CMDSTRLEN); + } + break; + } + break; + } + FREE (msg, M_NETGRAPH); + return error; +} + +static int ng_cp_rcvdata (hook_p hook, struct mbuf *m, meta_p meta) +{ +#if __FreeBSD_version >= 500000 + drv_t *d = hook->node->nd_private; +#else + drv_t *d = hook->node->private; +#endif + struct ifqueue *q; + int s; + + if (! hook->private || ! d) { + NG_FREE_DATA (m,meta); + return ENETDOWN; + } + q = (meta && meta->priority > 0) ? &d->hi_queue : &d->queue; + s = splhigh (); + if (IF_QFULL (q)) { + IF_DROP (q); + splx (s); + NG_FREE_DATA (m, meta); + return ENOBUFS; + } + IF_ENQUEUE (q, m); + splx (s); + cp_start (d); + return 0; +} + +static int ng_cp_rmnode (node_p node) +{ + int s; + +#if __FreeBSD_version >= 500000 + drv_t *d = node->nd_private; +#else + drv_t *d = node->private; +#endif + + if (d && d->running) + cp_down (d); + node->flags |= NG_INVALID; + ng_cutlinks (node); +#ifdef KLD_MODULE +#if __FreeBSD_version >= 400000 + /* We do so because of pci module problem, see also comment in + cp_unload. Not in 4.x. */ + ng_unname (node); + ng_unref (node); +#else + node->flags &= ~NG_INVALID; +#endif +#endif + return 0; +} + +static void ng_cp_watchdog (void *arg) +{ + drv_t *d = arg; + + if (d) { + if (d->timeout == 1) + cp_watchdog (d); + if (d->timeout) + d->timeout--; + d->timeout_handle = timeout (ng_cp_watchdog, d, hz); + } +} + +static int ng_cp_connect (hook_p hook) +{ +#if __FreeBSD_version >= 500000 + drv_t *d = hook->node->nd_private; +#else + drv_t *d = hook->node->private; +#endif + + if (d) + d->timeout_handle = timeout (ng_cp_watchdog, d, hz); + return 0; +} + +static int ng_cp_disconnect (hook_p hook) +{ +#if __FreeBSD_version >= 500000 + drv_t *d = hook->node->nd_private; +#else + drv_t *d = hook->node->private; +#endif + + if (d) { + if (hook->private) + cp_down (d); + untimeout (ng_cp_watchdog, d, d->timeout_handle); + } + return 0; +} +#endif + +#if __FreeBSD_version < 400000 + +#ifdef KLD_MODULE +extern STAILQ_HEAD(devlist, pci_devinfo) pci_devq; + +static +struct pci_devinfo *pci_device_find (u_int16_t device, u_int16_t vendor, int unit) +{ + pcicfgregs *cfg; + struct pci_devinfo *dinfo; + int u=0,i; + + for (dinfo = STAILQ_FIRST (&pci_devq), i=0; + dinfo && (i < pci_numdevs); + dinfo = STAILQ_NEXT (dinfo, pci_links), i++) { + cfg = &dinfo->cfg; + if ((device == cfg->device) && (vendor == cfg->vendor)) { + if (u == unit) + return dinfo; + u++; + } + } + return 0; +} + +/* + * Function called when loading the driver. + */ +static int cp_load (void) +{ + int i, s; + pcicfgregs *cfg; + struct pci_devinfo *dinfo; + + s = splhigh (); + for (i=0; icfg; + cp_attach (cfg, i); + dinfo->device = &cp_driver; + strncpy (dinfo->conf.pd_name, cp_driver.pd_name, + sizeof(dinfo->conf.pd_name)); + dinfo->conf.pd_name[sizeof(dinfo->conf.pd_name) - 1] = 0; + dinfo->conf.pd_unit = i; + } + splx (s); + if (! i) { + /* Deactivate the timeout routine. */ + untimeout (cp_timeout, 0, timeout_handle); + return ENXIO; + } + return 0; +} + +/* + * Function called when unloading the driver. + */ +static int cp_unload (void) +{ +#if 0 + /* Currently pci loadable module not fully supported, so we just + return EBUSY. Do not forget to correct ng_cp_rmnode then probelm + would be solved. */ + return EBUSY; +#else + int i, s; + + /* Check if the device is busy (open). */ + for (i=0; ichan->type && d->running) + return EBUSY; + } + + s = splhigh (); + + /* Deactivate the timeout routine. */ + untimeout (cp_timeout, 0, timeout_handle); + + /* OK to unload the driver, unregister the interrupt first. */ + for (i=0; iport) + continue; + + cp_reset (b, 0 ,0); + pci_unmap_int (tag, cp_intr, b, &net_imask); + /* Here should be something like pci_unmap_mem ()*/ + } + + for (i=0; i= 400000 || NBPFILTER > 0 + /* Detach from the packet filter list of interfaces. */ + { + struct bpf_if *q, **b = &bpf_iflist; + + while ((q = *b)) { + if (q->bif_ifp == d->pp.pp_if) { + *b = q->bif_next; + free (q, M_DEVBUF); + } + b = &(q->bif_next); + } + } +#endif + /* Detach from the sync PPP list. */ + sppp_detach (&d->pp.pp_if); + + /* Detach from the system list of interfaces. */ + { + struct ifaddr *ifa; + TAILQ_FOREACH (ifa, &d->pp.pp_if.if_addrhead, ifa_link) { + TAILQ_REMOVE (&d->pp.pp_if.if_addrhead, ifa, ifa_link); + free (ifa, M_IFADDR); + } + TAILQ_REMOVE (&ifnet, &d->pp.pp_if, if_link); + } +#endif + /* Deallocate buffers. */ +/* free (d, M_DEVBUF);*/ + } + + for (i=0; iport) + free (b, M_DEVBUF); + } + splx (s); + return 0; +#endif +} +#endif +#endif + +#if __FreeBSD_version < 400000 +#ifdef KLD_MODULE +static int cp_modevent (module_t mod, int type, void *unused) +{ + dev_t dev; + + switch (type) { + case MOD_LOAD: + dev = makedev (CDEV_MAJOR, 0); + cdevsw_add (&dev, &cp_cdevsw, 0); + timeout_handle = timeout (cp_timeout, 0, hz*5); + return cp_load (); + case MOD_UNLOAD: + return cp_unload (); + case MOD_SHUTDOWN: + break; + } + return 0; +} +#endif /* KLD_MODULE */ + +#else /* __FreeBSD_version < 400000 */ +static int cp_modevent (module_t mod, int type, void *unused) +{ + dev_t dev; + static int load_count = 0; + + dev = makedev (CDEV_MAJOR, 0); + switch (type) { + case MOD_LOAD: + if (devsw (dev)) { + printf ("Tau-PCI driver is already in system\n"); + return (ENXIO); + } + ++load_count; + cdevsw_add (&cp_cdevsw); + timeout_handle = timeout (cp_timeout, 0, hz*5); + break; + case MOD_UNLOAD: + if (devsw (dev) && (load_count == 1)) { + printf ("Removing device entry for Tau-PCI\n"); + cdevsw_remove (&cp_cdevsw); + } + --load_count; + break; + case MOD_SHUTDOWN: + break; + } + return 0; +} +#endif /* __FreeBSD_version < 400000 */ + +#ifdef NETGRAPH +static struct ng_type typestruct = { +#if __FreeBSD_version >= 500000 + NG_ABI_VERSION, +#else + NG_VERSION, +#endif + NG_CP_NODE_TYPE, +#if __FreeBSD_version < 400000 && (defined KLD_MODULE) + cp_modevent, +#else + NULL, +#endif + ng_cp_constructor, + ng_cp_rcvmsg, + ng_cp_rmnode, + ng_cp_newhook, + NULL, + ng_cp_connect, + ng_cp_rcvdata, + ng_cp_disconnect, + NULL +}; + +NETGRAPH_INIT_ORDERED (cp, &typestruct, SI_SUB_DRIVERS,\ + SI_ORDER_MIDDLE + CDEV_MAJOR); +#endif /*NETGRAPH*/ + +#if __FreeBSD_version < 400000 +#ifdef KLD_MODULE +#ifndef NETGRAPH +static moduledata_t cpmod = { "cp", cp_modevent, NULL}; +DECLARE_MODULE (cp, cpmod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE + CDEV_MAJOR); +#endif +#else /* KLD_MODULE */ + +/* + * Now for some driver initialisation. + * Occurs ONCE during boot (very early). + * This is if we are NOT a loadable module. + */ +static void cp_drvinit (void *unused) +{ + dev_t dev; + + dev = makedev (CDEV_MAJOR, 0); + cdevsw_add (&dev, &cp_cdevsw, 0); + + /* Activate the timeout routine. */ + timeout_handle = timeout (cp_timeout, 0, hz); +#ifdef NETGRAPH +#if 0 + /* Register our node type in netgraph */ + if (ng_newtype (&typestruct)) + printf ("Failed to register ng_cp\n"); +#endif +#endif +} + +SYSINIT (cpdev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR, cp_drvinit, 0) + +#endif /* KLD_MODULE */ +#else +DRIVER_MODULE (if_cp, pci, cp_driver, cp_devclass, cp_modevent, NULL); +#endif +#endif /* NPCI */ diff -u -r -P -N src-old/sys/dev/cp/machdep.h src/sys/dev/cp/machdep.h --- src-old/sys/dev/cp/machdep.h Thu Jan 1 03:00:00 1970 +++ src/sys/dev/cp/machdep.h Thu Oct 25 20:49:19 2001 @@ -0,0 +1,84 @@ +/* + * Cronyx DDK: platform dependent definitions. + * + * Copyright (C) 1998-2001 Cronyx Engineering Ltd. + * Author: Alexander Kvitchenko, + * Roman Kurakin, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ + +/* + * DOS (Borland Turbo C++ 1.0) + */ +#if defined (MSDOS) || defined (__MSDOS__) +# include +# include +# define inb(port) inportb(port) +# define inw(port) inport(port) +# define outb(port,b) outportb(port,b) +# define outw(port,w) outport(port,w) +#else + +/* + * Windows NT + */ +#ifdef NDIS_MINIPORT_DRIVER +# include +# define inb(port) inp((unsigned short)(port)) +# define inw(port) inpw((unsigned short)(port)) +# define outb(port,b) outp((unsigned short)(port),b) +# define outw(port,w) outpw((unsigned short)(port),(unsigned short)(w)) +#pragma warning (disable: 4761) +#pragma warning (disable: 4242) +#pragma warning (disable: 4244) +#define ulong64 unsigned __int64 +#else + +/* + * Linux + */ +#ifdef __linux__ +# undef REALLY_SLOW_IO +# include /* should swap outb() arguments */ +# include + static inline void __ddk_outb (unsigned port, unsigned char byte) + { outb (byte, port); } + static inline void __ddk_outw (unsigned port, unsigned short word) + { outw (word, port); } +# undef outb +# undef outw +# define outb(port,val) __ddk_outb(port, val) +# define outw(port,val) __ddk_outw(port, val) +#else + +/* + * FreeBSD and BSD/OS + */ +#ifdef __FreeBSD__ +# include +# include +# include +# include +# define memset(a,b,c) bzero (a,c) +#endif +#endif +#endif +#endif + +#ifndef INLINE +# if __GNUC__ >= 2 +# define inline __inline__ +# else +# define inline /**/ +# endif +#endif + +#ifndef ulong64 +#define ulong64 unsigned long long +#endif diff -u -r -P -N src-old/sys/dev/cp/ng_cp.h src/sys/dev/cp/ng_cp.h --- src-old/sys/dev/cp/ng_cp.h Thu Jan 1 03:00:00 1970 +++ src/sys/dev/cp/ng_cp.h Wed Mar 6 17:46:28 2002 @@ -0,0 +1,27 @@ +/* + * Defines for Cronyx-Tau-PCI adapter driver. + * + * Copyright (C) 1999-2002 Cronyx Engineering Ltd. + * Author: Kurakin Roman, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ + +#ifdef NETGRAPH + +#ifndef _CP_NETGRAPH_H_ +#define _CP_NETGRAPH_H_ + +#define NG_CP_NODE_TYPE "cp" +#define NGM_CP_COOKIE 941049562 +#define NG_CP_HOOK_RAW "rawdata" +#define NG_CP_HOOK_DEBUG "debug" + +#endif /* _CP_NETGRAPH_H_ */ + +#endif /* NETGRAPH */ diff -u -r -P -N src-old/sys/i386/conf/NOTES src/sys/i386/conf/NOTES --- src-old/sys/i386/conf/NOTES Wed Mar 6 19:57:37 2002 +++ src/sys/i386/conf/NOTES Wed Mar 6 19:35:14 2002 @@ -11,7 +11,7 @@ # Please use ``make LINT'' to create an old-style LINT file if you want to # do kernel test-builds. # -# $FreeBSD: src/sys/i386/conf/NOTES,v 1.1001 2002/03/04 03:51:20 alfred Exp $ +# $FreeBSD: src/sys/i386/conf/NOTES,v 1.1000 2002/02/18 15:46:10 jedgar Exp $ # # @@ -1736,6 +1736,8 @@ # cnw: Xircom CNW/Netware Airsurfer PC Card adapter # cm: Arcnet SMC COM90c26 / SMC COM90c56 # (and SMC COM90c66 in '56 compatibility mode) adapters. +# cp: Cronyx/Tau-PCI multiport sync adapter +# V.35/RS232/RS449/RS530/E1/G.703/X.21 # cs: IBM Etherjet and other Crystal Semi CS89x0-based adapters # cx: Cronyx/Sigma multiport sync/async (with Cisco or PPP framing) # dc: Support for PCI fast ethernet adapters based on the DEC/Intel 21143 @@ -1936,6 +1938,9 @@ device oltr hint.oltr.0.at="isa" +# PCI Serial cards. +device cp # Cronyx/Tau-PCI adapter(s) + # PCI Ethernet NICs that use the common MII bus controller code. device dc # DEC/Intel 21143 and various workalikes device fxp # Intel EtherExpress PRO/100B (82557, 82558) @@ -2853,8 +2858,6 @@ device urio # USB scanners device uscanner -# USB Fm Radio -device ufm # # ADMtek USB ethernet. Supports the LinkSys USB100TX, # the Billionton USB100, the Melco LU-ATX, the D-Link DSB-650TX diff -u -r -P -N src-old/sys/i386/include/cserial.h src/sys/i386/include/cserial.h --- src-old/sys/i386/include/cserial.h Thu Jan 1 03:00:00 1970 +++ src/sys/i386/include/cserial.h Tue Feb 5 11:21:34 2002 @@ -0,0 +1,408 @@ +/* + * Ioctl interface to Cronyx serial drivers. + * + * Copyright (C) 1997-2000 Cronyx Engineering Ltd. + * Author: Serge Vakulenko, + * + * This software is distributed with NO WARRANTIES, not even the implied + * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Authors grant any other persons or organisations permission to use + * or modify this software as long as this message is kept with the software, + * all derivative works or modified versions. + */ +/* + * General channel statistics. + */ +struct serial_statistics { + unsigned long rintr; /* receive interrupts */ + unsigned long tintr; /* transmit interrupts */ + unsigned long mintr; /* modem interrupts */ + unsigned long ibytes; /* input bytes */ + unsigned long ipkts; /* input packets */ + unsigned long ierrs; /* input errors */ + unsigned long obytes; /* output bytes */ + unsigned long opkts; /* output packets */ + unsigned long oerrs; /* output errors */ +}; + +/* + * Statistics for E1/G703 channels. + */ +struct e1_counters { + unsigned long bpv; /* bipolar violations */ + unsigned long fse; /* frame sync errors */ + unsigned long crce; /* CRC errors */ + unsigned long rcrce; /* remote CRC errors (E-bit) */ + unsigned long uas; /* unavailable seconds */ + unsigned long les; /* line errored seconds */ + unsigned long es; /* errored seconds */ + unsigned long bes; /* bursty errored seconds */ + unsigned long ses; /* severely errored seconds */ + unsigned long oofs; /* out of frame seconds */ + unsigned long css; /* controlled slip seconds */ + unsigned long dm; /* degraded minutes */ +}; + +struct e1_statistics { + unsigned long status; /* line status bit mask */ + unsigned long cursec; /* seconds in current interval */ + unsigned long totsec; /* total seconds elapsed */ + struct e1_counters currnt; /* current 15-min interval data */ + struct e1_counters total; /* total statistics data */ + struct e1_counters interval [48]; /* 12 hour period data */ +}; + +#define M_ASYNC 0 /* asynchronous mode */ +#define M_HDLC 1 /* bit-sync mode (HDLC) */ +#define M_G703 2 +#define M_E1 3 + +/* + * Receive error codes. + */ +#define ER_FRAMING 1 /* framing error */ +#define ER_CHECKSUM 2 /* parity/CRC error */ +#define ER_BREAK 3 /* break state */ +#define ER_OVERFLOW 4 /* receive buffer overflow */ +#define ER_OVERRUN 5 /* receive fifo overrun */ +#define ER_UNDERRUN 6 /* transmit fifo underrun */ +#define ER_SCC_FRAMING 7 /* subchannel framing error */ +#define ER_SCC_OVERFLOW 8 /* subchannel receive buffer overflow */ +#define ER_SCC_OVERRUN 9 /* subchannel receiver overrun */ + +/* + * E1 channel status. + */ +#define E1_NOALARM 0x0001 /* no alarm present */ +#define E1_FARLOF 0x0002 /* receiving far loss of framing */ +#define E1_AIS 0x0008 /* receiving all ones */ +#define E1_LOF 0x0020 /* loss of framing */ +#define E1_LOS 0x0040 /* loss of signal */ +#define E1_AIS16 0x0100 /* receiving all ones in timeslot 16 */ +#define E1_FARLOMF 0x0200 /* receiving alarm in timeslot 16 */ +#define E1_LOMF 0x0400 /* loss of multiframe sync */ +#define E1_TSTREQ 0x0800 /* test code detected */ +#define E1_TSTERR 0x1000 /* test error */ + +/* + * Query the mask of all registered channels, max 128. + */ +#define SERIAL_GETREGISTERED _IOR ('x', 0, char[16]) + +/* + * Attach/detach the protocol to the channel. + * The protocol is given by it's name, char[8]. + * For example "async", "hdlc", "cisco", "fr", "ppp". + */ +#define SERIAL_GETPROTO _IOR ('x', 1, char [8]) +#define SERIAL_SETPROTO _IOW ('x', 1, char [8]) + +/* + * Query/set the hardware mode for the channel. + */ +#define SERIAL_GETMODE _IOR ('x', 2, int) +#define SERIAL_SETMODE _IOW ('x', 2, int) + +#define SERIAL_ASYNC 1 +#define SERIAL_HDLC 2 + +/* + * Get/clear the channel statistics. + */ +#define SERIAL_GETSTAT _IOR ('x', 3, struct serial_statistics) +#define SERIAL_GETESTAT _IOR ('x', 3, struct e1_statistics) +#define SERIAL_CLRSTAT _IO ('x', 3) + +/* + * Query/set the synchronization mode and baud rate. + * If baud==0 then the external clock is used. + */ +#define SERIAL_GETBAUD _IOR ('x', 4, long) +#define SERIAL_SETBAUD _IOW ('x', 4, long) + +/* + * Query/set the internal loopback mode, + * useful for debugging purposes. + */ +#define SERIAL_GETLOOP _IOR ('x', 5, int) +#define SERIAL_SETLOOP _IOW ('x', 5, int) + +/* + * Query/set the DPLL mode, commonly used with NRZI + * for channels lacking synchro signals. + */ +#define SERIAL_GETDPLL _IOR ('x', 6, int) +#define SERIAL_SETDPLL _IOW ('x', 6, int) + +/* + * Query/set the NRZI encoding (default is NRZ). + */ +#define SERIAL_GETNRZI _IOR ('x', 7, int) +#define SERIAL_SETNRZI _IOW ('x', 7, int) + +/* + * Invert receive and transmit clock. + */ +#define SERIAL_GETINVCLK _IOR ('x', 8, int) +#define SERIAL_SETINVCLK _IOW ('x', 8, int) + +/* + * Query/set the E1/G703 synchronization mode. + */ +#define SERIAL_GETCLK _IOR ('x', 9, int) +#define SERIAL_SETCLK _IOW ('x', 9, int) + +#define E1CLK_INTERNAL 0 +#define E1CLK_RECEIVE 1 +#define E1CLK_RECEIVE_CHAN0 2 +#define E1CLK_RECEIVE_CHAN1 3 +#define E1CLK_RECEIVE_CHAN2 4 +#define E1CLK_RECEIVE_CHAN3 5 + +/* + * Query/set the E1 timeslot mask. + */ +#define SERIAL_GETTIMESLOTS _IOR ('x', 10, long) +#define SERIAL_SETTIMESLOTS _IOW ('x', 10, long) + +/* + * Query/set the E1 subchannel timeslot mask. + */ +#define SERIAL_GETSUBCHAN _IOR ('x', 11, long) +#define SERIAL_SETSUBCHAN _IOW ('x', 11, long) + +/* + * Query/set the high input sensitivity mode (E1). + */ +#define SERIAL_GETHIGAIN _IOR ('x', 12, int) +#define SERIAL_SETHIGAIN _IOW ('x', 12, int) + +/* + * Query the input signal level in santibells. + */ +#define SERIAL_GETLEVEL _IOR ('x', 13, int) + +/* + * Get the channel name. + */ +#define SERIAL_GETNAME _IOR ('x', 14, char [32]) + +/* + * Get version string. + */ +#define SERIAL_GETVERSIONSTRING _IOR ('x', 15, char [256]) + +/* + * Query/set master channel. + */ +#define SERIAL_GETMASTER _IOR ('x', 16, char [16]) +#define SERIAL_SETMASTER _IOW ('x', 16, char [16]) + +/* + * Query/set keepalive. + */ +#define SERIAL_GETKEEPALIVE _IOR ('x', 17, int) +#define SERIAL_SETKEEPALIVE _IOW ('x', 17, int) + +/* + * Query/set E1 configuration. + */ +#define SERIAL_GETCFG _IOR ('x', 18, char) +#define SERIAL_SETCFG _IOW ('x', 18, char) + +/* + * Query/set debug. + */ +#define SERIAL_GETDEBUG _IOR ('x', 19, int) +#define SERIAL_SETDEBUG _IOW ('x', 19, int) + +/* + * Query/set phony mode (E1). + */ +#define SERIAL_GETPHONY _IOR ('x', 20, int) +#define SERIAL_SETPHONY _IOW ('x', 20, int) + +/* + * Query/set timeslot 16 usage mode (E1). + */ +#define SERIAL_GETUSE16 _IOR ('x', 21, int) +#define SERIAL_SETUSE16 _IOW ('x', 21, int) + +/* + * Query/set crc4 mode (E1). + */ +#define SERIAL_GETCRC4 _IOR ('x', 22, int) +#define SERIAL_SETCRC4 _IOW ('x', 22, int) + +/* + * Query/set the timeout to recover after transmit interrupt loss. + * If timo==0 recover will be disabled. + */ +#define SERIAL_GETTIMO _IOR ('x', 23, long) +#define SERIAL_SETTIMO _IOW ('x', 23, long) + +/* + * Query/set port type for old models of Sigma + * -1 Fixed or cable select + * 0 RS-232 + * 1 V35 + * 2 RS-449 + * 3 E1 (only for Windows 2000) + * 4 G.703 (only for Windows 2000) + * 5 DATA (only for Windows 2000) + */ +#define SERIAL_GETPORT _IOR ('x', 25, int) +#define SERIAL_SETPORT _IOW ('x', 25, int) + +/* + * Add the virtual channel DLCI (Frame Relay). + */ +#define SERIAL_ADDDLCI _IOW ('x', 26, int) + +/* + * Invert receive clock. + */ +#define SERIAL_GETINVRCLK _IOR ('x', 27, int) +#define SERIAL_SETINVRCLK _IOW ('x', 27, int) + +/* + * Invert transmit clock. + */ +#define SERIAL_GETINVTCLK _IOR ('x', 28, int) +#define SERIAL_SETINVTCLK _IOW ('x', 28, int) + +/* + * Unframed E1 mode. + */ +#define SERIAL_GETUNFRAM _IOR ('x', 29, int) +#define SERIAL_SETUNFRAM _IOW ('x', 29, int) + +/* + * E1 monitoring mode. + */ +#define SERIAL_GETMONITOR _IOR ('x', 30, int) +#define SERIAL_SETMONITOR _IOW ('x', 30, int) + +/* + * Interrupt number. + */ +#define SERIAL_GETIRQ _IOR ('x', 31, int) + +/* + * Reset. + */ +#define SERIAL_RESET _IO ('x', 32) + +/* + * Hard reset. + */ +#define SERIAL_HARDRESET _IO ('x', 33) + +/* + * Query cable type. + */ +#define SERIAL_GETCABLE _IOR ('x', 34, int) + +/* + * Assignment of HDLC ports to E1 channels. + */ +#define SERIAL_GETDIR _IOR ('x', 35, int) +#define SERIAL_SETDIR _IOW ('x', 35, int) + +struct dxc_table { /* cross-connector parameters */ + unsigned char ts [32]; /* timeslot number */ + unsigned char link [32]; /* E1 link number */ +}; + +/* + * DXC cross-connector settings for E1 channels. + */ +#define SERIAL_GETDXC _IOR ('x', 36, struct dxc_table) +#define SERIAL_SETDXC _IOW ('x', 36, struct dxc_table) + +/* + * Dynamic binder interface. + */ +#ifdef __KERNEL__ +typedef struct _chan_t chan_t; +typedef struct _proto_t proto_t; + +void binder_register_protocol (proto_t *p); +void binder_unregister_protocol (proto_t *p); + +int binder_register_channel (chan_t *h, char *prefix, int minor); +void binder_unregister_channel (chan_t *h); + +/* + * Hardware channel driver structure. + */ +struct sk_buff; + +struct _chan_t { + char name [16]; + int mtu; /* max packet size */ + int fifosz; /* total hardware i/o buffer size */ + int port; /* hardware base i/o port */ + int irq; /* hardware interrupt line */ + int minor; /* minor number 0..127, assigned by binder */ + int debug; /* debug level, 0..2 */ + int running; /* running, 0..1 */ + struct _proto_t *proto; /* protocol interface data */ + void *sw; /* protocol private data */ + void *hw; /* hardware layer private data */ + + /* Interface to protocol */ + int (*up) (chan_t *h); + void (*down) (chan_t *h); + int (*transmit) (chan_t *h, struct sk_buff *skb); + void (*set_dtr) (chan_t *h, int val); + void (*set_rts) (chan_t *h, int val); + int (*query_dtr) (chan_t *h); + int (*query_rts) (chan_t *h); + int (*query_dsr) (chan_t *h); + int (*query_cts) (chan_t *h); + int (*query_dcd) (chan_t *h); + + /* Interface to async protocol */ + void (*set_async_param) (chan_t *h, int baud, int bits, int parity, + int stop2, int ignpar, int rtscts, + int ixon, int ixany, int symstart, int symstop); + void (*send_break) (chan_t *h, int msec); + void (*send_xon) (chan_t *h); + void (*send_xoff) (chan_t *h); + void (*start_transmitter) (chan_t *h); + void (*stop_transmitter) (chan_t *h); + void (*flush_transmit_buffer) (chan_t *h); + + /* Control interface */ + int (*control) (chan_t *h, unsigned int cmd, unsigned long arg); +}; + +/* + * Protocol driver structure. + */ +struct _proto_t { + char *name; + struct _proto_t *next; + + /* Interface to channel */ + void (*receive) (chan_t *h, struct sk_buff *skb); + void (*receive_error) (chan_t *h, int errcode); + void (*transmit) (chan_t *h); + void (*modem_event) (chan_t *h); + + /* Interface to binder */ + int (*open) (chan_t *h); + void (*close) (chan_t *h); + int (*read) (chan_t *h, unsigned short flg, char *buf, int len); + int (*write) (chan_t *h, unsigned short flg, const char *buf, int len); + int (*select) (chan_t *h, int type, void *st, struct file *filp); + struct fasync_struct *fasync; + + /* Control interface */ + int (*attach) (chan_t *h); + int (*detach) (chan_t *h); + int (*control) (chan_t *h, unsigned int cmd, unsigned long arg); +}; +#endif /* KERNEL */