From bc36e9dde54dd5fbbc1c56880eef142969a14f00 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 19 Apr 2012 19:18:15 -0700 Subject: [PATCH 01/63] Adds serial port support to the multiplexer library. It also modifies the HP 2100 and PDP11 multiplexers to add serial support as demonstrations of the capability that, one day, might be extended to all simulators. I have tested the HP support, but I relied on Holger Veit to test the DEC stuff, so I can't guarantee that it works. I also relied on Holger to test under Linux, so the same caveat applies. The changes needed in the device simulators are relatively small. For example, if you look at the patches for "hp2100_baci.c", you'll note that most of them are documentation changes. The only things of note are: - an expansion of the TMXR initializer - additional code in the "attach" routine to try attaching a serial port if attaching a socket fails - additional code in the "detach" routine for the same reasons The HP MPX device (hp2100_mpx.c) needs a tiny bit of additional support from the ATTACH and DETACH commands. Specifically, SCP was modified to set a flag ("sim_unit_ref") to indicate whether ATTACH MPX or ATTACH MPX0 was done, i.e., to differentiate between a device and a unit attach (recall that SCP treats these as both referring to unit 0). This is needed because the socket attaches (logically) to the device, whereas a serial port attaches to a line. Without this flag, the attach routine cannot differentiate between ATTACH MPX and ATTACH MPX0, as the distinction is lost by the time the VM's attach routine is called. This support isn't needed for the HP MUX device because the socket attaches to a different device than the lines do. MPX also requires a bit more work due to the capability to mix serial and Telnet lines on the same multiplexer (BACI is a single-line terminal device). The attached PDF contains revisions to the "Writing a Simulator for the SIMH System" publication that documents the additions and changes to the multiplexer library for serial port support. User documentation for serial port support currently exists only in the initial comments in "sim_tmxr.c"; I will add the appropriate text to the "SIMH User's Guide" if we decide to add this to the release version. --- HP2100/hp2100_baci.c | 98 +- HP2100/hp2100_defs.h | 10 +- HP2100/hp2100_mpx.c | 195 +- HP2100/hp2100_mux.c | 95 +- PDP11/pdp11_dc.c | 67 +- PDP11/pdp11_dz.c | 7 +- PDP11/pdp11_vh.c | 3 +- descrip.mms | 3 +- doc/simh_381_serial.pdf | 11515 ++++++++++++++++++++++++++++++++++++++ makefile | 2 +- scp.c | 10 + scp.h | 7 +- sim_serial.c | 814 +++ sim_serial.h | 99 + sim_tmxr.c | 1194 +++- sim_tmxr.h | 14 + 16 files changed, 13799 insertions(+), 334 deletions(-) create mode 100644 doc/simh_381_serial.pdf create mode 100644 sim_serial.c create mode 100644 sim_serial.h diff --git a/HP2100/hp2100_baci.c b/HP2100/hp2100_baci.c index 063705a6..cbadb7cf 100644 --- a/HP2100/hp2100_baci.c +++ b/HP2100/hp2100_baci.c @@ -29,6 +29,8 @@ 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines + 19-Nov-08 JDB [serial] Removed DEV_NET to allow restoration of listening port + 17-Oct-08 JDB [serial] Added serial port support 11-Sep-08 JDB Fixed STC,C losing interrupt request on BREAK 07-Sep-08 JDB Fixed IN_LOOPBACK conflict with netinet/in.h Changed Telnet poll to connect immediately after reset or attach @@ -78,13 +80,13 @@ an "external rate" that is equivalent to 9600 baud, as most terminals were set to their maximum speeds. - We support the 12966A connected to an HP terminal emulator via Telnet. - Internally, we model the BACI as a terminal multiplexer with one line. The - simulation is complicated by the half-duplex nature of the card (there is - only one FIFO, used selectively either for transmission or reception) and the - double-buffered UART (a Western Digital TR1863A), which has holding registers - as well as a shift registers for transmission and reception. We model both - sets of device registers. + We support the 12966A connected to an HP terminal emulator via Telnet or a + serial port. Internally, we model the BACI as a terminal multiplexer with + one line. The simulation is complicated by the half-duplex nature of the + card (there is only one FIFO, used selectively either for transmission or + reception) and the double-buffered UART (a Western Digital TR1863A), which + has holding registers as well as a shift registers for transmission and + reception. We model both sets of device registers. During an output operation, the first character output to the card passes through the FIFO and into the transmitter holding register. Subsequent @@ -113,12 +115,12 @@ as an "optimized (fast) timing" option. Optimization makes three improvements: - 1. On output, characters in the FIFO are emptied into the Telnet buffer as a + 1. On output, characters in the FIFO are emptied into the line buffer as a block, rather than one character per service call, and on input, all of - the characters available in the Telnet buffer are loaded into the FIFO as - a block. + the characters available in the line buffer are loaded into the FIFO as a + block. - 2. The ENQ/ACK handshake is done locally, without involving the Telnet + 2. The ENQ/ACK handshake is done locally, without involving the terminal client. 3. Input occurring during an output operation is delayed until the second or @@ -318,7 +320,7 @@ /* Unit references */ #define baci_term baci_unit[0] /* terminal I/O unit */ -#define baci_poll baci_unit[1] /* Telnet polling unit */ +#define baci_poll baci_unit[1] /* line polling unit */ /* BACI state variables */ @@ -391,11 +393,11 @@ t_stat baci_detach (UNIT *uptr); baci_deb BACI debug list baci_dev BACI device descriptor - Two units are used: one to handle character I/O via the Telnet library, and - another to poll for connections and input. The character I/O service routine - runs only when there are characters to read or write. It operates at the - approximate baud rate of the terminal (in CPU instructions per second) in - order to be compatible with the OS drivers. The Telnet poll must run + Two units are used: one to handle character I/O via the multiplexer library, + and another to poll for connections and input. The character I/O service + routine runs only when there are characters to read or write. It operates at + the approximate baud rate of the terminal (in CPU instructions per second) in + order to be compatible with the OS drivers. The line poll must run continuously, but it can operate much more slowly, as the only requirement is that it must not present a perceptible lag to human input. To be compatible with CPU idling, it is co-scheduled with the master poll timer, which uses a @@ -404,14 +406,14 @@ t_stat baci_detach (UNIT *uptr); DEVICE baci_dev; -TMLN baci_ldsc = { 0 }; /* line descriptor */ -TMXR baci_desc = { 1, 0, 0, &baci_ldsc }; /* device descriptor */ +TMLN baci_ldsc = { 0 }; /* line descriptor */ +TMXR baci_desc = { 1, 0, 0, &baci_ldsc, NULL, &baci_dev }; /* device descriptor */ DIB baci_dib = { &baci_io, BACI, 0 }; UNIT baci_unit[] = { { UDATA (&baci_term_svc, UNIT_ATTABLE | UNIT_FASTTIME, 0) }, /* terminal I/O unit */ - { UDATA (&baci_poll_svc, UNIT_DIS, POLL_FIRST) } /* Telnet poll unit */ + { UDATA (&baci_poll_svc, UNIT_DIS, POLL_FIRST) } /* line poll unit */ }; REG baci_reg[] = { @@ -769,7 +771,7 @@ return stat_data; The terminal service routine is used to transmit and receive characters. In terminal mode, it is started when a character is ready for output or when - the Telnet poll routine determines that there are characters ready for input + the line poll routine determines that there are characters ready for input and stopped when there are no more characters to output or input. When the terminal is quiescent, this routine does not run. @@ -809,11 +811,11 @@ return stat_data; first character after an ENQ is not an ACK. Finally, fast timing enables buffer combining. For output, all characters - present in the FIFO are unloaded into the Telnet buffer before initiating a - packet send. For input, all characters present in the Telnet buffer are - loaded into the FIFO. This reduces network traffic and decreases simulator - overhead (there is only one service routine entry per block, rather than one - per character). + present in the FIFO are unloaded into the line buffer before initiating a + packet send. For input, all characters present in the line buffer are loaded + into the FIFO. This reduces network traffic and decreases simulator overhead + (there is only one service routine entry per block, rather than one per + character). In fast output mode, it is imperative that not less than 1500 instructions elapse between the first character load to the FIFO and the initiation of @@ -976,12 +978,11 @@ return status; } -/* BACI Telnet poll service. +/* BACI line poll service. - This service routine is used to poll for Telnet connections and incoming - characters. If characters are available, the terminal I/O service routine is - scheduled. It starts when the socket is attached and stops when the socket - is detached. + This service routine is used to poll for connections and incoming characters. + If characters are available, the terminal I/O service routine is scheduled. + It starts when the line is attached and stops when the line is detached. As there is only one line, we only poll for a new connection when the line is disconnected. @@ -1028,42 +1029,57 @@ baci_term.wait = service_time (baci_icw); /* set terminal I/O time if (baci_term.flags & UNIT_ATT) { /* device attached? */ baci_poll.wait = POLL_FIRST; /* set up poll */ - sim_activate (&baci_poll, baci_poll.wait); /* start Telnet poll immediately */ + sim_activate (&baci_poll, baci_poll.wait); /* start line poll immediately */ } else - sim_cancel (&baci_poll); /* else stop Telnet poll */ + sim_cancel (&baci_poll); /* else stop line poll */ return SCPE_OK; } -/* Attach controller */ +/* Attach line */ t_stat baci_attach (UNIT *uptr, char *cptr) { t_stat status = SCPE_OK; -status = tmxr_attach (&baci_desc, uptr, cptr); /* attach to socket */ +if (uptr->flags & UNIT_DIS) /* unit disabled? */ + return SCPE_UDIS; /* report it */ -if (status == SCPE_OK) { - baci_poll.wait = POLL_FIRST; /* set up poll */ - sim_activate (&baci_poll, baci_poll.wait); /* start Telnet poll immediately */ +status = tmxr_attach (&baci_desc, uptr, cptr); /* try to attach to socket */ + +if (status == SCPE_ARG) /* invalid numeric port supplied? */ + status = tmxr_attach_line (uptr, 0, cptr, &baci_desc); /* try to attach to serial port */ + +if (status == SCPE_OK) { /* attach successful? */ + baci_poll.wait = POLL_FIRST; /* set up poll */ + sim_activate (&baci_poll, baci_poll.wait); /* start line poll immediately */ } return status; } -/* Detach controller */ + +/* Detach line */ t_stat baci_detach (UNIT *uptr) { t_stat status; -status = tmxr_detach (&baci_desc, uptr); /* detach socket */ +if (uptr->flags & UNIT_DIS) /* unit disabled? */ + return SCPE_UDIS; /* report it */ + +status = tmxr_detach_line (uptr, 0, NULL, &baci_desc); /* attempt to detach serial line */ + +if (status == SCPE_UNATT) /* not attached to serial? */ + status = tmxr_detach (&baci_desc, uptr); /* attempt to detach listening socket */ + baci_ldsc.rcve = 0; /* disable line reception */ -sim_cancel (&baci_poll); /* stop Telnet poll */ +sim_cancel (&baci_poll); /* stop line poll */ return status; } + /* Local routines */ diff --git a/HP2100/hp2100_defs.h b/HP2100/hp2100_defs.h index 3118e2d1..8bed6467 100644 --- a/HP2100/hp2100_defs.h +++ b/HP2100/hp2100_defs.h @@ -29,6 +29,7 @@ 27-Oct-10 JDB Revised I/O signal enum values for concurrent signals Revised I/O macros for new signal handling 09-Oct-10 JDB Added DA and DC device select code assignments + 21-Oct-08 JDB [serial] Added "sim_unit_ref" external 07-Sep-08 JDB Added POLL_FIRST to indicate immediate connection attempt 15-Jul-08 JDB Rearranged declarations with hp2100_cpu.h 26-Jun-08 JDB Rewrote device I/O to model backplane signals @@ -443,10 +444,11 @@ extern uint32 dev_prl [2], dev_irq [2], dev_srq [2]; /* I/O signal vectors */ /* Simulator state */ -extern FILE *sim_deb; -extern FILE *sim_log; -extern int32 sim_step; -extern int32 sim_switches; +extern FILE *sim_deb; +extern FILE *sim_log; +extern int32 sim_step; +extern int32 sim_switches; +extern UNITREF sim_unit_ref; /* CPU functions */ diff --git a/HP2100/hp2100_mpx.c b/HP2100/hp2100_mpx.c index a4d91dd9..7e4065a4 100644 --- a/HP2100/hp2100_mpx.c +++ b/HP2100/hp2100_mpx.c @@ -29,7 +29,9 @@ 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines + 19-Nov-08 JDB [serial] Removed DEV_NET to allow restoration of listening port 14-Nov-08 JDB Cleaned up VC++ size mismatch warnings for zero assignments + 20-Oct-08 JDB [serial] Added serial port support 03-Oct-08 JDB Fixed logic for ENQ/XOFF transmit wait 07-Sep-08 JDB Changed Telnet poll to connect immediately after reset or attach 10-Aug-08 JDB Added REG_FIT to register variables < 32-bit size @@ -57,8 +59,8 @@ character editing, echoing, ENQ/ACK handshaking, and read terminator detection, substantially reducing the load on the CPU over the earlier 12920 multiplexer. It was supported by HP under RTE-MIII, RTE-IVB, and RTE-6/VM. - Under simulation, it connects with HP terminal emulators via Telnet to a - user-specified port. + Under simulation, it connects with HP terminal emulators via Telnet or serial + ports. The single interface card contained a Z80 CPU, DMA controller, CTC, four two-channel SIO UARTs, 16K of RAM, 8K of ROM, and I/O backplane latches and @@ -199,7 +201,7 @@ #define MPX_CNTLS 2 /* number of control units */ #define mpx_cntl (mpx_unit [MPX_PORTS + 0]) /* controller unit */ -#define mpx_poll (mpx_unit [MPX_PORTS + 1]) /* Telnet polling unit */ +#define mpx_poll (mpx_unit [MPX_PORTS + 1]) /* polling unit */ /* Character constants */ @@ -611,16 +613,16 @@ t_stat mpx_show_frev (FILE *st, UNIT *uptr, int32 val, void *desc); mpx_dev MPX device descriptor The first eight units correspond to the eight multiplexer line ports. These - handle character I/O via the Telnet library. A ninth unit acts as the card - controller, executing commands and transferring data to and from the I/O - buffers. A tenth unit is responsible for polling for connections and socket - I/O. It also holds the master socket. + handle character I/O via the multiplexer library. A ninth unit acts as the + card controller, executing commands and transferring data to and from the I/O + buffers. A tenth unit is responsible for polling for connections and line + I/O. It also holds the master socket for Telnet connections. The character I/O service routines run only when there are characters to read or write. They operate at the approximate baud rates of the terminals (in CPU instructions per second) in order to be compatible with the OS drivers. The controller service routine runs only when a command is executing or a - data transfer to or from the CPU is in progress. The Telnet poll must run + data transfer to or from the CPU is in progress. The poll service must run continuously, but it may operate much more slowly, as the only requirement is that it must not present a perceptible lag to human input. To be compatible with CPU idling, it is co-scheduled with the master poll timer, which uses a @@ -632,9 +634,9 @@ t_stat mpx_show_frev (FILE *st, UNIT *uptr, int32 val, void *desc); DEVICE mpx_dev; -int32 mpx_order [MPX_PORTS] = { -1 }; /* connection order */ -TMLN mpx_ldsc [MPX_PORTS] = { { 0 } }; /* line descriptors */ -TMXR mpx_desc = { MPX_PORTS, 0, 0, mpx_ldsc, mpx_order }; /* device descriptor */ +int32 mpx_order [MPX_PORTS] = { -1 }; /* connection order */ +TMLN mpx_ldsc [MPX_PORTS] = { { 0 } }; /* line descriptors */ +TMXR mpx_desc = { MPX_PORTS, 0, 0, mpx_ldsc, mpx_order, &mpx_dev }; /* device descriptor */ DIB mpx_dib = { &mpx_io, MPX }; @@ -648,7 +650,7 @@ UNIT mpx_unit [] = { { UDATA (&mpx_line_svc, UNIT_FASTTIME, 0) }, /* terminal I/O line 6 */ { UDATA (&mpx_line_svc, UNIT_FASTTIME, 0) }, /* terminal I/O line 7 */ { UDATA (&mpx_cntl_svc, UNIT_DIS, 0) }, /* controller unit */ - { UDATA (&mpx_poll_svc, UNIT_ATTABLE | UNIT_DIS, POLL_FIRST) } /* Telnet poll unit */ + { UDATA (&mpx_poll_svc, UNIT_ATTABLE | UNIT_DIS, POLL_FIRST) } /* line poll unit */ }; REG mpx_reg [] = { @@ -1602,21 +1604,20 @@ return SCPE_OK; /* Multiplexer line service. The line service routine is used to transmit and receive characters. It is - started when a buffer is ready for output or when the Telnet poll routine + started when a buffer is ready for output or when the poll service routine determines that there are characters ready for input, and it is stopped when there are no more characters to output or input. When a line is quiescent, this routine does not run. Service times are selected to approximate the baud rate setting of the multiplexer port. "Fast timing" mode enables three optimizations. First, buffered characters - are transferred via Telnet in blocks, rather than a character at a time; this - reduces network traffic and decreases simulator overhead (there is only one - service routine entry per block, rather than one per character). Second, - ENQ/ACK handshaking is done locally, without involving the Telnet client. - Third, when editing and echo is enabled, entering BS echoes a backspace, a - space, and a backspace, and entering DEL echoes a backslash, a carriage - return, and a line feed, providing better compatibility with prior RTE - terminal drivers. + are transferred in blocks, rather than a character at a time; this reduces + line traffic and decreases simulator overhead (there is only one service + routine entry per block, rather than one per character). Second, ENQ/ACK + handshaking is done locally, without involving the client. Third, when + editing and echo is enabled, entering BS echoes a backspace, a space, and a + backspace, and entering DEL echoes a backslash, a carriage return, and a line + feed, providing better compatibility with prior RTE terminal drivers. Each read and write buffer begins with a reserved header byte that stores per-buffer information, such as whether handshaking should be suppressed @@ -1630,7 +1631,7 @@ return SCPE_OK; write buffer is freed, and a UI check is made if the controller is idle, in case a write buffer request is pending. - For input, the character is retrieved from the Telnet buffer. If a BREAK was + For input, the character is retrieved from the line buffer. If a BREAK was received, break status is set, and the character is discarded (the current multiplexer library implementation always returns a NUL with a BREAK indication). If the character is an XOFF, and XON/XOFF pacing is enabled, a @@ -1939,11 +1940,11 @@ return SCPE_OK; } -/* Telnet poll service. +/* Poll service. - This service routine is used to poll for Telnet connections and incoming - characters. It starts when the socket is attached and stops when the socket - is detached. + This service routine is used to poll for connections and incoming characters. + It is started when the listening socket or a serial line is attached and is + stopped when the socket and all lines are detached. Each line is then checked for a pending ENQ/ACK handshake. If one is pending, the ACK counter is incremented, and if it times out, another ENQ is @@ -2007,10 +2008,10 @@ return SCPE_OK; 1. Under simulation, we also clear the input buffer register, even though the hardware doesn't. - 2. We set up the first poll for Telnet connections to occur "immediately" - upon execution, so that clients will be connected before execution - begins. Otherwise, a fast program may access the multiplexer before the - poll service routine activates. + 2. We set up the first poll for connections to occur "immediately" upon + execution, so that clients will be connected before execution begins. + Otherwise, a fast program may access the multiplexer before the poll + service routine activates. 3. We must set the "emptying_flags" and "filling_flags" values here, because they cannot be initialized statically, even though the values are @@ -2030,83 +2031,129 @@ IOPRESET (&mpx_dib); /* PRESET device (does n mpx_ibuf = 0; /* clear input buffer */ -if (mpx_poll.flags & UNIT_ATT) { /* network attached? */ +if (tmxr_mux_free (&mpx_desc)) /* any lines attached? */ + sim_cancel (&mpx_poll); /* no, so stop poll */ +else { /* attached or listening */ mpx_poll.wait = POLL_FIRST; /* set up poll */ - sim_activate (&mpx_poll, mpx_poll.wait); /* start Telnet poll immediately */ + sim_activate (&mpx_poll, mpx_poll.wait); /* start poll immediately */ } -else - sim_cancel (&mpx_poll); /* else stop Telnet poll */ return SCPE_OK; } -/* Attach the multiplexer to a Telnet port. +/* Attach the multiplexer or a line. We are called by the ATTACH MPX command to attach the multiplexer to - the listening port indicated by . Logically, it is the multiplexer - device that is attached; however, SIMH only allows units to be attached. - This makes sense for devices such as tape drives, where the attached media is - a property of a specific drive. In our case, though, the listening port is a - property of the multiplexer card, not of any given serial line. As ATTACH - MPX is equivalent to ATTACH MPX0, the port would, by default, be attached to - the first serial line and be reported there in a SHOW MPX command. + the listening port indicated by and by ATTACH MPX to attach + line to serial port . Logically, it is the multiplexer device that + is attached; however, SIMH only allows units to be attached. This makes + sense for devices such as tape drives, where the attached media is a property + of a specific drive. In our case, though, the listening port is a property + of the multiplexer card, not of any given serial line. - To preserve the logical picture, we attach the port to the Telnet poll unit, - which is normally disabled to inhibit its display. Attaching to a disabled - unit is not allowed, so we first enable the unit, then attach it, then - disable it again. Attachment is reported by the "mpx_status" routine below. + To preserve the logical picture, we attach the listening port to the poll + unit (unit 9), which is normally disabled to inhibit its display. Serial + ports are attached to line units 0-7 normally. Attachment is reported by the + "mpx_status" routine below. - The Telnet poll service routine is synchronized with the other input polling - devices in the simulator to facilitate idling. + The connection poll service routine is synchronized with the other input + polling devices in the simulator to facilitate idling. + + Implementation notes: + + 1. ATTACH MPX will pass a pointer unit 0. This is because the common + simulator code treats ATTACH MPX as equivalent to ATTACH MPX0. We + differentiate these cases by examining the "sim_unit_ref" global to see + if a device was referenced. + + 2. Directly attempting to attach to units 8 (controller) or 9 (poll) will be + rejected. + + 3. If we are being called as part of RESTORE processing, we may see a + request to attach the poll unit (unit 9). This will occur if unit 9 was + attached when the SAVE was done. In this case, the SIM_SW_REST flag will + be set in "sim_switches", and we will allow the call to succeed. + + 4. If the poll unit is attached, it will be enabled as part of RESTORE + processing. We always unilaterally disable this unit to ensure that it + remains hidden. */ t_stat mpx_attach (UNIT *uptr, char *cptr) { t_stat status = SCPE_OK; -if (uptr != mpx_unit) /* not unit 0? */ - return SCPE_NOATT; /* can't attach */ +if ((uptr == &mpx_cntl) || /* attaching controller? */ + (uptr == &mpx_poll) && !(sim_switches & SIM_SW_REST)) /* or poll unit directly? */ + return SCPE_NOATT; /* disallow */ -mpx_poll.flags = mpx_poll.flags & ~UNIT_DIS; /* enable unit */ -status = tmxr_attach (&mpx_desc, &mpx_poll, cptr); /* attach to socket */ -mpx_poll.flags = mpx_poll.flags | UNIT_DIS; /* disable unit */ +if (sim_unit_ref == ref_dev || (uptr == &mpx_poll)) { /* device attach or poll restore request? */ + status = tmxr_attach (&mpx_desc, &mpx_poll, cptr); /* attach to socket */ + mpx_poll.flags = mpx_poll.flags | UNIT_DIS; /* disable unit */ + } + +else /* line attach request */ + status = tmxr_attach_line (uptr, 0, cptr, &mpx_desc); /* attach line */ if (status == SCPE_OK) { - mpx_poll.wait = POLL_FIRST; /* set up poll */ - sim_activate (&mpx_poll, mpx_poll.wait); /* start poll immediately */ + mpx_poll.wait = POLL_FIRST; /* set up poll */ + sim_activate (&mpx_poll, mpx_poll.wait); /* start poll immediately */ } return status; } -/* Detach the multiplexer. +/* Detach the multiplexer or a line. - Normally, we are called by the DETACH MPX command, which is equivalent to - DETACH MPX0. However, we may be called with other units in two cases. + We are called by the DETACH MPX command to detach the listening port and all + Telnet sessions and by the DETACH MPX to detach a serial port from line + . We will also be called by DETACH ALL, RESTORE, and during simulator + shutdown. For DETACH ALL and RESTORE, we must not fail the call, or + processing of other units will cease. + + Implementation notes: - A DETACH ALL command will call us for unit 9 (the poll unit) if it is - attached. Also, during simulator shutdown, we will be called for units 0-8 - (detach_all in scp.c calls the detach routines of all units that do NOT have - UNIT_ATTABLE), as well as for unit 9 if it is attached. In both cases, it is - imperative that we return SCPE_OK, otherwise any remaining device detaches - will not be performed. + 1. Because DETACH MPX will pass unit 0, we check the "sim_unit_ref" global + to see if MPX or MPX0 was specified in the command. + + 2. Directly attempting to detach unit 8 (controller) will be rejected. We + cannot fail a direct DETACH MPX9 (poll unit), because we cannot tell that + case apart from a DETACH ALL (a RESTORE will have the SIM_SW_REST flag + set in "sim_switches"). + + 3. During simulator shutdown, we will be called for units 0-8 (detach_all in + scp.c calls the detach routines of all units that do NOT have + UNIT_ATTABLE), as well as for unit 9 if it is attached. */ t_stat mpx_detach (UNIT *uptr) { -t_stat status = SCPE_OK; -int32 i; +uint32 ln; +t_stat status; +t_bool mux_free = TRUE; -if ((uptr == mpx_unit) || (uptr == &mpx_poll)) { /* base unit or poll unit? */ - status = tmxr_detach (&mpx_desc, &mpx_poll); /* detach socket */ +if (uptr == &mpx_cntl) /* detaching controller directly? */ + return SCPE_NOATT; /* disallow */ - for (i = 0; i < MPX_PORTS; i++) { - mpx_ldsc [i].rcve = 0; /* disable line reception */ - sim_cancel (&mpx_unit [i]); /* cancel any scheduled I/O */ - } +if (sim_unit_ref == ref_dev || uptr == &mpx_poll) /* device detach or detach all request? */ + status = tmxr_detach (&mpx_desc, &mpx_poll); /* detach socket */ - sim_cancel (&mpx_poll); /* stop Telnet poll */ +else /* line detach request */ + status = tmxr_detach_line (uptr, 0, NULL, &mpx_desc); /* detach line */ + +if (status == SCPE_OK) { + for (ln = 0; ln < MPX_PORTS; ln++) /* loop through lines */ + if (tmxr_line_free (&mpx_ldsc[ln])) { /* is line free? */ + mpx_ldsc[ln].rcve = 0; /* disable rcv as line was reset */ + sim_cancel (&mpx_unit [ln]); /* cancel any scheduled I/O */ + } + + else + mux_free = FALSE; /* mux isn't free if line is in use */ + + if (mux_free && !(mpx_poll.flags & UNIT_ATT)) /* all lines free and not listening? */ + sim_cancel (&mpx_poll); /* stop poll */ } return status; @@ -2167,7 +2214,7 @@ return SCPE_OK; /* Local routines */ -/* Poll for new Telnet connections */ +/* Poll for new connections */ static void poll_connection (void) { diff --git a/HP2100/hp2100_mux.c b/HP2100/hp2100_mux.c index f341a51d..354ce3d9 100644 --- a/HP2100/hp2100_mux.c +++ b/HP2100/hp2100_mux.c @@ -29,6 +29,8 @@ 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines + 19-Nov-08 JDB [serial] Removed DEV_NET to allow restoration of listening port + 20-Oct-08 JDB [serial] Added serial port support 09-Oct-08 JDB "muxl_unit" defined one too many units (17 instead of 16) 10-Sep-08 JDB SHOW MUX CONN/STAT with SET MUX DIAG is no longer disallowed 07-Sep-08 JDB Changed Telnet poll to connect immediately after reset or attach @@ -327,6 +329,7 @@ t_stat muxo_svc (UNIT *uptr); t_stat muxc_reset (DEVICE *dptr); t_stat mux_attach (UNIT *uptr, char *cptr); t_stat mux_detach (UNIT *uptr); +t_stat muxl_detach (UNIT *uptr); t_stat mux_setdiag (UNIT *uptr, int32 val, char *cptr, void *desc); @@ -430,8 +433,8 @@ DEVICE muxl_dev = { NULL, /* deposit routine */ &muxc_reset, /* reset routine */ NULL, /* boot routine */ - NULL, /* attach routine */ - NULL, /* detach routine */ + &mux_attach, /* attach routine */ + &muxl_detach, /* detach routine */ &muxl_dib, /* device information block */ DEV_DISABLE, /* device flags */ 0, /* debug control flags */ @@ -456,9 +459,9 @@ DEVICE muxl_dev = { DEVICE muxu_dev; -int32 mux_order [MUX_LINES] = { -1 }; /* connection order */ -TMLN mux_ldsc [MUX_LINES] = { { 0 } }; /* line descriptors */ -TMXR mux_desc = { MUX_LINES, 0, 0, mux_ldsc, mux_order }; /* device descriptor */ +int32 mux_order [MUX_LINES] = { -1 }; /* connection order */ +TMLN mux_ldsc [MUX_LINES] = { { 0 } }; /* line descriptors */ +TMXR mux_desc = { MUX_LINES, 0, 0, mux_ldsc, mux_order, &muxu_dev }; /* device descriptor */ UNIT muxu_unit = { UDATA (&muxi_svc, UNIT_ATTABLE, 0), POLL_FIRST }; @@ -920,7 +923,7 @@ while (working_set) { (old & DTR) && /* DTR drop? */ !(muxc_ota[ln] & DTR)) { tmxr_linemsg (&mux_ldsc[ln], "\r\nLine hangup\r\n"); - tmxr_reset_ln (&mux_ldsc[ln]); /* reset line */ + tmxr_clear_ln (&mux_desc, &mux_ldsc[ln]); /* disconnect line */ muxc_lia[ln] = 0; /* dataset off */ } } /* end update */ @@ -1305,12 +1308,12 @@ IOPRESET (dibptr); /* PRESET device (does n muxc_chan = muxc_scan = 0; /* init modem scan */ -if (muxu_unit.flags & UNIT_ATT) { /* master att? */ +if (tmxr_mux_free (&mux_desc)) /* any lines attached? */ + sim_cancel (&muxu_unit); /* no, so stop poll */ +else { /* attached or listening */ muxu_unit.wait = POLL_FIRST; /* set up poll */ - sim_activate (&muxu_unit, muxu_unit.wait); /* start Telnet poll immediately */ + sim_activate (&muxu_unit, muxu_unit.wait); /* start poll immediately */ } -else - sim_cancel (&muxu_unit); /* else stop */ for (i = 0; i < MUX_LINES; i++) mux_reset_ln (i); /* reset lines 0-15 */ @@ -1322,20 +1325,23 @@ return SCPE_OK; } -/* Attach master unit */ +/* Attach master unit or line */ t_stat mux_attach (UNIT *uptr, char *cptr) { t_stat status = SCPE_OK; -if (muxu_unit.flags & UNIT_DIAG) /* diag mode? */ - return SCPE_NOFNC; /* command not allowed */ +if (muxu_unit.flags & UNIT_DIAG) /* diag mode? */ + return SCPE_NOFNC; /* command not allowed */ -status = tmxr_attach (&mux_desc, uptr, cptr); /* attach */ +if (uptr == &muxu_unit) /* master unit? */ + status = tmxr_attach (&mux_desc, uptr, cptr); /* attach socket */ +else + status = tmxr_attach_line (uptr, 0, cptr, &mux_desc); /* attach line */ -if (status == SCPE_OK) { - muxu_unit.wait = POLL_FIRST; /* set up poll */ - sim_activate (&muxu_unit, muxu_unit.wait); /* start Telnet poll immediately */ +if (status == SCPE_OK) { /* attach successful? */ + muxu_unit.wait = POLL_FIRST; /* set up poll */ + sim_activate (&muxu_unit, muxu_unit.wait); /* start poll immediately */ } return status; @@ -1346,13 +1352,45 @@ return status; t_stat mux_detach (UNIT *uptr) { -int32 i; -t_stat r; +uint32 ln; +t_stat status; +t_bool free = TRUE; -r = tmxr_detach (&mux_desc, uptr); /* detach */ -for (i = 0; i < MUX_LINES; i++) mux_ldsc[i].rcve = 0; /* disable rcv */ -sim_cancel (uptr); /* stop poll */ -return r; +status = tmxr_detach (&mux_desc, uptr); /* detach unit */ + +if (status == SCPE_OK) { + for (ln = 0; ln < MUX_LINES; ln++) /* loop through lines */ + if (tmxr_line_free (&mux_ldsc[ln])) /* is line free? */ + mux_ldsc[ln].rcve = 0; /* yes, so disable rcv as line was reset */ + else + free = FALSE; /* mux isn't free if line is in use */ + + if (free) /* all lines free? */ + sim_cancel (uptr); /* stop poll */ + } + +return status; +} + + +/* Detach line */ + +t_stat muxl_detach (UNIT *uptr) +{ +uint32 ln; +t_stat status; + +status = tmxr_detach_line (uptr, 0, NULL, &mux_desc); /* detach line */ + +if (status == SCPE_OK) { + ln = uptr - muxl_unit; /* determine line number */ + mux_ldsc[ln].rcve = 0; /* disable line reception */ + + if (tmxr_mux_free (&mux_desc)) /* all lines free and not listening? */ + sim_cancel (&muxu_unit); /* stop poll */ + } + +return status; } @@ -1367,7 +1405,7 @@ return r; for normal character transfers, which is undesirable. Therefore, to enable diagnostic mode, we must force a disconnect of the - master socket and any connected Telnet lines, which clears the connection + master socket and all Telnet and serial lines, which clears the connection flags on all lines. Then we set the "transmission enabled" flags on all lines to enable output character processing for the diagnostic. (Normally, all of the flags are set when the multiplexer is first attached. Until then, @@ -1380,9 +1418,12 @@ t_stat mux_setdiag (UNIT *uptr, int32 val, char *cptr, void *desc) int32 ln; if (val) { /* set diag? */ - mux_detach (uptr); /* detach lines */ - for (ln = 0; ln < MUX_LINES; ln++) /* enable transmission */ - mux_ldsc[ln].xmte = 1; /* on all lines */ + mux_detach (uptr); /* detach Telnet lines */ + + for (ln = 0; ln < MUX_LINES; ln++) { + muxl_detach (&muxl_unit[ln]); /* detach all serial lines */ + mux_ldsc[ln].xmte = 1; /* enable transmission on all lines */ + } } else { /* set term */ for (ln = 0; ln < MUX_LINES; ln++) /* clear connections */ diff --git a/PDP11/pdp11_dc.c b/PDP11/pdp11_dc.c index b1def4a7..7c57773c 100644 --- a/PDP11/pdp11_dc.c +++ b/PDP11/pdp11_dc.c @@ -26,6 +26,7 @@ dci,dco DC11 terminal input/output 17-Aug-2011 RMS Added AUTOCONFIGURE modifier + 26-Nov-2008 JDB [serial] Added serial port support 19-Nov-2008 RMS Revised for common TMXR show routines Revised to autoconfigure vectors @@ -130,6 +131,7 @@ t_stat dci_svc (UNIT *uptr); t_stat dco_svc (UNIT *uptr); t_stat dcx_attach (UNIT *uptr, char *cptr); t_stat dcx_detach (UNIT *uptr); +t_stat dcl_detach (UNIT *uptr); t_stat dcx_set_lines (UNIT *uptr, int32 val, char *cptr, void *desc); void dcx_enbdis (int32 dis); void dci_clr_int (int32 ln); @@ -251,7 +253,7 @@ DEVICE dco_dev = { "DCO", dco_unit, dco_reg, dco_mod, DCX_LINES, 10, 31, 1, 8, 8, NULL, NULL, &dcx_reset, - NULL, NULL, NULL, + NULL, &dcx_attach, &dcl_detach, NULL, DEV_UBUS | DEV_DISABLE | DEV_DIS }; @@ -365,8 +367,6 @@ t_stat dci_svc (UNIT *uptr) { int32 ln, c, temp; -if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ - return SCPE_OK; sim_activate (uptr, tmxr_poll); /* continue poll */ ln = tmxr_poll_conn (&dcx_desc); /* look for connect */ if (ln >= 0) { /* got one? */ @@ -509,9 +509,12 @@ t_stat dcx_reset (DEVICE *dptr) int32 ln; dcx_enbdis (dptr->flags & DEV_DIS); /* sync enables */ -sim_cancel (&dci_unit); /* assume stop */ -if (dci_unit.flags & UNIT_ATT) /* if attached, */ - sim_activate (&dci_unit, tmxr_poll); /* activate */ +// +if (tmxr_mux_free (&dcx_desc)) /* any lines attached? */ + sim_cancel (&dci_unit); /* no, so stop poll */ +else /* attached or listening */ + sim_activate (&dci_unit, tmxr_poll); /* start poll immediately */ +// for (ln = 0; ln < DCX_LINES; ln++) /* for all lines */ dcx_reset_ln (ln); return auto_config (dci_dev.name, dcx_desc.lines); /* auto config */ @@ -531,16 +534,22 @@ dco_clr_int (ln); return; } -/* Attach master unit */ +/* Attach master unit or line */ t_stat dcx_attach (UNIT *uptr, char *cptr) { t_stat r; -r = tmxr_attach (&dcx_desc, uptr, cptr); /* attach */ +// +if (uptr == &dci_unit) /* master unit? */ + r = tmxr_attach (&dcx_desc, uptr, cptr); /* attach socket */ +else + r = tmxr_attach_line (uptr, 0, cptr, &dcx_desc); /* attach line */ +// + if (r != SCPE_OK) /* error? */ return r; -sim_activate (uptr, tmxr_poll); /* start poll */ +sim_activate (&dci_unit, tmxr_poll); /* start poll */ return SCPE_OK; } @@ -550,14 +559,48 @@ t_stat dcx_detach (UNIT *uptr) { int32 i; t_stat r; +t_bool free = TRUE; r = tmxr_detach (&dcx_desc, uptr); /* detach */ -for (i = 0; i < DCX_LINES; i++) /* all lines, */ - dcx_ldsc[i].rcve = 0; /* disable rcv */ -sim_cancel (uptr); /* stop poll */ + +// +if (r == SCPE_OK) { + for (i = 0; i < DCX_LINES; i++) /* loop through lines */ + if (tmxr_line_free (&dcx_ldsc[i])) /* is line free? */ + dcx_ldsc[i].rcve = 0; /* yes, so disable rcv as line was reset */ + else + free = FALSE; /* mux isn't free if line is in use */ + + if (free) /* all lines free? */ + sim_cancel (uptr); /* stop poll */ + } +// + return r; } +/* Detach line */ + +// +t_stat dcl_detach (UNIT *uptr) +{ +uint32 ln; +t_stat status; + +status = tmxr_detach_line (uptr, 0, NULL, &dcx_desc); /* detach line */ + +if (status == SCPE_OK) { + ln = uptr - dco_unit; /* determine line number */ + dcx_ldsc[ln].rcve = 0; /* disable line reception */ + + if (tmxr_mux_free (&dcx_desc)) /* all lines free and not listening? */ + sim_cancel (&dci_unit); /* stop poll */ + } + +return status; +} +// + /* Enable/disable device */ void dcx_enbdis (int32 dis) diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index 8f237cbc..8af832cd 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -26,6 +26,7 @@ dz DZ11 terminal multiplexor 29-Dec-08 RMS Added MTAB_NC to SET LOG command (Walter Mueller) + 24-Nov-08 JDB [serial] Added serial port support 19-Nov-08 RMS Revised for common TMXR show routines 18-Jun-07 RMS Added UNIT_IDLE flag 29-Oct-06 RMS Synced poll and clock @@ -231,8 +232,12 @@ MTAB dz_mod[] = { { TT_MODE, TT_MODE_7B, "7b", "7B", NULL }, { TT_MODE, TT_MODE_8B, "8b", "8B", NULL }, { TT_MODE, TT_MODE_7P, "7p", "7P", NULL }, +// + { MTAB_XTD | MTAB_VDV | MTAB_NC, ':', NULL, "CONNECT", + &tmxr_attach_line, NULL, &dz_desc }, { MTAB_XTD | MTAB_VDV, 1, NULL, "DISCONNECT", - &tmxr_dscln, NULL, &dz_desc }, + &tmxr_detach_line, NULL, &dz_desc }, +// { UNIT_ATT, UNIT_ATT, "summary", NULL, NULL, &tmxr_show_summ, (void *) &dz_desc }, { MTAB_XTD | MTAB_VDV | MTAB_NMO, 1, "CONNECTIONS", NULL, diff --git a/PDP11/pdp11_vh.c b/PDP11/pdp11_vh.c index fde07975..903f2725 100644 --- a/PDP11/pdp11_vh.c +++ b/PDP11/pdp11_vh.c @@ -34,6 +34,7 @@ of lines available to be 8, 16, 24, or 32. Fixed performance issue avoiding redundant polling 03-Jan-10 JAD Eliminate gcc warnings + 24-Nov-08 JDB Removed tmxr_send_buffered_data declaration (now in sim_tmxr.h) 19-Nov-08 RMS Revised for common TMXR show routines 18-Jun-07 RMS Added UNIT_IDLE flag 29-Oct-06 RMS Synced poll and clock @@ -324,8 +325,6 @@ static t_stat vh_set_log (UNIT *uptr, int32 val, char *cptr, void *desc); static t_stat vh_set_nolog (UNIT *uptr, int32 val, char *cptr, void *desc); static t_stat vh_show_log (FILE *st, UNIT *uptr, int32 val, void *desc); -int32 tmxr_send_buffered_data (TMLN *lp); - /* SIMH I/O Structures */ static DIB vh_dib = { diff --git a/descrip.mms b/descrip.mms index e02bd0e3..569f86d0 100644 --- a/descrip.mms +++ b/descrip.mms @@ -189,7 +189,8 @@ SIMH_LIB = $(LIB_DIR)SIMH-$(ARCH).OLB SIMH_SOURCE = $(SIMH_DIR)SIM_CONSOLE.C,$(SIMH_DIR)SIM_SOCK.C,\ $(SIMH_DIR)SIM_TMXR.C,$(SIMH_DIR)SIM_ETHER.C,\ $(SIMH_DIR)SIM_TAPE.C,$(SIMH_DIR)SIM_FIO.C,\ - $(SIMH_DIR)SIM_TIMER.C,$(SIMH_DIR)SIM_DISK.C + $(SIMH_DIR)SIM_TIMER.C,$(SIMH_DIR)SIM_DISK.C,\ + $(SIMH_DIR)SIM_SERIAL.C SIMH_MAIN = SCP.C .IFDEF ALPHA_OR_IA64 SIMH_LIB64 = $(LIB_DIR)SIMH64-$(ARCH).OLB diff --git a/doc/simh_381_serial.pdf b/doc/simh_381_serial.pdf new file mode 100644 index 00000000..b1ce3d4c --- /dev/null +++ b/doc/simh_381_serial.pdf @@ -0,0 +1,11515 @@ +%PDF-1.2 +% +73 0 obj +<< +/Dest [1 0 R /FitH 697] +/Type /Annot +/Subtype /Link +/Rect [84 689 523 703] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +75 0 obj +<< +/Dest [1 0 R /FitH 389] +/Type /Annot +/Subtype /Link +/Rect [90 668 523 682] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +76 0 obj +<< +/Dest [4 0 R /FitH 650] +/Type /Annot +/Subtype /Link +/Rect [90 649 523 663] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +77 0 obj +<< +/Dest [6 0 R /FitH 416] +/Type /Annot +/Subtype /Link +/Rect [100 629 523 643] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +78 0 obj +<< +/Dest [6 0 R /FitH 246] +/Type /Annot +/Subtype /Link +/Rect [110 617 523 631] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +79 0 obj +<< +/Dest [6 0 R /FitH 124] +/Type /Annot +/Subtype /Link +/Rect [110 605 523 619] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +80 0 obj +<< +/Dest [10 0 R /FitH 604] +/Type /Annot +/Subtype /Link +/Rect [110 593 523 607] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +81 0 obj +<< +/Dest [10 0 R /FitH 368] +/Type /Annot +/Subtype /Link +/Rect [110 582 523 596] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +82 0 obj +<< +/Dest [13 0 R /FitH 386] +/Type /Annot +/Subtype /Link +/Rect [110 570 523 584] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +83 0 obj +<< +/Dest [13 0 R /FitH 124] +/Type /Annot +/Subtype /Link +/Rect [110 559 523 573] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +84 0 obj +<< +/Dest [16 0 R /FitH 243] +/Type /Annot +/Subtype /Link +/Rect [100 542 523 556] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +85 0 obj +<< +/Dest [18 0 R /FitH 418] +/Type /Annot +/Subtype /Link +/Rect [110 529 523 543] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +86 0 obj +<< +/Dest [20 0 R /FitH 312] +/Type /Annot +/Subtype /Link +/Rect [110 517 523 531] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +87 0 obj +<< +/Dest [22 0 R /FitH 616] +/Type /Annot +/Subtype /Link +/Rect [110 506 523 520] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +88 0 obj +<< +/Dest [22 0 R /FitH 320] +/Type /Annot +/Subtype /Link +/Rect [110 494 523 508] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +89 0 obj +<< +/Dest [25 0 R /FitH 638] +/Type /Annot +/Subtype /Link +/Rect [90 476 523 490] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +90 0 obj +<< +/Dest [25 0 R /FitH 538] +/Type /Annot +/Subtype /Link +/Rect [100 457 523 471] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +91 0 obj +<< +/Dest [28 0 R /FitH 547] +/Type /Annot +/Subtype /Link +/Rect [110 444 523 458] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +92 0 obj +<< +/Dest [28 0 R /FitH 298] +/Type /Annot +/Subtype /Link +/Rect [110 433 523 447] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +93 0 obj +<< +/Dest [31 0 R /FitH 720] +/Type /Annot +/Subtype /Link +/Rect [110 421 523 435] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +94 0 obj +<< +/Dest [31 0 R /FitH 645] +/Type /Annot +/Subtype /Link +/Rect [110 410 523 424] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +95 0 obj +<< +/Dest [31 0 R /FitH 455] +/Type /Annot +/Subtype /Link +/Rect [110 398 523 412] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +96 0 obj +<< +/Dest [31 0 R /FitH 334] +/Type /Annot +/Subtype /Link +/Rect [110 386 523 400] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +97 0 obj +<< +/Dest [31 0 R /FitH 202] +/Type /Annot +/Subtype /Link +/Rect [110 375 523 389] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +98 0 obj +<< +/Dest [37 0 R /FitH 400] +/Type /Annot +/Subtype /Link +/Rect [110 364 523 378] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +99 0 obj +<< +/Dest [37 0 R /FitH 244] +/Type /Annot +/Subtype /Link +/Rect [110 353 523 367] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +100 0 obj +<< +/Dest [40 0 R /FitH 593] +/Type /Annot +/Subtype /Link +/Rect [100 335 523 349] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +101 0 obj +<< +/Dest [42 0 R /FitH 582] +/Type /Annot +/Subtype /Link +/Rect [110 322 523 336] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +102 0 obj +<< +/Dest [42 0 R /FitH 289] +/Type /Annot +/Subtype /Link +/Rect [110 311 523 325] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +103 0 obj +<< +/Dest [42 0 R /FitH 190] +/Type /Annot +/Subtype /Link +/Rect [100 293 523 307] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +104 0 obj +<< +/Dest [46 0 R /FitH 639] +/Type /Annot +/Subtype /Link +/Rect [110 281 523 295] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +105 0 obj +<< +/Dest [46 0 R /FitH 427] +/Type /Annot +/Subtype /Link +/Rect [100 263 523 277] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +106 0 obj +<< +/Dest [49 0 R /FitH 571] +/Type /Annot +/Subtype /Link +/Rect [110 251 523 265] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +107 0 obj +<< +/Dest [49 0 R /FitH 439] +/Type /Annot +/Subtype /Link +/Rect [110 239 523 253] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +108 0 obj +<< +/Dest [49 0 R /FitH 238] +/Type /Annot +/Subtype /Link +/Rect [100 221 523 235] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +109 0 obj +<< +/Dest [53 0 R /FitH 662] +/Type /Annot +/Subtype /Link +/Rect [90 203 523 217] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +110 0 obj +<< +/Dest [53 0 R /FitH 631] +/Type /Annot +/Subtype /Link +/Rect [100 183 523 197] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +111 0 obj +<< +/Dest [53 0 R /FitH 556] +/Type /Annot +/Subtype /Link +/Rect [100 164 523 178] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +112 0 obj +<< +/Dest [53 0 R /FitH 412] +/Type /Annot +/Subtype /Link +/Rect [100 146 523 160] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +113 0 obj +<< +/Dest [58 0 R /FitH 440] +/Type /Annot +/Subtype /Link +/Rect [100 127 523 141] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +114 0 obj +<< +/Dest [58 0 R /FitH 354] +/Type /Annot +/Subtype /Link +/Rect [110 114 523 128] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +115 0 obj +<< +/Dest [58 0 R /FitH 199] +/Type /Annot +/Subtype /Link +/Rect [110 103 523 117] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +116 0 obj +<< +/Dest [62 0 R /FitH 616] +/Type /Annot +/Subtype /Link +/Rect [110 92 523 106] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +117 0 obj +<< +/Dest [62 0 R /FitH 380] +/Type /Annot +/Subtype /Link +/Rect [110 80 523 94] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +118 0 obj +<< +/Dest [65 0 R /FitH 720] +/Type /Annot +/Subtype /Link +/Rect [90 706 523 720] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +120 0 obj +<< +/Dest [65 0 R /FitH 689] +/Type /Annot +/Subtype /Link +/Rect [100 686 523 700] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +121 0 obj +<< +/Dest [65 0 R /FitH 385] +/Type /Annot +/Subtype /Link +/Rect [100 668 523 682] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +122 0 obj +<< +/Dest [69 0 R /FitH 307] +/Type /Annot +/Subtype /Link +/Rect [100 649 523 663] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +123 0 obj +<< +/Dest [71 0 R /FitH 410] +/Type /Annot +/Subtype /Link +/Rect [100 630 523 644] +/C [0 0 1] +/Border [0 0 0] +/H /N +/InvisibleRect /N +>> +endobj +124 0 obj +<< +/Producer (\376\377\000A\000c\000r\000o\000b\000a\000t\000 \000D\000i\000s\000t\000i\000l\000l\000e\000r\000 \0003\000.\0000\0002) +/Creator (Microsoft Word 8.0) +/ModDate (D:20120324142551) +/Author (Bob Supnik) +/Title (Writing a Simulator for the SIMH System) +/CreationDate (D:20120324142551) +>> +endobj +126 0 obj +<< +/Length 2154 +/Filter /FlateDecode +>> +stream +HW7 ?LLlo)i:AַlOE@/顿_"%J3^o$Ov;\~nNa0/ pk1ǟLƘxͧS??? 3?kZyq;l\i]Z}o=7a):Ҋ9hLf2.-9o> _.?QG0d|.4Ǻ|,6cf|rr ɽ|-hɂ##1 +8cn&C8=}v1xq0́rc5yiQaNT^4i->8D4P/i MLϾ G1=MO=ɩ2d}p3缙Q ;NmĜ?M4brfAԧ1 Xrh9) +GϦk\vL;s=I/'3 +*@hW i)Hģ鹣@>l 0a +'&(۬?ŴzW5?Mluש(-% uOښiV<6ɁN/ *% rqz&p8bZ"áNY=cd`d1[ *4B+`'6Ļ\㰬@9!mؕ|#,K@EV(#-]Ye-SC0nl"2Sp=iPVS9[ 9#YFĘ.H3;`̄X5-VA +-RPB?-Ç~hÏ +]= 1 +\UϠJ֚i`Y*NE鉭D/֔vORtJ9ZJrܫ<9mcXҾ@Wi⑅͚8n鲦⥲X*KBuQH"☻_Z=R4$"Xqy#o# h໲6mB:;,& (i;לnݭR8k+_Fe;0j r4_`VcιW\/$|ӊX= F$EעsRYJոoJ:VӒJKBpY Ggjݥ0zR.l l5_H51}i)vЕF +GCݫvTf.tgx=b*nk:ˠfGD덤SB{U4cS7\)YT3xrY@m6 SLBHCUo*Wlxa`RAws9vO/rSڐ~[9Nx5:]WKZc5KGmZT'{MZz4bCg!在 5p>%7Lgrn0N: ~Jewh< +endstream +endobj +127 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F3 128 0 R +/F5 129 0 R +/F7 130 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +133 0 obj +<< +/Length 2314 +/Filter /FlateDecode +>> +stream +HWn# ?8E*a}u3əنWl@6¿z٢hG$mjv]uNsys}e|}3?Lw__>_ڿ_zc6?]_kî?G+0O9 /6|f뫳?;5q"7n@ᆠ9 <ʛA׺] `㫍qÙ3.Mg/Iס7^MJskrrs6n^g]T#z " F+(Xj= A8]gh-dX% oCD e߈=#0?Ha +WF F"(im}\>?)#!NX2y-V_t:!uEU9I)E4h'(!+Z֤Dcѕܑ!Ԍ4.xs5T)Y +ũ]A,MݣA:)˄*ݤnnoư\fd q\n3bHm[G|>pHKӑJā{Q +6H`(#68ؕmx[ט!4" 2Y/6Ge- +i$uhut)ygP(՚M0}z?UwY$Qw) eF{3~?Kxnh)zتrҽ>^=Ydщ7(Qs(g6ɇcCٕ@7Fƚph>Jc)^_ (E݋DQhN>,w˜"[PQS|-ͱ 6EY$AV\EFǎ ǽ Jڨw_λkW"1 S.Eo&%K;y3eJ>עms˒5/֥D܍mp]߅| +lxe[:>UÚxWާVus,Ǚ!@F}iӘW-\}| tܓ{!fDv;Ј74vj%c(0NZ٘>|MI]6SUd^fMQGx :#U<3ɳVZ1ڨA irE)b\DwԶېE-م8C u΋@w}dZL|Neu)mxS`4ȦmU] ]--7Ս65]li U#.&qGX[ֺVctt^rS?'9ЂK8p~p;;%u! y0ϝfD)) +xvt|މx> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +138 0 obj +<< +/Length 581 +/Filter /FlateDecode +>> +stream +HMo0\JKwfɵCJn,'H\ʁ;vUT;87s\ao_چ~&2F7E3o[8}L̟CwA#uh qxF@xA29g>B:Jkti` L.MNߚ˥8?;rkTq"I+vՃ`WT\+XP`X!(f ζ aBB^}c_,K ɩ{YAeyY([lPprr[uOgj?AJvheX_Ǘ\ju"ALKAK@.kMI|qhi=$R](NWxXI,uh޴> &Ɗo'r֚m^:i@p4w~& F^Jd^qthRm]G]4 oMJh"+KdUZY_|d}Ƈ)JEJ}j9O/G%z\ +endstream +endobj +139 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F13 140 0 R +/F14 141 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +142 0 obj +<< +/Length 3539 +/Filter /FlateDecode +>> +stream +HWM#A^;""l58mKr?͖41 y5&Yzիw>C:w'.׾aw_ _[ϟpz'_œ|'Ҿ+Ӓ8ǂqӚaKbNS5r'S>s=rlQ@krzVVѕ/ҢwN޺|/o^.xj3W.Ȋv]KSU2Z^Pyٗ[1i$8<%+\/i{jU^f;dlm+ &1^Gx *tT:cԝɱCW0A\. (U*@'Dh7mq٨UOTp{t {9UYIp.($ڋ~wUX]"BJ^ AۼoC *LI0u@ s=h7Q[!q(J!%1XOoY2!PȮHSbrju^~ҁJiT;'y33 vVlAIMDwP0,:E4 nz!eru ^y9ZI8@ӹy w7(BmZu0i_YͲxbG~<#L4ʉJ:(tluhS}+X}˥GjyT@HL(j?ʶiۺJ" WyS˄RFy]V͍ ҷbbt4+heз0^OP.y]󂍯wMG﫦ūhZe(SHfwrt0%dJ Y$m +a:z_UJ+ z`)0GW%Gzyar85G +$ }zt.Fb*EKr5ŁS3}xbVwvÒwR)r6 Oz38y$ΰ˷zCgwrL`+ {ǶsZ⠃x_V(`tyO|무 \x5/HU + p@A:F%AߪHi66K1V+M`9C%~y)*Β$Dvmz\V׷Iaʪ8)!,:x9*=b>Z`2r"ލ.N0)Y@}a1X/5GOё*Y0 +h +9Kݔٸ-Ƿ+-ĞiYFƐuy CihyQCA'Donlz+)ޱ5tN5y]Զ39CP9A}Қ#QeJ=[7"_2Os~VֶF[69 ӆ^x53]0+RuGehP$J(.J ok\sgJېaf8hlO»B2>+քM>4Vզ'3Jpt^yOEMt>i&ShW/hb(NKS[l igg=ṂNo gkoܒWShU; sM;Sx +q'jK` #}I6c&5y^`Y1N*wa3v}ԙlޠ+xҥD]6c y=2TB;F[Բ.a[rC #U 㕁-|R5Tu3.%C_% y$X4~ +(-Vk=C,@y$.Ymr\Aq d2<{(' hܘEoSG'-j͍F&# }JduR-0}EnI""4"`ޗ(Л!ƀųnlj-ƚSaIS߶ +yUV5 r(dkChFyӯӚjLd@э24 ++Ǧ+c 0}u_="Yk-mq +.͈ )2pAc[l,𔃹 С*F8f6Zukt*iC-kh/AvECBr)Ošaa@( Q˻۸ +'8ur2&׬HaJ4\>=-ۃ]r%"Pmfm1Yam mqoSgی寮Q3\Ut¹0;Y3#M.B7&h%bm:˲Vm%l:MTy=`t۪ w_ +f(rc 0 l(`y& E4}+xiWCqT@{aHq>!eE?X#}|o)_4 +dϚO"ӅZZ~4#eG,)\;o +DE]OLZ'ړ*b$A.I>Ns& $#Y-N5^B&š2xܻ8X68 cgMNlDSyf-Dk=?'Uc IJ,bSC$%93 m;y@<"=lzx W{{mT-U*pYَRGi^dxGgբ_}+{?*H<_>U #eO'6W3Ty[ ö +endstream +endobj +143 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F16 144 0 R +/F17 145 0 R +/F19 146 0 R +/F20 147 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +148 0 obj +<< +/Length 2901 +/Filter /FlateDecode +>> +stream +HWM0Adj؍ D7+vrI!X_lHcg0%5W^|c;;| ˴s<0fiw_K^/;9t87^O|8 +OCS^Pv* >~oBw巼[ pH~ՇpG7卲mZ6 3X>3p#| .s?CBXx X4[,[W;%OI.Ni.1;_uc`tb< -k)w.H!0QR?ޒLd,R[Nr-`K822q.| +%|Zn0N *6p‡F թTjUʲ5l!ҀY=p |=<$n&qrJ_ODO8L/CNSvkF]9u!jJ$ZEoAUźIZ3FϲvznSxyUpn{H*K} yWyIk=2" y6f4U׹ߘ~NwsQĶҴ>|]ӑbEf"!dD$MdC+[gdEL]${mZCEAT + +5KLxTķn[q,gz='WN#W6pw~w.'bUS-Ip葸" u;o{X/784q>A`L|§S [Go1[W[zKeC*ѵ>sdЀG/zM6)'% 8xSh:=+yfHxDU+E;BHhFF;yHkbnzM#GWp!>U tKOü鿞sMlU.qCGauy1j3a ~"|Byg쩖nI UVaen}e-)zxιO<>cLhۯƭcwIӲTe4Jۑ)nr5l5{IU,ʡ +l{OUBhZЙpz:TOW)oJUeQVAu(j +/GF% &}pF`䒸NoywDWW8Xƞʱ&?yﹸķݪBv֐5 o8"FNN$m"BXxs{}X8V{ ll%@@4VT,THöjds[1G,EZmLoSOIU?)OjJkŴCƄoxQU"SA\4j`0{wZqZXevAGۇ!"ҩVJTqPBmLپ/$9Sn < + +3B$I`/GSpm% +Orl4eY@yvJJ6fI+!?ј+Q(V;Y7Š^{妏fm,7=6 -S_&o~sh?á'&dP$'9g`џ:'bygƕ}qyx@wDtk0\5 >ged +endstream +endobj +149 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F21 150 0 R +/F22 151 0 R +/F23 152 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +153 0 obj +<< +/Length 2752 +/Filter /FlateDecode +>> +stream +HWMoXK=NL2foܜ@_~gzKɀmfg^zx}n: 1<ff9o?W]_lO?;Ms\O kv vc^3ֵl+|rvgP~cʛqttM%h\!{ڛ̈I4ra6> -Օi[%յT>QnJ.]A^0hBU> .R+ѯjn/QVa9GZq>[0``O.Dn&]+V夰35hD|9`/emT+b|t<w@P|K(0!x]9pTۻsV/c=[3&>L!6B-L3,TlL"ᦽ+TIp.6T;Zu߲D^Cunn{j}ɋۊ :zJw M:f>= ,20+ 풊DȹUsF&ꃔm9o6Pou¾)*HY4T͡W[Wxq|"'xǽN\J=6gY+FO'-U8r1qM(J~qwhbS BVA:mSzB·AH?N1LQTg O'*7W3` -QcI"(MGT-$t0sYRR0N7JzmcSRxf%b*؉ R5P"G,{5hH%`S +5-ܺ\V(6Hi<fwv}Jk۱%Y;bk @QgFR \z / +XS9ZVًSؐC8q*8-a@MͻROC9w[N> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +161 0 obj +<< +/Length 3500 +/Filter /FlateDecode +>> +stream +HWn\|XJ%ùn(8q73Ol _~җYr))0]3]]U勛1/qݹ_rtͻi[w|5ןG_Oy戀xbLKz?}Ho/ҧOz=ȾyQ.- >-zg.˧tw"/Qhf|d>*== p 7uY%ݕ}1lH(`rb\u_/m0X(X3 u}ߵW{fVֺ$K(\Wΰ 5.kz)h +p4XiPvm!y&=!ǻ,χ='Ѭ['ZZt젍AUj|  ۼbq5a)5t%ٕcE<?}Ik&k9oc+ۤJF"1l[":^w4,z!>9:ipBfg2&7yY;a]ivǕW:O+e/7vKF,w +@jz +|m&6A˩dxI`^{@ߥYGF3eMBgX5k}qcx׏[b$mJhۦ^_*RRiXSs %/F%k ֨J$L>|oPg"e FQEq֚KI[%ĺtU1IQKtkMpA +-kvU%)Tg<4lp>o6~.+aZ`PDMpyYS#T8},ݵU{ԣ";@KTOŝ05{;d([l"O9 3: 9>짡{3BiKj1AsTϙy7(}i9PNL9s1 9#nJ.U8dPCɴUJ2Nsm\hrzvdZ*G :Q!$5U?#*Ħc#Q sj?^|_b5s Ci}E쯠{\jV?1.~q \Sl*oh@C,ske e7hTʹa(%ԉQ,gKQmi]b:lR'BdW5!V8g-8xҜjVhdk6C]ܫd%_?N0sbmJ;9 F4n K;'ڢ<3Bי>DGl6XW +ˉ#z[YNF2}?IE{[fvy|FrCtfv(EVh"!ab5H0/7}'_ nʰoH'Oee>M*OH[uŠA% }qq Ǝ>cs/#ȴiqp ^[Ab=+%8qj큡Xj˵.ہ+ǖW h;`NDmmZvgZvƨ*>6w_ԄXvuFQ_`Pb7K?5Z@ lkj[jf.)4iN LFihb5Yw٭2 ¸0meJ̲gߖ3 +3?q Xҫ a# ) ˒m:3%=aCE}ޜ/#߿Vhr7xjɫ"XƯ|ͻ w%nl5^ Ioo`.&g#KDՈo{ +ETV9vz:B[!eG;7i} 9آiL W3rPj ;٪y!λt_^H4vqvA!TAZ5)tSiE!v)\Ռ q:%%G4 ,!p|J =:xkK͔٫0ئ>IPf:Cw=~b V-blYǴ*3Aӆ +Ӝ!ϭkuQip*8T\-Z0#k(c=UR])8br@[pk5)-ۓ Uv-A`"CTh <t#Q(f_%>B*a֛s%1b/;)S{f^{z󕡣6Xb B'ܦfo\&S@cI wN<_2k-b4#8a<\*^<Ɏi_ +xP xOK#6:933b-OHN6@H1a$l ӶGs7ie[[P"x#]#ƧfxP1-e #i NȁBVc驷` s/PvZ!42XsoGƤS KP[ :cݘC{IA`"XF`E @mw-A ^}KfƺQIӛ^f$ȾEjV"KGOp3wj "\Wv$5U#-{!:/ !o9CĄ=gL eES.FE=D,p9 Qrc"c + vWj3HH*I1k`@/R߇gDa۝LX04F`aO a/Fz!'Wk省aWe0V;XnP`~E)B+Ya6Oq)Fi-4r2: 9b +5n#S@;>{6?|[0(IKi#Dj0}`XىR#lzCSD -svUj(;l|HT("mœ|i\d7_:'2gs>n $HXV5'X3Fk"mZXm +\DIZ [&D!kR rkȕ!6ˆPFi ay WXp 0}U +endstream +endobj +162 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F27 157 0 R +/F32 163 0 R +/F33 164 0 R +/F34 165 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +166 0 obj +<< +/Length 3230 +/Filter /FlateDecode +>> +stream +HWɎ\0дiB󦖷t $ V:}@x}גYYKBİR_vvw|}u΄un='7N_L~Otwg>9|vsnMkß7?/[|2u{.npy7ZNޤ']`֤/Ä߹5Gn_Qdyݝ#x̍9X­ST~u~N˹QOݽAOY.')%< +̈́ݜ 5.$^>O0S)֐xm᲼ۺp 秣Û7 &?n܃s[/aJfߺ{Yo<;//;Hrz7R.H+s&R}{COV/jYbEGN0 +n_ڇno:aL;C*P*v "` Zhh֏M,)^ hI{⟭z 3NMY.qp$ 鱭]yt>wǑte q㹞7z`i+d]Tax4y?B(K2_ȁ5r|G?Y5Fђ#zͺ5+E}e0 +^͛ui٘P%)'n53d-56'.r\q__Y3_8ߖUxN͑+;& +ޏP +3w;oK@ tk +)}A͇i>|s˓uR#^|0uk4n#G)kf>8l.ò$~0))ӿT64/!dy$',k_&%-Jm hS}Чe9!hD +4г^!T,}VxhJtOYzLvuޜCc^ ҚB +x71BXޘuxXioѵ<8{ЧtXw0sGnuoX {0FQ5~t]Fg & +9p}WRSs'7d99[i8lrا?5#uű@T![īFlSdN;m Z7o0N7'{TlBtRj*칙1J?u JJ/P(${v\ ^f-Ã9W<yҧ{wŨ<<8l@lNkUN߉_LFNv&%2p?ay5]߈{|diwq٥_fs׃ai7NʊPFSI'{D*r(J*XԔ`<` ػWV{b|B =p?$b[ b4f!pcqftuC=UVvCf@QKk +8K'q׃aj%׫-Wl9@QJC! +YֱjU)Ĵ yZe +M82QZ"PVӗRGْk\lDc91Cz3{"fp 7 +rz~=H]i7ELMiXk€GJYr~+1t= qK^VzqUWߒ7*M*zfո1yEb <8;Y]4*`BoT[m]S~_SЈi|`dd7;6V\(|lxpWL>N_"b @"Wڒ~Yu81Hzs {k +7} x.6*PoeX{ +W}2Ar +%҂h/ό> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +171 0 obj +<< +/Length 3343 +/Filter /FlateDecode +>> +stream +HWMo ciFZ,?fq9@tN d{I&aHnYzޫ?<82\C%|x&9Op7Oa!O7LJ5q=^Sּ1~~{5Ĕ3 n7S|?_/1Aa> }w 0-S\ż^?C~ soRʣ핑K^\ad L)w,o #AGYd j[bn-P|۶׶ld(,^ +^ݢ$DΔP{]?xj`WC)wB娒HL瀯F~%nOqHl<ű&+ +bRZ mYKh\>>`vk5f\ѽBZMa$.f1'<)?QCH$"n\$I)j>Fp*z! lW<3 +nb0<ā ; ܩׇS]2Z(g5Qo:}@KJY3Q6:\ƴ9[CY=t@qW͝#ֿ?5䶥08SR 'b˪$eponF3)rIY WILZw2TxN]L$X^ EK61oM%l4ǁԋ]8Q:9a?U<]ժ4yѵ"X@0$)}\FГgAf^Im0gΊ>^CGE]O5N0%Ԣ| !PzYߢ +0ޯ!yOϑH5=T@v c-+$KU9lwήbKe #[!POdK +5Yxq*^)OC$mx= 0}XblFYC]AP(sWV͙8!qt-[IL֨{ \Edy#&IV&hmk%vSV1mgcQE6a;xf&SDS"3IGV{9k;߂AP'cBzG# _E1*ћ!5y=3[$|;2SRgV+1+L0O!#öiԠНmwζ#igں>3Ba^e@>k}~ -ߩ/W@U ;4ojdr8O5*TYI;T9[|@ݴ#گd6' 1 )(v nޟ\J4uўpeE{dFtg0 rU:R/(7,̻2U-j5dM4BWȫ9ʺffjbu/}Y[LG{1gO, mc;ގ8"&eLJs"#_tYQqwmak,<ŔSz"`'SGmk5V K;@ f:%b ]/H &/UhqۚԂꉞ8InOt@gwjG 0`Vgs9et +Tp~})0S5r-FXDˎ0~I_DHbRiwQ6FQ}wDR1J^_T[rB"^gK &+`' +N YU+I tzNqFH$4M9Yd9jm: 1TưS=eW@,a Alk1xTŝVu Fe=X wjI 恱HzMJg_S8,Wq:]b-QJ[-MQa=qɮPu(Tj]Of݊jZ4歯+dzgJr,<z!b"If}{Ss.}@LuUqV.:ؼMG8! Eq=`Q6[p-:<]6YZ߃%GϽܔ!gT{SR^˝2(QIZ2pw i/\A3ݼ*r~ëh^}`)[38Ԃ@ HT B ?$R:;f-6ݎ^w:`Sj{B=K%#DžƉRoOTVfWe[+nOwUQS!&5Qēڤe{M 8ylO2y?k ^z*)4+cL޵:3*AyjsiYep Vx> ǶD$jrb4 D]4kAΝ=(5)׏ ӫAVW5=FGzJs"*8(ގ<]Iӥ:qQ*r}49R>xpT{3L)`g*mqQ?oT +endstream +endobj +172 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F27 157 0 R +/F38 173 0 R +/F39 174 0 R +/F40 175 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +176 0 obj +<< +/Length 3699 +/Filter /FlateDecode +>> +stream +HWˎ$/v/4|UU7 /I+znj X],2$gƒ uU]rpu\y?7疛 .7|1n.H?M'7ooR~O(l9&'WڮGlWo7wAS,\Η@E'W_K!i]~a+p}կO*Эqs3)x;Ij[^L$3Y'KtCr1jKȋ~)U(լeZ2SZJJ.Md,jmKW +/wkavKgHqI4%TɰOaVѰ.\f@53ҼU ^3Nc(0RZa V|:4Kz߿+=9=+1)W7.UxC^cVBcYlµJޅZ ^LvʽV^JHhiET{,< Jژr4S T[N/G +uOmd% W0R01o{3:|TX Eϒp͌xQIyWe`/n^b<_j[9,X)Wfc׵Kdf_)y4j l1z~H͈ۑ jr}{|~3p $Df_F5hF䲗Gm(tIUqX0ER 2?+PY(|ё.7 :ޮٸkєa# OE.x^U HIvhCGXMvuȹ|xC娠h`/2JeDFbZz)D}r8FfJ, pj`^']jeXS=X҂5ա5c0.ҷa鿉C(E7 kY h<3\ɨ|EZjwκr-hVbNZ v + 2}1I s,@}Ѻh@>C1E,yJO nɌ[GF<55ui)ƕפoN$eV!ɭӜ}/Ȱ(vVG*PB#xpBX]R")Xŗ@\n(X~c +^?N|#>Ǩȥi˒xh`-1⪨uK w,,q»hփUN4;ؔ$+5ga#/duυcrm;%I 6˾Rs7 +3w50PV'Y{J\jUMXYoFK#f-su-9gXOP(Q/GqpyYGtU0B3ZX`f0fsEܚ!1݌)bL#i'z, Sφt ̿+ |h.mLǯ5hRQ7=ʞՔ&nrh2q۰W8 Ŋ5ߩNTS)čK0wҖbQ,> .k9b lBܮ6hwj\{mucqYryӌ$~L~1{}H Q1hHʔLX5q}/EX3:da&Ta4w<]ucNj egNC?x)iZ4E WɎxXJSRYuv8 o l1{~Z gJW]В2ƍ25@wϽv_ha&>Hۢ5-–ZNnfQkSx{`Bz2Rgc\&K!Çtzz<7Z_w8>Rӟ`?+'#,k-Q|Rt +\355eKmj(u~}e.xSߧa/{ф1ձ[e:_ +5Β\m$:3ؽe] !8W`aP .dvr̞d['?ܤ]]&rNA=cZ(3.Q쵏Wmƀ]*xUARxk/0(~s9&zS> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +182 0 obj +<< +/Length 3685 +/Filter /FlateDecode +>> +stream +HWɎ ?ju%չU% ` y,>oO<s53Fd1+32{/zaӿ^8ucҿh6њ9^0^v/_|ڝ'XKOܙio|.}u_ӛ&x_r'eu8'`ZhҶtq'Q 6qڱ\'_S2=BᏼRV0ZVL|qM}^$SW,>nr ~+B~SƘJy5`lxt 5Ox.k ^(tazǾ& Fb ̹XQkrԥmc)]N`!IVnJiV^&u%{LFzT$8#.NX -0H2SႪCqCW)RRg`<$SxtAdSL}}@jQE`òxL᯼abC)YElc沬e0$U⤎!4=L2Omq-OMbS6*\ W?x{THqyWaAhW_H͈ (D?r^52޾6Z©:F|h~ŝhLwoo$WPWf{&ɐ[bK@}}ת3(zt3vtSG̏3\.t=8@!qT ;HW1VqpͩAZLK +%Ȁߝ{#A Ew"YRrY(N98pU +o[\3fg9ڠpF.H_`d)oQd5er \-} '5nږs<.[lkrĽl s:7z2}m#*f%D+0a@DXoA u;5ܠ'2n_JL&t$Wv@xّG0*WL[.-}]OSϼ%s8i,`=߷ܡ xe8cj2[iww吝Bو`>lzMyU}ÙS\&p/e9wbnw#sx+ κ[29zfCk! søa*.X:A,^( f34ؤAMC +>PUgPX!qถPʇɱJ4C2^f S1D#wl l@ӻm#XHp5LHT'՗c* ocfl|iL [6\8Z= FW)mɰ7KGݵֶb2$bwa55Z"!p6yĵ\ފ.F],Ljt7Nz"!_V +lHfv4=wM 'S^.[tj~} V>iNQdJ~[xo +A  ߅~D\gK#&FTDeD݉%E2)0"bgꃏ3 w4]44$U:bT ω7NS#ħԩBwrUX))q2P@"^ތ@@~'&>>ԸwP(Ȼ6pJEP'5s)z rk\R;LKO84ˡ^z_S)-bp#`X"IJړ}:iTvF.{r2{6?\d$-gJZD&LgIp玨p~8MuAAtpv[aT$ zܑ^3nViU6)qlU}7h;1uY8wW{EYnq{T2Aݘq\GU.>̩g.=lDצF(7OhF-(anׅa `^֣p K.%Pt"cڽ vc ת~[.x#HAcVG/ku2`"c~9(MEWy CѽpJi`ĕ?qCL:%|&fPeP2e\"*LH4xZ ETmvD X.)8*g#&Xs *l,$NjG֑ Z'Uf&u zUr;v[%a"t9cw'|5miXsm#^P YLQNk|sfE%KQ߹TP!=tg!ODPCKa÷v1U*xg[C>mQAt3k'@n: }58Dh~Yz +endstream +endobj +183 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F27 157 0 R +/F45 184 0 R +/F46 185 0 R +/F47 186 0 R +/F48 187 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +190 0 obj +<< +/Length 3245 +/Filter /FlateDecode +>> +stream +HWn}Ȥ!6k.FєZpC3,Q s`tV_2ʛNR;۪ycafrd=tE*E$J"3jA#3)J9 H(+s!!kxXF;o F Fꚧ"zIQJ}JK3{{`I{.Ԑ#QM$Q H@9JXdusQ֤TC*_1sE{i-kjN{]FpZW))ͫ^;f>eH*)d+^N)'77c_b ^tkP74: ٷ(X6c.dYeO+f\_v=<P"C{cS뷘nύ?y~iTOyd֠Wep5K+ֈ^w] /n׾]#XF0 ߮D<\Ď |dP(wLYRNC/~Jk./{|~"uB+fltjmpqz2;v +v^uJmso_`PZsnvkes졾b( 2 X\:vtCG=!sv9 @ cBǂd~NFcăcc /{ H@ c9x5\ WO~ TyT+ !Iۨi[MTru I? jhuھ9D?q ++y /HfEwyc&l;0HN +IX*=Nq`C"H'U5>pM@K,rbIXl)9NV_X| +YɗVofyug$V'Q @0;d(Kc.ڌ'r4J]katAxr9"'hv +[Z'#،zyߕaf`k~P& +7M?b8je9 BC |)?VZw;Ԗe[>  KNGR*{c$# EmBE˕PZleqm,u[*~u,iA/fJg!ob(? NG]S7ۛj;O39-*RXjv̀BY(H&S;q_?@pB4Utue=P VJ(MkzPCJiͪ%T h#mN>B!w3qeX+{Pt`x-UơK}q7yTPwBh {+nw$p 0=lZw%,ܽ~Yrz Amo$^(ea4j—<ɫafC=y b +؉KS ,&t +P ^i*eJա1kZ=655dH ΠsFP!d +endstream +endobj +191 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F27 157 0 R +/F48 187 0 R +/F49 192 0 R +/F50 193 0 R +/F51 194 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +196 0 obj +<< +/Length 4057 +/Filter /FlateDecode +>> +stream +HWKoX3vWggwX6$ ӏzv!Y r9;]]G;{2]֝Kλÿ\??_WGlp4ytէ|.t>.}3=Zҁ]px~|X|b=U8]٠s.}m{gk'䋻0~^ +I؟r.(*3tpl  m{]4+QO!(~FmRV@C&30CqaS dʛvb Ч?f /lZWY,z%#4^Sq(Oo 7p]A b mfo@R[ii{-Qʈu.i,<ҮQ +ڌ-g3+AQ>2# P$ޗ!&w]{avpX8}]-:!W('|{ +|f\5m6TfTd۟h_DW+ul[Kpo OVÊtVZJB#^Y8:%ij3fIͮ&tw{^%Ɛ]tR'cY,b9;%ۦL+ @j,mh̷6hIf٣|v[KmC~˴b/+LG0NDX$M @;ݜ>$F&:咝o#,.(iTK!:6SKVE-B ^. Y:5V>\%c{n!S/:8ts R-T.$v,]wf%!aB[}4 my,|>+evk!K /EӳLU ΪCooN4>~\>]ZE~ +~SZRUg{ap? b/Ƅ9wDbdz-,f4.w߅b%cf=rheJ[QV8 +D*jгC]/B[^&_  A\f +@W)V즎l)D}0[ejr3#)tLA2u-)R9YfdL~z qA#0Pm26A5?YF9RߨkrumZ^ׂht&H;¹S m@S hԤ핁\?W12\>5VÑjt7|P9s2BV 5S6f`:݊Hxn:&) D+)H|F0lEAj0 4M~aߪIu +-|_ -!vB`B#}9^HP̨їw@_i psB4(ƙcv:鵙qFF;NSeM5:N/{E̥?T Yfw%ODb"w^\f Jߌ+GRAأNϋ~ѨW/<(;WL&Vc 7:M% ]6kHDL-⧦D/ĎJC^ +#oі2R,|(O3 `˄NSP!~8 Irw*&t#:.$AZdtGж6J=DY4V |d1L>"N]Nj&h}f|*CEDTFZ.B!Rui>[yMJf|ji=)IdȞ;?MgtÌPr ԫ}n,H +n 7+5gۙG3w㈪Rn*)/iQuG /EM ؚ ֩/FPo?_':" 0% + +6Zb tcp.N-j"rע-Mj!aZ/g?^5]r]Yg>,RqZjg\;J^ڭuj_ϦVgM!d+.Rnhu܌2Ry3mۥJEzN73˚꼧y%R4˨KoG| Qt_yPpYfQ~- 3C*.e`fU&u)CF@BckHz3MaxDnzN?S'qWhkn? iVB)ʺ'> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +200 0 obj +<< +/Length 2959 +/Filter /FlateDecode +>> +stream +HWKo$ h;N]ET`͝S,@.a~ %RUe!vwWǏ\_=ن^y}??~G/2w'8l _~IN4<]_h⚼5-w`GXs4# _'/Nt6cM=b|Ca)٠;ot>7a4 7<ЉgbgpW/cKLJ8&ߓ]!-wߖ]emL]9¶d8q>]k&zPd>lW B[lfr7GA +%=ec'aO~HSBlP|pd{SӡiYdb @ F(s`h+ L)I>ELh+Տ$>Tձ# X/w@+ dE%mAm 2\#3 ёۨX)Zz#J Z˫iv4rԽӅ>!`kVt>>>TD=|ZiDUlDyy"|Rt}#_sO(@ 6jp4zPim+ Gj"mʜVO9r!zd^MY!ЊyXڟK, HAg\0)nzDH | Ŷ/6W +9YpVW T 7ƆmH5C:54.ey1T6, jop5y +13kbYmqE)MΥFTz a֊tv^T0dj"̋©AbK cbd\Q!E]k\H[-a; }lZҩȅsEXkH+mMJqCNԪZZסϊlWWkFdNEL#U@ADLk*WœqZbLsONZT;vMUru%.""Tp %0DU"a TTOa}qWq @/aGm,]S&5ǫL-ǭW6c k;\NWb˷ *Qǚse8ȤlQ6 6bUeJ溇gc3.Yx@ _\ƁDYVV_ ),Lgek&"Dڲ7T&XW괵UXeYY$5Q WֹzԴrsq_dUTgkwd`xZ;לv¼в]e_ ;p& Ţ xb4: +Ro3sz|^P&֐ݜ|SO.\زwvdStb.f|,˂8{MB@®6.k_BϖT*35X4#B;\;G!K@eJAZBKA.ZZaI O7 ^('vgxqMPޛ B+2Tio7oBR?[s@i]됼TV| ![@"2{̄WƮ5\ طV%ƶhTfz.me TH̥*hJ.39J{U]2-.6L4mSdMMVuz]5{oymF(쳜?vz{ֲb76łP#ةrD>b,Hن؏A.["l8D1+9mSHL_9c3wWſ8b5&WdY]KlB^rBBy'"[;7mC|(kE +~meƳk'\m?MG }i!w1RD + 6Fׁ냆Q1ӕjSxqɮ9>G(jRle#WK螇}0\!I4KGu$ђ)T%-_XdnWY{w9B:{zv +;(,tRucVлIJ +S2kPz1 2hx rV",LΠLw0*ZHM=V+ ;Y*r/ݏ K74w%5/!bE 6Itɬ=:lZVm lea-$[!kmUr6PG'JFTl&Qm肓F9TP doAV }։S)yGT`?.j͠JIGUAV$,+0ܭs邇VP)X OyjVW+HغS&\,1'H R K7{7uR - +$,嶹ۖzVwj&ٺ.y)TKSPMr}, +endstream +endobj +201 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F27 157 0 R +/F54 202 0 R +/F55 203 0 R +/F56 204 0 R +/F57 205 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +206 0 obj +<< +/Length 3187 +/Filter /FlateDecode +>> +stream +HWMo i%[c{tƹF{r +,VUdHV hW!m&ڦ±9 *<95OA<9c-^hfRKY`w۲] Nz6aI/ Q) (A+%^Fahj˝l>#<| G14,r_nӇT>}ks$65~ukK,}{)7SQn/N0L_W`XM )ZGdI}c-yY5EpxĐ!O/X~W#8X&WFu1](ji,LEY0tq_d +bz|*{z"/v(Jpn649ӆII2?>t膙j12K `SftwK| Aq]0(%U&Z8M-R+ΪL0kF*(]O ,TÂXwK@{fG~SKlb#*]b'#\ai,ʺ,mr4Ң :NF3Ɋrj0|Ŕ+B0+_Ѹ2oKnjX`*D!DzKH  5],[FSOi.eM: +lɁ{*?/qq 7(h#5Zuaq=#i8O]Aɽ>+dEYޖ4|2?OkLkWZI$Tb~弖VY(c ѱ E̴խHӴWрFSKk + ]Y6wZbR~wňiA6M+;kUd_jzv.ښfqj3ʥ2+kޅq:Ȗ$Msxˌ\&IǓ!_IC:XB~;{GE͑gcbWs,&IG' SÎU פLsѰq5 uUa@rZ>Te (XX݃Nuo6ؖI1{lC_N2Nno(NF5q[}%pjVmAvvFtGs{.? ZP,{j@*Nr(P\kILVF:O^46TE3(y#V 9A*1ZՔVEa;AM˪MxҟW7h\0eg%ā)˧ڜ#arl>ԩqlmV-Iǝ.g1&qgu_y}2 D^c(.S{>kG >Uhܺ] 15lf187i22Xۣ,RWv[z( 6Wy=W4iq +*Kn{\SF[|)[uTqN\JᠯYjQ4"' +>L녿:^M8R/9+mx:Z쌷 rMP>wY[A#ꃚ!j S/): [V뱟NX-QbBK+9qq ʦ |!E*6~d=\8 #-4ulY0=zL71@>Gsc\NC&邯6 Ck>Fב@m387+ U9MGU\\u"݀MsjPayVg}6 h)fkQ@kde ++RFb+-NEW]+Ek i> +c+|T蚄wdBHC0hZSn[ B/z_DR@~kS'ȤՎOV ,i!V,rzRۤW6iwhT61MC}xrbd +/&=mVuiD>WnC=梿w_В|镶MFTaertT՝A2Wƀ ֋43Olu> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +211 0 obj +<< +/Length 3184 +/Filter /FlateDecode +>> +stream +HWMo$ ]CьW7!Phr +|I!U*=Ү?XhI^o/7{Xw0_!uږ/7~~zb8=Lxw1.]Mrd'o||I/B!)3s16?礿9=Z;i +gq\y?mʁ6Reu7<7}z)q5 쐯 َ_ے('|4r,.d'>ʏ~0=TԺ]KlȀ)ty6zԐ&fea7O ;&͇Nw!i +PRĀ{]YW +԰z]DZDi J[8IqPk2\6ya9`#\j1bBӆ# .rJ7 :,RP 'h1I2-\EPu"%o1'nB\śHX9u("tN~y!ɏwҳLՔh{JF^v|\ͅ"KKFՒ*"vaOxg#E5nup7FC`z\Kn/4Y=rdT^8'+b|xtO{ROؔIsZ_ ZASDz3J7֊bN6)81 +yEcնSi˩j\מ8 Ų?n3 :]2=S+շYT^%9|$\HE =KaQ2H,3s^B)o]d/e,0F?7bS07NDv&Wx ΝESk0YgjBL8nTEeNчm,m1'fs!4Ѻ|7mSI[1=^΋gеl;q cEVz*@mx\銫 +U`V `F "7-`8:ukz Jt`lG#K82|zCŎ ɠX74U*@D5r.s)u佰4ry:Bxm4M7,n_֗i]"@Iӎ: e%_Uv:35F1gz`j2_J*4xHVZB6͛ L%P)1e(<2CJ^W$Ayd?_-ߤpwCàBP +83]LWKrj%UI7!VΉîp6tn|EFN; +`T sH9u_yB&!\>vyle Om8lrg^.PFTL L|6*HpUC 2B6 ړ$kd +ݱJ:K"qzZ/Rp(@w-J' \%gALdՒ;4[V򳚵b\m= \r5>3jDVh}F֏PPZeaf*<^Zo}`i `kcco)k#[.VHESF,3QC,a +^UY|ѷ3_5sҐ-1e˩jIrXxQp"M\ESȗp9DzIb<ԧQANlʈ8I+c=phIzg~a?I!,dі#uƼ$GZr| !NntD}\N[ݲ^ɮ˴K]f6b bcZ5KnQAOㄷόLXjky-p=M=H2&=g4vb2a"veN4f`) PYח:b}bMծLEU+oz`Gi`Я* fh:4Bq.xr:ȡ3Í5l#,t$$$Cն"(o@ + xp x`ݺ+n̞W JS*ZCR1?KD@M//\_[qep|H#MصFsX BH\=&SH`1H=Orwdt[XD{K^٠s~W4)|wo4q}%U鎍 ];_ǓȈN!Anʼ_veh u> +endstream +endobj +212 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F61 213 0 R +/F62 214 0 R +/F63 215 0 R +/F64 216 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +217 0 obj +<< +/Length 3602 +/Filter /FlateDecode +>> +stream +HWM/aJ3EȲVx/NNb.?bU9NNWç0`ۛuZΤaL˲{z{cʓϰ߷7G3cҷٟ5lAkײK]]Z?UOkw8,t0鏉_8pyY~ӭ:kLK"m,ǿfpWywZfb]@. kO|PnݧGqy_SOiupH}K 22:c:N\]poHG%H(*aJ(N*H%3-a-sJRu`eWr~%$/kfȻX^m[LZ^up5'YLF̿@״ nV̸D,4&"ҙ),ʴ"9swW_w eA<Sk}g+Ŕ}mg)cSsv,ba0 cuHƥ(@gyOW +% u/w"| 4ԃ RU×>o/ۺ{uǷD~WU@c/z?UX2_a/A;kF8Y'"k˺˱ऽU<KzM3>#۔2<(&h7&yˮb*] r(("N3`jg9 kDN@2ʥGCI$[f9};5_}I޵ca9lV φv ;W02/M}m UUGVG!:MGKxSmSJu[$}v6> QLCzFע3*w2G1MހtQZ#{vkRm;D"Xɽǵ3,3@fy#-?APAS5(oTi[FA ra|.j +JVY]Zx@SBcG 6K;:?3|^Po—Z`c륢l +- +g"K/uuߝD3W?c[i= Cч4?:⣬u||=W2 +endstream +endobj +218 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F65 219 0 R +/F66 220 0 R +/F67 221 0 R +/F69 222 0 R +/F70 223 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +224 0 obj +<< +/Length 2263 +/Filter /FlateDecode +>> +stream +HWM 0ήd[S* = LNb @.!?EYE, u#uZ;CfZw>ON{ތ oƸ7lct)M.Џ񍮾1==Y;4Gz8K\>Z:Сocf83$Ht-gx"%@P1a3I}9ʡDy[a3>=cirnɱ[KljƖAwF+Je۽eqPP xU`}C O ;1IkLX"CX=}$[. PG8Jj}upݖXK~q+Ix"9O;-eWܶ`J!LRX bjI4Zۇs) ѣ%Z]l%TH3DY =i,c$_Ue.GWurǰb`mx*P 4Sp88͈u `:m[T ĆСui0(z%u璉Y 7]a#E>7{GQxP #6J<;0%.)TO͛:r:? +rG&7GeS==k؉Ϲ8 ~|(vRLbJo)4Юnz_X7q1 +_ȍ-GBZr,(QEs=Wm\vI [m +媫|Nhn])UAy>I].9MXH@:@SsLq&weDFx|xW'R>z0"wf%ѯi0*wQfҽ4yqF COWuVG[+ UnpYUƔ!7s|xa8kHiSKDy9\"~q4ZjmԈˍ[[Hx֦̥Uf9*[0p:K+̘• 6"0ȸh"(V&}4#bYȴQ29/tk{}}je<ӹn#h=_}z 0!={g%9MrBFwSVGwL1g|U@_F>=;ɹe{ne_o*V }oxDRDvr9|w Celjhn??R?FunT}֥lѷOHȗCtGX7K6C-hAUi~_*~vq0u֕^8oҥat4(ZܹWL{j&<+UΙ2޸UG!*J)9F"_߼Gz+v~/@e&+^iɩjlܨOeJͭ]vJUQUԏŶE-cl慍L7ߑmk_TQ^Kǵ^b|F9 +M"wQּ!>򉷃E :5d 2 &oTA± }z 6\!vkc(]( JNjV,l(@dr>yᯪ/k22iNIP=jxr>,xիDV(g|0 WSv¼KZ D):`Dt'7 =EEDiFh3> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +229 0 obj +<< +/Length 2634 +/Filter /FlateDecode +>> +stream +HWMo7 Xx(ŏ5Cb'|ٝzO $@\v,VnH9,afUU{|}uSts8r}%t/>eQ߯4i0_u}5oVm\!iuP:h9:j6T?-eLş? +@Lh:MeV&϶r46=Re9Z0LHsqz}^&yoGV!t~J993=(Oh&#`ϟ!onhxq,/eDS:L:) 14Z9',|>Iq r:5 C`\}FG^v*OlrsEr^p](n9+uŢ L +y %IYSrzUHsxeaH_L |0֤ - =L\–*gگtFp" PX)faS#ceJbJ;jur(LH˖Nd)2T;\p UڰFOo_!Ho hK/i5=+S`I,j\P7@ HCZ>5}vUA%DE J8둜$B˅l0ɰl18<'9V'a)݅H kQgvTG!%;LNV +´["g H2 +L׵"Y jlEain໚/Iܦ5˂&"lFYPhInyKRR}7QwMJ7N,ԛ鼳t2<΁}]Ymd("q\G]* +ռ[]FeBb NI4|l-'c{ۂa]d[\RU6imKU#6iꇝO6QHh8`CU,Ӌ= -=cY .ЍGVخ ΍*ۙű2B&<> &e$E@ yFK(HcY-9uֳm$PHz\ã)5=m*# vjRY-v@7uR=/,_36"RhT^(uÙ N@({9J~Mʀ(R=Rxتhr8i}A+eHo`23å|.PBOge)qeb' rҸ;х'go+z[ʼn1!5Om4ː!\: $f{hD6`'}\[O;]i|#n8hvl`+{xs +)dDGPm}):m T ʅeAWFI [5Z[7lU+܌lilDFwxdL oKIGot+w Wf&:X\gNI+t&|9JlyOnf͝0ʖ%x +̶ 7VK磽 Pieˎ}=0D!a/QK7 HL\T,ܠc:HavK@e([|@:a<(H'nYK[%HE~JAI^''Œ UC4ɦ?as'd`OVx;e} l?n.9-{|leSĠD -On> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +238 0 obj +<< +/Length 2697 +/Filter /FlateDecode +>> +stream +HWMo k$'|Z49rI!Ud"vahM7b{^OGӻޜSةt0_7 +OznojUJO7YxVZ&=AUXuB_MyLZY)OsjϮ~U^{o{kWCkSD|sM>U[4f=blecyfAӴװv5q[O.nn 2\*jM mTJB?yfU%kو9 +8~^Ӈk#|dwpy#Js̛xWk"?)ǨPKo{.Yy[\9vZm-Kv҈{rGv9[ը- T7ȏRx7S߁H7tu _IE:Yzym GěUFgt-N L*ӝ4\ `Y֟$){ab(m%j,4,٫~J5T1D!ܵ]ke R(N@eUkB>XR) S&PY9-{AJ0pKh- 5AvwΗd{ q%Nd9ްhrin%C 3,7AҶ.5muē{yAVLO$A֖O5MkQ#ޢ rJGk3 ds?6M5ߎڧfVHn#EVt-Y 屹`F8/9|uОwxmq*I6Ȗ_1,]>obP<| niN;UA{d67:͝v_d_]u |͵bL/ݗ*U s4A^, +eqkF +EϐG`S{I= C#k<@6BT%bK|/We[kA糎: ƾ]85`fQf =l^JRgq[@>dLe2C+Y[k񇱠3Yc̓WRs)r +,vb B*_W$TYtuD8[Z2YAcm[_t+1TTՃ쫌q9 +2Ь0玀l3 F66H +endstream +endobj +239 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F80 240 0 R +/F81 241 0 R +/F82 242 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +243 0 obj +<< +/Length 3077 +/Filter /FlateDecode +>> +stream +HWM 0XPpݤבCvt)@ %9炙>Hhe$0ƚͪW^O3o7/qIW/;dy><kyO?ïz/P>P>|r{(WS[C7B}:Kw:w}=7>M Z >z<cɍ<ٗ} gE<Ojv58'S枃Ya:+2) 8w^Sq]vUje\ZejT_0 +*C +Z՛.$@X!'sGLHw߀N4p(8ϔ;lpL#L-8X~Z-wC6 ̉{i6BX\F9sgŒW*zm.@] 9g2ǘT;&&B=KY~ho_G:՛(g`:.9' ObkX~wSߘ\rB؋X +СJ~O3*DYj^s%]ʿ݀ƪ&$S}4,RԠzJYL3=)oZՇ-V]hUҫog!ô34 8&4g),gzʌNձ1#7CF=VU>5:NȩXr: +i"$qpwg$X-c@D}*˷UB傟_/5JQtV /+M* [OU)̣_%)8;W:ε*׉15i g%WJQl`ʂ13aO.?sPزe 7Vd/y^u*M;=2GԪҷwЄRܖPI/CmQzEP5JZUMdgLLq2mL5PIƈ,fs8!KBx)RY*IҜI*dVe"0_#;_u%lUͪ@hė.E3ѧ)2o" !m43Q?+*ZB6'B!/}z:+Z y`W +EO_"SX bP߼]?s埲F?WO\1'HBDx[a5D!6 "K`K y\$jb6o4ҫ*Bp@`6f_AMTbG/PaH&B20Mz'teTPMz%& ͳJVuGk*'npv;VG&Lg+ٔzBoij*+]smGc-(d>ݟ ݗiyU XqU2 YCw\h;bh qlh>2SlzYK1)g>Tɵ+'?Nom2%E|գK}9Fu0{Wvd\ާ~%7JfM tT4pu@ɝJa^ %rֳiteǪzz P7~s0pK<> Zo>'rv껏7 s^n߸>/Xc|kNA^+.P-BɏA +jafWV^}H!gmpAf|ִ8'7#bM)D-+2DZxNd5eT, +qluv)XWʌ6sSw +MrUVN&W GB?i!|9N+*cttz) \zST>C\XJO>{nL¼11j=WggLq't[@r + "v0SЫL{;hG>`ӧ^UðEKF +~9!}k +ZZm;j"sN?itt\1MֵY`>5k*.,x[6 +0nC= *>+! =CaEfWg\,F@L=j_"GmM)ŭ}H{e\Zv{p~_WYxw.l-W(kUP۳mh,f+ĭ?.kCb&.R!wKeެ+ROOq@(v%je%_Ek +=c!S2xv>cپՑ\,%9eыmR+:8=4i&\{ I${n^{ +endstream +endobj +244 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F83 245 0 R +/F84 246 0 R +/F85 247 0 R +/F86 248 0 R +/F87 249 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +252 0 obj +<< +/Length 3083 +/Filter /FlateDecode +>> +stream +HWM/aDr򣛜Ƃ)0fs +rIGdώ֒@Xt,VNYw:`O~+hv?7}uyzy??Ggg[I/=|4Fi7ߵ 巃ZWOi|~O?tks[9hc){*v +ٟ%s%Sq]~`F }e8L_kcG]>{|=NzcpxS̐k2Э1<\XNMSt1_2:مe<=cD̒7`W5mK!D {XxebgBeA0Xx?BybP|S\*1NL]* Ձ̯P$"rց@QSam7 <ݚ.1( HE쿈/%X[7KёTpxp^k!.Nbu$O{]9uF9(C`e]RJ 3#s fk2<씣Je І14јP[ +KN_@󟮍@ZռXp3Nat%WN: VX'LFJŐ M6@QwoJ"5,kbԖM^1!y-j,ׯVUjt~*ԧx4ݴ>m@upc)?QDPƘ\$܆j*`Vl+|.%lE޵ksMEohc`TILp&rj +Qm س:K^/(:յ@q6֭5iDK45gk)Rca\1U:0R!X燑ʠ+q]T>XSUu"Hu.U{Y<\}? ',B +l b9/#w"YyQ zV7X_/V[זX"tHsȄfjZ!i4M̘~SE6U5Zh*2 JVS$@!9&@BS>»qXQKS_dO&vJ/{IuMpE/ڎ {/!̃Au0jOu7x UI!4Ef*̡U)bWfg3J0>+%.\# L\?S2vKx9i5WC.C}!MLrQKS_X;di~UД]ҖӶ|&, + +R5{읁)DhE}O[kko̍ܿSJo[FnrM/7ŸCZ̔R,M<y[g:1 Ey;DL8خ8d?dIR L6r_O%Ul0I!jF!X{|y4:]޲q+xkVzƤ  +ǽ|6N~K%,cb)saOȊD;:k;H?ܠlxX0 zK$T<>} 4vny 9pS4Kq&E#LoL7Έkt֐)t8F:kR,19kMF}4Ƙ` +:Ν t|pXG6RTm'b3m jJfCgjaMU$T#7 ;@ uwc d- 엌v‰<= +w\8\xd`PT/2,aZ1> .lu |sԽ+hw'}sF<A\A&vZCE8v vqCl3l-QF; e#k0e)+eI$-Lhن{ }ceJ*'Pxl|&:jap_M{zB"ȐU7w$I?0? =T3T;6PׂF-սFB{\p)/{XshN^-N Q. BUe!2 oѼ[X{)ner؉`SlscLX ZPH^nvai?>n☶9c2wȉY٤es2J(huinn#$>xS6a?*Avo0h&fU؍T@(U.nF]ӟ6?4B%(_S*ӳ)iA\אVr 1tBEdM]K$rłjdFMk?7tnQ*6S!h˙&FԒX ܷ. <⡉aw >9YjcqZ7(=> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +256 0 obj +<< +/Length 3576 +/Filter /FlateDecode +>> +stream +HW ?$KYx{Yf )#;P!lN9$~bYEv6 yf{d{{p/i[.G_nZ//_8?8/_Wot3m w^OoֻO8`9]NxE3} s^H/@K /I8wu +`]>iwU}2Fwݿf +|gKiwΰe:H6yi֢P} +btdd'f[v 5֋[,5&`L؛G2BKm?&ޱ'wK^H Juhe DTh9zalMM~R! pv"v 42>B”㺕{DNr#' ;x'N\Q20$ÈaZ/\N˳TA;5VJ_!0s ML1lI7jԄ(_¿6|'9Gڈ/Ұ_j^l8_)o8"OT?N}& #؛mӼ¶c͎C#o0*5~QѲ +z` 輦 3ݷiiOnF)bv Oǚ"[齍FmKSe`|K+Șd-Cڕ_˔Ww+mAo準7{%)*c5TD S_IfF3u@[[-󍷨m2hʨƦPR:vn-xݕD ikc.`zT@_Kn ծR*:kl+u/8=d}!v 1X.Ȼxw T5SjNx;W + -( ֡;IGγC\ځ#TLQٳrJA<%jC"Xe//v):0VYXQn>Bk2EPY 4M܁\r %cJ~6􁚉3ZCB~ta +qr7 II9ﴃ# 32-C {ς_v/y"ⴺsiOsXj$}aѕyBPyZCXC"w~@D{\%~\9˟Kց4N7LhÙZ9jTŐ|@ya˜ X0>WP ^wdžy;oEv;lc̞I/FB&2v<3 :hFl5*Ğ>AպmXo T(Qf-}p4hnqi\j7PVxRv=# ˴|EU# :d5 Q̪ȉa;z؄H+nڹ=UVT솕mU[/*i =_0CF::J;x. o1ԗ7Rh UpY+A{ֺ[A^% hYαՑJsj"CWA㭻P!{o`_x!==70 f\ib*Re{;|ıHJΣxCrIт4PZZޡI={rv)/U#8G" t& K ɜ+B4o5ˆӊP8 9mβў!<>2l!G:ݙ?FN{X#=0܌ T +endstream +endobj +257 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F90 258 0 R +/F91 259 0 R +/F92 260 0 R +/F93 261 0 R +/F94 262 0 R +/F95 263 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +264 0 obj +<< +/Length 3750 +/Filter /FlateDecode +>> +stream +HWn\?vdw+#K'd2P(++ @6¿dnif0}QU9ׯ+wׯvS>>*;kN~eTw^Z[ÓuZd+s2Mrq+[߲v=ԴșS]`{ؒI `t MM7G1/Rڪ3T%PR.G&8](/issKo"Ek r>=B^-zOyA7A +Q +[H C8kMևZ{wEc#,~*n,onz r ?aNTY7oC-&PX]=^-] O"RR9~{I[cj[=:|p}'Ɠm{0 %GLV |QO ~iF@,D H 怿Jp1 0,( yk K|8EQ}}PІKJ VsG&#C.{pDQX8<Ix4'AymmˎR#-Qa^|a*#Zd?|:\-[ ЄUGN<]ԺX^ۜyMݛEX0l,}uhIc 2&Bf9{6Y!ȓ +rm,)Cii,Q‘yKz>kd4AAߐǧNZHГjiq]vIXu)1,2^)ԝNOpDu8zѭ`Td= =2"[oVY6T;b'8s`Cײ_ڛvY3Zg Α삷4HOm w3 3.u'"7vc޺"!\0 ߶. %)9d4ΜQ@ (^ k]"FO-džOTOF[bfJ\u3u,@zP\@YD܅0.a̓Gijf=)/D[6P?p,o ̀\Ǒ[M:^O}9roȉ~425L{#VoO|E籾@MqraKꑄfq'{O+zqVdކE=TY;َtIJ%usFf9,.1&*Cij46_x ^4g ,sd5}Od83 gpq5^œ"FB]u'/[e4Z?Glf!YɮdXݢ/r0Bi_XHrڔIDyW9FzUSye#H>z9вöj8+je2=O g̩Z ZhKtFvf!UscOŲ֫AUR'h&g{GLbmZbLM4`]) ڳ8YWy1Qِ6I,1Eh0asR4wr˧L6jÓ03'_hW&P pe";DSK0T(՛@| ~DىSIU֧!ඔ~Z +Ӝĩu->vusϢzm("GV +oS;/gÜ߁ \4>AfPQY7 xt |aA5#<7"ɉ:-X +B˦kxr)k NwG]-3W/є0(;SuGzQ>ׂ&Du>xDؐ\s.ܷ |%"M(RjI*ζԆ:CyUö)Riu Ħk]4 ԇ];'}3S~k[s?mf9RnAQo~37;bxGZYZ<**u{b +dFxe]8E BB.ϴ7Y.b[կ-vC|_j-\2auiHK̝~9҃o_D.7# r"\M}{.T;eaN>yoOxkO*_$zjX8 2闼knàV̳ U,ӕ%x7Id"),c\OxiWhHjA>&ԬD/K^n|15rRsQ1/ ?X`SgRe$Z2c&k]hfUݕ2WZH*R[MX+ӎifZqH~͔s *%_4 b!9\Jh|ofp#f8e%FpK v*c4=걖hFBH΍A\DOz|?.h +endstream +endobj +265 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F96 266 0 R +/F97 267 0 R +/F98 268 0 R +/F99 269 0 R +/F100 270 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +271 0 obj +<< +/Length 3645 +/Filter /FlateDecode +>> +stream +HWMo$ #iFH"ay':en;ň9UnvK$Xh5vz^|}5vgwN)LW>pw矯LY֧ݏ_.Ѻ/skqyb>ڴ_]_=pphO;;[h31o& `fOo:_S:F{V:!9BX'3MMij8-py *Z! 4VVy﷡=B1&Uἔ\E] aٿ˿;BB[Z*H]K&U]jmŠvXj+U~Vi B.T7A@&Tuy *aTUmP\RV)N_0[[ۀG;o+K>[۞_j+//r2RN*L?Zc]Uw2&$66L1z QB.k0kb>EC 0 6a(9?o}>?eSM~Q.ǝ>;h e痱щ~LutMU-b4Q0lɷ.IHw:`vxFv(-qAD»` Q:'hTjunBպ/!۴UEIsw 6O{[G{h2e| '! )onKhu5;z4^igG`#5A(aVZB۞*/A=jY2? +ydqT>UiU 2#r *iPhF-{:^+0tb2sKq{M͔gB/ݹIҍL57އnsy.6ni;]3"Dw=q;Ѳt4安Xc@{Xo+FS]]gV n}< ^3%Q pnU r̨&3F\՜CItq!0 ӎUZ!| N!ɞٓ(*a'(QQ n#BQIK*># Nl%D TT\Ĥwoľ//4T6eja)׎iaZ7V*Z) \3ȑuiiqUt[&AaƜė ;`qCQ=_WS4zjv"Af-\b$S6*.3ܖĻ|3x^k(Z,r"T8ֵDKuڽ !X?4pQsl~-.aFcug7T2% D-HP^UcC1)f(To Ԕ!췶{˞YųR9?T'p1ngౄ=_6 #JPZE TWfdflUK\mzo“P z^2NruFij3O,LuDY i%IiB^)(GGPv#TX_z= 3GEGf+Yzfdcv; ~ڝFk *+P@3͏a`1#RS(9Ѡd ,Fu"k#Wľe|T7 +:&*"B:0UӎQQG ^%l`r䑤8?b$_ʁDNvȀ V(&@\°w);Ef.co;`9![Q9g^1?WdgVY8s)J[u2+"@y| ~iӟC3H(HrVZʤ'*0LLC i<3ҋbrљ8Jfa|/A?V4ê\TQF1KMAy$Y+ubW%fVFE(ϴ&VܨaDVo0 g/5r9ǧ`ź¾ea-oEw,:d.8zXv$l9 Pg.khUDs6/gQSSd6;k%f#kY^~&oy]i\ݚ`LP_s/'bMu2 >䳑>TOx%TqMI=J Sdƛ*{.wѸ2If5:D<+!>|P> PdgLb@eO9r }(g U+_Ǖ`)\|pKKp'l{;><%š*u?ClϺ0ږz4%o6E2gH -uvUL<^6^/YU[0Y-begMW<7.f6D/ޤfIx*oG NB*Zav-1nuFgj*TbS^A,KMECSwʰ +qvq1+i M`uZpt,n +P#KuT,=ZBѓiWFnQ/=wF7#meHLk%OB'[%#Hk6(rˉ(zbdɪl"N:Ϫ,+>)f|V + 'uvYyI0FT +^֢c Ee26a*j8MDr~jm{h(K:wI?@%2ex]0vXv;@w6#Fx$4J7|)HCɉpO{CVT-`+ɓʫxҜ-т>rbPI-= +4 92X)* +N%8Hٹ.B2 LB(H{u.$OKpgQ.߿H:Pkluд[&=4v;cU獍\uT҇iR6ۏ ]]x,IB`* m- uُ B[YI xud]g!3L '\X*EZkNjCf +. C(J}p:V&Y~cV+«L +endstream +endobj +272 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F101 273 0 R +/F102 274 0 R +/F103 275 0 R +/F104 276 0 R +/F105 277 0 R +/F106 278 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +279 0 obj +<< +/Length 3217 +/Filter /FlateDecode +>> +stream +HW[d~_3a<F#a/݄ x޶!?T$q6a1öMRW凗w2:76N>mS.^~yˍO󥗿߼\uO*GV6p6KE,=.|ۧM׬t; oX _ͯX9΋BY?_^Rys'q[y^>ܼ;iNw~Тx`<|?|)]/]iepH/ */ɟ|p\ +[7t|Tx>)=KR`kű)wpzDYَjN*6dYC(aҵyb'}(k; 0Fi?"Fe%G2=Pl[bHKSmi +FM=RT'̳(HWnFbblIc$"*KoQcJ+]!ʮXi-;QnA`gLB~mtr(:M!}57/.粤Z_Wgbfل:~L13bgqFgzG;c/ޥdf]{8̬QMW_A=>lLr0c V4n9c22 >}o㚾δsG|IOycߩO2<9C{b^hy=`%an[,SgJ.{5wtXo ]n[r]U6J{ݸ·D&Sd7L-zɞVq5Lvreľ`(:ܱ?(~/TIÇwrϯP\qͶв c\¢*ǚ5M\ums`{*iXک@[ha8[Pɰ9:!F3O>Vƚ:ʿ 4h!>O@#œl+ap3c$ r͖fXu(CG\Α%OD)3I2Vy+SnJ35np5*|VW1àT!|IC`e4C<;X+BOH9+[8I`;urTN RYF }Ɔex_))'OSCVUz#W,:\TdV!i#]MxrƬh&Z[sGѣҷ +o3 TaSw9թ-˩`ZTg RKP1JS:.755};wțy"V"$K8UhA.,nϺG|ڛlrTa'{fs" F#wXXRJ{l "L8L; ^}>=vc+-SM\ؔ_ 5楨oZП3rVZɭ}eW}ьfl۲c! xPvZ~h_Ǥ>N?>VӎgAG!6[{9x +ҥdSMK>NDHN~L}=ur\[J6M_&E6H2ֶTF*{KA7(L0e bؕ ,,777]tnNm+<-vFqV I! +sP3'H(ը@-;1פ($nu$.XpA#8Ø[Bypff.#"'Wj^01Tc4 :Uچ X‡i>EY0!1ݟj\[&Br~= w-Hc,Ye6F.pMV N;먥6&ziERqw~W0B&&?^G¬SZSo4;q"SkXGi,eJ3a.csSc*lNjsǐ*rBNgeo+0lX{xart>XBi"My2YU츽!Tf>R"0Wv]f<ʠXXn +endstream +endobj +280 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F107 281 0 R +/F108 282 0 R +/F109 283 0 R +/F110 284 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +285 0 obj +<< +/Length 3602 +/Filter /FlateDecode +>> +stream +HWK/afl4&؀ ف>doXH_~"ݕ-n>}_}x{sv{n]!==r{?v}{sJk7qĿto=gw?ⳏC>+ZUǟ9_Ǖ.r>C؏tR\0)dA3/mx?% ɪ)z,6L9Ei+ɺd +${D?,q@vi%x(U:B+{nYlQϾCM3DL1 4%`9;YowI apSl)sN#RTO +0{tƱUXuCkv)P>edDuYΝA?krݨk+zMɇŲTޝAcߖ\認;CM(+-?O$UT%neHK:3N? 2{"} &Qeg }wɵIޡwW]8 + g݈k굦\!>=ni7CR)ZtK 23jfSH%t +2YsYr9X率y&b$31= +ԝ̐_ !eB18џ=0E +SS6c˼!s Rs"`!r +i .}|cz +EY(g/i?݁?n 9gɳhoԻqZ$,]Tl-f@ADiA;NꞯES0`)a%H8)dYafӓ)VO˦ئrT_;UaI!"q؜H.WEs:0?A RIU^mq54>Y¶Qs\A/s;W7Χi\f^L?D<7J] +U? (j W 1H`b3Ǝ۶a]ɕ}f'(㘋uvcP&',7&'GT- A_~pP?!+MyjXo*$}γxWvyDSn^^Ń#2 *fT5BJ~\T|%K6M +%6Cc |%}ip({|-@{nиUU'Z11B4ՄV.Qu k}!v#]8Z%ЏSK-Yi7d|Ns +DtQ$CXtuګ6uP'bƕ%8𸝗#'v.BpLeiQtܣg%sԞL9ph<5}rlN$V@˴2e(Zsڧ3KiT^Mм:u %g5Z` Zd^-)lH q*wwU|S#B-q  ʴ8X!Y` L"y-8p4Dae of/ t8_+)8?:]nx?5 0Y Or$\8Ar>7o FYg!k"ǽibEYFmF 3e_å*2~ +@{z~GǮKOLq?ڗ$(e$A>5TSd^Yp9k7b +)6{4:ciXi`۳BM~+JXbųj16*C^ݕgW:zõ^)`N&V̦Xz[!x/})Lp2zJ}hTvI)؜G^iSŧ4<21+ [~HM@+QUb[ aִ +ajyënVYmұ8cJ|s7l-xk km#1[I6]nܪ|&ILd[6<&܅\?d)d>W{dG7 +Gi\)LoJ2ZE#5=E )o$uu%*j6H4Vth5eIf$U +](gsP!'sn-Zv}vsw{c'|T.^YHZy7տ{Y ϛWSph/A +_eTiDMWzsm ?lH}~6Kx|ة\?Vs/s3bKg}D|1GءctW&-0״:,cq-2.X."P"\N&R|yDА(<.Y[e$%?p;ٍʦЅ%~2FZG=wr7V9c×eޕ 2[Lڦo-u1w֪X7Ml5H`׫BL&@! +RS@ ,Gz3z Z\ +endstream +endobj +286 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F111 287 0 R +/F112 288 0 R +/F113 289 0 R +/F114 290 0 R +/F115 291 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +293 0 obj +<< +/Length 2572 +/Filter /FlateDecode +>> +stream +HWMo gדmMXf vd=qNAfLCX-[m;FÒHp}GAj'tL|+_hş˿7ҿ]_}= G3HnlowvO4 @M'C2 !=v|}emP1 oS:gn2w) +5}Yc#7rDFNUN>.K.`ǩov\vVZ-改c1W)ڜÄVBM`GzeWofc8t,mSNU.ll*?ݿ6C0CATF-i݊DnJG*,!Pqz6sh/.ιm}+X9=zi\AF~.ee?S}lj1 3VZX"3d>r0&_ܪRxkp)%ҝthux +@U5k7&b;twA(h +Մh{eYCYL?uGFPXȅoi 'By+dDOۻ$?-fHPo;gH}t!@M;X;SSriE`QLt!6CHGБ>'8'Dbo΋}ZܴՃOgQjύPB(4a'Joc)XE'fcЏ96e+V$Œϖ?; 2,;DV_E.N7G OU &C*@΢gM8!8b"YSU2$̔y:/B7Ԇ&:JvȔoBij˸fx&e-1NjP1I6#Zێvc2jE}>)&cw7V+1:2B !]ډ)xU0&].ASwR +T98UJtBs58Rc3ܜG(P-Bܴ7:SIO#) qը:UZf.nԮ\UНι +\x{orQY^|&g]L2F ϗS0⏪^E)t5#!Ϋc qwE4,pBD)i`H. ۗ^rC6N#P""Wi;u**7"{TO_g¼Ԑ?<*nCF%rz6(bduT\M xy/3P܂|V+^BgrtB J]Ŵgݔo_}bKt94`Ty )'U$r{t+utQ=a#aatOZK4L=հg$eBkHcKM[ō8?KJiCG]k,u?*\*fIv5L&!"?UbSsᐫ>iUO=&F?GdfQBMIXMP}!tܒgj>-Z"VUA*./*:3;]?:|74,I +endstream +endobj +294 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F116 295 0 R +/F117 296 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +298 0 obj +<< +/Length 4331 +/Filter /FlateDecode +>> +stream +HWMo 9+{&YdlvÀ {X@M)H 搿~fu 4f^zۛ?7ږ˦h|_?b']zEk??6~\,0E9=P& @^nGcQiڦz?}]רXnKq91>֕1fpYwN:csV A+3UvwaXrĨVOdďC+D IXAVe5LQKˋl|75Nr`Mt)ZF,,cqqZE+[Yn|J ,Х) ÄPnNk/>q<$S 'A*kح\.Z8m$ԎyԹ. %VIKVo҈]%f+gSq젬DmǠQ]f6}p֩4H=zPKy } %ƪ5lg Yҝc6Yzf`#IQ0̲Xg(jNve*: daM-SpBq uM|G/>vcZ S٪a=U+NYYEpyS n{y|9  [3bO`v]_x3)˫>)rn [5MTEJc +)YW/\J$)ED6q d⩃zZ:_b"_\ޮ/s|YOZ$jqU04*.;DKrsU8ccDKʆd:M]~6f\ +m:JO=8KdhT/gDzKv=DHUuRAq +U_* A-o Yh7u>%YFZSE*b0 e\IG^!8̋-:1CɓE4zکJ=un\EɇF9Yū=ҷ>W@a.D(bջJ ^5|E4vym|Ӹ)8v}Bmpw(FULK`T4v^!ܰ;ԲQ.});C_a8@H ~lvlIc|n^B^(tT:ge⚜OSv1VozNĈQĕ28wq|#&-/ݲSBM\ o9₫VLM %qԳFFRSE0_-}+PEw{΃尋ZVXfHr,M Vbf%e~m6H+DJ|]r*A0t'=K8k>*sSZ"MV +3Z' OgDs%Ȳ%Fv˝;%gP(L)VN5e,^aSrpJmұN$`[)<g3+NM"Z<#[.|fQWtYN VsY |~1ZVdUl;:ۀCIŽIr @泮7։LI;Kr)h*7j&`qhwVq݈=t&ߌ ӧEhQ^0H\rHmn+6;ۭoHK9k2+J o(\ڮ L|wltLpؽ&mL;ÅB²"Ols3e(Y$<d]2lFgtGT,ډ9#E3-y^8E P@{j0cžQɵj~{o4-wO q9r#/0j3N^c4&ٱȾ6PmdU +MAY`0!`WYnZpUF\Y_Sza2Q$V鈫I^fԍJ}#l;jffr0¸j;y1_q@ M`.#8HHk83$ŕ&aثwKHE"Ab&ʋuG)X S$K,f)M@| (̚tK7P~9/zE&KRʨ[/zuؔTدon"6bt{{%-[7PL{c|p'¦"jft4=S˪Aw+~MAiFZΌJu+APAd-!.'5*hhEz}i*P\ .h(a:µbkA$l3H:`Sl\P%XGĬ`'!V2i1ajꎲHVg!c+tpTC#il=iÿ ̽5[3AbY}PLVoWzyüq*kORfrkj?oiY7B* +ޟ~AON(+_e/b.xxEOZ|^_|1wvHGtn<0}lt9|kG  }vt)\| jԈ_IH=5gt062e*XRfd~n $4x`]ߣŗ53Be/O65dxb*ؽT7VSn?iI!s?ЊԹ5` k%V"Mp[Z1ӔCAEz2@V;r1,q=X1v~a)½5!94bW=gT٩?/Jed쒊*.8 iAabA/ՊLj<α/LO_ox-ygfJ`]c: ] QBkBsNuȗ2 " . |gn +72hO[پXLv-ΖuZ}R ꄉU&OT䛆x!sd> l!4Xul"&U8_1!AFs f#ݞ +endstream +endobj +299 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F118 300 0 R +/F119 301 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +303 0 obj +<< +/Length 4302 +/Filter /FlateDecode +>> +stream +HܗM w%eۂtP$2 ir +l!|Q)EYKaUoۛILn/ 퍌w|Ư0|Q +)%~_x[HPj8v{?KQgK?;KiWJ c ޅ +w{w)^4ßtX\Zs(^&Z>wC^T. H_6$}%gUO }>%uda]x / eub<\ c(wĜ+#5yoJ 4Zjܻ2#%S(OYAJ.Y! [s#YF 2ctps3ob%\: (9=U y:GR'pꤓ5TipFnU2Voݴj"&UՖS/&ЪJc *Oh'FpTBhоOrUf!6`_ ,<դ#|-fH2t- QS*~׻l蹲rL\R~֍dt趰Z%=%> +Ttvo]Sb,1z Ի"NݔNmMLfXEed͸4hfxMXf5̯];I]b,:ϸufAR+βmwsB!n ;mABT4@F>E?|.~9xĆ<gsl@d#̰׹"~Q>KlM(e]O/kFv$Q HRaD2+X5KDGkD#=z +hHo _m;=pV2Ц-/ȊiphqmzC]Ӵ}81~Qyiκ4֩);VPĮS8 B*Nbb,[t8A1@畚f*U1!u(y6m+1WE]'ϬUȘ;^H+$n޾4M!TCvӤå˹ i+0.˗/'b{5qV0o֕SLe;s+5\kl9٥i6Gp{xEU!% RW^uݕgINyJtyU3 ի.}-6[ԖnRbBBy=I{!<$xxo$ޅ>"Z1y;J1hfjzE07ȥ!-kJqfKqMݽ\iFX+.ޡ⦑Pz% +K1ߜ-(QUU{ +3_(/?Y{VG4ƎW8bB_·/]"$F.^Mx{שIlKo1$U3\3E E>1(iRAj1RO!BnP3aϷ7A9E.IE©Ͻu&1x#'p 6"dR`T/lNOB,!8i,7)яwHŻ e#0aKTj6n J #I3 d΄zetZ v`/ec%k//W}R_8\rKuAM$҇"**%=r$a z"Qk !Ӓ^dIcE6ck~'ğޏV612p:]\؆>NMgBebg˫c(J3- ܘ5=aPWMIP䓶 +PqA=܆sc9'UFpFu">p̞(sRǣռ?r2${0# +w!7q7̣-,$pa97c d d|.@8ʆ O0FV +&Fs<$X8<3iyt]st[Ѽ^ (6A mrH^ `gp y@¿p lkK,>zi[/(b@7HYCÎY!J-MǣwHF3|I i|NU„uaUtLre? O9px]42dE@&Mr)zRZPk~:a|6c#)\7D?oߐGV,FQFE(+ oDC5ȋOmN*icߑ ߴY W;4ŀ86B b,m͜04Un(]ӄkG6Ô#atM\'dLuC87,aŃ8žX0Mԭ-h %9L-t`Dh51GY\lYH8\&̟n蝤rrv-0~@LCT塉A*N6.le= i4{VсJ%e۫dz>Ÿ.Ĩ.-3!(`O2Om +[Ol!aU 9xt5aRhW-%+KKfvdA)I%$:|GjF4/(i ڭt;r,s rZɹI,EJwQ4 +c^k*EY(^tT)}SgQ\Qiih) n(-#I$2#sJ;n1C1S`+bYԙظuA'ȥonZH%iN4r}όټdCcjIoc:AY +endstream +endobj +304 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F120 305 0 R +/F121 306 0 R +/F122 307 0 R +/F123 308 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +310 0 obj +<< +/Length 4178 +/Filter /FlateDecode +>> +stream +HWn\?4);F&IYDYYYAd3YWUJl$!ԺUuΩS?<\={WN? U^ίW'8W'ݿ^:>j?_&I{GƵm +,iyuz=jw'0 +wZIWmCOw|?ʰZR u;~|;G А>Ԙ P2]˗ϗMhI:(%)7r^($? +-Po%єb퉒|-U:Ny +sF_ұ22* +V @PQ+%wtrmeA +I," 7ܥ9NZmK KE[l4w!غ(ZG0:2kB(#v\_~_7.J2B?nʍ^C8 += gayhlV7B&8Ti_@gгkm=LuS-(S{dfϧdbƥtNX[^[>coB(-AsmHC~ +hX0T3QT XjtC; 4#j|V}<>E΁8Q\Ikcr3ȴnΖ@Crd?9׍<])i(]&ɧ՞RD {Jm87+[!7Vw $ T[[$}=c^l f:V$GҒqATS;F ] 8نeR&΄%\V\U%qN0g?$S0 yCw;O= +CpLSa͜V&p tPhi;]Igפ3/襗[#;.f ״Tz{ؑ궃"jɹoA"iBci{`UmK"L{PK"YW?`nq*JKIjoL+bY)fp kLT%0sf-j¦Ȑ2%+e1XpK}?܆u JsŨ[lFBI;P6{ v+s,a(pP9V]X|/ȥ2Jdsn`>1##ef!BʰDNLHҠ'RL`y>pB^kX[&o;P=;HଵTg&D{Qί*!xKgRy(a;b{}3&^U.Ο1㾻}ܝ +dGf `'X] )B4ť֨y\,I,ĕQh&11E6yCJ!q@R<R^΋Xa[L10FVy^֚ E_imr6鏎g4npQQS^ +dSwrlvd#(s]ٞݐi&p^ZR\K ~a+k]F7D 5B 1f\~ +#a8dk# Mf `6p(DmbHÓxM:S +ɖ|@stdX[}iXcWRc}Lf`K?#56DXrGx~m +FJO\d)SUi3=dXTE4Bx¬QaJ [򡺰䬀EܘAaLQ)ݍ誧?1cW O7g+"Iǰr6}T-a`?qjdm>rmXJ`e7cF K(yԔ}|Q)3Bx2Kdm!3h]M`fdPB+ 5FΡ{psi} 5Cj;YGv!JwAd4F0&@F2-Jh* +Z*[ +9X~[N @ӵgAYk_1  Y/ '|T4Bf"Ih/P|73y:9.dw%aoXmkOK +^:l%:[6 ecL.ʼnխ3F\icL"IogGHJ^T9@ѫQJ5Dqv]^8|Ep}6;{/FgUjh_L׵W4ŦO1&& +dv8w" }gPnЯx8N l;lM!ReC9٥!K/d膪́nC \pB MjE(| ЂO,| pJRqI}ݰ=1cw ɱu1!_*?PL蚦X;ܒx^O x0C7{XTwXo Z.y.#GKBA(MZwBfh^=w?xAb9Edqw|[*l;;َĨ{·?xق1C꘳Yuqgk ]k,6MWN` v}FU"'ҲfSV/s2Qo+Lde3r.^!$[ۖNu1GN0 @!1)F˗)dTNU 2Sy +2>U>2([ IBPxek4BwI6%|uQB(hOdzꖬ_Y3YIyQ_fKVR-/͒qWu]ڊL(29_* Kz;t>dUWTeޮRw%NB96^F{ڱ#5.\(M-GC"F2۸*R3}ͤu3.mK:Z,k5rWݠm-ata#y2?Ca36hs'l ۰sWm768mw¯ FzNWB١*32 f gH'L|d0eL<";ŀص<sJYG, K;D^[?z98cv.ػx%no%ܽ.~3!ďTJII6.yPĎ>;a\su`$~$aAM|bQe=nq{`E$ +endstream +endobj +311 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F124 312 0 R +/F125 313 0 R +/F126 314 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +316 0 obj +<< +/Length 4560 +/Filter /FlateDecode +>> +stream +HWMo7  V0DY6: b{_ŪjG# 23&U^'`O\_j + C4Zpx)O~5]_?1iGqګT + +Dݷ5漧SeXMTZ?~aCW]pHp_Wd v5[~}яO3uU6z``1UK*A#P@5AGU$!fv.ߏ1-]B6[ySN rMJ_ʳ( +gkYӰFOw@rLrQ5fMNOT4tiϧ)T.gݜZb6.6 cMWl0ǏWhC=6Vdz7 c[TuPAkeb(:՚EAY`+;_ʣ-jqYB4i|-9} sÒ5 +Å#v4KH\ +(S.?a|$V  <8†*d碄ZHybn0plZ`k,M1&J3r y@Lݑ 齜d:\9FCt 'w٬bA }ИW`{RqhR17V۲ +Sk! Օu$٬B5z2`xr^rު`p;+3z' +\H)g˂Xo ([ֈH,JIa s:yְY^5 RFɂTQ6)MVud_+a͠GMF}%V6\L[$ saqw&pw)e:aJ3ɟ,|b$iBjoHtĸ T `I7Քs& v .D H8dJ`HQby-buy}܀vB3ӳ*1B R7^%4/X^85ʐٯDsN IZozfNjI>I7AA6 (_j؂'Y*e|WHqݼQtӯP]oۣEu=6VY5m޶dnQc5wM!/@VH.V+Ęac;{Kˉ*莍xwH4%Ba:3yGƾ37Xւ"Dl|({~@j/-_/ koNz[ڑu]߿N5)nH]4ҩ>mif8a +k*=UzVڻN6`D.*&i"z`:?p?0[˛=J#Xj` " +ߙC6i Ar'PY4(=[pGxn]CjlBV*T#+ͩ>?]ZJv3R\gSA;5u ?s.#?lJWC Pt-E܊}{t{a{ϩYM9ܟ?SCM\*cN*$2vRZi:Xw.JfQ:t +vTIάIu껸&( -lwjXn.u⬓}3V#߳uth5i*%oʚ,mʀi!d4I>;UUNJ ٢bU)M#^-E0·VW BdT.I(a~!3—#5\1.Yb +n-Qg[=dHl'1uFYQCL&algh>83K7;U<]`J7U`K0M|k[!exU4QNf!J0snlpS Fˆ30fCC6A( bn!%߰5VcQ

65FiwS\i)>:u3%͟m!/]^5~7rDXA0xW)( q2 VL=%Ӷ bSPeޕJouݼϾG c0V+kHrz1+'LQyO0ǜG ܍T~(cwnn7n\{ۍm}QHjҞ?dk ;5i8R9|׳s50Zj͂zmѻ$#æI88g^jyTd H"[ҞS( IݝAV;KJbı9띱 e(UK+LȫrdDpjϭ}~FN<S׬[::~żh_ û%"`>0vv. ,(JW͕^anY-ߣiDZHqI` @ʭ5‡vEݘbJ $^S !hMwnp[_-R"óW!!.?pK2J#ś$:DsQ{[#GG"#}y/]MCe,3mMg3XxVXn|2;D~S>fGB=e|(m@vU} t57jih [\m v~S7>Xwtl'./os2X,n;6}O<h3B'"ftkFBܦ[DDI6*R8EXՑgPJј(K)}*>Zk9fD ('$ŵ$ Ű67KWK5?U\h=룎aռ`'~V޺9w9є4bsm]etOOq(C++Nfw-UOc@bMz`<0f {ԫ2#+00A\iPI6?vR5­] $I"/M$b,!@ubboYޑ^KtK$΀d"P]PJwůe161!Dq7zǤ3 Բǎug3`vJ*]mȦݑ`dP 3+!Ӡ;wOo6ձ1~8g ю +ERl.eVt{ԹoלBu?oqUel2P@P-n>u:$ͷ>o=#q?;&-?N c^Bz7= +wKru1ư/vClB$5tuaYhunoH>+>ʬݠzD*$#CcxT~W %9h=SB>~ؖiG׀fRX}r'ݲߒ'!cj!E'%%:wi",w$2,)]^tRrKݿ==3KKYϲ9 +@ODUuyWC?re+爼r6=M)OB֊} +endstream +endobj +317 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F127 318 0 R +/F128 319 0 R +/F129 320 0 R +/F130 321 0 R +/F132 322 0 R +/F134 323 0 R +/F135 324 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +326 0 obj +<< +/Length 3093 +/Filter /FlateDecode +>> +stream +HWMo#<Ѯ,"`b(Y @.a~HV͖gl j6Yzիooo`ۛX `q<'%׿Mgf2Cm@.X;MoHݘߞ>@|f;H|zxKF:D2iC>jJ d`! q&i:G~yzD[CM: !f ).0v Ow Ao;ůaYt/EHwIaPlC#W"2 +|,a{:ʆJdЍa6Gst|ZK T# CA;["\TWeu.1XF?&߉*@\ #J9bˀ +y {'Hjzǜ.9^Co>OlfT/rlbJ @wS,.Ps A'!%`2dθ~J۪<<ȞxƁxRMH@Ed=^lsq%Q>&8#,;͡8؆p O +wn +)mZp}jPGb| @Z6d{u M-#L dB;@4Vb6wAݣ\۾ ہr( EUWi#1g W6<ӛaMR7x/o=Kp)lYz?q- I +;c- +Ɗeb.ص=ӫ _ ,i _DgҢ<dQJ+H˿;#y[?*` 3Dѥ2@P 菮'[A?&#:C9^ۃ *nQZ7.bv,yz`./|*Y +eA]R)Y9&'xxq^tatpF[{2 jyv-JE鴏nzpvgk.{5.afVFBG=HYB-iڢO8" oi X[bJ ӂ=& EwFX <6s=7xhh&+{K]ߕTZb1GDUL +=hkdbU2YVe!oЪ\&Y`P{/OD2t} gf;BmcXj\JM%5jg] +O+6SmK42/ld.ߊb +;e +|,yXq.kw3R +͠^OYrN57 ^Epe0) #yeڛrVWj%>(4ϧEgb։ˆ~JX (ՐoXV(;tqѸշ8pWk3%EL?riu68P~W!ˮ++`"D+r{I(еG^S_ș(ws0 +`3f\ ih}"˚AZkowP vЋ( xSz|+ TDl W*_A{*n +j"F&y \ӫ\Mg~KaR^d2Uo& bC7Ti@)MVǨ}Ajaٻ. ;3NZ+55M-7?9䨧\KخX+P{de]۝&^0j^ WҚ!-x1kQqif k%qэ 5܀q1|GնK?RBet^yv:gG۾&I]EJ4Hѧ s\cZ J[ =k<6mWy\ozK?Yԍy3g͓|X; أسem|6fz3y{n&YYc5R+ؗJ&eU!':!.ufMcM0|EeMg0 }Ɵ=hP)`piF/V?Eh_&,M6}wV.o2$m )'-weNMoLp~w2\ +wCo +N_B9Tn6}8AK׮Ig惇)=bd#ӈaEn4iNhyE^&%{54{ǰP8AH ^IJ~!l!V[WnwӅҚH#Y7 J[:J_g2Ww8%I=Į FJHKTzQ5ky5?v:'^5̌W2<2)M䦱BQ?aFYSUjWlH˦: _d"ESgFIR&]F&_% ۖMpToNC7SKť*DbrۿḿUSD]:WKwJ@taBєCܬfb1"sMPll IX[e5D\,y ii +!9/L/ fK`PʋYpC؝kw]1LCKy#+ZЅ ݗX)KnBj>9neإ-.{*\p,(kOv+Bkl C +4ȵy`]?eb.dgnQr"^ +^eV> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +331 0 obj +<< +/Length 3160 +/Filter /FlateDecode +>> +stream +HWM 0atye*I]08$CS,``/a~$ɪ)WWo?0㿯qN7ÇݤyC9~}~+;O㿮>ޝL/ݞ\p7 {#ʣ[ O.\8>^_`6i8~1 h [S. lPHuÔEY)/?i݃<nMkW}Z1rC3v@xbdqX92u䢸r^e}O]Kt9z(G]ȿ; Oz(TrŻ0S,@nG@?Ϟ}A> _#-u_@fKl +Ɇkp^ό0'r<=(ע:7|ɮJi6 >tGG4/=y9bZ'.kv5Zyd;fL|<'x=!mzwa! +Ŝm$=جm8x|8m׀a1ҰeFt cS|!\z%7[ƨ\Lq1w}s\=)]V6DWzkTWRHia,r -ElPdM[;B%g=57Dt*Y[G^\z_8us96 l;06w#b3( IoF ̽i^q"RnU \#MknRBQh2s~dOЂz|m"\fݻ!G|FU  ,OI6h(6pC]xs/[,eh(,2'I + ֎ީV(y|{Kk}ċAp@U^U} Mr!h )eUQ<X%83 + SI6e5 tUi w$=2l krs0ǷӔ=$,jtk_ׄ$F3wRj[d6E +QuEEH?4m_r1o{u7}f=u9ҮD"(eboc Qr7Yӯ|EA9 qo70q,HY45]}J?Zf"x\4ާ0 -Ŗ 4\ ;<:@iVg-IvŒ`<Ӣy{=J[{kY +ncg,IQ goIq0L]Z!j4H1/1[@ ;u8:yid UL]k:upPi[W/u` oVtŷ Vu/oe(g~FL-˅KWl'?g5ev$I%٩S?po *¾v!tV=mB2V~ۘ) +cA 3p8'H~w6Ǥk>0^g'W6N%ŔM^@I ̜jJגB ^%Z!`h쯥'ad6¤i64ZOj<فྠ,rCi\!a^j:Te) *H[4i%34يՂeyS:B?Y0:NA?+bPRJ+(X 6f +x#eѭ* 7$OA X^ջδDLDcٛޠTeYs͝@! o^plenYن~ִx7J.ۖf2/~ƠC@lL5L,>g>/"0(LLvr(_$@[1$ 3`€'F*QbǍ[ Szjj4j,!d1 C;4SYA%=0?[F&t{뺐7 LAS~ŒRMuPʾ9`e ,_IF(͙p5jy'5:@ $d[4hմ7$x} +endstream +endobj +332 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F139 333 0 R +/F140 334 0 R +/F141 335 0 R +/F142 336 0 R +/F143 337 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +339 0 obj +<< +/Length 923 +/Filter /FlateDecode +>> +stream +HWKo1Ghl=כ$' -E}3czN_C 4÷dnR^h~L'$?75\{x=wΧwu;>?]`o쮮Hq?2Xb«*Ͽ҇%>.IhĮYA1Hp˾atϧlSLJ~ B ~iV qɦ#~h(uiB5gM +"jJ$% 1Up*hP!%<^Ζ*WzF4lWė`u+5{4 C~_=%&)?'v.3?yze&_0hLpJv\ _E`GnrP> O]aAy]OJ%yfuX2-XBKKCGfq@LEi'̅r8P+{rĝ0\n+WJŵdSwh὚ +9]fDj˓ +U5R*$Ts3-dV֌qmޑ# +"OɓSg-u\kWlw)QzFXvh[CLR<#$z4$ɶ}UFҹ}|*uƵ㬞0TP#_o1P1JcT*[x#JsV6 0!yIDhhBj.|LD~ z +KZ~WoHթmo{uߏ/.a TDtE͝E[׍&ZXQd9)o`eQǤ#eţ:]fk1y=vsF6#L +endstream +endobj +340 0 obj +<< +/ProcSet [/PDF /Text ] +/Font << +/F144 341 0 R +/F145 342 0 R +/F146 343 0 R +/F147 344 0 R +>> +/ExtGState << +/GS1 131 0 R +>> +>> +endobj +345 0 obj +<< +/Type /Halftone +/HalftoneType 1 +/HalftoneName (Default) +/Frequency 60 +/Angle 45 +/SpotFunction /Round +>> +endobj +131 0 obj +<< +/Type /ExtGState +/SA false +/OP false +/HT /Default +>> +endobj +346 0 obj +<< +/Type /FontDescriptor +/Ascent 714 +/CapHeight 0 +/Descent -210 +/Flags 4 +/FontBBox [-4 -210 940 729] +/FontName /CMANNC+TT8A4o00 +/ItalicAngle 0 +/StemV 0 +/CharSet (/three/i/t/S/a/four/u/I/v/V/l/d/m/W/hyphen/n/M/y/period/o/eight/c/p/zero/H/e/D/one/space/r/f/two/h/s/R/g) +/FontFile3 347 0 R +>> +endobj +347 0 obj +<< +/Filter /FlateDecode +/Length 3694 +/Subtype /Type1C +>> +stream +HDUkTY@i:FeԙQEEF"O!ΫUGT0 BI@AW#,;VFf?[uq 0c*7$>׉LOļ!%|׼w/̀\tFlsF0ί̉0Lq1K [ar5f6q0b{X bA`<) sP`]ɭ>:<?G'DBkDM-0^@.7^l,7$TlztD`,#o4}Hiey]XHՓx[UB߄$>㜄ʗȃOW[͹GM&}=D`W䭂רJm]Mǥo.2BΩS/81t䱤C"!Z711+ +(CF+R +YMN3Nk T| }d'_ З +u Z9(Ax:ļ[Bt932բTM"u + 0Y2Dt+[B \%A!3j-2hn,-=&KGG~ 9~b7Ƚ4""*Wh +yEj B>xL`Ge6Jes1s~^ӍH9ŭmhYUGez' "P +r֋U)0O`hY|&{TUE~L)K\k:;~*XR6=#ۈ_ԯB8z=՛Jt`7`,#h +S0 +U}EOejhc:fi,c^VW\W)ftɰkbPZn9u) +*"IIe񙒯PKEя5]k}U + iB'T[lH'ъmD[-+ AkQk"~(9F6Zٍ|uzsh?3Kyprv x yVu5\]2y0 *rOct7ݕq uOROa +XFA31\;{"|F8c=R-$G\;;n#1q4[}pXI5P w;eޅzW"=ʴѵ+ՄBunNRSIQL0O$dy[4TMHsZs-4_#dތibB|O:$Y@$dePkļf3Un[.CG4:a#}v;]wlsH: g%p?N8 WUVW^i+K 鷩Dm&: ag7 -b$籘B E|= 'g2y:ٜRsse18{朜Pki<8(Ҹh)wD".Z 2=V'tnp؁,`;LT$ĝ?z=jes1o!$,K&OלW\R5M,Lq8l_d֫ /C-$^3SPI{=^_&UiԡRs[Kjd[zQC9Bi֌_!4_ڿoC)$B,!Yw:BQLfҔ,v&*Rڸ8eG]s'_fCڥ:9QN>bh%H(B^Ⱥ+Vyak9ئc ha>͝rFpt;dD"K}T M*r!Z$žw."FlB#V^&f?ҿ$ zZ0v5;[JH>-B V{VFC~BwBPQ?| +Q&uc7*[õ0-$c+mx*8X-t.-Z+X6$c!KXB@@R$RXD(LqKնb]un{ss~{_ /k}dFoRZ:Y-dX4xv@=<2;QPIaI+"hc!DqP0F0E/MisDK?A9`}CK֧9xhGuSއK +>Y4p+i pk:ض8~9Ol`ԏ;4۽^PU:}F$r %s%:P+W0eۈ`n+ re44֓^Ş:805HW hA8QoY$Nu™7~#G< +'ɣ8Opqv#ݬvPRuh7./S>@هVV ~>c"5.qI'o@ۺ{Awg8AQ$EJ䛊ba6 +>*xpt#۶æ2+LrP%;IL?LJA/f9(UIaءQiTU[L8#@3Ъqԃ>## b<~[ڭƦt'ϴ2WY?󉉕8Eb<,p*ڄ8UFR^W ' #F;idZᝌVej ϨX3LA޾exMmkȬڎLF2OGqXe,Bt\c!.r989Gz4o7ejXbbUAӯ]wHQh׃ |s٧ , &ѤH A ݋EѮ鷀_en,X[c7q(sb;`ŭs7t0]ͬsib~ zT@?",䵝v5g7"͈h&ZM[(: M[DMRqw<&ּ;N9ό=6w/p9vB@PtSG})똵CR,E;#0=>F:wv[5.fPCh.+ӘSըJR +P.a +YnI(:a t_mG 6*dYͮ#i5̋$@oOO\|cf0(i[Do[GR(F#>{vh@ʍ'1!n>RÆ#fJw~ՄoXSL(*Eʣbᛊn퓑?0 PǮbEpӱc÷ۓ +PחPϦRJWA?(3\H-(򋨪]d5eoѵh˹Wj0K[Y%`FrC܇ªZMSP==AJX1V&==$+LȴYaڬ|V]߶UKii"= 6:O|&:l:OB=S#:!ؖ +endstream +endobj +348 0 obj +<< +/Type /FontDescriptor +/Ascent 722 +/CapHeight 722 +/Descent -216 +/Flags 4 +/FontBBox [-12 -217 832 735] +/FontName /CMANNE+TT8A5o00 +/ItalicAngle 0 +/StemV 0 +/XHeight 530 +/CharSet (/F/three/bracketright/i/G/t/asterisk/S/a/four/I/U/u/five/k/v/V/underscore/comma/d/l/m/w/six/L/n/M/T/y/X/b/A/N/Y/B/o/slash/z/c/C/O/p/x/zero/H/e/D/P/bracketleft/q/one/space/E/r/f/semicolon/h/s/R/g) +/FontFile3 349 0 R +>> +endobj +349 0 obj +<< +/Filter /FlateDecode +/Length 5357 +/Subtype /Type1C +>> +stream +H<{Tw'LF T-JZ[AQ4C0( CBQ1  ++PZ]=i =];{~sCpb]hDʏ|-q;j%rMp[X(X)uZ/ q ]WoW% g\uswwӹDDZd&*E6=gO׵T`[^=Wx&\H?[WXXFUã[/-?Hegg駳y6`ҤP_744P~N]Z"nY\Ws̉JXV}nꌪ}}miT!L, ,DWF}\n57vַc0$`?8r.UG {+ ۲<:X\a;|,3fGK9[SRSR2٣Ƥk04]^ +ُI;Ix}<("q\2r]<p7 ϧХPOLA[p'z#&{'  MfHq\%%*9{RE( V悴v[! ן4gPKi:T}?ߔS[y*CNvGur K]ݳk_>5RPD +[|YeZB5ц4!KuS~j5=XrggeLMPeӏ$r&us լWЦ=:fOCz*MdwmGc|ţfƥM=QDl8ZO{72~|k-uKڰlD.c,iI"2}aB˔;/AΟpσSo!+0,#גakmU:LӾ]ܑUp[/Uk2Qiav#f׬S-buL&dh!BR ſ~~XdD +gOa~ x{'ڵ~tĖd3gm6feԘ/WK=M7I?S?.jgonc?Ire(-54Ԛ!n 8Œ^Xb4kΏ5?>E>׬3Z~,8oh 02闷jbT䲢4jGZaLmCSRwƉsz=լSr 2*[Eai}ɵzǛU]еPMzuMji[)hY|6EW^KGEe# yb 0s-}40$ C(A65v@= +F_hZUD{_`*|+h0A034 +jX>{nOs-pm^[#PYUH5]_R-c=YL:rVeS\*__U|'NOvhZ/66ti'GЋ>fovWZk!Au:gEgV )< >lGB*~6q+cݖe +֩)vUY'ܭu~(X\PBO\~)/$^B* +0kYYdןuu0G +N-A$8 = +F^0DOlY.&,B |q?/D"V\CQh Ye:h)򊰦"` (JUĖ]"/>{& ug;w;|Ϲ r4hPׂk׾n7o +={#5o*?`X7?'g1u|dE?~;$`3za# n :g Ʋ_tAč*e].QWZz ^;hXI+g$:FQ;RC>݂!!`.Uu`usxC鹟 kHXiaJrg 93h +-1%<~V) Dsv|DtJj!铽jg(㓄heLRLFڬ?|Erp=r:9?X&'zgK UuDi]c y1EUOUʣk{V@+!%xߜ=}.)8TD!Sq9ܲgx !5BAx7GaFrMrhGᦣ f?uT iBp]my-lh![Sh]a Si9!N~VR]:."q1ǴN7gw{UI˔TԡEhB_E?ǽߑ}ͽTSo֙u>vP?Zz9~V2o@)?# ;3I.MmDUB5(*K _'ۥِ͍7CGT.jH\Q2y{zF qպbp@{8Vk~)0B$jQUb6'zSISЙ $z]&BAKj*K#!$VANho% &%Eu{eb66˕˲ק!0}w "{EZ΅[#Lz.*@<rVk+;{shD85ZD\_C>߹ ;|{Tl cl?hЗ\ ?y9VMˑ4DQg[\cbPSy75DJ/C[_xH ֞KL O?W/MjcLX&FK7`﯏̉pGwK?O0InO'[lx=4`K<2x &t+iK.Q1ߐ .5MIBK"fW#; +Fd7L]Y"LvSiެ^& "lA‚%AF15;H>V[]SYX܎ C8fz¤hb"4PH3$$K⫌~~@8|D0\)ܦo*Pprf;ޟId*cɵ4(6 (4X5Ge:ՉMvԗ,'t#nBKB;DOv$&a]3x% +F +@ +7J MPlVڹpW~+8VWj$1r\fH5m\ГQItT $8:(vПPz:!O[&Ɇ >sʵX4; +0Țm*2??Ei 2MJ`d"WWIQfIk\#2ۓMy+| +q[g'/Yqn;ݶBًl2r@.%+[wm#.pfz鮬 [Uge ]S&}=]թ4JO屺٤-hH?Mobtb2EIUdK9$WM zuր-ϪJ/I/DF[3%51KFHJf\j5X\߈[O8)O)K)`=En'=M$\|[ŪŢ^f:M{n^a^Wu2pˑ?7g;ď[sǴQqzE:8@]&%(b@)t0RXa&]ZR@, aX@Kp JrO<{ݿLOlܿ>eӈ (D܄) r@p +#^rFƒo< EĔj޸))=)Y*^56,&ɩuZ=AfdDOpm3ccf=mr/\;}yWLEn +]9}M6貍/ ep4IG_!Fn -}CM9|)V-8Y%#$ +Vˎ;-&ir$dX=Yl\1L_ZId駮5W5S jCx;{wuEP6@mwi߼a=x+ܖt;LWS揯іZQ^.T3ܖI'IXQrC-V7Cp pnn|h36MApIXaFeR2+֚3O<Sl)Ah0DG fA(_ >!)"O:.Le"yɉyl_7 tG.i* +5=YtƯ ӠugAF>{")V@ž%Vxm:7qƶf{sJcg5.f{q66#qP H x \+jA\vGNe +˴ +:_O8)d2?meDHë>/\rvDk]+ `ܳFL|ؐs!"e{ K$i~1Bv! wo +endstream +endobj +350 0 obj +<< +/Type /FontDescriptor +/Ascent 722 +/CapHeight 722 +/Descent -216 +/Flags 4 +/FontBBox [-46 -217 988 735] +/FontName /CMANNG+TT8A6o00 +/ItalicAngle 0 +/StemV 0 +/XHeight 530 +/CharSet (/braceleft/Z/K/k/comma/bracketleft/colon/bar/space/m/hyphen/L/semicolon/braceright/a/quotedblright/n/M/period/x/less/exclam/bracketright/quotedbl/o/N/slash/equal/asciitilde/d/p/O/asciicircum/zero/great\ +er/ellipsis/numbersign/A/P/q/underscore/one/question/r/Q/two/quoteleft/endash/s/R/H/three/ampersand/b/B/t/S/four/c/C/u/U/quoteright/five/e/D/v/V/T/parenleft/six/g/f/E/w/W/parenright/seven/F/h/y/X/aster\ +isk/eight/i/G/Y/z/plus/j/I/l/quotedblleft/nine) +/FontFile3 351 0 R +>> +endobj +351 0 obj +<< +/Filter /FlateDecode +/Length 8255 +/Subtype /Type1C +>> +stream +HLT TSg~&4ya ȒMX e7J VP+u1@fK] +eX(j 4ǭmOc;3swyw{.B( +3(R%vMHmXڹYbx< GBR]>|blm𜭗/F/$<:qL$ + !2G]R dn|Q)}hjLuzQ$hδhzL-b5:ºZiݱ$dIҰ/;2# 1˜qbҙE˵([ KҲL?Uv }('ⲸDc/}4qe +'Dqou81ڱq< lؑ "Jq.h isǟNh+*ugkgs׹:@imƔէ2v="tXR ,&NX`M'<(,"oOÎ=1ӡRBI:LEh@VM7EiJYeRxq!qnGGљ7w\iPlP5xWWz\1ixD=MA6*8HҷAmjI"c(cO@ +q0G=$ D@m!ĈnX"$E@/GF Isa6X6C뚗US9CpX[zr60ƅLM_?"$A&s»BG6='`q2gԎ5Ov~\.&*"GVlk?`-opʴ%Vc37;,=jDp|Vy]%;7tT h<6 +/F'H F9O7u8vC9L2/0P'#۱ M ǀ *D8ܭx mZ0q86G@*І$E$)R~10N`C|\h qN?AA& +=p)ЏC?tvֳ̅5 P?[,=0ݍը"ϞcmT=ЉsC+;nF7@[gH36Iӡ[U/pjMA5ķ7BZHZ i  #_+ؕ,&O3pΟmh9ю8z}HVo0ŐaAE_i&_m֢޼/ ;a!gX_ʵ#XclQǪ#[6` !]pX!Add,Q!؛t T6y=ЊFwL+(F0X+p7ux*}bYX<& sI4X.)@ucQNa zPa bCG/ܬ<~7 [5C\_cf9OAc/BrJnN*+ 7[>kDbߦfL!9qNXU-)ͯm͒>%Br)>D)VĕoOߞ/9 <M~$lB'em"XY +UT/z> L݋֩_|c4˷@D7h`|IMfnxL{jJ|5۝>\2|0?/)D6ͩ&*yoV~V,0Vkif19{ó'J.Q{q ҡ#CkZ2Zd+n/pS5Be"nO|~T/ "tktan0~ʘf=퀻RA֨,%\.W.E@$ME"5Cd` KrV]M&̔P D^AQ0(>tfk1Nξ笽}':$L Y -Ae1|"pfys09ZQ7/iDlj#u:4.Tnٰ]+LFjKE㴴%+*Ykqg s|5'V!WK Z͠Y;!aܿQ5po'g`?43`B_)`I!zS9f+aiRӠq6ZBWK:v*UՊ†6}7\9*7P;EBn pB/[tL\L&]Ҹ)Ɓ|q\hl"n>2[f^ɒ\*ȬώGD}u2\Æ ]İfޕU&vfg9|*T#$6 c( yy'K +KUed5 T7u5RQTQ.^6l8E_fFH2w4W;ueQe"ؑ0# %@iĮyͷ`JPMZpȺU*4WK%|)&3>dvK_YҲ/a`H.Gս{;_ì);E?gKam+=Ȋ)DdYK`@O *faРo} M^ghKA뙚b%S5@n6$>EZՉǐ%Fap׷ pj[~p\m`\HO?7Tooh\ʓ`u2sB c-d낦wF  VR )pSMMwݓ@tqQ'{↘ʕ9(BL0KQAJ_E0Y|$E$L$Ӹ=(P̯/5>wGRGR=D嘤? D >Ըj*mi^hL 4FYQPLm Ha|kFv$ES?.jI[ LMZB2ιIo݉TAܜ'F-P&a_FfK}o|yQ̒Y#}0Mlci@}(Yv[,?"lCV%yR+9 +:,E1d2G624}l$~u`i+B˘'l#8r7ru +vI%#1ꗪ)و=DdS\|p;5LS)M=]2 ZF? DF1yl0`+*o TwR:vSHߖsf +h7#Q ./кdv FZ5VX\s,Xg`$tzcٻ`6a(n}fk[1ZG]?\WkTSWBn.HgI.M +F +<MM y( A|2S"Z-`Dh$<% uIeqpnXs{9go.'>Bպ,`#=R+Lo0Et|t/. +qr>rIhu+u5Tj>yVLLb 7f~%UmXKz-hlVtEv @ Ɇ9 &DY[ڥ̳Y?f=.;fE;VXbƓ*]eӅ\yB#d23`Ua8U.v1}h|ڞN_#Z5.y ʔ3^PCB~i*Iۭt#kk0PH=Y (f˞H-:RpXSi.Ż2 'N·%dF⪤fyu=s7K?Nфj& b_)wE>? 4x1bƲvFi\֠y[{ξD A32eO2/23B%ƣ Cy.mօߗN҉"SrЩbyM8YILcW:xgl@FikPO%@*F-^]kNHݘ!:{ym2):#s;n/h:-eYrM7an}UA6؁?O\ی=%EQ Dn:ѼcD__rSjl S|;,^K'ԅzys3,;~8KW8WdƘ +1C}ڄ͜}c@I6X^2,5 XDjuVmh7s,*!g`̺C!ch_N1'嚧A,pL4BcHvI_0.u +Y,fĐż4'Rx0h/Zݓȴk 8$/'~0Ւu75׺:҂]Gߋ'a' !}L;[}m)ۛ% 50" ~F\> AO&f +=b㗄һLx (հ钠\P( Ʒu.Ă>=BcmB;g~:[5>4OWo1zIdSHy ;Iĕm #.\\{ސ?+.5k״k*~Oz'w&\iY8O_նxubS8.}7lwU'Ȧ]!ݨr̨-lHũ&48L@]aAv'dJ))1)"/ֻd1PS4(-:Q v|bZ(Nk\ WA/y  .ߐ^h9_(dr)>Id-T䒖nĚ|#nf@NR?^m?3 +'_S-AFK( [YWG1M'*JmCm}#eeCo_{Ċ9}9@ +Q>ju3|XII1?8JkU5hPl_r3t6]`:wɀVo^Xk;&2`x-YE@8'dBLDD"7$"ϼ9C^O+?F.R|3?wݡG&U5=ӀMǬ-2xkpZT(.\ {%/2e# +SAO>M•.E5̉-K# (.+όߛ+o;?pA?8A\Ռ"B/_ey-2c_k9 *^S3Rl +LH|; L\c}&g'N·1)1 =oDHuC\Ġ>m?;>Xckj^=XulTq;cOIR6`cYVxtKě9TuL=;s:֥T&OJEt=,?yq7LrOgS2rnzy|CV%Ϙ'u"mZ&~3yc@u4k!ݞfFp4c]w<蜭?GޞEOm kK^H4vٛ x8qw(SbU5vR]w+u\c@#<_Ɓ/BqsKs, b[48> +endobj +353 0 obj +<< +/Filter /FlateDecode +/Length 5059 +/Subtype /Type1C +>> +stream +HLT PTW|A?Q@A4 +(.l-,46(&jo%o +(ۀH-*TcFmߔR^}u9\bgצ~~˝l4f&\Dz"NbOO3ߌNƺ?1sa7 3`fc `$@⪷=["%X0#7AߪNL!;,DFd ! + +,Q+q1xgWN}1_s{3 mՃ>),^g9էʊE tb^xVҟ >eLRR\z8y\#H9"6NSȃbyZL$%;P2!Yј*T嗗W旟;Yc.ԄRHMgoNB GG^ȇ`BH!Pd@?anN2S:A_S=Tk>=RF@+|謲A39~.:-ȋkeb)4,ݚK!N=ϼ*3dac|`m_.T6d)k[_xdϡ->[x:{h$qzk:͈덦+ @ ehWu[P&0`3 V-kH=qkڰ t|QUѡ}qm1Kv~b1i](VRGڟlؚ﹉߻4pAJJzB5˹-9jȢ3*PE ˔XAc+z#qCt0KM5%%udIYUu%U^EGVzwPcĊ1!΢4el#G{d..A<-6CnhUX[ `75h&ЯF.:!xE7l3M{}=H_qJtp&^d0a2(r{6E?U3wKZW븿Pkv8{ځ)e*iuXiPy7ВX2ь5\ݶ؅){4GX6=bT[N{vKq}gYRޗ\m-bu'PD4? 6|؀gvbOIJ1|?oZ?…jtϧN2(`zPh&PnO!|dD+|o&lx}(]RcD٦epM,>"^J6}%U`__t}5^ +B%l``p)@h+]@vfHxߋxAF'oAn_C;qDLZ6* __֮Ak#ؕcR^ȭWt(P͒#hey%0{O}?NubmYp!vGs&5 lbyY_jL~l@*r~V}Ujl(یgՄ@_Bbc7%[k%L5w:,% &NT}zv\sXpQW{èXwh|5o_̀U*G@`_KTOql2g$\Az{fBצIɀUNwlv -.pr]šޭ;d8yBx_/zw0B ά^tfCTQ(x~3L +yY%[I˼HE&N3򟄾zYw[<<؂F\0X8O&c{4sh` d*tw[ԥS'O՟l6^` 1+,Ij ӳ"s'")4A(0t5̱`5N\c:OPoVs)Yᎋݒl4;b;]O;i10 ,:.Swڊ>Yo]~!ziz@:*R"UbEDdž!TAYI:Kb AlMϴ$|X LN{5 $XA6zu3ߒj.gjd4W݊JkNǛtVe5VbjVD1<;Q=k* ,aW > >_vl&3을b}K_џ5w'=ъkګNݥw1\UDRFmZdevC#_a;IR0Xplj`51b(kIK U> op I '=AtSh9`aboaW~s vyKkO # N_KG D [\1ޜҩi47mq 6! +`U\~Puth4cĿO"F"W.-/.*/)K=}h;xM:-Tqu^}H1h+~蜢˾F"WpӪA5ngT}iL(,W;\NdfxFOB/!m!=`C!)۹ Y'%J' +$ix9ZeF E X#+S`~dS)&Ay@g`=N^M>΅2 )i2}Xsw[YZU0G/ܮғω P,4`G%6A\0P;Y 9@3*Sx"'-wP{͋aŦH,_Qvi`1ZKg4>a/@CL,0r/t 0ÂAF)P'dCZLj*͜О뺁 Dd3q/+lÎJC6Bln屘QYf:y\]- +ߞ W}fʱ4"hXEs*b"H4]+$KbvRc~̀k51ǫ3DA1w{cGE%pwKJÛ箝8l-k,J!D$sĥ&r[327G-7쥃 +k8X$p%23^h .v<t\<{{ +Pdѓ(> /Szb}DTWMFМCa)6V2}:q0 ! @"+FC] +a=4E ]0A Wp:DP,\XdazJT_TqcX6+p#4Ԛ,\C)g576i:ÈIEYQf!#T}S.{Ͻ{>{DNLdE@'qa( ~Gk{~Z./{ m\e%9)f +ȇGVM, L3$a`a5(,c(ڰ6aA +|X CgE|n,]!\˕j^,)Sx* +%DVpeDOQ<h,ElF\! k>XgFȿum9 +endstream +endobj +354 0 obj +<< +/Type /FontDescriptor +/Ascent 717 +/CapHeight 717 +/Descent -206 +/Flags 4 +/FontBBox [-11 -207 826 728] +/FontName /CMANNK+TT8AAo00 +/ItalicAngle 0 +/StemV 0 +/XHeight 521 +/CharSet (/three/i/t/S/a/four/u/U/I/five/k/v/underscore/l/six/m/d/L/seven/n/y/T/period/M/b/o/z/eight/B/slash/c/C/O/p/nine/x/zero/e/D/P/one/space/r/E/f/two/h/s/F/g) +/FontFile3 355 0 R +>> +endobj +355 0 obj +<< +/Filter /FlateDecode +/Length 5026 +/Subtype /Type1C +>> +stream +H< PWǿ<.y`>v.Q":y# o_>jb踈VGXF@AXPQT +XV[`ٝ{g̙P<.pC#Cd.|flϯwT3Zj_Ni#|e8;uwzxoS=(ΚQ+(ʇCr(.BTɣjVŧƩ{`dbqW2r GFr@^Xrjoֱ +66/]tVmn6W8H.,޺X(p tttw{` 3E~}ne`wFy}2O8h̖dbwMb}^کҤkTT.z ZX>> p}.ۙlHjXFޣuF1~Z3"=p) +Y$6z!c&>H*F/]Y]_v n:DsHLuxLW+h9^W5j 9 4AS|'ߘ]:Xk;k\ƹ2M0 ֍L=l~K$k?%,oXWL`וm5JS33'tť +|bCഃf<|F25JQL4qBdfv_i^n~NQ<2cؾY)c{E6mkX[fVuk;Dzp_bg`2 5qeJxz82yߥVZ}*2+e:leqɝh2Tjk7ͽ##M/MhM TҤ?yҶΏFMfўHr3>$FYǬ)ȸ99K~- 38%Ù Ubd4f +qt~/F\lXNոplDe֚˨;E?/_cXm&Xeod(nu~4ΟH4HS7䥟 zh_}Y+r;&xkP%ຠvbn%Ϯfק_HDSrI.rKq+ORMN +X 7 nYDJj{!=0gY< dE< YY6|=xk`xdrar谢2)#D7o 4"?Y= ~K'Ov(c9uu=J)pOӯv45]b5b۪I^WKZIv>Dbѧ hn P5{XͪW~r|;X_P'Gٱ94^[ +1Z\?PאgŇ\=SLo/LJ>bM7(eX +a'SC)|b*V;{\rfoK\ J#mvB y `AN b$!<%[BdØH)cf0ZO ;FȄ~'y8M˕P +f]4Ǖ9|N+d"/1XgXڭ.U 6QB_^(Wȍ ʲ;$>P%nQK3†Q](W4 g؎Z穯cd=a6>lP+t(rh&r͌ SviTqQCUgȩrAYHIܙ 0`}px>&(ľxO=chyg[M>FPny^_szہ0 J "I8ђ_nhB~§x钾)܃D˒C`0~d2ُ`3(`h+d̮ =6.73`a7_]hmQH٨jRL|E'z3L:yR$By\=ID@azOk:fw9380JNU2M閱QxYOU2ǞT#-߆&V]6xl]nGl뀚֘>q-H`Qцz.ն/WRjQ ̇N :C-J1A霥MMaTFU>2I/G:0/]ABA]mmm]H6mdgxJ~YZsD)r~q,Eou Ơv3Ѭ㷎Ry*DũE2$ZωKFYy۝I9P(o&j VhCaEa0:53VA&3tt+ Ƃ7r/Cs Uas@FvA'Rr{"οJat<ԙ)lI˶ @}|w#)~xbǧNjDqYDVx=;K/9uTnMVyFafA)'{YQDvQNi61ѿ~irE@)ɎMeG#A_X|Wʹ=|\(eQ,*۝Lh[Yk. ^͌pYJU8u&%,l)[;0'ge-NΪmiLf`vJjmq_u{/EFan/W!L&vP5kHSaǃ8gÝFDZf"5/,f[n*k"l^fN59oY%, L/AgG=R{g@G}etKa>q$BQ4"m fm٢[;}`6UX`@Th|0fa`fYcQH@E9w&j;'b>5Q6ٍ"{1: +D}2Цբ wD1{e.%%Z5oX{DIvްj-B- cpHI?"޿.F[߈ߊ'b{Y.6Y[&rjeDyEMTʭ^͊yϳ癎dh#''0]9(QtrA~V{PNQܤ6W*-unC~u /+WE %VHz[(kklj[T*I_||B g/y slօDaRBE >yN$yT3YO|+|WWJ ;(YP7pS>F1k^ xp ?-#&govަ@ +=Θ^ pG+ݎ88A*3MOP +?a;΅7l|vT˘-ͧ`II!_]R(JjZs3CbkXݰX`hQc4s̅6҈OO|]nc`v gʐe>&|:6Rp.JJȠas +endstream +endobj +356 0 obj +<< +/Type /FontDescriptor +/Ascent 717 +/CapHeight 717 +/Descent -205 +/Flags 4 +/FontBBox [0 -205 795 727] +/FontName /CMANNM+TT8ABo00 +/ItalicAngle 0 +/StemV 0 +/CharSet (/F/three/i/t/S/a/four/u/five/v/V/d/six/l/w/n/y/T/period/M/o/z/c/p/O/C/e/D/P/one/space/r/two/h/s/R/g) +/FontFile3 357 0 R +>> +endobj +357 0 obj +<< +/Filter /FlateDecode +/Length 3830 +/Subtype /Type1C +>> +stream +HG l.Ӏ."* ڲ 8FTF66K,LD\J(NHDX N>$mwֻP#8bOg//?sޔ`e5wf2283΄`ҥĶ~;sb[mXsD{@w` .M\œC K6jZpU#C%9,K$J)TۥNjk<]mrj!Mgr{.ڢ%Y~ѥE X)7A>L' Q"xP`"dfO|O|sdy0Yx([ےLTN4r伿_!2ycW+M=R=;UOJJ@X>q*y7.*TE/ILK<G4P"gd9xXr)NNOSQ㫓얼6–eeU7g{v`VvXj 06`23A_˥9H86|\-3e'VdaoJRJbdRL _p.UiTޚ֙-]VB*ZϨ&Z-H# ̪LÁm7Hy]TS<>TyR,L*ΌOO9ayf ({rRy%.uǏ uxN. D jK$ 51X&4I8֚͟1©/%XT + U.fs05!H v75{ *mi&[Ǩi+q9H7ݷ놰f;lo{eF%}4jCZ7!R)^y5zh"cGx̙넓銄JK2oRoo9OX% EMkzj10^)ФJM#GŸ xp}gsܖz/_QR} tdoV_G"Ȉ#>Fg&Tݬ@l̜( +m!Ꙣx8B~]hC0a2&>7P_J֝-ekeȗZ8.ѨzGcѻHƤ+z;{[^U&ҟsdNzػcI2HWjgQHnosM"f}Սg_%/b8#8PpD^-S:H=(x$ש}޸;.}o}H4 >jFABɬ\Pa{:ȇs_L6W~|VM4Nro'PMLʫ/yrk[cOÚɺ%)8)8o!D=1@!hq;c<:?`7E}0t2 +LE +Gl?N,|h~5F7>l@ QqԬ 24֑"EyU7oU<' Dw@>eEx'u4;_; Fpvlb؅B&Y\of1RNB>ki~>>/k8i8;ɍlZ`OF+*2mar 8x*1{QFNE<ݹuեdYu~] u'u::dyy˂:5JVUѢUuiIG#PqVӇˣK -Eh_67%E/֞ 5 Ѝ}m// ܥ`6)-;df=I +x\I 㒏ą710H{6EB:beg̪gyVAj<<*I[m2p7ǨҢŭ*4H^B@CI #ࣚۛy ) !"AkYiZT\Kwz. ;̜~;``sis"F{@@O[\c.pnrXHg M^ɥT8)Rb C^%#: zf N3 +d>òz. !N |9pJݟY=h^;\|'Ȅh-6B{EAI8XOڎ6˅Pb6χXy`sű_\MۘVX'IrPb=HjR,I&|1qAH>t-\-DaͨZ 7YbzoPb~2b2XȇrkWkmmUoUv'w^Sd>Y)~>JGL/JtF ‰Zs쳺Kqb!J350=@0=XCܑ*֤ؗyp}Hy"NNUk-)ap]X(t"sI)<&յ{PKcrœu +p?(ŠbLb^_&e8+LjϾѠjTU)Xr[JhGy`'_؈3kE)T֫uiyr,O~8cv.rhŊ0mnꂯC5]\9?(ԨUeZR)94'tj;8_Ù\ +rЏaI^}oNuU% +R\x_܆6xB<&y󗺹eb~݂=1sfbȏ}޾>4.rЭ!/g37}77L.Q"np~*Ȋ>Zp٣s[\AXW9{f*;0L 7IܚȊ"y]|Wmig@`Уgʺc7]+O*, ҦpF!aSԂOp+}wzZjmŝ09du,x&^M*?JmVoPbysCp/{+`$!֫]3`03 7bʒz^sXFKKKa ٍ %Mj8ධҳ+4_-׸IgКQUT"ȸ̓!c=kɫ' ?`l$?#yo",=p+5Hhc匑DCT1q<_tXzjsh +<?R+2j M'syů^t:T}(ìB-/`7/5*^!2 +~XqU&ڎ9ocٷ{A˾%Rk54H556K;Ҏ<8-#i t Zpq* +{W8-{Y-W-6Dw{>Ł?f0#3 (y1\(Vmΰ_6 +Qi㺿_LQ.(X +/[ߗ`|X/M֡'!TJVp4B0.RqcpsBpQ$j/c,<7 +G҅7^id +c@Jn" +[$i5EGCR M[Y +endstream +endobj +358 0 obj +<< +/Type /FontDescriptor +/Ascent 722 +/CapHeight 0 +/Descent -205 +/Flags 4 +/FontBBox [-72 -205 813 735] +/FontName /CMANNO+TT8ACo00 +/ItalicAngle 0 +/StemV 0 +/XHeight 530 +/CharSet (/i/t/a/u/k/v/underscore/l/d/m/w/n/y/b/o/z/c/p/x/e/space/r/f/h/s/g) +/FontFile3 359 0 R +>> +endobj +359 0 obj +<< +/Filter /FlateDecode +/Length 2898 +/Subtype /Type1C +>> +stream +HLUkTSW {(Ҏ3q YmH A+ޏ` ЄTztD`@ň2PϪ֩:jWYko߽|NŋNNN y"?^pq]~a!B2vUtϧw9r8#>@#ؙ01Xxxɰ;]4gX| $mtta[1K˘ \Ҁi&{0F +e!5"n5 Zm$; FSIo97\mZtWeo-1Ɵ +$ʼnĬB!չGL+=p +0l A/ +A @RXSVUI8?,4D*ŊrʲdxWiDd&kz.Mg&qcq-y4gB@~j6vΪ.y?s4 hJܫlb쉕dIs UA$CZ!"4⸒i߾))AM|/N7%DjAZkm1Kw'DPj7/G'oA&/ i味6.[ =v}1iM.dr)7kxMR|\>p+@  + ~7>05J_n;L5,l%dFA vrـ >{pL 7X3`?,jq<x@"v-c ?JԤe|c^{u19#%`v?Lu;L$T +Q˒e"e0;}`CY XYI&ml_$1Hc %&806=!,yޣއ(;u]lj:A.}T\.&jա%u:k~mйapkm]XogUŸv)u|zvŅzۆV7܄/lG/jnk5٦z֨:]xJRAejSv}݁UB/0bf B&y,FE^UH.?ln:M{`恻՜|#6f߿cSS橞z:oC A0 ++ E]/ g˄9&^ǯ҉Sڱ<&z>>J# L,!;^!R CqrG̿Zl=&fnqEՅl T^CY/DoPϤPH!Kȅ9ayCǞ`9<@ +'܏eM,Ȣ/mmZGr:0Qfjw_h΅ɠmVԯ^uMv!:2}yyD3B=%T$=I+<~<޳Hue77is9UR*QGcSSFoPAgȴW;>*t_[4HGj( )VGш,av*xڿpcn6D!G#V'،gG5s+ 5]DI,>I29 /Txee=C܀'6;ɿҧ`3~%pbDdEcޟۮ$jDzFL= c n(RWɫ'/\3 MF/;0hՍKdBoPd\i"1?M*= ϵұdP9Bͅ#]uG1Za/ Dիe>lmJ`\t\8#Z)bˢ8p(`t߳VF#4+muSA>M"x,ǿ+HJt}DI 2{2 rIP +y:d?3S:2 Bd`b6-,l)A{nSFF!X!MEQ/=FҖ7V "Ll J eRֳlY召L̟MmkStE4FTQE&7{=s䄔,9xsېmj3 IczMCGDVگ?J?K<}r.ྐྵ%^دg8Dq"ϙKwDZ "}eHkB޲_7(dlib2?KNn|O;O.b՚SfgXg,m/_q lA`tt%38ΠF* +"vNZQ*h&;,(#aat\-V{ ~s8Bרq B*ՉΙ.p5fak&)j>20i6L*@GPP"| |hOtA F<,„$.Crf;FBw]zzU{g;=SV?(? +` `c˳8q4q%U(T[t bأ=HZE`mB@" +XHfwX1&1C`" .5?0I |+ar?첈,.! e)i`.hPƥB4i#G +tYm@JO=&0Yh1[YH< n֝?ľjj[s9$Q}b8P +endstream +endobj +360 0 obj +<< +/Type /FontDescriptor +/Ascent 0 +/CapHeight 0 +/Descent 0 +/Flags 4 +/FontBBox [0 0 410 470] +/FontName /CMANOA+TT8ADo00 +/ItalicAngle 0 +/StemV 0 +/CharSet (/bullet) +/FontFile3 361 0 R +>> +endobj +361 0 obj +<< +/Filter /FlateDecode +/Length 161 +/Subtype /Type1C +>> +stream +Hbd`ad`ddpuw pt70iyW0Cg̈́@j9308100322:vuyQ c'9ggt^NΗ9\.="~ãKW._zcǮi]883Qf0wR9, +endstream +endobj +362 0 obj +<< +/Type /FontDescriptor +/Ascent 720 +/CapHeight 720 +/Descent -209 +/Flags 4 +/FontBBox [-16 -210 770 730] +/FontName /CMANOC+TT8A9o00 +/ItalicAngle 0 +/StemV 0 +/XHeight 520 +/CharSet (/R/three/i/t/S/a/four/u/I/U/five/k/v/V/l/six/m/d/w/hyphen/seven/n/M/T/period/y/b/B/o/z/A/slash/eight/c/p/O/x/C/nine/e/D/P/one/space/r/E/f/two/h/s/F/g) +/FontFile3 363 0 R +>> +endobj +363 0 obj +<< +/Filter /FlateDecode +/Length 5402 +/Subtype /Type1C +>> +stream +HAB_py1^ge`.skt GƏQksłUc +%)l: s0g +21> ;cw*ńAy@-R F:Ӊ9b@8Ҳe`/`-C-+uHbb4aL5^a\ab*ڋK*GFzj.[-Q51uѝr}8 Iy_^-:̌[ΌAjT m䐺sz+bxP"+4I%6lD&+'ؓ&Mf$Β eu:$G5~%"5՞) +w*ȱ(RNȯ.7i|(F( DޠC̢uY=\-3,WlyBE4R$ =?.W#x9VY!ۆ6'ẇFYssfsyG:BoHmji-u֙h?Fvhf?݉ /{{@!ʓKdRidSȷ ?+ZB]=0ڊG.'32F٪IOϛqIdMkUs\L$I rU>k0WO)}O;dlwB%\'bMY.Vk!Rc` ,aJ ?!A*4pŞ~AoTglAipM8Q(u]"E0Q{i\PO_OD:(ܯa@ㄓ`fiِ?1,q@^;GV ;  =FChOgbtOUhS$dNZM nOol%4} 9ID(b7c6u8=^傣<77Đ,e%b>tqM?1BtVwv@yTh eUޑ沞+~My"UXU\H +$bHВgvԱ8|G}҅ !"e-V^dE^&D}kIӣ#@txƶ-A#Ҩ Moee׃ZEug++UOSE' + I9(֜|6=p5מC$ATT/CguD%v%7-N{fhu6_$+}dΘ$Dx(~)<(Ɲԟkˆސ ٯgoQ}/5Y r茩 䩋/QEGi P71jݪhZ6eY 97[s ǹiic@OraDRhx7X ͯnxi,8).1U,9Z/1xn ҆FPpl%2RE)jҧ0848R)~8XR=UUj 6[JZwĞ9_T=}1Қ])cv"w_dhiaLD묐#2=;f0thJp%jed}6H?M +.mUԱ-J2rUz, .,AT(B"H,a$,Q +նӠZe'DP c"QX[諾D93|g{1FaF3!V㞆Ef잼 $ƥtț*1 H;G< }ݾ^ސLq}/joxX(?p(v;PaX!lS(d{OAӋPQ2t) +wt1-&$DaC͟9c||/)qq-(\ٷSo)QeqWܫ8үZA"k1 #kgUGty2X-]Kv(ԹEBԟax:n2Z3 ݩ/z%uˍp=Eyrłh'L32BKp + ;S}:,)Ɔ/(xN+I#bK( Z|(c ľ/3 +hO̾ёEBUmc I21\`Gڦ.-7܍ J˟ɍ`2M}_]觖L7C=a/՝ՑҙRs[Zp}7ϱ Gk7[ֆ"}ҷnl[Kb(|Jlm7C(7V l5@vi]^z:v2-t + M%oo5}O>RTAlkh_RcTu88˸%["@kJ-,RHP2NˣZSzg5#=odp~Cq1 f$}3yPPIu'6&JE\C?MUehue/PZWh@@R(.s|Al+؈5h@,~$:;3l!@eMBcN@O9\wr \p=G!IkbDǨtrvV9vc%M]w]iݩ/8e>':$N׊]!PI 0Ew& :mPﳊ䵺[R!a} dSܙx~*:;- :GX"5g1tfۨs4ccƈ.SZ)^P}j5}4͸1fUp#{TY=' / 6t5syyswPpao<IҔV,]t-%w@*0VkZate:="=K˖A]# 2f@л7ğ1AM`N[D Qȅqcc!,N9<􈈧F)?!G1Z +@pak"]566qĒ`|pɡYRjZ.s,ǰᰮ#p, (8xё#X4!Zlaj(T Q.` Jߤ#.$ E74&RJA*a ctq׬*o)69\g4 \& uQ8S($q'B]bi^3fL=ֻUj䞐>m>jH˷c3]iӍ麧POϠMV*FMQAQАID|L+0qyuI.mRjYoFϵ`dxѐj2Ӣ B $5,>hཬX9A26X:![S1cgp?0Q/hP +.IGu9RZKt^RA{E6[,ۣd`',nO}쌾_S|\+by +K,lU W)nSS݅:.r($JkzɧpߚjmIt!B +xO-_> +endstream +endobj +364 0 obj +<< +/Type /FontDescriptor +/Ascent 614 +/CapHeight 578 +/Descent -192 +/Flags 6 +/FontBBox [0 -277 603 675] +/FontName /CMANOE+TT8AEo00 +/ItalicAngle 0 +/StemV 0 +/XHeight 421 +/CharSet (/K/comma/k/bracketleft/bar/space/m/L/hyphen/semicolon/braceright/a/quotedblright/n/M/period/less/x/exclam/bracketright/o/N/slash/equal/d/p/O/zero/greater/ellipsis/A/P/q/underscore/one/r/Q/two/quoteleft\ +/s/R/three/ampersand/B/b/t/S/four/c/C/U/u/quoteright/five/e/D/v/V/T/g/parenleft/f/E/W/w/parenright/F/h/X/y/asterisk/eight/i/G/Y/plus/I/l/braceleft/quotedblleft) +/FontFile3 365 0 R +>> +endobj +365 0 obj +<< +/Filter /FlateDecode +/Length 9602 +/Subtype /Type1C +>> +stream +Ht{TW'$c$qZ֭#Ȣ(yGH25<AQZ+ˮUݮ=g=nݽ ۝xN_3wwEXl &n^eW/JM~[QNMpLbo$ЂeP?8?Seg=ǨgztÔvcFD,K0Kb1l[a0uVmc1*1 +ö `bO؟Ec4gO} &QIH:e.\O9gNzkq+Wqt3iE _LlM"2q[* ~pPTf/~&/Ju3g?祜߳@p{S)'_z<0+%|Jh|I"[H2 |RgG:G>>M2|l*V(Lki*&)i95KR?G2MP46:A*Px aCUZ */+!˪J[f,UHK*&*D;N. Bͅ;do6@$uk +֟k!|7 rfx FW.\Wn¶5L x<\gaM8gefi +˃\9W-sUi4&>boϺ}NwI_I[A3GSIM q(!V;hJ~Zى?_"}Rl*ߏVA o/;G#G%#UPcRtlVS^]LcgR3dTA8A& &u,I}O-C8f |] Z$H_#kIz0fcSK!m$ +>{>>;KqtzbT>DܢCFEHi%JD'bdU6& >}AO DҤ!Oy.ƛ#=:-1dͶz ꄺHY+]&GAtDh嵥^6`s1QfGoKPa7CqJkҵECD^S\J +63Do +<5U%Q)&7Ƴ%u5uJr&53B"ʓ7rPryY|S:'qW\Sr^;Lay2(ppoFɕDڨ(/j97 6z"/@y:(R @ty.2jXҭ!Pe ;mPΞ.'η{;;G^ۆt,semݖV&k@[i.-z$G3 +C箝iÈp=:xg-~wuT"@2Ma~+V( -E)h:p9֠4l;sۡ;:-:"^(VņF.MѺ8"Unr. +6$2\(53UvX׵;'90E+_;=<OJDK0䀠`ls{)o}mmܺ%45Rˌ0D\I#P {zt\>=zR ˰>oׇ)BX3wZ-h8v+tw 6TD)v  +%S("XK5̓cJuGX8o1Eq1Aa'C\9,gcQQ[6dP#`y̹DJ*ezf$;jCe#GP^R61r%@]@2r4bֺo{)v$K6o6nY~|'B|Zu uQoBD>'T>>2 +^;@Чޏ[)k21*Z rC=b75ezIh[ajF̎(Ux w94]S1mC Oo}_#JPK?k;hۑi)=GѻOO{PM#?*9L<5<C,&,qXlEHV\,,;r͑ @m0p_POngE`1}@qb-Oof>Tw]7nlp=v 3-l2+Yܖ(A* 9Ix\S 6-$atJ抄"Rq)^SX\+-kTժXOwKUVA42 CDhAAqj)6iBfjX'ŸX*&K**n +/ C9SkfKOcb5HmRӸ o%3~ɴnE9큰\4(cʽʄLQ* +d)HZNk׶`nkǤ*Sy%M\uVYk:YV|9!٤E\`lHK {q-Yd$ZUF_OU2׻SYWNVC9Y4aox+ |y#((n2>6>3t5D%{XH}tA "#!Co˹3_Nł۱xJ@D!Ԉ+WXk,&KisS'0vΞC}eZO7%Ô 3c7VҖ FWЖV\y&,&1Tg\~8߶"T/ +=v0S+5*+%Er6nVcW'S¯}>tng)POHq@Ó ''2do&I`J$] +.zE쿚~Ŭw\=So{4r|X%`9\f:T5@>\8p負)=a_q( K [vr6ĹCѦ]#]_9Gu`H󻰜Ѵ=M5'w7UGC@ƦeJ' *zx*"UIJ:st q?#MQPJ4"k H&4>z.fc :$0I*Ka|C bf;C/Oۡʠ{gUI?o{m0[]Q +ϗ\s*7Ttg-bJoȺ,%V[{TA(ZѨTcjUZViUe~ Q2}B˿X^Pu M/u7V+xaȰ -,/d J/^w?oX+/zN ;8 sIcHX"0H :b2B&Ip<%xs 5RZ _ Hڑ.id`)`b#|6fr8r;5JrtN'~^bi eҟ/c%y<:WβV??bF:^8E( x㋁}~sI]&7DXB/}KG:>ڻBF'G{ 3o rM}0e~i   g:/#&ō.CNw+2 ߼ؠ /L,Bm'8LOAJ2ڐ9jt }!M0HfUz99<!~+k*RU'ZK{G5qeqLc NVąUĶB@v Պ"*(+ƲD lGA܊x(BU]a[[ϛg$EY[cν\<'J0h_`v*AlW?oEXz<.䝌b8 N^@|f|~u=q7s~3bkG!ln< j%sރNEз sNW0,^v"ے `_"NH*6el!3d;ץ.WF=2'nl?z|m267{i.\ +?f3~+CI,з_5o\/ibI+^b +,i"= <%No ٗ_(l0AWUjZGiDDXSATw'8 οXLhA4Ts(fAW#qzC8jT}N T@.# +6(*S2A#2{}z}~&22 LlXs"\Vv; !VfMZG&}/kOlM0ǝ]a(#uozbC[+.EqXˋ aWkGۏ4k+D[؋KGB:':o[65lfBCWTEӲ5ƿd:43&٘*H1؟NKy4n{ RuWO싙?یM4_Em^ +g/l~((B4PDR4.PZz ʑ"Us 튆5e' l;.|wIa:Af5Ȏ&UNoƏ[wG;Íz0LU~(rO5)  ] 9@f "B$煄KX~$>mm,M o(fUt8c;:x\4ֶԜ9} o|š_6o34 )%:*@l)K-JL&ƠFtJ-h $(VҤV*i59{e*=(Z>%`HP*ibeH=+O!=Tbp +zP"6Z,=9|kL@pp_q$B86 $bЕ)7Aa;)8B[ + ˖Q`\Oը{b6cl 9>X\A#.p%DZl(~!VՕTjjK3lBA*ȵ/yAOGݳf)ϕ;5\US[4,&`W1 Iw؋U1Q1T!WekT6V(p.lI ? Klw_0.e#/zmyňGwGtyƒF~8E<"`X_ ̕"Ov)| peQ9$䗙|-k/aG g3S#/ep"k0~.zUiDDS]b̞."P6@K&riyϓd0r` wj+ڄ`*p6&l~.޿lF@-p‚Ӽ%p ofc4~o*{ul78 Ǭ=`J_2So&0%T%zT@<>\=Wg0>!sc7Ef=|dw>})^J}l(CO(0?\,Y`901 f р p>{¤cRAy}%\  [I5WZmz.HS˃P'5?Y YF 30yCѷ xhww{5DuZD{lq-د4GX[Y 'q؋B\iM"Ú:0Ŝj'0ZƦW1[XX FB I D 򑊢Q VZg ƺrUh[{$`\<{߿w5&+ޘ^BK9Еdۅ1O;9uTepsuj J]!_,5FE[V2"zIO@C[&YJ D\9ӻ"Hiس<301Їې@*Ҥi4qjjFZHK咑5؊̣LyTm)=(h9Z_ӊԟ"Å@n,·YMт;ې+`Bӣ^fetp{mVweҵa63~]R\!IRSDvq;@.UpMv;J0tG3ئM_EȻDo2ȍ*rƹfrK[hffϖT 1}#Pah*{Uh5[XP!0ăR8HD/v܀<F~$,[%&s ,ńyb=yPQ I1>ȱ!b*1F3)1Y6y^-aÏYّ`=/F<~ws{r=847 >-:7iO<I1gqd.g I}:9܆;kR4:5G)&nMh(ÌeUTsy(ݖ>ݮLߝy*w\M@[m}pbn48{g+̟ˊ'dG<~,|w{jRY6d ^zq z,]L`O\<8y+)0yyw&`i0  +_oA> {t7c2= 29:2 J3w 9p޺r,;9 m͗_fzo$u%5oUϿ(r6ɹ:[.P5A ]̊;` +f .'v v2XEݤе 0y+P"΅nySx/^ۍ]ޯٿλT +zy 4C^A?Vo<ظ&xIh| P W|8izSo`ѝ5?Ca`2f ,s8q_p""OBHEQ\"%MO}OˍpQIq^m;~<}&YHw!TjR) ^k8&Wfge1b:~u#Pܗ쇏D!mq~(h̆G^WSQ"5*#W[߯sfMiiVOLLJɺk>5[Ѩ,mIMo+CBh-W߃/4Ra @HZ:\Sy*CJ6k˪2ChְЬ%J2ʳ;/dQuI9iӦFǒ*+){rky]u.D\ww5C,Q{6=)D/w P])ib?ڮ?VUf-+搦:9|li&.[GH8f4IkZC!4i_SAH0;lQfIm(Jë0W:c Z o]JVKkuj]ΤE) TW]6}.Qp5䮚Ҕ"> +endobj +367 0 obj +<< +/Filter /FlateDecode +/Length 1191 +/Subtype /Type1C +>> +stream +H}LSWO=Sݒ[B\LʜZJ7Ei˺FG;\i  +[b?ɤR(ԁd +T(jGf"ʢ!q-l&dC<ފ}Kq7y=>]8Ϊ4(G*ݖXXK+aa Ë ׽[uU]U pԢ`j8HQ` A  +< yYQy;>r}dHv/<@r,/})BaN/Ϗ `>,DϐNV^+entn=D6::͈."> +9Hv71zU3>@?1+|7˝lKu*Ȥ;^UUeBOiͥ\ a86:4坺puφ-כpJDAfִt&y9Xd $/Ey*hFzxONs{ˈ7K ,ecظo wonpCP&qq%Ku[rbؔfLݭ>ڍf6#B)|me7ǛJEeD-LCe024OWO JZF3U*3,YBΡL$zt +st{qr W|)PVhh~!ъk2;!*)ڹbNLUg][*`1~| a ?|8?w:mӖɪ%C*k~ Xˤ,B,}wb> +endobj +369 0 obj +<< +/Filter /FlateDecode +/Length 96 +/Subtype /Type1C +>> +stream +Hbd`ad`ddpu p470V a4m{? +ru100g`pb`d`fddf1 H +endstream +endobj +128 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F3 +/FirstChar 1 +/LastChar 36 +/Widths [947 391 278 331 609 609 278 557 669 887 609 278 609 331 609 557 +278 834 722 534 557 722 534 609 557 331 609 557 722 557 557 557 +669 557 278 557 ] +/Encoding 370 0 R +/BaseFont /CMANNC+TT8A4o00 +/FontDescriptor 346 0 R +>> +endobj +129 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F5 +/FirstChar 1 +/LastChar 12 +/Widths [723 783 663 675 723 277 783 723 626 277 723 663 ] +/Encoding 371 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +130 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F7 +/FirstChar 1 +/LastChar 63 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 554 554 +337 554 554 554 723 518 723 337 337 663 350 277 229 494 277 663 +614 1000 663 663 723 723 723 650 663 675 554 783 663 506 482 ] +/Encoding 372 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +135 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F9 +/FirstChar 1 +/LastChar 32 +/Widths [560 280 780 560 560 390 280 780 560 560 720 560 330 280 610 560 +610 560 560 670 830 610 610 500 610 560 670 610 560 670 610 720 +] +/Encoding 373 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +136 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F11 +/FirstChar 1 +/LastChar 43 +/Widths [554 283 554 717 663 717 283 783 391 609 554 609 283 500 337 609 +554 554 554 609 609 283 717 543 554 554 554 554 891 554 609 663 +609 554 609 554 283 663 554 717 533 609 337 ] +/Encoding 374 0 R +/BaseFont /CMANNK+TT8AAo00 +/FontDescriptor 354 0 R +>> +endobj +137 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F12 +/FirstChar 1 +/LastChar 67 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 0 554 554 855 0 783 554 554 554 +337 554 554 554 723 518 723 0 0 663 0 277 0 494 277 663 +614 0 663 663 723 723 0 0 0 0 0 0 663 506 482 554 +554 554 554 ] +/Encoding 375 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +140 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F13 +/FirstChar 2 +/LastChar 38 +/Widths [280 780 0 560 390 280 0 0 560 0 560 330 280 0 0 0 +560 0 0 0 0 0 0 0 0 670 0 560 670 0 0 560 +610 720 610 280 560 ] +/Encoding 376 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +141 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F14 +/FirstChar 1 +/LastChar 50 +/Widths [554 283 554 0 0 0 283 783 391 609 554 609 283 0 337 609 +554 554 554 609 0 283 0 0 554 0 554 0 891 0 0 663 +609 0 609 0 283 663 554 717 533 609 0 598 283 609 554 837 +554 554 ] +/Encoding 377 0 R +/BaseFont /CMANNK+TT8AAo00 +/FontDescriptor 354 0 R +>> +endobj +144 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F16 +/FirstChar 1 +/LastChar 17 +/Widths [556 282 282 778 547 556 393 282 803 556 718 556 333 607 521 607 +556 ] +/Encoding 378 0 R +/BaseFont /CMANNM+TT8ABo00 +/FontDescriptor 356 0 R +>> +endobj +145 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F17 +/FirstChar 1 +/LastChar 76 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 0 554 554 554 +337 554 554 554 0 518 723 337 337 663 0 277 229 494 277 663 +614 1000 663 663 723 723 723 0 0 0 554 0 663 506 482 554 +0 554 0 277 554 217 337 337 554 277 578 277 ] +/Encoding 379 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +146 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F19 +/FirstChar 1 +/LastChar 19 +/Widths [506 217 832 554 217 554 277 554 337 277 506 554 554 506 554 554 +506 554 554 ] +/Encoding 380 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +147 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F20 +/FirstChar 1 +/LastChar 15 +/Widths [723 0 0 0 0 277 0 0 626 0 723 663 723 663 723 ] +/Encoding 381 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +150 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F21 +/FirstChar 1 +/LastChar 40 +/Widths [723 0 0 0 723 0 783 0 626 0 0 663 723 0 0 855 +687 723 554 277 892 554 614 554 554 337 337 614 554 554 614 566 +337 614 614 277 386 542 337 386 ] +/Encoding 382 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +151 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F22 +/FirstChar 1 +/LastChar 78 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 0 0 554 +337 554 0 0 723 518 723 337 337 663 0 0 0 494 277 663 +614 0 663 663 723 723 723 0 663 0 554 783 663 506 482 0 +0 0 0 277 0 217 0 0 554 0 0 0 386 1000 ] +/Encoding 383 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +152 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F23 +/FirstChar 2 +/LastChar 24 +/Widths [282 282 778 0 0 393 282 0 0 0 556 333 0 0 0 0 +556 667 846 607 607 504 607 ] +/Encoding 384 0 R +/BaseFont /CMANNM+TT8ABo00 +/FontDescriptor 356 0 R +>> +endobj +155 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F24 +/FirstChar 1 +/LastChar 73 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 554 554 +337 554 554 554 723 518 723 337 337 663 0 277 0 494 277 663 +0 0 663 663 723 723 723 0 0 675 554 783 663 506 482 554 +0 554 554 277 554 217 0 0 554 ] +/Encoding 385 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +156 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F25 +/FirstChar 3 +/LastChar 16 +/Widths [832 0 0 554 0 0 0 0 0 554 0 0 0 554 ] +/Encoding 386 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +157 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F27 +/FirstChar 1 +/LastChar 1 +/Widths [458 ] +/Encoding 387 0 R +/BaseFont /CMANOA+TT8ADo00 +/FontDescriptor 360 0 R +>> +endobj +158 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F28 +/FirstChar 1 +/LastChar 39 +/Widths [560 280 780 0 0 390 280 0 0 0 0 560 330 280 0 0 +0 0 560 0 0 610 610 500 610 0 0 0 0 670 0 0 +0 0 720 0 0 0 720 ] +/Encoding 388 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +159 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F30 +/FirstChar 1 +/LastChar 20 +/Widths [560 280 560 280 620 220 840 560 670 560 500 560 670 280 560 610 +560 560 500 560 ] +/Encoding 389 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +160 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F31 +/FirstChar 19 +/LastChar 37 +/Widths [554 277 892 554 614 554 554 0 0 614 554 0 0 566 337 614 +0 277 386 ] +/Encoding 390 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +163 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F32 +/FirstChar 1 +/LastChar 84 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 554 554 +337 554 554 554 0 518 723 337 337 663 0 277 0 494 277 663 +0 0 663 663 723 0 723 0 0 675 554 0 663 506 482 554 +554 554 554 277 554 217 0 0 554 277 0 277 0 1000 554 554 +663 337 337 578 ] +/Encoding 391 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +164 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F33 +/FirstChar 19 +/LastChar 36 +/Widths [554 277 892 554 614 554 554 0 0 614 554 0 0 0 337 0 +0 277 ] +/Encoding 392 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +165 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F34 +/FirstChar 1 +/LastChar 28 +/Widths [560 280 560 280 0 220 840 560 0 560 0 0 0 280 560 0 +560 560 0 560 830 330 490 780 550 490 560 280 ] +/Encoding 393 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +168 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F35 +/FirstChar 1 +/LastChar 87 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 0 0 0 +337 0 0 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 0 663 663 723 723 723 0 0 0 554 783 663 506 482 0 +0 0 0 277 554 0 0 0 554 0 0 0 0 1000 0 0 +663 337 337 0 578 241 578 ] +/Encoding 394 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +169 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F36 +/FirstChar 1 +/LastChar 35 +/Widths [560 280 560 280 0 220 0 560 0 560 500 0 0 280 560 0 +560 560 500 560 0 330 0 780 550 0 0 280 560 280 720 560 +560 670 490 ] +/Encoding 395 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +170 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F37 +/FirstChar 19 +/LastChar 37 +/Widths [554 277 892 554 614 0 0 0 0 0 0 0 0 0 337 0 +0 0 386 ] +/Encoding 396 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +173 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F38 +/FirstChar 1 +/LastChar 89 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 0 +337 0 554 0 0 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 723 723 0 0 0 0 0 0 663 506 482 0 +0 0 0 277 554 217 0 0 554 0 0 0 0 1000 0 0 +0 337 337 0 578 0 0 458 578 ] +/Encoding 397 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +174 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F39 +/FirstChar 1 +/LastChar 37 +/Widths [723 0 663 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 554 277 892 554 614 554 554 0 0 614 554 0 0 566 +337 614 0 277 386 ] +/Encoding 398 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +175 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F40 +/FirstChar 2 +/LastChar 37 +/Widths [280 780 560 560 390 280 0 0 560 720 560 330 280 0 0 610 +0 560 0 0 610 610 500 610 0 0 0 560 670 0 0 0 +610 0 0 280 ] +/Encoding 399 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +178 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F41 +/FirstChar 1 +/LastChar 70 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 0 494 277 0 +614 1000 663 663 723 723 723 0 663 0 554 0 663 506 0 554 +0 554 554 277 554 217 ] +/Encoding 400 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +179 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F42 +/FirstChar 1 +/LastChar 19 +/Widths [506 217 0 0 0 554 277 0 337 277 0 0 0 0 554 554 +0 0 554 ] +/Encoding 401 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +180 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F43 +/FirstChar 19 +/LastChar 41 +/Widths [554 277 892 554 614 0 554 0 0 0 554 0 614 566 337 0 +614 0 386 0 0 0 614 ] +/Encoding 402 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +181 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F44 +/FirstChar 1 +/LastChar 36 +/Widths [560 280 560 280 620 220 840 560 0 0 0 560 0 0 0 0 +0 560 500 0 0 0 0 0 550 0 0 0 0 0 720 0 +0 0 0 490 ] +/Encoding 403 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +184 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F45 +/FirstChar 1 +/LastChar 90 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 554 0 554 +337 554 554 554 723 518 723 337 337 663 0 277 0 494 277 0 +0 1000 663 663 723 723 723 0 0 0 554 0 663 506 482 0 +0 554 0 277 554 0 337 337 554 0 578 0 386 0 0 0 +663 0 0 0 0 0 0 0 0 301 ] +/Encoding 404 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +185 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F46 +/FirstChar 19 +/LastChar 43 +/Widths [554 277 892 554 614 554 554 0 0 614 554 0 0 566 337 614 +614 277 386 0 0 0 614 614 614 ] +/Encoding 405 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +186 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F47 +/FirstChar 1 +/LastChar 40 +/Widths [560 280 0 280 0 220 0 0 0 560 0 560 0 280 0 0 +0 560 500 560 0 330 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 720 220 500 560 ] +/Encoding 406 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +187 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F48 +/FirstChar 2 +/LastChar 20 +/Widths [217 0 0 217 0 277 554 0 0 506 554 0 506 0 554 0 +0 0 554 ] +/Encoding 407 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +192 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F49 +/FirstChar 1 +/LastChar 81 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 554 723 518 723 337 337 663 0 277 0 494 277 663 +614 0 663 663 723 723 723 0 0 0 554 0 663 506 482 0 +554 554 0 277 554 0 0 0 554 0 0 0 386 0 554 0 +663 ] +/Encoding 408 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +193 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F50 +/FirstChar 1 +/LastChar 41 +/Widths [560 280 0 280 0 220 0 0 0 560 0 560 0 280 0 0 +0 560 0 0 0 0 0 780 550 0 560 280 0 280 720 0 +0 0 0 0 0 220 0 0 560 ] +/Encoding 409 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +194 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F51 +/FirstChar 10 +/LastChar 45 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 614 554 554 +0 0 0 554 0 614 566 337 614 0 277 386 0 0 0 0 +0 0 614 795 ] +/Encoding 410 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +198 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F52 +/FirstChar 1 +/LastChar 88 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 723 723 723 0 663 0 554 783 663 506 482 554 +0 554 0 277 554 0 0 0 554 0 578 0 386 0 0 0 +0 0 0 578 578 0 0 458 ] +/Encoding 411 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +199 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F53 +/FirstChar 10 +/LastChar 46 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 0 554 554 +0 0 614 554 0 614 0 337 614 0 277 386 0 337 0 614 +0 614 614 795 554 ] +/Encoding 412 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +202 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F54 +/FirstChar 1 +/LastChar 91 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 554 0 554 +337 554 0 0 0 518 723 337 337 663 0 277 0 494 277 663 +0 1000 663 663 723 723 723 0 0 0 554 0 0 506 482 554 +0 554 0 277 0 0 0 0 554 0 0 0 386 0 0 0 +0 337 337 0 0 0 0 0 0 0 554 ] +/Encoding 413 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +203 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F55 +/FirstChar 1 +/LastChar 47 +/Widths [723 0 0 0 0 277 0 0 0 0 0 663 723 663 0 0 +0 0 554 277 892 554 614 554 554 337 337 614 554 554 614 566 +337 614 614 0 386 0 337 386 614 0 614 614 795 0 277 ] +/Encoding 414 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +204 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F56 +/FirstChar 2 +/LastChar 28 +/Widths [282 282 0 0 556 393 0 0 0 718 556 333 0 0 0 556 +0 0 0 0 0 0 0 556 667 607 556 ] +/Encoding 415 0 R +/BaseFont /CMANNM+TT8ABo00 +/FontDescriptor 356 0 R +>> +endobj +205 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F57 +/FirstChar 1 +/LastChar 41 +/Widths [560 280 0 560 560 390 280 0 560 0 0 0 330 280 0 0 +0 560 0 0 0 0 0 0 0 0 670 610 560 0 610 0 +0 0 0 0 0 0 0 890 560 ] +/Encoding 416 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +208 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F58 +/FirstChar 10 +/LastChar 48 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 0 614 554 554 +0 0 614 554 554 614 0 337 614 614 277 386 0 337 0 0 +0 614 614 795 0 0 506 ] +/Encoding 417 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +209 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F59 +/FirstChar 1 +/LastChar 85 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 0 +337 554 0 554 723 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 723 723 723 650 0 675 554 783 663 506 482 554 +0 554 0 277 554 217 337 337 554 0 0 0 0 0 0 0 +0 0 0 0 578 ] +/Encoding 418 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +210 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F60 +/FirstChar 2 +/LastChar 43 +/Widths [280 560 280 0 220 0 560 0 560 500 560 0 280 0 610 0 +560 500 0 0 330 0 0 550 0 560 0 0 0 720 560 0 +0 0 490 0 220 0 0 560 670 710 ] +/Encoding 419 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +213 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F61 +/FirstChar 1 +/LastChar 45 +/Widths [560 280 560 280 0 220 840 560 670 560 500 0 0 280 560 0 +560 560 500 560 0 0 0 0 0 0 560 0 560 0 720 560 +560 670 490 0 720 0 0 0 560 670 0 720 560 ] +/Encoding 420 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +214 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F62 +/FirstChar 1 +/LastChar 89 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 554 +337 554 0 0 723 518 723 337 337 663 0 0 0 494 277 663 +614 1000 663 663 723 723 723 0 0 0 0 0 663 506 0 0 +0 0 0 277 554 217 0 0 554 0 0 0 386 0 554 0 +0 0 0 578 0 0 0 0 578 ] +/Encoding 421 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +215 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F63 +/FirstChar 10 +/LastChar 32 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 0 554 554 +0 0 0 554 554 614 566 ] +/Encoding 422 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +216 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F64 +/FirstChar 1 +/LastChar 25 +/Widths [506 217 832 554 217 554 277 554 337 277 506 554 554 0 0 554 +506 554 554 554 506 506 723 554 277 ] +/Encoding 423 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +219 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F65 +/FirstChar 1 +/LastChar 89 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 554 +337 554 0 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 0 663 663 723 723 723 0 0 675 554 783 663 506 482 0 +0 0 0 277 554 217 0 0 554 0 0 0 386 0 554 0 +0 337 337 578 0 0 0 0 578 ] +/Encoding 424 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +220 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F66 +/FirstChar 1 +/LastChar 26 +/Widths [506 217 832 554 217 554 277 554 337 0 506 554 554 0 554 554 +506 554 554 554 0 0 0 0 0 482 ] +/Encoding 425 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +221 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F67 +/FirstChar 9 +/LastChar 44 +/Widths [626 0 0 663 723 0 0 0 687 723 554 277 892 554 614 554 +554 0 0 614 554 0 614 0 337 0 614 277 386 0 337 0 +614 0 614 614 ] +/Encoding 426 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +222 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F69 +/FirstChar 1 +/LastChar 38 +/Widths [603 603 603 603 603 603 603 603 603 603 603 603 603 603 603 603 +603 603 603 603 603 603 603 603 603 603 603 603 603 603 603 603 +603 603 603 603 603 603 ] +/Encoding 427 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +223 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F70 +/FirstChar 2 +/LastChar 47 +/Widths [280 560 280 0 220 840 560 0 560 500 0 670 280 0 0 560 +560 0 560 830 330 490 0 550 490 560 0 0 0 720 560 0 +0 0 0 720 220 0 560 0 0 0 720 0 560 560 ] +/Encoding 428 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +226 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F71 +/FirstChar 1 +/LastChar 83 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 0 0 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 0 337 337 0 0 277 0 494 277 663 +614 0 663 663 0 723 723 0 0 0 554 0 0 506 0 554 +0 554 554 277 554 0 0 0 554 0 578 0 386 0 0 0 +0 337 337 ] +/Encoding 429 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +227 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F72 +/FirstChar 6 +/LastChar 54 +/Widths [277 0 0 626 277 723 0 0 0 723 0 0 0 554 277 892 +554 614 554 554 0 0 614 554 554 0 0 337 614 614 277 386 +0 337 0 614 0 614 614 795 554 277 0 337 554 554 554 554 +277 ] +/Encoding 430 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +228 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F73 +/FirstChar 2 +/LastChar 41 +/Widths [280 0 0 560 390 280 0 560 560 0 0 330 280 0 0 0 +560 0 0 0 0 610 0 0 0 670 610 560 0 0 0 0 +0 0 0 0 0 0 890 560 ] +/Encoding 431 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +231 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F74 +/FirstChar 1 +/LastChar 92 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 723 723 723 0 663 675 554 0 663 506 0 0 +0 554 554 277 554 0 337 337 554 0 0 0 386 0 0 0 +0 337 0 0 0 0 0 0 0 0 0 783 ] +/Encoding 432 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +232 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F75 +/FirstChar 5 +/LastChar 43 +/Widths [723 0 783 0 626 277 0 663 723 0 723 0 687 0 554 277 +892 554 614 554 554 0 0 614 554 0 0 566 337 614 614 277 +386 0 337 0 614 0 614 ] +/Encoding 433 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +233 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F76 +/FirstChar 1 +/LastChar 47 +/Widths [603 603 603 0 603 603 603 603 0 603 603 603 603 603 0 603 +0 603 603 603 603 603 0 603 603 0 603 0 0 603 0 0 +0 0 603 603 0 0 603 603 603 603 603 603 603 603 603 ] +/Encoding 434 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +234 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F77 +/FirstChar 2 +/LastChar 48 +/Widths [280 560 280 0 220 0 560 0 560 500 560 670 280 0 610 560 +560 500 560 0 330 0 0 550 0 560 0 0 0 0 0 0 +0 0 490 0 220 0 0 0 0 0 720 0 0 0 720 ] +/Encoding 435 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +235 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F78 +/FirstChar 1 +/LastChar 20 +/Widths [506 217 0 554 0 0 277 554 337 0 506 554 0 0 0 554 +506 0 0 554 ] +/Encoding 436 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +236 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F79 +/FirstChar 2 +/LastChar 41 +/Widths [280 0 0 560 390 280 0 560 0 0 0 330 280 0 0 0 +560 560 0 0 610 0 0 0 0 670 610 560 0 0 0 0 +0 0 0 0 0 0 890 560 ] +/Encoding 437 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +240 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F80 +/FirstChar 1 +/LastChar 92 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 0 277 832 0 554 277 554 554 855 277 0 554 0 554 +337 554 0 0 723 518 723 337 337 663 0 277 229 494 277 0 +614 0 663 0 723 723 0 0 0 0 554 783 663 506 482 554 +0 0 0 277 554 0 337 337 554 0 0 0 386 0 0 0 +0 0 337 0 0 0 0 0 0 0 0 783 ] +/Encoding 438 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +241 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F81 +/FirstChar 2 +/LastChar 56 +/Widths [783 0 0 723 277 783 723 626 0 723 0 723 0 723 0 687 +723 554 277 892 0 614 554 554 0 0 614 554 554 614 0 337 +614 614 277 386 0 337 0 0 614 0 614 795 0 0 0 0 +0 0 0 0 0 614 614 ] +/Encoding 439 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +242 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F82 +/FirstChar 1 +/LastChar 55 +/Widths [603 603 603 0 603 603 603 0 0 603 0 0 0 603 0 603 +603 603 603 603 0 603 0 603 603 0 603 0 603 603 603 0 +603 603 0 603 0 603 603 603 0 0 0 0 0 603 0 603 +603 603 603 603 603 603 603 ] +/Encoding 440 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +245 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F83 +/FirstChar 1 +/LastChar 93 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 229 494 277 663 +614 1000 663 663 723 723 723 0 0 675 554 783 663 506 482 0 +0 554 0 277 554 217 0 0 554 0 0 0 386 0 0 0 +0 337 337 0 0 0 0 0 0 0 0 0 614 ] +/Encoding 441 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +246 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F84 +/FirstChar 6 +/LastChar 49 +/Widths [277 0 0 626 277 723 0 0 0 723 855 687 723 554 277 892 +554 614 554 0 0 0 614 554 0 614 566 337 0 614 277 386 +0 337 0 0 0 614 614 0 554 277 0 337 ] +/Encoding 442 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +247 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F85 +/FirstChar 1 +/LastChar 60 +/Widths [603 603 603 0 603 0 603 0 0 603 603 0 0 603 0 603 +0 603 603 603 0 603 0 0 603 0 603 0 603 0 603 0 +603 603 603 603 603 0 603 603 0 603 0 0 0 0 0 603 +0 0 603 0 0 0 0 603 603 603 603 603 ] +/Encoding 443 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +248 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F86 +/FirstChar 1 +/LastChar 44 +/Widths [560 280 560 280 0 220 0 560 0 560 500 0 0 280 0 610 +0 0 0 0 0 330 0 0 550 0 560 0 0 0 0 0 +0 0 0 0 0 220 0 0 0 0 0 720 ] +/Encoding 444 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +249 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F87 +/FirstChar 2 +/LastChar 42 +/Widths [280 0 0 560 390 280 0 560 0 0 560 330 280 0 0 0 +560 0 0 0 0 0 0 0 0 670 610 560 0 0 0 0 +0 0 0 0 0 0 890 560 610 ] +/Encoding 445 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +254 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F88 +/FirstChar 1 +/LastChar 89 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 0 0 723 518 723 337 337 663 0 0 0 494 277 663 +614 1000 663 663 723 723 723 0 0 675 554 783 663 506 0 554 +554 554 554 277 554 0 337 337 554 277 0 277 0 0 0 0 +0 337 337 578 578 241 0 0 578 ] +/Encoding 446 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +255 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F89 +/FirstChar 19 +/LastChar 46 +/Widths [554 277 892 0 614 554 554 0 0 614 554 0 614 566 337 0 +614 277 386 0 0 0 0 0 0 614 0 554 ] +/Encoding 447 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +258 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F90 +/FirstChar 1 +/LastChar 39 +/Widths [723 0 663 0 723 0 783 0 0 0 0 663 0 0 0 0 +0 0 554 277 892 554 614 554 554 337 337 614 554 554 614 566 +337 0 614 277 386 0 337 ] +/Encoding 448 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +259 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F91 +/FirstChar 1 +/LastChar 85 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 554 +337 554 0 0 723 518 723 337 337 663 0 0 0 494 277 663 +614 1000 663 663 723 723 723 0 0 0 554 783 663 506 0 0 +0 0 0 277 554 217 0 0 554 0 0 0 386 0 554 0 +0 0 0 0 578 ] +/Encoding 449 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +260 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F92 +/FirstChar 1 +/LastChar 68 +/Widths [603 603 603 603 603 603 603 603 0 0 603 603 603 603 0 603 +603 603 0 603 603 603 0 603 603 0 603 603 603 603 603 0 +603 603 603 603 603 0 603 603 603 603 0 0 603 603 0 603 +0 0 0 0 603 0 0 603 603 0 0 0 603 603 603 603 +603 603 603 603 ] +/Encoding 450 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +261 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F93 +/FirstChar 2 +/LastChar 49 +/Widths [280 560 280 0 220 0 560 0 560 500 560 0 280 560 0 560 +560 0 560 0 0 490 0 0 0 560 0 0 0 720 0 0 +0 0 0 0 220 0 0 560 0 0 720 0 0 0 0 670 +] +/Encoding 451 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +262 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F94 +/FirstChar 1 +/LastChar 22 +/Widths [506 217 0 554 217 554 277 554 337 0 506 554 554 0 0 554 +506 0 554 554 0 506 ] +/Encoding 452 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +263 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F95 +/FirstChar 2 +/LastChar 34 +/Widths [280 780 0 560 390 0 0 560 0 720 560 330 280 0 0 0 +560 0 0 0 0 0 0 0 560 670 610 560 0 0 0 0 +610 ] +/Encoding 453 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +266 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F96 +/FirstChar 1 +/LastChar 93 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 0 723 337 337 663 0 0 0 494 277 663 +614 0 663 663 723 723 723 650 663 675 554 783 663 506 482 554 +554 554 554 0 554 217 0 0 554 0 0 0 386 0 554 0 +0 0 0 578 578 0 0 0 0 0 554 0 614 ] +/Encoding 454 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +267 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F97 +/FirstChar 19 +/LastChar 39 +/Widths [554 277 892 554 614 554 554 337 337 614 554 0 614 566 337 614 +614 277 386 542 337 ] +/Encoding 455 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +268 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F98 +/FirstChar 2 +/LastChar 32 +/Widths [282 282 0 547 556 393 282 0 0 0 0 333 0 0 0 556 +0 667 846 0 607 0 607 0 0 607 0 556 667 607 718 ] +/Encoding 456 0 R +/BaseFont /CMANNM+TT8ABo00 +/FontDescriptor 356 0 R +>> +endobj +269 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F99 +/FirstChar 1 +/LastChar 47 +/Widths [560 280 0 0 560 390 280 0 0 560 720 560 330 280 0 560 +610 560 560 0 0 0 610 0 610 560 670 610 560 0 610 0 +0 0 0 0 280 0 0 890 0 610 280 670 560 720 610 ] +/Encoding 457 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +270 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F100 +/FirstChar 1 +/LastChar 25 +/Widths [506 217 832 554 217 554 277 554 337 0 506 554 554 0 554 554 +506 554 554 0 0 0 723 554 277 ] +/Encoding 458 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +273 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F101 +/FirstChar 1 +/LastChar 94 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 0 554 0 554 +337 554 554 0 0 518 723 337 337 663 0 0 229 494 277 663 +614 0 663 663 723 723 723 0 0 0 554 0 663 506 482 0 +0 0 0 277 554 217 337 337 554 277 578 277 386 0 554 0 +0 0 0 0 578 0 0 0 0 0 0 0 0 217 ] +/Encoding 459 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +274 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F102 +/FirstChar 10 +/LastChar 45 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 614 554 554 +0 0 614 0 0 614 566 337 0 0 277 386 542 337 0 0 +0 0 614 795 ] +/Encoding 460 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +275 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F103 +/FirstChar 2 +/LastChar 48 +/Widths [280 780 0 560 390 280 0 560 0 0 560 330 280 0 0 610 +560 0 0 0 0 610 0 610 560 0 0 560 0 0 0 0 +0 0 0 280 0 0 0 0 0 280 0 0 0 0 330 ] +/Encoding 461 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +276 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F104 +/FirstChar 2 +/LastChar 44 +/Widths [280 560 280 0 220 0 560 0 560 500 560 0 280 560 0 560 +560 500 560 0 330 490 780 0 490 560 280 560 0 720 0 0 +0 0 0 0 220 0 0 560 670 0 720 ] +/Encoding 462 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +277 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F105 +/FirstChar 1 +/LastChar 63 +/Widths [603 603 603 603 603 603 603 603 0 603 0 0 0 0 603 0 +0 0 603 0 603 603 0 603 603 0 0 0 0 0 0 0 +603 603 0 0 603 0 0 0 603 603 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 603 ] +/Encoding 463 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +278 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F106 +/FirstChar 7 +/LastChar 19 +/Widths [277 554 337 0 506 0 554 0 0 0 0 0 554 ] +/Encoding 464 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +281 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F107 +/FirstChar 1 +/LastChar 83 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 0 0 0 554 +337 554 0 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 0 663 663 723 723 723 0 0 0 554 783 663 506 482 0 +0 0 0 277 554 0 0 0 554 0 0 0 386 0 554 0 +0 337 337 ] +/Encoding 465 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +282 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F108 +/FirstChar 1 +/LastChar 43 +/Widths [723 0 0 0 0 0 0 0 626 0 0 0 0 0 0 0 +687 723 554 277 892 554 614 554 554 0 0 614 554 0 614 566 +337 614 614 0 386 0 337 0 614 0 614 ] +/Encoding 466 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +283 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F109 +/FirstChar 1 +/LastChar 25 +/Widths [506 0 832 554 0 554 277 554 337 0 506 0 554 0 0 554 +0 0 554 554 506 0 0 554 277 ] +/Encoding 467 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +284 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F110 +/FirstChar 1 +/LastChar 52 +/Widths [560 280 0 280 0 220 840 560 0 560 500 0 670 280 560 0 +560 560 500 560 830 330 0 0 550 0 560 280 560 0 0 0 +0 0 0 0 720 0 0 0 560 0 0 0 0 0 0 0 +670 670 330 290 ] +/Encoding 468 0 R +/BaseFont /CMANOC+TT8A9o00 +/FontDescriptor 362 0 R +>> +endobj +287 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F111 +/FirstChar 2 +/LastChar 37 +/Widths [282 282 778 0 556 393 282 0 0 0 556 333 0 0 0 556 +0 0 0 0 0 0 0 0 667 0 556 0 667 0 0 556 +607 718 607 282 ] +/Encoding 469 0 R +/BaseFont /CMANNM+TT8ABo00 +/FontDescriptor 356 0 R +>> +endobj +288 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F112 +/FirstChar 1 +/LastChar 49 +/Widths [560 280 780 0 560 390 280 0 0 560 0 560 330 280 610 560 +610 0 0 0 830 610 610 0 610 0 0 610 0 0 0 0 +560 0 0 610 280 0 0 890 0 610 280 670 560 0 610 0 +280 ] +/Encoding 470 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +289 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F113 +/FirstChar 1 +/LastChar 79 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 554 554 723 518 723 337 337 663 0 277 0 494 277 663 +614 0 663 663 723 723 723 0 663 0 554 783 663 506 0 0 +554 0 0 277 0 0 0 0 554 0 0 0 386 0 554 ] +/Encoding 471 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +290 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F114 +/FirstChar 19 +/LastChar 45 +/Widths [554 277 892 554 614 554 554 0 0 614 554 0 0 566 337 614 +0 0 386 0 0 0 614 0 0 614 795 ] +/Encoding 472 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +291 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F115 +/FirstChar 1 +/LastChar 19 +/Widths [506 0 832 0 0 0 277 554 337 277 506 0 554 0 0 554 +0 0 554 ] +/Encoding 473 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +295 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F116 +/FirstChar 1 +/LastChar 85 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 723 723 723 0 663 675 554 0 663 506 0 0 +0 0 0 277 0 0 0 0 554 277 0 277 386 0 0 0 +0 337 337 0 578 ] +/Encoding 474 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +296 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F117 +/FirstChar 9 +/LastChar 56 +/Widths [626 0 723 0 0 0 0 855 0 0 554 277 892 0 614 554 +554 0 0 614 554 554 614 566 337 614 614 277 386 0 0 0 +0 0 614 0 0 0 0 0 0 0 0 0 0 0 0 614 +] +/Encoding 475 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +300 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F118 +/FirstChar 1 +/LastChar 91 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 554 0 554 +337 554 0 0 723 518 723 337 337 663 350 277 0 494 277 663 +0 1000 663 663 723 723 723 0 663 0 554 0 0 506 0 0 +0 0 0 277 554 217 337 0 554 0 0 0 386 0 554 0 +0 337 337 0 0 0 0 0 0 0 554 ] +/Encoding 476 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +301 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F119 +/FirstChar 1 +/LastChar 60 +/Widths [723 783 0 0 723 0 0 0 626 0 0 0 0 0 0 855 +0 0 554 277 892 554 614 554 554 0 0 614 554 554 614 566 +337 614 614 277 386 542 0 0 0 0 0 614 0 0 277 0 +0 0 0 0 0 0 0 0 663 554 663 554 ] +/Encoding 477 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +305 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F120 +/FirstChar 1 +/LastChar 79 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 554 0 554 +337 554 554 0 723 518 723 337 337 663 0 0 0 494 277 663 +0 0 663 0 723 723 723 0 663 675 554 0 663 506 482 0 +0 0 0 277 554 217 0 0 554 0 0 0 386 0 554 ] +/Encoding 478 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +306 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F121 +/FirstChar 19 +/LastChar 44 +/Widths [554 277 892 554 614 554 554 0 0 614 554 554 614 0 337 614 +614 277 386 0 337 0 614 614 614 614 ] +/Encoding 479 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +307 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F122 +/FirstChar 3 +/LastChar 18 +/Widths [832 554 217 554 277 0 337 277 506 0 554 0 0 0 506 554 +] +/Encoding 480 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +308 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F123 +/FirstChar 1 +/LastChar 69 +/Widths [603 603 0 603 603 0 0 603 603 603 0 0 603 603 0 0 +603 0 603 0 0 0 0 0 0 0 0 0 0 0 0 0 +603 0 0 0 0 603 603 603 0 0 0 0 0 603 0 603 +0 0 0 0 603 0 0 0 0 0 0 0 603 0 0 0 +0 0 603 603 603 ] +/Encoding 481 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +312 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F124 +/FirstChar 1 +/LastChar 85 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 0 783 0 0 554 +337 554 554 0 723 518 723 337 337 0 0 0 0 494 277 663 +614 0 663 0 0 723 723 0 663 675 554 0 663 506 482 0 +0 0 0 277 0 0 0 0 554 0 0 0 386 0 554 0 +0 0 0 578 578 ] +/Encoding 482 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +313 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F125 +/FirstChar 10 +/LastChar 45 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 614 554 554 +0 0 614 554 554 614 0 337 614 614 277 386 0 337 0 614 +0 0 614 795 ] +/Encoding 483 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +314 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F126 +/FirstChar 1 +/LastChar 17 +/Widths [506 0 832 554 217 554 277 554 337 0 506 554 554 506 554 0 +506 ] +/Encoding 484 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +318 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F127 +/FirstChar 1 +/LastChar 79 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 723 554 277 554 554 855 277 783 0 0 554 +337 554 0 0 723 518 0 337 337 0 0 277 0 494 277 663 +614 1000 663 663 723 723 723 0 663 675 554 0 663 506 482 0 +0 0 0 277 554 0 337 337 554 0 0 0 386 0 554 ] +/Encoding 485 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +319 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F128 +/FirstChar 6 +/LastChar 45 +/Widths [277 0 0 626 0 723 0 0 0 723 0 0 0 554 0 892 +554 614 0 554 0 0 614 554 554 614 0 337 614 0 277 386 +0 0 0 0 0 0 614 795 ] +/Encoding 486 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +320 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F129 +/FirstChar 1 +/LastChar 19 +/Widths [506 0 832 0 217 554 277 0 337 0 506 0 554 0 0 554 +506 0 554 ] +/Encoding 487 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +321 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F130 +/FirstChar 1 +/LastChar 75 +/Widths [603 0 603 603 603 603 603 603 603 0 0 0 0 0 0 603 +603 0 0 0 0 603 603 0 603 0 0 0 0 0 0 0 +603 603 0 0 603 603 0 603 0 0 0 603 0 603 0 0 +0 603 0 0 0 0 0 0 0 0 0 0 0 603 603 0 +0 0 0 0 0 603 603 603 603 603 603 ] +/Encoding 488 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +322 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F132 +/FirstChar 1 +/LastChar 9 +/Widths [603 603 603 603 603 603 603 603 603 ] +/Encoding 489 0 R +/BaseFont /CMANOG+TT8B0o00 +/FontDescriptor 366 0 R +>> +endobj +323 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F134 +/FirstChar 1 +/LastChar 1 +/Widths [253 ] +/Encoding 490 0 R +/BaseFont /CMANOI+TT8A7o00 +/FontDescriptor 368 0 R +>> +endobj +324 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F135 +/FirstChar 2 +/LastChar 47 +/Widths [280 0 0 560 390 280 0 0 0 0 560 330 280 610 560 610 +0 560 0 830 610 610 0 610 0 0 610 560 0 0 0 560 +0 0 0 280 0 0 890 0 610 0 670 0 0 610 ] +/Encoding 491 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +328 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F136 +/FirstChar 1 +/LastChar 84 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 0 0 0 0 554 +337 554 554 554 723 518 0 337 337 0 0 0 0 494 277 663 +614 1000 663 0 723 723 723 0 0 0 554 0 663 506 482 0 +0 0 0 0 0 0 0 0 554 277 0 277 386 0 554 0 +0 0 0 578 ] +/Encoding 492 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +329 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F137 +/FirstChar 10 +/LastChar 46 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 614 554 554 +0 0 614 554 0 614 0 337 614 614 0 386 0 337 0 0 +0 614 614 795 554 ] +/Encoding 493 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +330 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F138 +/FirstChar 1 +/LastChar 25 +/Widths [506 217 832 554 217 554 277 0 337 277 506 554 554 0 554 554 +0 0 0 0 506 0 0 554 277 ] +/Encoding 494 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +333 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F139 +/FirstChar 10 +/LastChar 59 +/Widths [277 0 0 0 0 0 0 0 0 554 277 892 554 0 554 554 +0 0 614 554 0 614 0 337 614 0 277 386 542 337 0 614 +0 614 614 795 554 0 0 0 0 0 0 0 277 0 0 0 +0 663 ] +/Encoding 495 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +334 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F140 +/FirstChar 1 +/LastChar 93 +/Widths [626 554 554 277 289 554 217 711 217 554 554 506 554 470 337 277 +554 506 663 277 832 0 554 277 554 554 855 277 783 0 0 554 +337 554 554 0 723 518 723 337 337 663 0 277 0 494 277 663 +614 1000 663 663 0 723 723 0 663 0 554 0 663 506 482 554 +0 0 0 277 0 217 0 0 554 0 0 0 0 0 554 0 +0 0 0 0 0 0 0 0 0 0 0 0 614 ] +/Encoding 496 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +335 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F141 +/FirstChar 1 +/LastChar 77 +/Widths [603 603 603 603 603 0 603 603 603 0 603 603 603 603 0 0 +0 603 0 603 603 603 603 603 0 0 0 603 603 0 603 0 +603 603 603 603 603 0 603 603 603 0 0 0 603 603 0 603 +0 0 0 0 603 603 603 603 603 0 0 0 603 0 603 0 +603 603 603 603 0 0 0 0 0 0 0 603 603 ] +/Encoding 497 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +336 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F142 +/FirstChar 2 +/LastChar 50 +/Widths [280 0 0 560 390 280 0 560 0 0 560 330 280 0 0 610 +0 0 0 0 0 610 0 610 0 670 610 0 0 0 0 560 +0 0 0 0 0 0 0 0 0 0 0 0 720 0 0 0 +560 ] +/Encoding 498 0 R +/BaseFont /CMANNI+TT8A8o00 +/FontDescriptor 352 0 R +>> +endobj +337 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F143 +/FirstChar 6 +/LastChar 22 +/Widths [554 277 0 337 0 0 0 554 0 0 0 0 0 554 0 0 +506 ] +/Encoding 499 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +341 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F144 +/FirstChar 1 +/LastChar 80 +/Widths [603 603 603 603 603 0 0 603 0 603 0 0 0 0 0 603 +603 603 603 603 0 603 603 0 603 0 603 603 603 603 0 603 +603 603 0 603 0 0 0 603 603 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 603 0 603 603 603 603 +0 0 0 0 603 0 0 0 0 0 603 0 0 603 603 603 +] +/Encoding 500 0 R +/BaseFont /CMANOE+TT8AEo00 +/FontDescriptor 364 0 R +>> +endobj +342 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F145 +/FirstChar 1 +/LastChar 89 +/Widths [626 554 554 277 289 554 217 0 217 554 554 506 554 470 337 277 +554 506 663 0 0 0 554 277 554 554 855 277 0 554 0 554 +0 554 554 0 0 518 723 337 337 663 0 0 0 0 277 663 +614 0 0 0 0 723 0 0 0 0 0 0 663 506 0 554 +0 554 0 277 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 578 0 0 0 0 578 ] +/Encoding 501 0 R +/BaseFont /CMANNG+TT8A6o00 +/FontDescriptor 350 0 R +>> +endobj +343 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F146 +/FirstChar 7 +/LastChar 22 +/Widths [277 0 0 0 0 0 554 0 0 0 0 0 0 0 0 506 +] +/Encoding 502 0 R +/BaseFont /CMANNO+TT8ACo00 +/FontDescriptor 358 0 R +>> +endobj +344 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F147 +/FirstChar 19 +/LastChar 46 +/Widths [554 277 892 554 0 0 554 0 0 0 0 0 0 0 337 0 +0 0 386 0 0 0 0 0 614 0 0 554 ] +/Encoding 503 0 R +/BaseFont /CMANNE+TT8A5o00 +/FontDescriptor 348 0 R +>> +endobj +504 0 obj +<< +/Type /Encoding +/Differences [ 1/W/r/i/t/n/g/space/a +/S/m/u/l/o/f/h/e +/I/M/H/y/s +] +>> +endobj +370 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/W/r/i/t/n/g/space +/a/S/m/u/l/o/f/h +/e/I/M/H/y/s/R/v +/d/two/hyphen/p/four/D/c/zero +/eight/V/three/period/one/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +371 0 obj +<< +/Type /Encoding +/Differences [ 1/C/O/P/Y/R/I/G/H +/T/space/N/E +] +>> +endobj +505 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l/w +/i/n/g/c/p/y/r/t +/a/s/S/I/M/H/u/comma +/b/d/m/colon +] +>> +endobj +372 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/nine +/three/hyphen/two/zero/eight/R/k/C +/parenleft/parenright/P/quotedbl/slash/j/v/period +/E/F/W/A/V/D/U/N +/Y/K/X/L/G/B/x/z +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +506 0 obj +<< +/Type /Encoding +/Differences [ 1/one/period +] +>> +endobj +373 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/O/v/e/r/i +/w/four/two/D/a/t/space/T +/y/p/s/three/V/M/g/n +/z/o/five/S/u/c/P/d +/R/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +507 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period/one +] +>> +endobj +374 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/C/P/U/space +/O/r/g/a/n/i/z/t +/o/six/two/e/p/h/l/D +/v/c/nine/four/s/m/underscore/d +/S/u/eight/b/five/I/E/x +/B/y/L/f/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +508 0 obj +<< +/Type /Encoding +/Differences [ 30/one 32/three 47/period +] +>> +endobj +375 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/.notdef/b/d/m/.notdef/O/one/nine +/three/hyphen/two/zero/eight/R/k/C +/.notdef/.notdef/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/B/x/z +/six/seven/four/five/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +509 0 obj +<< +/Type /Encoding +/Differences [ 2/period 33/six +] +>> +endobj +376 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/O/.notdef/e/r/i +/.notdef/.notdef/two/.notdef/a/t/space/.notdef +/.notdef/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/S/.notdef/c/P/.notdef +/.notdef/six/h/C/F/l/seven/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +510 0 obj +<< +/Type /Encoding +/Differences [ 2/period/one 17/six +] +>> +endobj +377 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/.notdef/.notdef/.notdef/space +/O/r/g/a/n/i/.notdef/t +/o/six/two/e/p/.notdef/l/.notdef +/.notdef/c/.notdef/four/.notdef/m/.notdef/.notdef +/S/u/.notdef/b/.notdef/I/E/x +/B/y/L/.notdef/T/slash/F/seven +/M/zero/k/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +378 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/space/O/v/e/r +/i/w/two/D/a/t/T/y +/p/s/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +511 0 obj +<< +/Type /Encoding +/Differences [ 2/h/e/space/f/o/l/w/i +/n/g/c/p/y/r/t/a +/s/S/I/M/H/u/comma/b + 27/m 39/C/parenleft/parenright 46/v +] +>> +endobj +379 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/.notdef/one/nine +/three/hyphen/two/zero/eight/.notdef/k/C +/parenleft/parenright/P/.notdef/slash/j/v/period +/E/F/W/A/V/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/B/x/z +/six/.notdef/four/.notdef/semicolon/q/quoteright/quotedblleft +/quotedblright/underscore/bracketleft/plus/bracketright/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +512 0 obj +<< +/Type /Encoding +/Differences [ 1/s/i/m/u/l/a/t/o +/r/space/c/n/p/k/g/e +] +>> +endobj +380 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/m/u/l/a/t +/o/r/space/c/n/p/k/g +/e/v/h/d/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +513 0 obj +<< +/Type /Encoding +/Differences [ 1/C 6/I 12/E/D/V +] +>> +endobj +381 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/.notdef/.notdef/.notdef/I/.notdef +/.notdef/T/.notdef/N/E/D/V/U +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +514 0 obj +<< +/Type /Encoding +/Differences [ 5/R 7/G 12/E +] +>> +endobj +515 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space/f/o 9/i/n/g/c + 15/r/t 18/s 23/u 26/d +] +>> +endobj +382 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/.notdef/.notdef/R/.notdef/G +/.notdef/T/.notdef/.notdef/E/D/.notdef/.notdef +/M/A/B/s/i/m/underscore/n +/a/e/bracketleft/bracketright/p/c/x/d +/v/t/o/g/l/r/y/f +/asterisk/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +383 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/K/.notdef/L/G/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/.notdef/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/ellipsis/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +516 0 obj +<< +/Type /Encoding +/Differences [ 2/period 18/three +] +>> +endobj +384 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/space/O/.notdef/.notdef/r +/i/.notdef/.notdef/.notdef/a/t/.notdef/.notdef +/.notdef/.notdef/three/V/M/g/n/z +/o/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +517 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l/w +/i/n/g/c 15/r/t/a/s + 21/M 23/u 25/b/d 46/v/period 52/V 63/z + 69/q +] +>> +endobj +385 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/nine +/three/hyphen/two/zero/eight/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/.notdef/.notdef/A/V/D/U/N +/.notdef/.notdef/X/L/G/B/x/z +/six/.notdef/four/five/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +386 0 obj +<< +/Type /Encoding +/Differences [ 3/m 6/a 12/n 16/e +] +>> +endobj +387 0 obj +<< +/Type /Encoding +/Differences [ 1/bullet +] +>> +endobj +518 0 obj +<< +/Type /Encoding +/Differences [ 1/one/period 19/three +] +>> +endobj +388 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/O/.notdef/.notdef/r/i +/.notdef/.notdef/.notdef/.notdef/a/t/space/.notdef +/.notdef/.notdef/.notdef/three/.notdef/.notdef/g/n +/z/o/.notdef/.notdef/.notdef/.notdef/P/.notdef +/.notdef/.notdef/.notdef/C/.notdef/.notdef/.notdef/U +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +389 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/T/i/m +/e/B/a/s/two/S/t/p +/F/u/n/c/o/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +519 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n/a/e 32/v +/t 36/l/r +] +>> +endobj +390 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/.notdef +/v/t/o/.notdef/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +520 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l/w +/i/n/g/c/p 16/t/a/s +/S 23/u 26/d/m 39/C 42/P 47/period/E +] +>> +endobj +391 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/nine +/three/hyphen/two/zero/eight/.notdef/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/.notdef/.notdef/A/V/D/.notdef/N +/.notdef/.notdef/X/L/.notdef/B/x/z +/six/seven/four/five/semicolon/q/quoteright/.notdef +/.notdef/underscore/bracketleft/.notdef/bracketright/.notdef/ellipsis/endash +/question/ampersand/braceleft/braceright/greater/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +392 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n/a/e 28/p +/c 33/t 36/l +] +>> +endobj +393 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/.notdef/i/m +/e/.notdef/a/.notdef/.notdef/.notdef/t/p +/.notdef/u/n/.notdef/o/M/r/y +/O/g/z/four/I/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +521 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space 16/t 18/s 28/colon +] +>> +endobj +394 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/.notdef/.notdef +/.notdef/hyphen/.notdef/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/.notdef/.notdef/L/G/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/.notdef/ellipsis/.notdef +/.notdef/ampersand/braceleft/braceright/.notdef/equal/bar/asciitilde +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +522 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period/one 29/five +] +>> +endobj +395 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/.notdef/.notdef/t/p +/.notdef/u/n/c/o/.notdef/r/.notdef +/O/g/.notdef/.notdef/I/five/slash/D +/h/six/E/x/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +396 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n 33/t 37/r +] +>> +endobj +523 0 obj +<< +/Type /Encoding +/Differences [ 4/space 39/C/parenleft 42/P +] +>> +endobj +524 0 obj +<< +/Type /Encoding +/Differences [ 1/C 3/P 19/s/i/m/underscore +] +>> +endobj +397 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/.notdef/hyphen/.notdef/zero/.notdef/.notdef/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/.notdef/ellipsis/.notdef +/.notdef/.notdef/braceleft/braceright/.notdef/equal/.notdef/.notdef +/asciicircum/less/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +398 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/P/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/.notdef +/v/t/o/.notdef/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +525 0 obj +<< +/Type /Encoding +/Differences [ 2/period 10/two 19/three +] +>> +endobj +399 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/O/v/e/r/i +/.notdef/.notdef/two/D/a/t/space/.notdef +/.notdef/p/.notdef/three/.notdef/.notdef/g/n +/z/o/.notdef/.notdef/.notdef/c/P/.notdef +/.notdef/.notdef/h/.notdef/.notdef/l/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +526 0 obj +<< +/Type /Encoding +/Differences [ 2/h/e/space 6/o 9/i/n 12/c/p + 15/r/t/a/s 23/u 26/d 46/v/period + 53/D 61/B +] +>> +endobj +527 0 obj +<< +/Type /Encoding +/Differences [ 1/s/i 7/t 9/r 15/g/e +] +>> +endobj +400 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/.notdef/F/W/A/V/D/U/N +/.notdef/K/.notdef/L/.notdef/B/x/.notdef +/six/.notdef/four/five/semicolon/q/quoteright/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +401 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/.notdef/.notdef/.notdef/a/t +/.notdef/r/space/.notdef/.notdef/.notdef/.notdef/g +/e/.notdef/.notdef/d/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +528 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 25/e 29/c 31/d/v +] +>> +endobj +402 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/.notdef/e/.notdef/.notdef/.notdef/c/.notdef/d +/v/t/.notdef/g/.notdef/r/.notdef/.notdef +/.notdef/u/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +529 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period/one 12/two +] +>> +endobj +403 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/T/i/m +/e/.notdef/.notdef/.notdef/two/.notdef/.notdef/.notdef +/.notdef/.notdef/n/c/.notdef/.notdef/.notdef/.notdef +/.notdef/g/.notdef/.notdef/.notdef/.notdef/.notdef/D +/.notdef/.notdef/.notdef/.notdef/v/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +530 0 obj +<< +/Type /Encoding +/Differences [ 2/h/e/space/f/o/l 9/i/n +/g/c/p/y/r/t/a/s + 23/u/comma 26/d/m 33/hyphen 38/k 40/parenleft/parenright + 46/v/period 59/L 69/q +] +>> +endobj +404 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/eight/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/.notdef/.notdef/W/A/V/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/B/x/z +/.notdef/.notdef/four/.notdef/semicolon/q/.notdef/quotedblleft +/quotedblright/underscore/.notdef/plus/.notdef/asterisk/.notdef/.notdef +/.notdef/ampersand/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/exclam/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +531 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n 25/e 28/p/c + 32/v/t/o 37/r +] +>> +endobj +405 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/.notdef +/v/t/o/g/l/r/.notdef/.notdef +/.notdef/u/q/b/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +532 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period 12/two +] +>> +endobj +406 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/.notdef/space/.notdef/i/.notdef +/.notdef/.notdef/a/.notdef/two/.notdef/t/.notdef +/.notdef/.notdef/n/c/o/.notdef/r/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/C/l/k +/b/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +533 0 obj +<< +/Type /Encoding +/Differences [ 5/l 11/c 14/k +] +>> +endobj +534 0 obj +<< +/Type /Encoding +/Differences [ 3/e 12/c 16/t 47/period +] +>> +endobj +408 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/eight/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/B/x/z +/.notdef/seven/four/.notdef/semicolon/q/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/ampersand/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +409 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/.notdef/space/.notdef/i/.notdef +/.notdef/.notdef/a/.notdef/two/.notdef/t/.notdef +/.notdef/.notdef/n/.notdef/.notdef/.notdef/.notdef/.notdef +/O/g/.notdef/four/I/.notdef/slash/D +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef +/.notdef/d/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +535 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 25/e 31/d 36/l +] +>> +endobj +410 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/.notdef/c/.notdef/d +/v/t/o/.notdef/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +407 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/i/.notdef/.notdef/l/.notdef/t +/o/.notdef/.notdef/c/n/.notdef/k/.notdef +/e/.notdef/.notdef/.notdef/underscore/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +536 0 obj +<< +/Type /Encoding +/Differences [ 4/space +] +>> +endobj +411 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/K/.notdef/L/G/B/x/z +/six/.notdef/four/.notdef/semicolon/q/.notdef/.notdef +/.notdef/underscore/.notdef/plus/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/greater/equal/.notdef/.notdef +/asciicircum/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +537 0 obj +<< +/Type /Encoding +/Differences [ 20/i 25/e 36/l/r 39/f +] +>> +endobj +412 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/.notdef +/a/e/.notdef/.notdef/p/c/.notdef/d +/.notdef/t/o/.notdef/l/r/.notdef/f +/.notdef/u/.notdef/b/h/w/k/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +413 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/.notdef/.notdef/.notdef/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/.notdef/W/A/V/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/.notdef/x/z +/six/.notdef/four/.notdef/semicolon/.notdef/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/braceleft/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/numbersign/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +538 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 24/a 28/p/c 33/t + 37/r 41/u 44/h +] +>> +endobj +539 0 obj +<< +/Type /Encoding +/Differences [ 2/period 25/four +] +>> +endobj +415 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/space/.notdef/.notdef/e/r +/.notdef/.notdef/.notdef/D/a/t/.notdef/.notdef +/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/four/S/u/c/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +414 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/.notdef/.notdef/.notdef/I/.notdef +/.notdef/.notdef/.notdef/.notdef/E/D/V/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/bracketleft/bracketright/p/c/x/d +/v/t/o/g/.notdef/r/.notdef/f +/asterisk/u/.notdef/b/h/w/.notdef/slash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +540 0 obj +<< +/Type /Encoding +/Differences [ 1/one/period 9/four +] +>> +endobj +416 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/.notdef/v/e/r/i +/.notdef/four/.notdef/.notdef/.notdef/t/space/.notdef +/.notdef/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/S/u/c/.notdef/d +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/m/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +541 0 obj +<< +/Type /Encoding +/Differences [ 20/i 24/a 30/x/d 37/r +] +>> +endobj +542 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space/f/o/l 9/i/n 12/c +/p/y/r/t/a/s 23/u/comma + 26/d 30/one 34/two 46/v/period 62/x 64/six +] +>> +endobj +417 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/.notdef/n +/a/e/.notdef/.notdef/p/c/x/d +/.notdef/t/o/g/l/r/.notdef/f +/.notdef/.notdef/.notdef/b/h/w/.notdef/.notdef +/z/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +418 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/.notdef/hyphen/two/.notdef/eight/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/N +/Y/.notdef/X/L/G/B/x/z +/six/.notdef/four/.notdef/semicolon/q/quoteright/quotedblleft +/quotedblright/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +543 0 obj +<< +/Type /Encoding +/Differences [ 2/period/one 27/four +] +>> +endobj +419 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/two/.notdef/t/.notdef +/F/.notdef/n/c/.notdef/.notdef/r/.notdef +/.notdef/g/.notdef/four/.notdef/.notdef/.notdef/D +/h/.notdef/.notdef/.notdef/v/.notdef/l/.notdef +/.notdef/d/A/w/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +544 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period/one 27/four +] +>> +endobj +420 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/.notdef/i/m +/e/B/a/s/.notdef/.notdef/t/p +/.notdef/u/n/c/o/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/four/.notdef/five/.notdef/D +/h/six/E/x/.notdef/C/.notdef/.notdef +/.notdef/d/A/.notdef/R/seven/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +545 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l 9/i +/n 12/c/p 15/r/t/a/s/S +/I/M/H/u/comma/b/d 33/hyphen + 46/v/period 52/V 62/x 69/q +] +>> +endobj +421 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/.notdef/.notdef/.notdef/.notdef/B/x/.notdef +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/greater/.notdef/.notdef/.notdef +/.notdef/less/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +546 0 obj +<< +/Type /Encoding +/Differences [ 10/space 19/s/i/m/underscore 25/e 29/c 31/d +/v +] +>> +endobj +547 0 obj +<< +/Type /Encoding +/Differences [ 2/i/m/u 6/a/t/o/r 12/n + 16/e 20/underscore/x +] +>> +endobj +422 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/.notdef +/a/e/.notdef/.notdef/.notdef/c/x/d +/v/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +423 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/m/u/l/a/t +/o/r/space/c/n/p/.notdef/.notdef +/e/v/h/d/underscore/x/y/w +/b/f/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +548 0 obj +<< +/Type /Encoding +/Differences [ 4/space 16/t/a/s 73/underscore +] +>> +endobj +549 0 obj +<< +/Type /Encoding +/Differences [ 2/i 4/u 6/a/t/o/r 11/c/n + 16/e 18/h/d/underscore +] +>> +endobj +424 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/.notdef/X/L/G/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/braceleft/braceright/greater/.notdef/.notdef/.notdef +/.notdef/less/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +425 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/m/u/l/a/t +/o/r/.notdef/c/n/p/.notdef/g +/e/v/h/d/underscore/.notdef/.notdef/.notdef +/.notdef/.notdef/z/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +550 0 obj +<< +/Type /Encoding +/Differences [ 20/i 22/underscore/n/a 29/c 33/t 41/u 44/h +] +>> +endobj +426 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/T/.notdef/.notdef/E/D/.notdef/.notdef +/.notdef/A/B/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/d +/.notdef/t/.notdef/g/l/r/.notdef/f +/.notdef/u/.notdef/b/h/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +551 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore/s/a/space/l/p/c +/h/parenleft/U/N/I/T/asterisk/u +/r/comma/parenright/braceleft +] +>> +endobj +427 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/a/space/l/p +/c/h/parenleft/U/N/I/T/asterisk +/u/r/comma/parenright/braceleft/semicolon/i/f +/equal/n/exclam/S/C/P/E/O +/K/e/o/zero/braceright/d/one/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +552 0 obj +<< +/Type /Encoding +/Differences [ 2/period/one 27/four 46/eight +] +>> +endobj +428 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/one/space/.notdef/i/m +/e/.notdef/a/s/.notdef/S/t/.notdef +/.notdef/u/n/.notdef/o/M/r/y +/.notdef/g/z/four/.notdef/.notdef/.notdef/D +/h/.notdef/.notdef/.notdef/.notdef/C/l/.notdef +/b/.notdef/.notdef/.notdef/R/.notdef/eight/nine +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +553 0 obj +<< +/Type /Encoding +/Differences [ 2/h 12/c 15/r 17/a +] +>> +endobj +429 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/.notdef/.notdef/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/.notdef +/parenleft/parenright/.notdef/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/.notdef/U/N +/.notdef/.notdef/.notdef/L/.notdef/.notdef/x/.notdef +/six/.notdef/four/five/semicolon/q/.notdef/.notdef +/.notdef/underscore/.notdef/plus/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/braceleft/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +554 0 obj +<< +/Type /Encoding +/Differences [ 49/semicolon +] +>> +endobj +430 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/I/.notdef +/.notdef/T/space/N/.notdef/.notdef/.notdef/U +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/x/.notdef +/.notdef/t/o/g/l/r/.notdef/f +/.notdef/u/.notdef/b/h/w/k/slash +/.notdef/semicolon/three/four/five/six/comma/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +555 0 obj +<< +/Type /Encoding +/Differences [ 2/period 9/four/two +] +>> +endobj +431 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/.notdef/.notdef/e/r/i +/.notdef/four/two/.notdef/.notdef/t/space/.notdef +/.notdef/.notdef/s/.notdef/.notdef/.notdef/.notdef/n +/.notdef/.notdef/.notdef/S/u/c/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/m/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +556 0 obj +<< +/Type /Encoding +/Differences [ 4/space 6/o 12/c 15/r 17/a 21/M +] +>> +endobj +557 0 obj +<< +/Type /Encoding +/Differences [ 9/T 13/D 15/U 17/A +] +>> +endobj +432 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/K/X/L/.notdef/B/x/.notdef +/.notdef/.notdef/four/five/semicolon/q/.notdef/quotedblleft +/quotedblright/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/braceleft/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/Q/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +433 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/R/.notdef/G +/.notdef/T/space/.notdef/E/D/.notdef/U +/.notdef/A/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/.notdef +/v/t/o/g/l/r/.notdef/f +/.notdef/u/.notdef/b/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +558 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore 5/space/l/p 11/U/N/I +/T 16/u 22/i 24/equal/n +] +>> +endobj +434 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/.notdef/space/l/p +/c/.notdef/parenleft/U/N/I/T/.notdef +/u/.notdef/comma/parenright/braceleft/semicolon/i/.notdef +/equal/n/.notdef/S/.notdef/.notdef/E/.notdef +/.notdef/.notdef/.notdef/zero/braceright/.notdef/.notdef/D +/A/ampersand/v/Q/plus/B/L/five +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +559 0 obj +<< +/Type /Encoding +/Differences [ 2/period/one 12/two 27/four +] +>> +endobj +435 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/two/S/t/.notdef +/F/u/n/c/o/.notdef/r/.notdef +/.notdef/g/.notdef/four/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/v/.notdef/l/.notdef +/.notdef/.notdef/.notdef/.notdef/R/.notdef/.notdef/.notdef +/U/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +436 0 obj +<< +/Type /Encoding +/Differences [ 1/s/i 4/u 7/t/o/r 11/c/n + 16/e/v 20/underscore +] +>> +endobj +560 0 obj +<< +/Type /Encoding +/Differences [ 2/period 9/four 19/three +] +>> +endobj +437 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/.notdef/.notdef/e/r/i +/.notdef/four/.notdef/.notdef/.notdef/t/space/.notdef +/.notdef/.notdef/s/three/.notdef/.notdef/g/.notdef +/.notdef/.notdef/.notdef/S/u/c/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/m/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +561 0 obj +<< +/Type /Encoding +/Differences [ 9/i/n 16/t 23/u 32/three 34/two +] +>> +endobj +438 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/.notdef/I/M/.notdef/u +/comma/b/d/m/colon/.notdef/one/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/j/v/period +/.notdef/F/.notdef/A/.notdef/D/U/.notdef +/.notdef/.notdef/.notdef/L/G/B/x/z +/six/.notdef/.notdef/.notdef/semicolon/q/.notdef/quotedblleft +/quotedblright/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/.notdef/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/Q/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +562 0 obj +<< +/Type /Encoding +/Differences [ 21/m 23/n/a/e +] +>> +endobj +439 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/O/.notdef/.notdef/R/I/G +/H/T/.notdef/N/.notdef/D/.notdef/U +/.notdef/A/B/s/i/m/.notdef/n +/a/e/.notdef/.notdef/p/c/x/d +/.notdef/t/o/g/l/r/.notdef/f +/.notdef/.notdef/q/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/F +/L/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +563 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore 5/space/l/p 17/r 20/braceleft 24/equal + 30/E 33/e 48/R/G/g +] +>> +endobj +440 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/.notdef/space/l/p +/.notdef/.notdef/parenleft/.notdef/.notdef/.notdef/T/.notdef +/u/r/comma/parenright/braceleft/.notdef/i/.notdef +/equal/n/.notdef/S/.notdef/P/E/O +/.notdef/e/o/.notdef/braceright/.notdef/one/D +/A/.notdef/.notdef/.notdef/.notdef/.notdef/L/.notdef +/R/G/g/period/three/V/F/ellipsis +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +564 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l 9/i +/n 12/c 16/t/a/s 23/u 25/b/d +] +>> +endobj +565 0 obj +<< +/Type /Encoding +/Differences [ 6/I 9/T/space/N 15/U +] +>> +endobj +441 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/j/v/period +/E/F/W/A/V/D/U/N +/.notdef/.notdef/X/L/G/B/x/z +/.notdef/.notdef/four/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/.notdef +/.notdef/.notdef/braceleft/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/Z/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +566 0 obj +<< +/Type /Encoding +/Differences [ 5/space 11/U 14/T 20/braceleft 39/D/A 48/R +] +>> +endobj +443 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/.notdef/space/.notdef/p +/.notdef/.notdef/parenleft/U/.notdef/.notdef/T/.notdef +/u/.notdef/comma/parenright/braceleft/.notdef/i/.notdef +/.notdef/n/.notdef/S/.notdef/P/.notdef/O +/.notdef/e/o/zero/braceright/d/.notdef/D +/A/.notdef/v/.notdef/.notdef/.notdef/.notdef/.notdef +/R/.notdef/.notdef/period/.notdef/.notdef/.notdef/.notdef +/bracketleft/bracketright/eight/W/four/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +444 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/.notdef/.notdef/t/.notdef +/F/.notdef/.notdef/.notdef/.notdef/.notdef/r/.notdef +/.notdef/g/.notdef/four/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef +/.notdef/.notdef/.notdef/.notdef/R/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +442 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/I/.notdef +/.notdef/T/space/N/.notdef/.notdef/.notdef/U +/M/A/B/s/i/m/underscore/n +/a/.notdef/.notdef/.notdef/p/c/.notdef/d +/v/t/.notdef/g/l/r/.notdef/f +/.notdef/.notdef/.notdef/b/h/.notdef/k/slash +/.notdef/semicolon/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +567 0 obj +<< +/Type /Encoding +/Differences [ 2/period 9/four +] +>> +endobj +445 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/.notdef/.notdef/e/r/i +/.notdef/four/.notdef/.notdef/a/t/space/.notdef +/.notdef/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/S/u/c/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/m/underscore/b/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +568 0 obj +<< +/Type /Encoding +/Differences [ 34/two 47/period +] +>> +endobj +446 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/.notdef/X/L/G/B/x/.notdef +/six/seven/four/five/semicolon/q/.notdef/quotedblleft +/quotedblright/underscore/bracketleft/.notdef/bracketright/.notdef/.notdef/.notdef +/.notdef/.notdef/braceleft/braceright/greater/equal/bar/.notdef +/.notdef/less/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +569 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m 23/n 33/t 35/g 37/r +] +>> +endobj +447 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/.notdef/n +/a/e/.notdef/.notdef/p/c/.notdef/d +/v/t/.notdef/g/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/h/.notdef/k/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +570 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i 23/n 28/p 33/t 35/g 37/r +] +>> +endobj +571 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space/f/o/l 9/i/n/g + 13/p/y/r/t/a/s 24/comma 26/d +/m 47/period 49/F +] +>> +endobj +449 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/.notdef/.notdef/L/G/B/x/.notdef +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +572 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore 4/a/space 7/p/c 14/T 16/u + 20/braceleft 24/equal 40/A 45/B 56/bracketleft/bracketright 61/M/b +] +>> +endobj +450 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/a/space/l/p +/c/.notdef/.notdef/U/N/I/T/.notdef +/u/r/comma/.notdef/braceleft/semicolon/i/.notdef +/equal/n/.notdef/S/C/P/E/O +/.notdef/e/o/zero/braceright/d/.notdef/D +/A/ampersand/v/.notdef/.notdef/B/L/.notdef +/R/.notdef/.notdef/.notdef/.notdef/V/.notdef/.notdef +/bracketleft/bracketright/.notdef/.notdef/.notdef/M/b/m +/k/quotedblleft/quotedblright/X/bar/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +451 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/two/.notdef/t/p +/.notdef/u/n/.notdef/o/.notdef/.notdef/y +/.notdef/.notdef/.notdef/four/.notdef/.notdef/.notdef/D +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef +/.notdef/d/.notdef/.notdef/R/.notdef/.notdef/.notdef +/.notdef/V/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +573 0 obj +<< +/Type /Encoding +/Differences [ 2/i 4/u/l/a/t/o/r 12/n + 16/e/v 19/d/underscore +] +>> +endobj +452 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/.notdef/u/l/a/t +/o/r/.notdef/c/n/p/.notdef/.notdef +/e/v/.notdef/d/underscore/.notdef/y/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +448 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/P/.notdef/R/.notdef/G +/.notdef/.notdef/.notdef/.notdef/E/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/bracketleft/bracketright/p/c/x/d +/v/t/.notdef/g/l/r/.notdef/f +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +574 0 obj +<< +/Type /Encoding +/Differences [ 2/period 9/four 26/five +] +>> +endobj +453 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/O/.notdef/e/r/.notdef +/.notdef/four/.notdef/D/a/t/space/.notdef +/.notdef/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/five/S/u/c/.notdef/.notdef +/.notdef/.notdef/h/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +575 0 obj +<< +/Type /Encoding +/Differences [ 2/h 4/space 12/c 15/r 17/a 77/asterisk +] +>> +endobj +576 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 24/a/e/bracketleft/bracketright +/p 33/t/o/g +] +>> +endobj +454 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/.notdef/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/Y/K/X/L/G/B/x/z +/six/seven/four/five/.notdef/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/greater/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/numbersign/.notdef/Z/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +455 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/bracketleft/bracketright/p/c/.notdef/d +/v/t/o/g/l/r/y/f +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +577 0 obj +<< +/Type /Encoding +/Differences [ 2/period 29/five +] +>> +endobj +456 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/space/.notdef/v/e/r +/i/.notdef/.notdef/.notdef/.notdef/t/.notdef/.notdef +/.notdef/s/.notdef/V/M/.notdef/n/.notdef +/o/.notdef/.notdef/u/.notdef/five/P/d +/R/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +578 0 obj +<< +/Type /Encoding +/Differences [ 1/one/period 26/five +] +>> +endobj +457 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/.notdef/.notdef/e/r/i +/.notdef/.notdef/two/D/a/t/space/.notdef +/y/p/s/three/.notdef/.notdef/.notdef/n +/.notdef/o/five/S/u/c/.notdef/d +/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef/.notdef +/m/.notdef/b/I/E/x/B/L +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +579 0 obj +<< +/Type /Encoding +/Differences [ 5/l/a 15/g 25/f +] +>> +endobj +458 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/m/u/l/a/t +/o/r/.notdef/c/n/p/.notdef/g +/e/v/h/d/.notdef/.notdef/.notdef/w +/b/f/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +580 0 obj +<< +/Type /Encoding +/Differences [ 7/l 17/a 35/zero 46/v 74/bracketleft 76/bracketright +] +>> +endobj +459 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/.notdef/one/.notdef +/three/hyphen/two/zero/.notdef/.notdef/k/C +/parenleft/parenright/P/.notdef/.notdef/j/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/quotedblleft +/quotedblright/underscore/bracketleft/plus/bracketright/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/quoteleft/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +581 0 obj +<< +/Type /Encoding +/Differences [ 24/a 32/v 36/l +] +>> +endobj +460 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/.notdef/.notdef/d +/v/t/.notdef/.notdef/l/r/y/f +/.notdef/.notdef/.notdef/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +461 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/O/.notdef/e/r/i +/.notdef/four/.notdef/.notdef/a/t/space/.notdef +/.notdef/p/s/.notdef/.notdef/.notdef/.notdef/n +/.notdef/o/five/.notdef/.notdef/c/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef/.notdef +/.notdef/.notdef/.notdef/I/.notdef/.notdef/.notdef/.notdef +/f/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +582 0 obj +<< +/Type /Encoding +/Differences [ 2/period/one 27/four 29/five +] +>> +endobj +462 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/one/space/.notdef/i/.notdef +/e/.notdef/a/s/two/.notdef/t/p +/.notdef/u/n/c/o/.notdef/r/y +/O/.notdef/z/four/I/five/.notdef/D +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/l/.notdef +/.notdef/d/A/.notdef/R/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +583 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore/s/a/space/l/p/c + 10/parenleft 19/parenright 21/semicolon/i 25/n 33/e/o 37/d + 42/v 63/m +] +>> +endobj +463 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/a/space/l/p +/c/.notdef/parenleft/.notdef/.notdef/.notdef/.notdef/asterisk +/.notdef/.notdef/.notdef/parenright/.notdef/semicolon/i/.notdef +/equal/n/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/e/o/.notdef/.notdef/d/.notdef/.notdef +/.notdef/ampersand/v/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/m +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +584 0 obj +<< +/Type /Encoding +/Differences [ 7/t 9/r 11/c 13/p +] +>> +endobj +464 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/t +/o/r/.notdef/c/.notdef/p/.notdef/.notdef +/.notdef/.notdef/.notdef/d/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +585 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space/f/o 9/i/n 13/p 15/r +/t/a/s/S 26/d 39/C/parenleft 42/P + 46/v 77/asterisk +] +>> +endobj +586 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n/a 28/p 31/d +/v/t 37/r 39/f +] +>> +endobj +465 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/.notdef/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/.notdef/.notdef/L/G/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/braceleft/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +587 0 obj +<< +/Type /Encoding +/Differences [ 6/a 9/r 19/d +] +>> +endobj +467 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/.notdef/m/u/.notdef/a/t +/o/r/.notdef/c/.notdef/p/.notdef/.notdef +/e/.notdef/.notdef/d/underscore/x/.notdef/.notdef +/b/f/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +588 0 obj +<< +/Type /Encoding +/Differences [ 1/three/period 27/four 29/five +] +>> +endobj +468 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/three/period/.notdef/space/.notdef/i/m +/e/.notdef/a/s/.notdef/S/t/p +/.notdef/u/n/c/o/M/r/.notdef +/.notdef/g/.notdef/four/I/five/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/C/.notdef/.notdef +/.notdef/d/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/V/P/hyphen/f/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +466 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/T/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/A/B/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/d +/v/t/o/g/.notdef/r/.notdef/f +/.notdef/u/.notdef/b/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +469 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/space/O/.notdef/e/r +/i/.notdef/.notdef/.notdef/a/t/.notdef/.notdef +/.notdef/s/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/S/.notdef/c/.notdef/P/.notdef +/.notdef/six/h/C/F/l/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +589 0 obj +<< +/Type /Encoding +/Differences [ 1/one/period 33/six +] +>> +endobj +470 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/one/period/O/.notdef/e/r/i +/.notdef/.notdef/two/.notdef/a/t/space/T +/y/p/.notdef/.notdef/.notdef/M/g/n +/.notdef/o/.notdef/.notdef/u/.notdef/.notdef/.notdef +/.notdef/six/.notdef/.notdef/F/l/.notdef/.notdef +/m/.notdef/b/I/E/x/.notdef/L +/.notdef/slash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +590 0 obj +<< +/Type /Encoding +/Differences [ 2/h/e/space/f/o 9/i/n 12/c +/p 15/r/t/a/s/S/I/M +/H/u/comma 26/d/m 39/C 46/v 51/A +/V 62/x +] +>> +endobj +471 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/eight/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/.notdef/A/V/D/U/N +/.notdef/K/.notdef/L/G/B/x/.notdef +/.notdef/seven/.notdef/.notdef/semicolon/.notdef/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +591 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore/n 28/p/c 32/v +/t +] +>> +endobj +592 0 obj +<< +/Type /Encoding +/Differences [ 11/c +] +>> +endobj +473 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/.notdef/m/.notdef/.notdef/.notdef/t +/o/r/space/c/.notdef/p/.notdef/.notdef +/e/.notdef/.notdef/d/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +472 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/.notdef +/v/t/o/.notdef/.notdef/r/.notdef/.notdef +/.notdef/u/.notdef/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +593 0 obj +<< +/Type /Encoding +/Differences [ 3/e/space 6/o 8/w/i/n 15/r 17/a +/s 20/I 23/u 26/d 47/period 50/W 54/U/N + 58/X +] +>> +endobj +474 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/K/X/L/.notdef/B/x/.notdef +/.notdef/.notdef/.notdef/.notdef/semicolon/.notdef/.notdef/.notdef +/.notdef/underscore/bracketleft/.notdef/bracketright/asterisk/.notdef/.notdef +/.notdef/.notdef/braceleft/braceright/.notdef/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +594 0 obj +<< +/Type /Encoding +/Differences [ 21/m 23/n 33/t 36/l +] +>> +endobj +475 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/T/.notdef/N/.notdef/.notdef/.notdef/.notdef +/M/.notdef/.notdef/s/i/m/.notdef/n +/a/e/.notdef/.notdef/p/c/x/d +/v/t/o/g/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/b/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/L/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +595 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l 9/i +/n 14/y/r/t/a/s 25/b/d +/m 46/v 62/x +] +>> +endobj +596 0 obj +<< +/Type /Encoding +/Differences [ 21/m 30/x 33/t 37/r +] +>> +endobj +476 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/C +/parenleft/parenright/P/quotedbl/slash/.notdef/v/period +/E/.notdef/W/A/V/D/U/N +/.notdef/K/.notdef/L/.notdef/.notdef/x/.notdef +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/quotedblleft +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/braceleft/braceright/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/numbersign/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +477 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/C/O/.notdef/.notdef/R/.notdef/.notdef +/.notdef/T/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/M/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/x/d +/v/t/o/g/l/r/y/.notdef +/.notdef/.notdef/.notdef/.notdef/h/.notdef/.notdef/slash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/X/one/S/zero/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +597 0 obj +<< +/Type /Encoding +/Differences [ 4/space 9/i/n 16/t 32/three 34/two +] +>> +endobj +598 0 obj +<< +/Type /Encoding +/Differences [ 21/m/underscore/n 28/p/c/x 33/t/o + 36/l/r +] +>> +endobj +478 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/one/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/v/period +/E/.notdef/.notdef/A/.notdef/D/U/N +/.notdef/K/X/L/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +599 0 obj +<< +/Type /Encoding +/Differences [ 3/m 13/p +] +>> +endobj +479 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/x/d +/.notdef/t/o/g/l/r/.notdef/f +/.notdef/u/q/b/h/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +480 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/m/u/l/a/t +/.notdef/r/space/c/.notdef/p/.notdef/.notdef +/.notdef/v/h/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +481 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore 4/a/space 8/c/h/parenleft 13/I +/T 17/r 19/parenright 33/e 38/one/D/A 46/L + 48/R 53/V 61/M 67/X/bar/less +] +>> +endobj +600 0 obj +<< +/Type /Encoding +/Differences [ 19/s 21/m/underscore/n/a/e 28/p 30/x + 33/t/o 37/r +] +>> +endobj +482 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/.notdef/O/.notdef/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/.notdef/.notdef/.notdef/.notdef/v/period +/E/F/.notdef/A/.notdef/.notdef/U/N +/.notdef/K/X/L/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/.notdef/.notdef/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/greater/equal/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +484 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/.notdef/m/u/l/a/t +/o/r/.notdef/c/n/p/k/g +/.notdef/v/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +483 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/x/d +/.notdef/t/o/g/l/r/.notdef/f +/.notdef/u/.notdef/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +601 0 obj +<< +/Type /Encoding +/Differences [ 2/h/e/space 6/o/l/w/i/n + 12/c 15/r/t/a/s 23/u/comma/b +/d/m 46/v 68/semicolon +] +>> +endobj +485 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/H/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/.notdef/.notdef/R/k/.notdef +/parenleft/parenright/.notdef/.notdef/slash/.notdef/v/period +/E/F/W/A/V/D/U/N +/.notdef/K/X/L/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/semicolon/q/.notdef/quotedblleft +/quotedblright/underscore/.notdef/.notdef/.notdef/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +602 0 obj +<< +/Type /Encoding +/Differences [ 19/s 21/m/underscore/n 29/c/x/d 33/t + 36/l/r +] +>> +endobj +487 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/.notdef/m/.notdef/l/a/t +/.notdef/r/.notdef/c/.notdef/p/.notdef/.notdef +/e/v/.notdef/d/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +486 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/I/.notdef +/.notdef/T/.notdef/N/.notdef/.notdef/.notdef/U +/.notdef/.notdef/.notdef/s/.notdef/m/underscore/n +/.notdef/e/.notdef/.notdef/p/c/x/d +/.notdef/t/o/.notdef/l/r/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/h/w/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +603 0 obj +<< +/Type /Encoding +/Differences [ 6/l 22/i 25/n 33/e 38/one 70/hyphen/two +] +>> +endobj +488 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/.notdef/s/a/space/l/p +/c/h/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/u/r/.notdef/.notdef/.notdef/.notdef/i/f +/.notdef/n/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/e/o/.notdef/.notdef/d/one/.notdef +/A/.notdef/.notdef/.notdef/plus/.notdef/L/.notdef +/.notdef/.notdef/g/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/b/m +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/hyphen/two +/q/slash/y/x/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +604 0 obj +<< +/Type /Encoding +/Differences [ 1/l/i/n/e/one +] +>> +endobj +489 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/l/i/n/e/one/two/g +/t/h/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +490 0 obj +<< +/Type /Encoding +/Differences [ 1/space +] +>> +endobj +605 0 obj +<< +/Type /Encoding +/Differences [ 2/period 19/three 33/six +] +>> +endobj +491 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/.notdef/.notdef/e/r/i +/.notdef/.notdef/.notdef/.notdef/a/t/space/T +/y/p/.notdef/three/.notdef/M/g/n +/.notdef/o/.notdef/.notdef/u/c/.notdef/.notdef +/.notdef/six/.notdef/.notdef/.notdef/l/.notdef/.notdef +/m/.notdef/b/.notdef/E/.notdef/.notdef/L +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +606 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 24/a/e 28/p/c + 33/t 44/h +] +>> +endobj +492 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/.notdef/.notdef/.notdef/.notdef +/three/hyphen/two/zero/eight/R/k/.notdef +/parenleft/parenright/.notdef/.notdef/.notdef/.notdef/v/period +/E/F/W/A/.notdef/D/U/N +/.notdef/.notdef/.notdef/L/.notdef/B/x/z +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/underscore/bracketleft/.notdef/bracketright/asterisk/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/greater/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +607 0 obj +<< +/Type /Encoding +/Differences [ 4/u 7/t 9/r/space 13/p +] +>> +endobj +494 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/s/i/m/u/l/a/t +/.notdef/r/space/c/n/p/.notdef/g +/e/.notdef/.notdef/.notdef/.notdef/x/.notdef/.notdef +/b/f/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +493 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/n +/a/e/.notdef/.notdef/p/c/.notdef/d +/.notdef/t/o/g/.notdef/r/.notdef/f +/.notdef/.notdef/.notdef/b/h/w/k/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +608 0 obj +<< +/Type /Encoding +/Differences [ 20/i/m/underscore 24/a/e 28/p/c 33/t + 44/h 59/S +] +>> +endobj +609 0 obj +<< +/Type /Encoding +/Differences [ 4/space 24/comma +] +>> +endobj +495 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/s/i/m/underscore/.notdef +/a/e/.notdef/.notdef/p/c/.notdef/d +/.notdef/t/o/.notdef/l/r/y/f +/.notdef/u/.notdef/b/h/w/k/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/comma/.notdef +/.notdef/.notdef/.notdef/S/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +496 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/w/i/n/g/c/p/y/r +/t/a/s/S/I/M/.notdef/u +/comma/b/d/m/colon/O/.notdef/.notdef +/three/hyphen/two/zero/.notdef/R/k/C +/parenleft/parenright/P/.notdef/slash/.notdef/v/period +/E/F/W/A/V/.notdef/U/N +/.notdef/K/.notdef/L/.notdef/B/x/z +/six/.notdef/.notdef/.notdef/semicolon/.notdef/quoteright/.notdef +/.notdef/underscore/.notdef/.notdef/.notdef/.notdef/.notdef/endash +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/Z/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +610 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore 4/a/space 7/p 14/T 20/braceleft 24/equal + 33/e/o 37/d 40/A 45/B 56/bracketleft/bracketright 61/M + 63/m +] +>> +endobj +497 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/a/space/.notdef/p +/c/h/.notdef/U/N/I/T/.notdef +/.notdef/.notdef/comma/.notdef/braceleft/semicolon/i/f +/equal/.notdef/.notdef/.notdef/C/P/.notdef/O +/.notdef/e/o/zero/braceright/d/.notdef/D +/A/ampersand/.notdef/.notdef/.notdef/B/L/.notdef +/R/.notdef/.notdef/.notdef/.notdef/V/F/ellipsis +/bracketleft/bracketright/.notdef/.notdef/.notdef/M/.notdef/m +/.notdef/quotedblleft/quotedblright/X/bar/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/w/Y/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +611 0 obj +<< +/Type /Encoding +/Differences [ 2/period 9/four 33/six +] +>> +endobj +498 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/period/.notdef/.notdef/e/r/i +/.notdef/four/.notdef/.notdef/a/t/space/.notdef +/.notdef/p/.notdef/.notdef/.notdef/.notdef/.notdef/n +/.notdef/o/.notdef/S/u/.notdef/.notdef/.notdef +/.notdef/six/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/B/.notdef +/.notdef/.notdef/k/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +502 0 obj +<< +/Type /Encoding +/Differences [ 7/t 13/p 22/y +] +>> +endobj +499 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/a/t +/.notdef/r/.notdef/.notdef/.notdef/p/.notdef/.notdef +/.notdef/.notdef/.notdef/d/.notdef/.notdef/y/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +612 0 obj +<< +/Type /Encoding +/Differences [ 1/t/underscore/s 5/space 10/parenleft 16/u/r/comma +/parenright/braceleft 22/i/f 27/S/C/P/E + 32/K/e 40/A/ampersand 59/W 61/M/b/m +/k 78/quoteleft/quoteright +] +>> +endobj +500 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/t/underscore/s/a/space/.notdef/.notdef +/c/.notdef/parenleft/.notdef/.notdef/.notdef/.notdef/.notdef +/u/r/comma/parenright/braceleft/.notdef/i/f +/.notdef/n/.notdef/S/C/P/E/.notdef +/K/e/o/.notdef/braceright/.notdef/.notdef/.notdef +/A/ampersand/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/W/.notdef/M/b/m +/k/.notdef/.notdef/.notdef/.notdef/less/.notdef/.notdef +/.notdef/.notdef/.notdef/x/.notdef/.notdef/quoteleft/quoteright +/greater/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +613 0 obj +<< +/Type /Encoding +/Differences [ 1/T/h/e/space/f/o/l 9/i +/n 12/c/p 15/r/t/a/s/S + 24/comma/b/d/m 38/k/C 42/P 62/x +] +>> +endobj +501 0 obj +<< +/Type /Encoding +/Differences [0/.notdef/T/h/e/space/f/o/l +/.notdef/i/n/g/c/p/y/r +/t/a/s/S/.notdef/.notdef/.notdef/u +/comma/b/d/m/colon/.notdef/one/.notdef +/three/.notdef/two/zero/.notdef/.notdef/k/C +/parenleft/parenright/P/.notdef/.notdef/.notdef/.notdef/period +/E/F/.notdef/.notdef/.notdef/.notdef/U/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/B/x/.notdef +/six/.notdef/four/.notdef/semicolon/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/greater/.notdef/.notdef/.notdef +/.notdef/less/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +] +>> +endobj +503 0 obj +<< +/Type /Encoding +/Differences [ 19/s/i/m/underscore 25/e 33/t 37/r 43/b + 46/k +] +>> +endobj +125 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 127 0 R +/Contents 126 0 R +>> +endobj +74 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 134 0 R +/Contents 133 0 R +/Annots [73 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R +90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R +106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R] +>> +endobj +119 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 139 0 R +/Contents 138 0 R +/Annots [118 0 R 120 0 R 121 0 R 122 0 R 123 0 R] +>> +endobj +1 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 143 0 R +/Contents 142 0 R +>> +endobj +4 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 149 0 R +/Contents 148 0 R +>> +endobj +6 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 154 0 R +/Contents 153 0 R +>> +endobj +10 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 162 0 R +/Contents 161 0 R +>> +endobj +13 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 167 0 R +/Contents 166 0 R +>> +endobj +16 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 172 0 R +/Contents 171 0 R +>> +endobj +18 0 obj +<< +/Type /Page +/Parent 132 0 R +/Resources 177 0 R +/Contents 176 0 R +>> +endobj +20 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 183 0 R +/Contents 182 0 R +>> +endobj +22 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 191 0 R +/Contents 190 0 R +>> +endobj +195 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 197 0 R +/Contents 196 0 R +>> +endobj +25 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 201 0 R +/Contents 200 0 R +>> +endobj +28 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 207 0 R +/Contents 206 0 R +>> +endobj +31 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 212 0 R +/Contents 211 0 R +>> +endobj +37 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 218 0 R +/Contents 217 0 R +>> +endobj +40 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 225 0 R +/Contents 224 0 R +>> +endobj +42 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 230 0 R +/Contents 229 0 R +>> +endobj +237 0 obj +<< +/Type /Page +/Parent 189 0 R +/Resources 239 0 R +/Contents 238 0 R +>> +endobj +46 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 244 0 R +/Contents 243 0 R +>> +endobj +251 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 253 0 R +/Contents 252 0 R +>> +endobj +49 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 257 0 R +/Contents 256 0 R +>> +endobj +53 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 265 0 R +/Contents 264 0 R +>> +endobj +58 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 272 0 R +/Contents 271 0 R +>> +endobj +62 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 280 0 R +/Contents 279 0 R +>> +endobj +65 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 286 0 R +/Contents 285 0 R +>> +endobj +292 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 294 0 R +/Contents 293 0 R +>> +endobj +297 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 299 0 R +/Contents 298 0 R +>> +endobj +302 0 obj +<< +/Type /Page +/Parent 250 0 R +/Resources 304 0 R +/Contents 303 0 R +>> +endobj +309 0 obj +<< +/Type /Page +/Parent 315 0 R +/Resources 311 0 R +/Contents 310 0 R +>> +endobj +69 0 obj +<< +/Type /Page +/Parent 315 0 R +/Resources 317 0 R +/Contents 316 0 R +>> +endobj +325 0 obj +<< +/Type /Page +/Parent 315 0 R +/Resources 327 0 R +/Contents 326 0 R +>> +endobj +71 0 obj +<< +/Type /Page +/Parent 315 0 R +/Resources 332 0 R +/Contents 331 0 R +>> +endobj +338 0 obj +<< +/Type /Page +/Parent 315 0 R +/Resources 340 0 R +/Contents 339 0 R +>> +endobj +132 0 obj +<< +/Type /Pages +/Kids [125 0 R 74 0 R 119 0 R 1 0 R 4 0 R 6 0 R 10 0 R 13 0 R 16 0 R 18 0 R] +/Count 10 +/Parent 188 0 R +>> +endobj +189 0 obj +<< +/Type /Pages +/Kids [20 0 R 22 0 R 195 0 R 25 0 R 28 0 R 31 0 R 37 0 R 40 0 R 42 0 R 237 0 R] +/Count 10 +/Parent 188 0 R +>> +endobj +250 0 obj +<< +/Type /Pages +/Kids [46 0 R 251 0 R 49 0 R 53 0 R 58 0 R 62 0 R 65 0 R 292 0 R 297 0 R 302 0 R] +/Count 10 +/Parent 188 0 R +>> +endobj +315 0 obj +<< +/Type /Pages +/Kids [309 0 R 69 0 R 325 0 R 71 0 R 338 0 R] +/Count 5 +/Parent 188 0 R +>> +endobj +188 0 obj +<< +/Type /Pages +/Kids [132 0 R 189 0 R 250 0 R 315 0 R ] +/Count 35 +/MediaBox [0 0 612 792] +>> +endobj +614 0 obj +<< +/Count 49 +/First 2 0 R +/Last 66 0 R +>> +endobj +2 0 obj +<< +/Title (Overview) +/Dest [1 0 R /FitH 697] +/Parent 614 0 R +/Next 3 0 R +>> +endobj +3 0 obj +<< +/Title (Data Types) +/Dest [1 0 R /FitH 389] +/Parent 614 0 R +/Prev 2 0 R +/Next 5 0 R +>> +endobj +5 0 obj +<< +/Title (VM Organization) +/Dest [4 0 R /FitH 650] +/Parent 614 0 R +/Prev 3 0 R +/Next 26 0 R +/First 7 0 R +/Last 17 0 R +/Count 12 +>> +endobj +7 0 obj +<< +/Title (CPU Organization) +/Dest [6 0 R /FitH 416] +/Parent 5 0 R +/Next 17 0 R +/First 8 0 R +/Last 15 0 R +/Count 6 +>> +endobj +8 0 obj +<< +/Title (Time Base) +/Dest [6 0 R /FitH 246] +/Parent 7 0 R +/Next 9 0 R +>> +endobj +9 0 obj +<< +/Title (Step Function) +/Dest [6 0 R /FitH 124] +/Parent 7 0 R +/Prev 8 0 R +/Next 11 0 R +>> +endobj +11 0 obj +<< +/Title (Memory Organization) +/Dest [10 0 R /FitH 604] +/Parent 7 0 R +/Prev 9 0 R +/Next 12 0 R +>> +endobj +12 0 obj +<< +/Title (Interrupt Organization) +/Dest [10 0 R /FitH 368] +/Parent 7 0 R +/Prev 11 0 R +/Next 14 0 R +>> +endobj +14 0 obj +<< +/Title (I/O Dispatching) +/Dest [13 0 R /FitH 386] +/Parent 7 0 R +/Prev 12 0 R +/Next 15 0 R +>> +endobj +15 0 obj +<< +/Title (Instruction Execution) +/Dest [13 0 R /FitH 124] +/Parent 7 0 R +/Prev 14 0 R +>> +endobj +17 0 obj +<< +/Title (Peripheral Device Organization) +/Dest [16 0 R /FitH 243] +/Parent 5 0 R +/Prev 7 0 R +/First 19 0 R +/Last 24 0 R +/Count 4 +>> +endobj +19 0 obj +<< +/Title (Device Timing) +/Dest [18 0 R /FitH 418] +/Parent 17 0 R +/Next 21 0 R +>> +endobj +21 0 obj +<< +/Title (Clock Calibration) +/Dest [20 0 R /FitH 312] +/Parent 17 0 R +/Prev 19 0 R +/Next 23 0 R +>> +endobj +23 0 obj +<< +/Title (Idling) +/Dest [22 0 R /FitH 616] +/Parent 17 0 R +/Prev 21 0 R +/Next 24 0 R +>> +endobj +24 0 obj +<< +/Title (Data I/O) +/Dest [22 0 R /FitH 320] +/Parent 17 0 R +/Prev 23 0 R +>> +endobj +26 0 obj +<< +/Title (Data Structures) +/Dest [25 0 R /FitH 638] +/Parent 614 0 R +/Prev 5 0 R +/Next 54 0 R +/First 27 0 R +/Last 52 0 R +/Count 19 +>> +endobj +27 0 obj +<< +/Title (sim_device Structure) +/Dest [25 0 R /FitH 538] +/Parent 26 0 R +/Next 41 0 R +/First 29 0 R +/Last 39 0 R +/Count 9 +>> +endobj +29 0 obj +<< +/Title (Awidth and Aincr) +/Dest [28 0 R /FitH 547] +/Parent 27 0 R +/Next 30 0 R +>> +endobj +30 0 obj +<< +/Title (Device Flags) +/Dest [28 0 R /FitH 298] +/Parent 27 0 R +/Prev 29 0 R +/Next 32 0 R +>> +endobj +32 0 obj +<< +/Title (Context) +/Dest [31 0 R /FitH 720] +/Parent 27 0 R +/Prev 30 0 R +/Next 33 0 R +>> +endobj +33 0 obj +<< +/Title (Examine and Deposit Routines) +/Dest [31 0 R /FitH 645] +/Parent 27 0 R +/Prev 32 0 R +/Next 34 0 R +>> +endobj +34 0 obj +<< +/Title (Reset Routine) +/Dest [31 0 R /FitH 455] +/Parent 27 0 R +/Prev 33 0 R +/Next 35 0 R +>> +endobj +35 0 obj +<< +/Title (Boot Routine) +/Dest [31 0 R /FitH 334] +/Parent 27 0 R +/Prev 34 0 R +/Next 36 0 R +>> +endobj +36 0 obj +<< +/Title (Attach and Detach Routines) +/Dest [31 0 R /FitH 202] +/Parent 27 0 R +/Prev 35 0 R +/Next 38 0 R +>> +endobj +38 0 obj +<< +/Title (Memory Size Change Routine) +/Dest [37 0 R /FitH 400] +/Parent 27 0 R +/Prev 36 0 R +/Next 39 0 R +>> +endobj +39 0 obj +<< +/Title (Debug Controls) +/Dest [37 0 R /FitH 244] +/Parent 27 0 R +/Prev 38 0 R +>> +endobj +41 0 obj +<< +/Title (sim_unit Structure) +/Dest [40 0 R /FitH 593] +/Parent 26 0 R +/Prev 27 0 R +/Next 45 0 R +/First 43 0 R +/Last 44 0 R +/Count 2 +>> +endobj +43 0 obj +<< +/Title (Unit Flags) +/Dest [42 0 R /FitH 582] +/Parent 41 0 R +/Next 44 0 R +>> +endobj +44 0 obj +<< +/Title (Service Routine) +/Dest [42 0 R /FitH 289] +/Parent 41 0 R +/Prev 43 0 R +>> +endobj +45 0 obj +<< +/Title (sim_reg Structure) +/Dest [42 0 R /FitH 190] +/Parent 26 0 R +/Prev 41 0 R +/Next 48 0 R +/First 47 0 R +/Last 47 0 R +/Count 1 +>> +endobj +47 0 obj +<< +/Title (Register Flags) +/Dest [46 0 R /FitH 639] +/Parent 45 0 R +>> +endobj +48 0 obj +<< +/Title (sim_mtab Structure) +/Dest [46 0 R /FitH 427] +/Parent 26 0 R +/Prev 45 0 R +/Next 52 0 R +/First 50 0 R +/Last 51 0 R +/Count 2 +>> +endobj +50 0 obj +<< +/Title (Validation Routine) +/Dest [49 0 R /FitH 571] +/Parent 48 0 R +/Next 51 0 R +>> +endobj +51 0 obj +<< +/Title (Display Routine) +/Dest [49 0 R /FitH 439] +/Parent 48 0 R +/Prev 50 0 R +>> +endobj +52 0 obj +<< +/Title (Other Data Structures) +/Dest [49 0 R /FitH 238] +/Parent 26 0 R +/Prev 48 0 R +>> +endobj +54 0 obj +<< +/Title (VM Provided Routines) +/Dest [53 0 R /FitH 662] +/Parent 614 0 R +/Prev 26 0 R +/Next 66 0 R +/First 55 0 R +/Last 59 0 R +/Count 8 +>> +endobj +55 0 obj +<< +/Title (Instruction Execution) +/Dest [53 0 R /FitH 631] +/Parent 54 0 R +/Next 56 0 R +>> +endobj +56 0 obj +<< +/Title (Binary Load and Dump) +/Dest [53 0 R /FitH 556] +/Parent 54 0 R +/Prev 55 0 R +/Next 57 0 R +>> +endobj +57 0 obj +<< +/Title (Symbolic Examination and Deposit) +/Dest [53 0 R /FitH 412] +/Parent 54 0 R +/Prev 56 0 R +/Next 59 0 R +>> +endobj +59 0 obj +<< +/Title (Optional Interfaces) +/Dest [58 0 R /FitH 440] +/Parent 54 0 R +/Prev 57 0 R +/First 60 0 R +/Last 64 0 R +/Count 4 +>> +endobj +60 0 obj +<< +/Title (Once Only Initialization Routine) +/Dest [58 0 R /FitH 354] +/Parent 59 0 R +/Next 61 0 R +>> +endobj +61 0 obj +<< +/Title (Address Input and Display) +/Dest [58 0 R /FitH 199] +/Parent 59 0 R +/Prev 60 0 R +/Next 63 0 R +>> +endobj +63 0 obj +<< +/Title (Command Input and Post-Processing) +/Dest [62 0 R /FitH 616] +/Parent 59 0 R +/Prev 61 0 R +/Next 64 0 R +>> +endobj +64 0 obj +<< +/Title (VM-Specific Commands) +/Dest [62 0 R /FitH 380] +/Parent 59 0 R +/Prev 63 0 R +>> +endobj +66 0 obj +<< +/Title (Other SCP Facilities) +/Dest [65 0 R /FitH 720] +/Parent 614 0 R +/Prev 54 0 R +/First 67 0 R +/Last 72 0 R +/Count 4 +>> +endobj +67 0 obj +<< +/Title (Terminal Input/Output Formatting Library) +/Dest [65 0 R /FitH 689] +/Parent 66 0 R +/Next 68 0 R +>> +endobj +68 0 obj +<< +/Title (Terminal Multiplexor Emulation Library) +/Dest [65 0 R /FitH 189] +/Parent 66 0 R +/Prev 67 0 R +/Next 70 0 R +>> +endobj +70 0 obj +<< +/Title (Magnetic Tape Emulation Library) +/Dest [69 0 R /FitH 307] +/Parent 66 0 R +/Prev 68 0 R +/Next 72 0 R +>> +endobj +72 0 obj +<< +/Title (Breakpoint Support) +/Dest [71 0 R /FitH 410] +/Parent 66 0 R +/Prev 70 0 R +>> +endobj +615 0 obj +<< +/Type /Catalog +/Pages 188 0 R +/Outlines 614 0 R +/OpenAction [125 0 R /XYZ null 796 1] +/PageMode /UseOutlines +>> +endobj +xref +0 616 +0000000000 65535 f +0000493885 00000 n +0000497680 00000 n +0000497779 00000 n +0000493979 00000 n +0000497893 00000 n +0000494073 00000 n +0000498052 00000 n +0000498196 00000 n +0000498294 00000 n +0000494167 00000 n +0000498410 00000 n +0000498534 00000 n +0000494262 00000 n +0000498662 00000 n +0000498783 00000 n +0000494357 00000 n +0000498896 00000 n +0000494452 00000 n +0000499056 00000 n +0000494547 00000 n +0000499162 00000 n +0000494642 00000 n +0000499286 00000 n +0000499399 00000 n +0000494833 00000 n +0000499500 00000 n +0000499662 00000 n +0000494928 00000 n +0000499814 00000 n +0000499923 00000 n +0000495023 00000 n +0000500042 00000 n +0000500156 00000 n +0000500291 00000 n +0000500411 00000 n +0000500530 00000 n +0000495118 00000 n +0000500663 00000 n +0000500796 00000 n +0000495213 00000 n +0000500903 00000 n +0000495308 00000 n +0000501067 00000 n +0000501170 00000 n +0000501278 00000 n +0000495499 00000 n +0000501441 00000 n +0000501534 00000 n +0000495690 00000 n +0000501698 00000 n +0000501809 00000 n +0000501917 00000 n +0000495785 00000 n +0000502031 00000 n +0000502198 00000 n +0000502312 00000 n +0000502439 00000 n +0000495880 00000 n +0000502578 00000 n +0000502729 00000 n +0000502854 00000 n +0000495975 00000 n +0000502986 00000 n +0000503126 00000 n +0000496070 00000 n +0000503239 00000 n +0000503392 00000 n +0000503525 00000 n +0000496549 00000 n +0000503670 00000 n +0000496740 00000 n +0000503808 00000 n +0000000017 00000 n +0000493304 00000 n +0000000177 00000 n +0000000337 00000 n +0000000497 00000 n +0000000658 00000 n +0000000819 00000 n +0000000980 00000 n +0000001142 00000 n +0000001304 00000 n +0000001466 00000 n +0000001628 00000 n +0000001790 00000 n +0000001952 00000 n +0000002114 00000 n +0000002276 00000 n +0000002438 00000 n +0000002599 00000 n +0000002761 00000 n +0000002923 00000 n +0000003085 00000 n +0000003247 00000 n +0000003409 00000 n +0000003571 00000 n +0000003733 00000 n +0000003895 00000 n +0000004057 00000 n +0000004219 00000 n +0000004382 00000 n +0000004545 00000 n +0000004708 00000 n +0000004871 00000 n +0000005034 00000 n +0000005197 00000 n +0000005360 00000 n +0000005523 00000 n +0000005686 00000 n +0000005848 00000 n +0000006011 00000 n +0000006174 00000 n +0000006337 00000 n +0000006500 00000 n +0000006663 00000 n +0000006826 00000 n +0000006988 00000 n +0000007149 00000 n +0000493738 00000 n +0000007311 00000 n +0000007474 00000 n +0000007637 00000 n +0000007800 00000 n +0000007963 00000 n +0000493208 00000 n +0000008288 00000 n +0000010524 00000 n +0000183686 00000 n +0000184014 00000 n +0000184242 00000 n +0000127373 00000 n +0000496931 00000 n +0000010661 00000 n +0000013057 00000 n +0000184681 00000 n +0000184993 00000 n +0000185350 00000 n +0000013196 00000 n +0000013858 00000 n +0000185779 00000 n +0000186076 00000 n +0000013984 00000 n +0000017605 00000 n +0000186435 00000 n +0000186686 00000 n +0000187162 00000 n +0000187421 00000 n +0000017759 00000 n +0000020742 00000 n +0000187648 00000 n +0000187975 00000 n +0000188435 00000 n +0000020882 00000 n +0000023716 00000 n +0000188692 00000 n +0000189155 00000 n +0000189372 00000 n +0000189556 00000 n +0000189851 00000 n +0000190114 00000 n +0000023898 00000 n +0000027480 00000 n +0000190364 00000 n +0000190866 00000 n +0000191108 00000 n +0000027634 00000 n +0000030946 00000 n +0000191389 00000 n +0000191875 00000 n +0000192180 00000 n +0000031100 00000 n +0000034525 00000 n +0000192416 00000 n +0000192905 00000 n +0000193196 00000 n +0000034679 00000 n +0000038460 00000 n +0000193495 00000 n +0000193945 00000 n +0000194184 00000 n +0000194440 00000 n +0000038628 00000 n +0000042395 00000 n +0000194725 00000 n +0000195223 00000 n +0000195493 00000 n +0000195788 00000 n +0000497495 00000 n +0000497078 00000 n +0000042563 00000 n +0000045890 00000 n +0000196027 00000 n +0000196506 00000 n +0000196805 00000 n +0000494737 00000 n +0000046058 00000 n +0000050197 00000 n +0000197097 00000 n +0000197599 00000 n +0000050337 00000 n +0000053378 00000 n +0000197899 00000 n +0000198389 00000 n +0000198728 00000 n +0000198989 00000 n +0000053546 00000 n +0000056815 00000 n +0000199288 00000 n +0000199594 00000 n +0000200088 00000 n +0000056969 00000 n +0000060235 00000 n +0000200401 00000 n +0000200732 00000 n +0000201218 00000 n +0000201470 00000 n +0000060389 00000 n +0000064073 00000 n +0000201749 00000 n +0000202246 00000 n +0000202519 00000 n +0000202822 00000 n +0000203159 00000 n +0000064241 00000 n +0000066586 00000 n +0000203490 00000 n +0000203961 00000 n +0000204312 00000 n +0000066726 00000 n +0000069442 00000 n +0000204607 00000 n +0000205115 00000 n +0000205430 00000 n +0000205775 00000 n +0000206098 00000 n +0000206343 00000 n +0000495403 00000 n +0000069624 00000 n +0000072403 00000 n +0000206638 00000 n +0000207129 00000 n +0000207490 00000 n +0000072543 00000 n +0000075702 00000 n +0000207857 00000 n +0000208369 00000 n +0000208698 00000 n +0000209069 00000 n +0000209372 00000 n +0000497228 00000 n +0000495594 00000 n +0000075870 00000 n +0000079035 00000 n +0000209669 00000 n +0000210181 00000 n +0000079161 00000 n +0000082819 00000 n +0000210453 00000 n +0000210764 00000 n +0000211244 00000 n +0000211665 00000 n +0000211988 00000 n +0000212247 00000 n +0000083001 00000 n +0000086833 00000 n +0000212528 00000 n +0000213043 00000 n +0000213309 00000 n +0000213588 00000 n +0000213925 00000 n +0000087002 00000 n +0000090729 00000 n +0000214199 00000 n +0000214707 00000 n +0000215002 00000 n +0000215318 00000 n +0000215642 00000 n +0000215998 00000 n +0000090917 00000 n +0000094216 00000 n +0000216218 00000 n +0000216692 00000 n +0000217008 00000 n +0000217272 00000 n +0000094374 00000 n +0000098058 00000 n +0000217618 00000 n +0000217910 00000 n +0000218252 00000 n +0000218722 00000 n +0000218993 00000 n +0000496165 00000 n +0000098231 00000 n +0000100885 00000 n +0000219235 00000 n +0000219724 00000 n +0000496261 00000 n +0000101013 00000 n +0000105426 00000 n +0000220050 00000 n +0000220551 00000 n +0000496357 00000 n +0000105554 00000 n +0000109938 00000 n +0000220917 00000 n +0000221381 00000 n +0000221660 00000 n +0000221898 00000 n +0000496453 00000 n +0000110096 00000 n +0000114356 00000 n +0000222270 00000 n +0000222742 00000 n +0000223043 00000 n +0000497380 00000 n +0000114499 00000 n +0000119141 00000 n +0000223289 00000 n +0000223758 00000 n +0000224062 00000 n +0000224306 00000 n +0000224704 00000 n +0000224921 00000 n +0000225106 00000 n +0000496644 00000 n +0000119344 00000 n +0000122519 00000 n +0000225430 00000 n +0000225899 00000 n +0000226200 00000 n +0000122662 00000 n +0000125904 00000 n +0000226468 00000 n +0000226803 00000 n +0000227300 00000 n +0000227734 00000 n +0000228052 00000 n +0000496835 00000 n +0000126077 00000 n +0000127081 00000 n +0000228282 00000 n +0000228704 00000 n +0000229162 00000 n +0000229384 00000 n +0000127239 00000 n +0000127454 00000 n +0000127776 00000 n +0000131570 00000 n +0000131999 00000 n +0000137456 00000 n +0000138145 00000 n +0000146500 00000 n +0000146877 00000 n +0000152036 00000 n +0000152423 00000 n +0000157549 00000 n +0000157867 00000 n +0000161797 00000 n +0000162095 00000 n +0000165093 00000 n +0000165309 00000 n +0000165569 00000 n +0000165953 00000 n +0000171455 00000 n +0000172051 00000 n +0000181753 00000 n +0000181990 00000 n +0000183281 00000 n +0000183492 00000 n +0000229758 00000 n +0000231748 00000 n +0000231982 00000 n +0000233922 00000 n +0000236009 00000 n +0000238055 00000 n +0000240038 00000 n +0000242198 00000 n +0000244189 00000 n +0000246437 00000 n +0000248451 00000 n +0000250595 00000 n +0000252908 00000 n +0000254933 00000 n +0000256931 00000 n +0000259188 00000 n +0000261073 00000 n +0000261154 00000 n +0000261311 00000 n +0000263404 00000 n +0000265580 00000 n +0000267823 00000 n +0000269741 00000 n +0000269849 00000 n +0000272007 00000 n +0000274018 00000 n +0000276066 00000 n +0000276343 00000 n +0000278276 00000 n +0000280451 00000 n +0000282737 00000 n +0000284630 00000 n +0000286854 00000 n +0000289048 00000 n +0000291343 00000 n +0000293376 00000 n +0000295536 00000 n +0000303980 00000 n +0000297799 00000 n +0000299697 00000 n +0000301895 00000 n +0000306180 00000 n +0000308143 00000 n +0000310210 00000 n +0000314453 00000 n +0000312339 00000 n +0000316571 00000 n +0000318917 00000 n +0000320969 00000 n +0000322940 00000 n +0000325088 00000 n +0000327291 00000 n +0000329429 00000 n +0000331550 00000 n +0000333806 00000 n +0000335709 00000 n +0000337884 00000 n +0000340087 00000 n +0000342206 00000 n +0000344321 00000 n +0000346335 00000 n +0000348435 00000 n +0000350719 00000 n +0000352612 00000 n +0000354767 00000 n +0000356914 00000 n +0000358972 00000 n +0000359171 00000 n +0000361375 00000 n +0000363387 00000 n +0000365507 00000 n +0000367745 00000 n +0000373901 00000 n +0000369730 00000 n +0000371799 00000 n +0000376011 00000 n +0000378196 00000 n +0000380188 00000 n +0000390835 00000 n +0000382498 00000 n +0000384578 00000 n +0000386567 00000 n +0000388748 00000 n +0000392982 00000 n +0000395311 00000 n +0000397182 00000 n +0000399346 00000 n +0000401514 00000 n +0000403613 00000 n +0000405783 00000 n +0000407798 00000 n +0000409877 00000 n +0000412050 00000 n +0000414254 00000 n +0000416440 00000 n +0000418838 00000 n +0000425058 00000 n +0000420835 00000 n +0000423022 00000 n +0000427109 00000 n +0000429275 00000 n +0000431454 00000 n +0000435640 00000 n +0000433522 00000 n +0000437870 00000 n +0000439867 00000 n +0000442123 00000 n +0000444052 00000 n +0000446274 00000 n +0000448260 00000 n +0000450317 00000 n +0000452429 00000 n +0000452727 00000 n +0000456744 00000 n +0000454654 00000 n +0000458947 00000 n +0000463079 00000 n +0000460971 00000 n +0000465251 00000 n +0000467348 00000 n +0000469472 00000 n +0000469631 00000 n +0000471791 00000 n +0000475899 00000 n +0000473823 00000 n +0000478158 00000 n +0000480211 00000 n +0000482299 00000 n +0000484399 00000 n +0000486568 00000 n +0000488927 00000 n +0000491121 00000 n +0000486491 00000 n +0000493098 00000 n +0000229643 00000 n +0000231843 00000 n +0000233846 00000 n +0000235927 00000 n +0000237966 00000 n +0000239959 00000 n +0000242115 00000 n +0000246274 00000 n +0000248348 00000 n +0000250515 00000 n +0000252721 00000 n +0000252797 00000 n +0000256850 00000 n +0000259034 00000 n +0000261226 00000 n +0000265475 00000 n +0000267679 00000 n +0000271915 00000 n +0000273928 00000 n +0000276161 00000 n +0000276252 00000 n +0000280363 00000 n +0000282514 00000 n +0000282653 00000 n +0000286754 00000 n +0000288959 00000 n +0000291155 00000 n +0000293263 00000 n +0000295451 00000 n +0000297635 00000 n +0000297712 00000 n +0000301797 00000 n +0000306109 00000 n +0000308058 00000 n +0000312142 00000 n +0000312259 00000 n +0000316488 00000 n +0000318672 00000 n +0000318757 00000 n +0000322856 00000 n +0000324998 00000 n +0000327121 00000 n +0000329209 00000 n +0000329320 00000 n +0000333599 00000 n +0000333693 00000 n +0000337778 00000 n +0000339929 00000 n +0000342113 00000 n +0000344239 00000 n +0000346259 00000 n +0000348352 00000 n +0000350542 00000 n +0000350637 00000 n +0000354643 00000 n +0000356823 00000 n +0000359083 00000 n +0000361280 00000 n +0000363310 00000 n +0000365369 00000 n +0000367544 00000 n +0000367661 00000 n +0000369624 00000 n +0000375932 00000 n +0000378116 00000 n +0000380096 00000 n +0000382266 00000 n +0000382361 00000 n +0000384405 00000 n +0000388637 00000 n +0000392895 00000 n +0000395081 00000 n +0000395183 00000 n +0000399266 00000 n +0000401430 00000 n +0000403534 00000 n +0000405667 00000 n +0000407720 00000 n +0000411958 00000 n +0000414087 00000 n +0000416359 00000 n +0000418578 00000 n +0000418725 00000 n +0000420759 00000 n +0000422928 00000 n +0000429192 00000 n +0000431300 00000 n +0000433353 00000 n +0000433454 00000 n +0000437727 00000 n +0000439784 00000 n +0000441915 00000 n +0000442040 00000 n +0000446070 00000 n +0000446168 00000 n +0000448188 00000 n +0000452613 00000 n +0000458805 00000 n +0000460862 00000 n +0000465148 00000 n +0000467271 00000 n +0000469543 00000 n +0000471682 00000 n +0000473737 00000 n +0000477966 00000 n +0000478078 00000 n +0000482116 00000 n +0000484313 00000 n +0000488706 00000 n +0000490976 00000 n +0000497614 00000 n +0000503919 00000 n +trailer +<< +/Size 616 +/Root 615 0 R +/Info 124 0 R +/ID [<303dd5fe35887e612b216d96ac4f258d><303dd5fe35887e612b216d96ac4f258d>] +>> +startxref +504060 +%%EOF diff --git a/makefile b/makefile index 639691e2..7feb5cdf 100644 --- a/makefile +++ b/makefile @@ -373,7 +373,7 @@ LDFLAGS = $(OS_LDFLAGS) $(NETWORK_LDFLAGS) $(LDFLAGS_O) # BIN = BIN/ SIM = scp.c sim_console.c sim_fio.c sim_timer.c sim_sock.c \ - sim_tmxr.c sim_ether.c sim_tape.c sim_disk.c + sim_tmxr.c sim_ether.c sim_tape.c sim_disk.c sim_serial.c # diff --git a/scp.c b/scp.c index 5c80a8f6..d4ab078f 100644 --- a/scp.c +++ b/scp.c @@ -57,6 +57,7 @@ 08-Feb-09 RMS Fixed warnings in help printouts 29-Dec-08 RMS Fixed implementation of MTAB_NC 24-Nov-08 RMS Revised RESTORE unit logic for consistency + 21-Oct-08 JDB [serial] Added sim_unit_ref global to indicate type of reference 05-Sep-08 JDB "detach_all" ignores error status returns if shutting down 17-Aug-08 RMS Revert RUN/BOOT to standard, rather than powerup, reset 25-Jul-08 JDB DO cmd missing params now default to null string @@ -414,6 +415,7 @@ t_stat do_cmd_label (int32 flag, char *cptr, char *label); /* Global data */ +UNITREF sim_unit_ref; DEVICE *sim_dflt_dev = NULL; UNIT *sim_clock_queue = NULL; int32 sim_interval = 0; @@ -2817,6 +2819,7 @@ DEVICE *dptr; UNIT *uptr; t_stat r; +sim_unit_ref = ref_unit_all; /* we will reference all units */ if ((start < 0) || (start > 1)) return SCPE_IERR; for (i = start; (dptr = sim_devices[i]) != NULL; i++) { /* loop thru dev */ @@ -3134,6 +3137,8 @@ t_bool force_restore = sim_switches & SWMASK ('F'); #define READ_I(xx) if (sim_fread (&xx, sizeof (xx), 1, rfile) == 0) \ return SCPE_IOERR; +sim_unit_ref = ref_unit_all; /* we will reference all units */ + fstat (fileno (rfile), &rstat); READ_S (buf); /* [V2.5+] read version */ v35 = v32 = FALSE; @@ -4579,6 +4584,9 @@ return NULL; Outputs: result = pointer to device (null if no dev) *iptr = pointer to unit (null if nx unit) + + The "sim_unit_ref" global is set to the type of reference specified by cptr + (device or unit). */ DEVICE *find_unit (char *cptr, UNIT **uptr) @@ -4588,11 +4596,13 @@ char *nptr, *tptr; t_stat r; DEVICE *dptr; +sim_unit_ref = ref_unit; /* assume unit reference */ if (uptr == NULL) /* arg error? */ return NULL; if (dptr = find_dev (cptr)) { /* exact match? */ if (qdisable (dptr)) /* disabled? */ return NULL; + sim_unit_ref = ref_dev; /* flag device reference */ *uptr = dptr->units; /* unit 0 */ return dptr; } diff --git a/scp.h b/scp.h index 3ee43b97..98f6bc8b 100644 --- a/scp.h +++ b/scp.h @@ -1,6 +1,6 @@ /* scp.h: simulator control program headers - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2009, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -24,6 +24,7 @@ in this Software without prior written authorization from Robert M Supnik. 05-Dec-10 MP Added macro invocation of sim_debug + 07-Jan-09 JDB Added UNITREF typedef 09-Aug-06 JDB Added assign_device and deassign_device 14-Jul-06 RMS Added sim_activate_abs 06-Jan-06 RMS Added fprint_stopped_gen @@ -52,6 +53,10 @@ #define CMD_OPT_SCH 004 /* search */ #define CMD_OPT_DFT 010 /* defaults */ +/* unit references */ + +typedef enum { ref_dev, ref_unit, ref_unit_all } UNITREF; + /* Command processors */ t_stat reset_cmd (int32 flag, char *ptr); diff --git a/sim_serial.c b/sim_serial.c new file mode 100644 index 00000000..a75127b8 --- /dev/null +++ b/sim_serial.c @@ -0,0 +1,814 @@ +/* sim_serial.c: OS-dependent serial port routines + + Copyright (c) 2008, J. David Bryan + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the author shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from the author. + + The author gratefully acknowledges the assistance of Holger Veit with the + UNIX-specific code and testing. + + 07-Oct-08 JDB [serial] Created file + + + This module provides OS-dependent routines to access serial ports on the host + machine. The terminal multiplexer library uses these routines to provide + serial connections to simulated terminal interfaces. + + Currently, the module supports Windows and UNIX. Use on other systems + returns error codes indicating that the functions failed, inhibiting serial + port support in SIMH. + + The following routines are provided: + + sim_open_serial open a serial port + sim_config_serial change baud rate and character framing configuration + sim_control_serial connect or disconnect a serial port (controls DTR) + sim_read_serial read from a serial port + sim_write_serial write to a serial port + sim_close_serial close a serial port + + + The calling sequences are as follows: + + + SERHANDLE sim_open_serial (char *name) + -------------------------------------- + + The serial port referenced by the OS-dependent "name" is opened. If the open + is successful, and "name" refers to a serial port on the host system, then a + handle to the port is returned. If not, then the value INVALID_HANDLE is + returned. + + + t_stat sim_config_serial (SERHANDLE port, SERCONFIG config) + ----------------------------------------------------------- + + The baud rate and framing parameters (character size, parity, and number of + stop bits) of the serial port associated with "port" are set. If any + "config" field value is unsupported by the host system, or if the combination + of values (e.g., baud rate and number of stop bits) is unsupported, SCPE_ARG + is returned. If the configuration is successful, SCPE_OK is returned. + + + t_bool sim_control_serial (SERHANDLE port, t_bool connect) + ---------------------------------------------------------- + + If "connect" is TRUE, the DTR (modem control) line of the serial port + associated with "port" is asserted. If "connect" is false, the line is + denied. If the DTR change is successful, the function returns TRUE. FALSE + is returned if an error occurs. + + + int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk) + ---------------------------------------------------------------------------- + + A non-blocking read is issued for the serial port indicated by "port" to get + at most "count" bytes into the string "buffer". If a serial line break was + detected during the read, the variable pointed to by "brk" is set to 1. If + the read is successful, the actual number of characters read is returned. If + no characters were available, then the value 0 is returned. If an error + occurs, then the value -1 is returned. + + + int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count) + ------------------------------------------------------------------ + + A write is issued to the serial port indicated by "port" to put "count" + characters from "buffer". If the write is successful, the actual number of + characters written is returned. If an error occurs, then the value -1 is + returned. + + + void sim_close_serial (SERHANDLE port) + -------------------------------------- + + The serial port indicated by "port" is closed. +*/ + + +#include "sim_defs.h" +#include "sim_serial.h" + + + +/* Generic error message handler. + + This routine should be called for unexpected errors. Some error returns may + be expected, e.g., a "file not found" error from an "open" routine. These + should return appropriate status codes to the caller, allowing SCP to print + an error message if desired, rather than printing this generic error message. +*/ + +static void sim_error_serial (char *routine, int error) +{ +fprintf (stderr, "Serial: %s fails with error %d\n", routine, error); +return; +} + + + +/* Windows serial implementation */ + + +#if defined (_WIN32) + + +/* Open a serial port. + + The serial port designated by "name" is opened, and the handle to the port is + returned. If an error occurs, INVALID_HANDLE is returned instead. After + opening, the port is configured with the default communication parameters + established by the system, and the timeouts are set for immediate return on a + read request to enable polling. + + Implementation notes: + + 1. We call "GetDefaultCommConfig" to obtain the default communication + parameters for the specified port. If the name does not refer to a + communications port (serial or parallel), the function fails. + + 2. There is no way to limit "CreateFile" just to serial ports, so we must + check after the port is opened. The "GetCommState" routine will return + an error if the handle does not refer to a serial port. + + 3. Calling "GetDefaultCommConfig" for a serial port returns a structure + containing a DCB. This contains the default parameters. However, some + of the DCB fields are not set correctly, so we cannot use this directly + in a call to "SetCommState". Instead, we must copy the fields of + interest to a DCB retrieved from a call to "GetCommState". +*/ + +SERHANDLE sim_open_serial (char *name) +{ +SERHANDLE port; +DCB dcb; +COMMCONFIG commdefault; +DWORD error; +DWORD commsize = sizeof (commdefault); +COMMTIMEOUTS cto; + +if (!GetDefaultCommConfig (name, &commdefault, &commsize)) { /* get default comm parameters */ + error = GetLastError (); /* function failed; get error */ + + if (error != ERROR_INVALID_PARAMETER) /* not a communications port name? */ + sim_error_serial ("GetDefaultCommConfig", (int) error); /* no, so report unexpected error */ + + return INVALID_HANDLE; /* indicate bad port name */ + } + +port = CreateFile (name, GENERIC_READ | GENERIC_WRITE, /* open the port */ + 0, NULL, OPEN_EXISTING, 0, 0); + +if (port == INVALID_HANDLE_VALUE) { /* open failed? */ + error = GetLastError (); /* get error code */ + + if ((error != ERROR_FILE_NOT_FOUND) && /* bad filename? */ + (error != ERROR_ACCESS_DENIED)) /* already open? */ + sim_error_serial ("CreateFile", (int) error); /* no, so report unexpected error */ + + return INVALID_HANDLE; /* indicate bad port name */ + } + +if (!GetCommState (port, &dcb)) { /* get the current comm parameters */ + error = GetLastError (); /* function failed; get error */ + + if (error != ERROR_INVALID_PARAMETER) /* not a serial port name? */ + sim_error_serial ("GetCommState", (int) error); /* no, so report unexpected error */ + + CloseHandle (port); /* close the port */ + return INVALID_HANDLE; /* and indicate bad port name */ + } + +dcb.BaudRate = commdefault.dcb.BaudRate; /* copy default parameters of interest */ +dcb.Parity = commdefault.dcb.Parity; +dcb.ByteSize = commdefault.dcb.ByteSize; +dcb.StopBits = commdefault.dcb.StopBits; +dcb.fOutX = commdefault.dcb.fOutX; +dcb.fInX = commdefault.dcb.fInX; + +dcb.fDtrControl = DTR_CONTROL_DISABLE; /* disable DTR initially until poll connects */ + +if (!SetCommState (port, &dcb)) { /* configure the port with default parameters */ + sim_error_serial ("SetCommState", /* function failed; report unexpected error */ + (int) GetLastError ()); + CloseHandle (port); /* close port */ + return INVALID_HANDLE; /* and indicate failure to caller */ + } + +cto.ReadIntervalTimeout = MAXDWORD; /* set port to return immediately on read */ +cto.ReadTotalTimeoutMultiplier = 0; /* i.e., to enable polling */ +cto.ReadTotalTimeoutConstant = 0; +cto.WriteTotalTimeoutMultiplier = 0; +cto.WriteTotalTimeoutConstant = 0; + +if (!SetCommTimeouts (port, &cto)) { /* configure port timeouts */ + sim_error_serial ("SetCommTimeouts", /* function failed; report unexpected error */ + (int) GetLastError ()); + CloseHandle (port); /* close port */ + return INVALID_HANDLE; /* and indicate failure to caller */ + } + +return port; /* return port handle on success */ +} + + +/* Configure a serial port. + + Port parameters are configured as specified in the "config" structure. If + "config" contains an invalid configuration value, or if the host system + rejects the configuration (e.g., by requesting an unsupported combination of + character size and stop bits), SCPE_ARG is returned to the caller. If an + unexpected error occurs, SCPE_IOERR is returned. If the configuration + succeeds, SCPE_OK is returned. + + Implementation notes: + + 1. We do not enable input parity checking, as the multiplexer library has no + way of communicating parity errors back to the target simulator. + + 2. A zero value for the "stopbits" field of the "config" structure implies + 1.5 stop bits. +*/ + +t_stat sim_config_serial (SERHANDLE port, SERCONFIG config) +{ +static const struct { + char parity; + BYTE parity_code; + } parity_map [] = + { { 'E', EVENPARITY }, { 'M', MARKPARITY }, { 'N', NOPARITY }, + { 'O', ODDPARITY }, { 'S', SPACEPARITY } }; + +static const int32 parity_count = sizeof (parity_map) / sizeof (parity_map [0]); + +DCB dcb; +DWORD error; +int32 i; + +if (!GetCommState (port, &dcb)) { /* get the current comm parameters */ + sim_error_serial ("GetCommState", /* function failed; report unexpected error */ + (int) GetLastError ()); + return SCPE_IOERR; /* return failure status */ + } + +dcb.BaudRate = config.baudrate; /* assign baud rate */ + +if (config.charsize >= 5 && config.charsize <= 8) /* character size OK? */ + dcb.ByteSize = config.charsize; /* assign character size */ +else + return SCPE_ARG; /* not a valid size */ + +for (i = 0; i < parity_count; i++) /* assign parity */ + if (config.parity == parity_map [i].parity) { /* match mapping value? */ + dcb.Parity = parity_map [i].parity_code; /* assign corresponding code */ + break; + } + +if (i == parity_count) /* parity assigned? */ + return SCPE_ARG; /* not a valid parity specifier */ + +if (config.stopbits == 1) /* assign stop bits */ + dcb.StopBits = ONESTOPBIT; +else if (config.stopbits == 2) + dcb.StopBits = TWOSTOPBITS; +else if (config.stopbits == 0) /* 0 implies 1.5 stop bits */ + dcb.StopBits = ONE5STOPBITS; +else + return SCPE_ARG; /* not a valid number of stop bits */ + +if (!SetCommState (port, &dcb)) { /* set the configuration */ + error = GetLastError (); /* check for error */ + + if (error == ERROR_INVALID_PARAMETER) /* invalid configuration? */ + return SCPE_ARG; /* report as argument error */ + + sim_error_serial ("SetCommState", (int) error); /* function failed; report unexpected error */ + return SCPE_IOERR; /* return failure status */ + } + +return SCPE_OK; /* return success status */ +} + + +/* Control a serial port. + + The DTR line of the serial port is set or cleared. If "connect" is true, + then the line is set to enable the serial device. If "connect" is false, the + line is disabled to disconnect the device. If the line change was + successful, the function returns TRUE. +*/ + +t_bool sim_control_serial (SERHANDLE port, t_bool connect) +{ +if (!EscapeCommFunction (port, connect ? SETDTR : CLRDTR)) { + sim_error_serial ("EscapeCommFunction", (int) GetLastError ()); + return FALSE; + } + +return TRUE; +} + + +/* Read from a serial port. + + The port is checked for available characters. If any are present, they are + copied to the passed buffer, and the count of characters is returned. If no + characters are available, 0 is returned. If an error occurs, -1 is returned. + If a BREAK is detected on the communications line, the corresponding flag in + the "brk" array is set. + + Implementation notes: + + 1. The "ClearCommError" function will set the CE_BREAK flag in the returned + errors value if a BREAK has occurred. However, we do not know where in + the serial stream it happened, as CE_BREAK isn't associated with a + specific character. Because the "brk" array does want a flag associated + with a specific character, we guess at the proper location by setting + the "brk" entry corresponding to the first NUL in the character stream. + If no NUL is present, then the "brk" entry associated with the first + character is set. +*/ + +int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk) +{ +DWORD read; +DWORD commerrors; +COMSTAT cs; +char *bptr; + +if (!ClearCommError (port, &commerrors, &cs)) { /* get the comm error flags */ + sim_error_serial ("ClearCommError", /* function failed; report unexpected error */ + (int) GetLastError ()); + return -1; /* return failure to caller */ + } + +if (!ReadFile (port, (LPVOID) buffer, /* read any available characters */ + (DWORD) count, &read, NULL)) { + sim_error_serial ("ReadFile", /* function failed; report unexpected error */ + (int) GetLastError ()); + return -1; /* return failure to caller */ + } + +if (commerrors & CE_BREAK) { /* was a BREAK detected? */ + bptr = (char *) memchr (buffer, 0, read); /* search for the first NUL in the buffer */ + + if (bptr) /* was one found? */ + brk = brk + (bptr - buffer); /* calculate corresponding position */ + + *brk = 1; /* set the BREAK flag */ + } + +return read; /* return the number of characters read */ +} + + +/* Write to a serial port. + + "Count" characters are written from "buffer" to the serial port. The actual + number of characters written to the port is returned. If an error occurred + on writing, -1 is returned. +*/ + +int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count) +{ +DWORD written; + +if (!WriteFile (port, (LPVOID) buffer, /* write the buffer to the serial port */ + (DWORD) count, &written, NULL)) { + sim_error_serial ("WriteFile", /* function failed; report unexpected error */ + (int) GetLastError ()); + return -1; /* return failure to caller */ + } +else + return written; /* return number of characters written */ +} + + +/* Close a serial port. + + The serial port is closed. Errors are ignored. +*/ + +void sim_close_serial (SERHANDLE port) +{ +CloseHandle (port); /* close the port */ +return; +} + + + +/* UNIX implementation */ + + +#elif defined (__unix__) + + +/* Open a serial port. + + The serial port designated by "name" is opened, and the handle to the port is + returned. If an error occurs, INVALID_HANDLE is returned instead. After + opening, the port is configured to "raw" mode. + + Implementation notes: + + 1. We use a non-blocking open to allow for polling during reads. + + 2. There is no way to limit "open" just to serial ports, so we must check + after the port is opened. We do this with a combination of "isatty" and + "tcgetattr". + + 3. We configure with PARMRK set and IGNBRK and BRKINT cleared. This will + mark a communication line BREAK condition in the input stream with the + three-character sequence \377 \000 \000. This is detected during + reading. +*/ + +SERHANDLE sim_open_serial (char *name) +{ +static const tcflag_t i_clear = IGNBRK | /* ignore BREAK */ + BRKINT | /* signal on BREAK */ + INPCK | /* enable parity checking */ + ISTRIP | /* strip character to 7 bits */ + INLCR | /* map NL to CR */ + IGNCR | /* ignore CR */ + ICRNL | /* map CR to NL */ + IXON | /* enable XON/XOFF output control */ + IXOFF; /* enable XON/XOFF input control */ + +static const tcflag_t i_set = PARMRK | /* mark parity errors and line breaks */ + IGNPAR; /* ignore parity errors */ + +static const tcflag_t o_clear = OPOST; /* post-process output */ + +static const tcflag_t o_set = 0; + +static const tcflag_t c_clear = HUPCL; /* hang up line on last close */ + +static const tcflag_t c_set = CREAD | /* enable receiver */ + CLOCAL; /* ignore modem status lines */ + +static const tcflag_t l_clear = ISIG | /* enable signals */ + ICANON | /* canonical input */ + ECHO | /* echo characters */ + ECHOE | /* echo ERASE as an error correcting backspace */ + ECHOK | /* echo KILL */ + ECHONL | /* echo NL */ + NOFLSH | /* disable flush after interrupt */ + TOSTOP | /* send SIGTTOU for background output */ + IEXTEN; /* enable extended functions */ + +static const tcflag_t l_set = 0; + + +SERHANDLE port; +struct termios tio; + +port = open (name, O_RDWR | O_NOCTTY | O_NONBLOCK); /* open the port */ + +if (port == -1) { /* open failed? */ + if (errno != ENOENT && errno != EACCES) /* file not found or can't open? */ + sim_error_serial ("open", errno); /* no, so report unexpected error */ + + return INVALID_HANDLE; /* indicate failure to caller */ + } + +if (!isatty (port)) { /* is device a TTY? */ + close (port); /* no, so close it */ + return INVALID_HANDLE; /* and return failure to caller */ + } + +if (tcgetattr (port, &tio)) { /* get the terminal attributes */ + sim_error_serial ("tcgetattr", errno); /* function failed; report unexpected error */ + close (port); /* close the port */ + return INVALID_HANDLE; /* and return failure to caller */ + } + +// which of these methods is best? + +#if 1 + +tio.c_iflag = tio.c_iflag & ~i_clear | i_set; /* configure the serial line for raw mode */ +tio.c_oflag = tio.c_oflag & ~o_clear | o_set; +tio.c_cflag = tio.c_cflag & ~c_clear | c_set; +tio.c_lflag = tio.c_lflag & ~l_clear | l_set; + +#elif 0 + +tio.c_iflag &= ~(IGNBRK | BRKINT | INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF); +tio.c_iflag |= PARMRK | IGNPAR; +tio.c_oflag &= ~(OPOST); +tio.c_cflag &= ~(HUPCL); +tio.c_cflag |= CREAD | CLOCAL; +tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL | NOFLSH | TOSTOP | IEXTEN); + +#elif 0 + +tio.c_iflag = PARMRK | IGNPAR; +tio.c_oflag = 0; +tio.c_cflag = tio.c_cflag | CLOCAL | CREAD; +tio.c_lflag = 0; + +#endif + +if (tcsetattr (port, TCSANOW, &tio)) { /* set the terminal attributes */ + sim_error_serial ("tcsetattr", errno); /* function failed; report unexpected error */ + close (port); /* close the port */ + return INVALID_HANDLE; /* and return failure to caller */ + } + +return port; /* return port fd for success */ +} + + +/* Configure a serial port. + + Port parameters are configured as specified in the "config" structure. If + "config" contains an invalid configuration value, or if the host system + rejects the configuration (e.g., by requesting an unsupported combination of + character size and stop bits), SCPE_ARG is returned to the caller. If an + unexpected error occurs, SCPE_IOERR is returned. If the configuration + succeeds, SCPE_OK is returned. + + Implementation notes: + + 1. 1.5 stop bits is not a supported configuration. + +*/ + +t_stat sim_config_serial (SERHANDLE port, SERCONFIG config) +{ +struct termios tio; +int32 i; + +static const struct { + uint32 rate; + speed_t rate_code; + } baud_map [] = + { { 50, B50 }, { 75, B75 }, { 110, B110 }, { 134, B134 }, + { 150, B150 }, { 200, B200 }, { 300, B300 }, { 600, B600 }, + { 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 }, { 4800, B4800 }, + { 9600, B9600 }, { 19200, B19200 }, { 38400, B38400 }, { 57600, B57600 }, + { 115200, B115200 } }; + +static const int32 baud_count = sizeof (baud_map) / sizeof (baud_map [0]); + +static const tcflag_t charsize_map [4] = { CS5, CS6, CS7, CS8 }; + + +if (tcgetattr (port, &tio)) { /* get the current configuration */ + sim_error_serial ("tcgetattr", errno); /* function failed; report unexpected error */ + return SCPE_IOERR; /* return failure status */ + } + +for (i = 0; i < baud_count; i++) /* assign baud rate */ + if (config.baudrate == baud_map [i].rate) { /* match mapping value? */ + cfsetispeed(&tio, baud_map [i].rate_code); /* set input rate */ + cfsetospeed(&tio, baud_map [i].rate_code); /* set output rate */ + break; + } + +if (i == baud_count) /* baud rate assigned? */ + return SCPE_ARG; /* invalid rate specified */ + +if (config.charsize >= 5 && config.charsize <= 8) /* character size OK? */ + tio.c_cflag = tio.c_cflag & ~CSIZE | /* replace character size code */ + charsize_map [config.charsize - 5]; +else + return SCPE_ARG; /* not a valid size */ + +switch (config.parity) { /* assign parity */ + case 'E': + tio.c_cflag = tio.c_cflag & ~PARODD | PARENB; /* set for even parity */ + break; + + case 'N': + tio.c_cflag = tio.c_cflag & ~PARENB; /* set for no parity */ + break; + + case 'O': + tio.c_cflag = tio.c_cflag | PARODD | PARENB; /* set for odd parity */ + break; + + default: + return SCPE_ARG; /* not a valid parity specifier */ + } + +if (config.stopbits == 1) /* one stop bit? */ + tio.c_cflag = tio.c_cflag & ~CSTOPB; /* clear two-bits flag */ +else if (config.stopbits == 2) /* two stop bits? */ + tio.c_cflag = tio.c_cflag | CSTOPB; /* set two-bits flag */ +else /* some other number? */ + return SCPE_ARG; /* not a valid number of stop bits */ + +if (tcsetattr (port, TCSAFLUSH, &tio)) { /* set the new configuration */ + sim_error_serial ("tcsetattr", errno); /* function failed; report unexpected error */ + return SCPE_IERR; /* return failure status */ + } + +return SCPE_OK; /* configuration set successfully */ +} + + +/* Control a serial port. + + The DTR line of the serial port is set or cleared. If "connect" is true, + then the line is set to enable the serial device. If "connect" is false, the + line is disabled to disconnect the device. If the line change was + successful, the function returns TRUE. +*/ + +t_bool sim_control_serial (SERHANDLE port, t_bool connect) +{ +int request; +static const int dtr = TIOCM_DTR; + +if (connect) /* request for DTR set? */ + request = TIOCMBIS; /* use "set" control request */ +else /* DTR clear */ + request = TIOCMBIC; /* use "clear" control request */ + +if (ioctl (port, request, &dtr)) { /* set or clear the DTR line */ + if (errno != EINVAL) /* DTR control not supported? */ + sim_error_serial ("ioctl", errno); /* no, so report unexpected error */ + + return FALSE; /* return failure status */ + } + +return TRUE; /* control request succeeded */ +} + + +/* Read from a serial port. + + The port is checked for available characters. If any are present, they are + copied to the passed buffer, and the count of characters is returned. If no + characters are available, 0 is returned. If an error occurs, -1 is returned. + If a BREAK is detected on the communications line, the corresponding flag in + the "brk" array is set. + + Implementation notes: + + 1. A character with a framing or parity error is indicated in the input + stream by the three-character sequence \377 \000 \ccc, where "ccc" is the + bad character. A communications line BREAK is indicated by the sequence + \377 \000 \000. A received \377 character is indicated by the + two-character sequence \377 \377. If we find any of these sequences, + they are replaced by the single intended character by sliding the + succeeding characters backward by one or two positions. If a BREAK + sequence was encountered, the corresponding location in the "brk" array + is determined, and the flag is set. Note that there may be multiple + sequences in the buffer. +*/ + +int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk) +{ +int read_count; +char *bptr, *cptr; +int32 remaining; + +read_count = read (port, (void *) buffer, (size_t) count); /* read from the serial port */ + +if (read_count == -1) /* read error? */ + if (errno == EAGAIN) /* no characters available? */ + return 0; /* return 0 to indicate */ + else /* some other problem */ + sim_error_serial ("read", errno); /* report unexpected error */ + +else { /* read succeeded */ + cptr = buffer; /* point at start of buffer */ + remaining = read_count - 1; /* stop search one char from end of string */ + + while (remaining > 0 && /* still characters to search? */ + (bptr = memchr (cptr, '\377', remaining))) { /* search for start of PARMRK sequence */ + remaining = remaining - (bptr - cptr) - 1; /* calc characters remaining */ + + if (*(bptr + 1) == '\377') { /* is it a \377 \377 sequence? */ + memmove (bptr + 1, bptr + 2, remaining); /* slide string backward to leave first \377 */ + remaining = remaining - 1; /* drop remaining count */ + read_count = read_count - 1; /* and read count by char eliminated */ + } + + else if (remaining > 0 && *(bptr + 1) == '\0') { /* is it a \377 \000 \ccc sequence? */ + memmove (bptr, bptr + 2, remaining); /* slide string backward to leave \ccc */ + remaining = remaining - 2; /* drop remaining count */ + read_count = read_count - 2; /* and read count by chars eliminated */ + + if (*bptr == '\0') /* is it a BREAK sequence? */ + *(brk + (bptr - buffer)) = 1; /* set corresponding BREAK flag */ + } + + cptr = bptr + 1; /* point at remainder of string */ + } + } + +return (int32) read_count; /* return the number of characters read */ +} + + +/* Write to a serial port. + + "Count" characters are written from "buffer" to the serial port. The actual + number of characters written to the port is returned. If an error occurred + on writing, -1 is returned. +*/ + +int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count) +{ +int written; + +written = write (port, (void *) buffer, (size_t) count); /* write the buffer to the serial port */ + +if (written == -1) /* write error? */ + sim_error_serial ("write", errno); /* report unexpected error */ + +return (int32) written; /* return number of characters written */ +} + + +/* Close a serial port. + + The serial port is closed. Errors are ignored. +*/ + +void sim_close_serial (SERHANDLE port) +{ +close (port); /* close the port */ +return; +} + + + +/* Non-implemented stubs */ + +#else + + +/* Open a serial port */ + +SERHANDLE sim_open_serial (char *name) +{ +return INVALID_HANDLE; +} + + +/* Configure a serial port */ + +t_stat sim_config_serial (SERHANDLE port, SERCONFIG config) +{ +return SCPE_IERR; +} + + +/* Control a serial port */ + +t_bool sim_control_serial (SERHANDLE port, t_bool connect) +{ +return FALSE; +} + + +/* Read from a serial port */ + +int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk) +{ +return -1; +} + + +/* Write to a serial port */ + +int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count) +{ +return -1; +} + + +/* Close a serial port */ + +void sim_close_serial (SERHANDLE port) +{ +return; +} + + + +#endif /* end else !implemented */ diff --git a/sim_serial.h b/sim_serial.h new file mode 100644 index 00000000..64ffdeb1 --- /dev/null +++ b/sim_serial.h @@ -0,0 +1,99 @@ +/* sim_serial.h: OS-dependent serial port routines header file + + Copyright (c) 2008, J. David Bryan + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the author shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from the author. + + 07-Oct-08 JDB [serial] Created file +*/ + + +#ifndef _SIM_SERIAL_H_ +#define _SIM_SERIAL_H_ 0 + + +/* Windows definitions */ + +#if defined (_WIN32) + + +/* We need the basic Win32 definitions, but including "windows.h" also includes + "winsock.h" as well. However, "sim_sock.h" explicitly includes "winsock2.h," + and this file cannot coexist with "winsock.h". So we set a guard definition + that prevents "winsock.h" from being included. +*/ + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include + +typedef HANDLE SERHANDLE; + +#define INVALID_HANDLE INVALID_HANDLE_VALUE + + +/* UNIX definitions */ + +#elif defined (__unix__) + + +#include +#include +#include +#include + +typedef int SERHANDLE; + +#define INVALID_HANDLE -1 + + +/* Non-implemented definitions */ + +#else + +typedef int SERHANDLE; + +#endif + + +/* Common definitions */ + +typedef struct serial_config { /* serial port configuration */ + uint32 baudrate; /* baud rate */ + uint32 charsize; /* character size in bits */ + char parity; /* parity (N/O/E/M/S) */ + uint32 stopbits; /* 0/1/2 stop bits (0 implies 1.5) */ + } SERCONFIG; + + +/* Global routines */ + +extern SERHANDLE sim_open_serial (char *name); +extern t_stat sim_config_serial (SERHANDLE port, SERCONFIG config); +extern t_bool sim_control_serial (SERHANDLE port, t_bool connect); +extern int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk); +extern int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count); +extern void sim_close_serial (SERHANDLE port); + +#endif diff --git a/sim_tmxr.c b/sim_tmxr.c index 4cb866de..3d9c0ddf 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -31,6 +31,9 @@ 17-Jan-11 MP Added Buffered line capabilities 16-Jan-11 MP Made option negotiation more reliable 20-Nov-08 RMS Added three new standardized SHOW routines + 05-Nov-08 JDB [bugfix] Moved logging call after connection check in tmxr_putc_ln + 03-Nov-08 JDB [bugfix] Added TMXR null check to tmxr_find_ldsc + 07-Oct-08 JDB [serial] Added serial port support 30-Sep-08 JDB Reverted tmxr_find_ldsc to original implementation 27-May-08 JDB Added line connection order to tmxr_poll_conn, added tmxr_set_lnorder and tmxr_show_lnorder @@ -57,36 +60,235 @@ This library includes: - tmxr_poll_conn - poll for connection - tmxr_reset_ln - reset line - tmxr_getc_ln - get character for line - tmxr_poll_rx - poll receive - tmxr_putc_ln - put character for line - tmxr_poll_tx - poll transmit - tmxr_open_master - open master connection - tmxr_close_master - close master connection - tmxr_attach - attach terminal multiplexor - tmxr_detach - detach terminal multiplexor - tmxr_ex - (null) examine - tmxr_dep - (null) deposit - tmxr_msg - send message to socket - tmxr_linemsg - send message to line - tmxr_fconns - output connection status - tmxr_fstats - output connection statistics - tmxr_dscln - disconnect line (SET routine) - tmxr_rqln - number of available characters for line - tmxr_tqln - number of buffered characters for line - tmxr_set_lnorder - set line connection order - tmxr_show_lnorder - show line connection order + tmxr_poll_conn - poll for connection + tmxr_reset_ln - reset line (drops Telnet connections only) + tmxr_clear_ln - clear line (drops Telnet and serial connections) + tmxr_getc_ln - get character for line + tmxr_poll_rx - poll receive + tmxr_putc_ln - put character for line + tmxr_poll_tx - poll transmit + tmxr_send_buffered_data - transmit buffered data + tmxr_open_master - open master connection + tmxr_close_master - close master connection + tmxr_attach - attach terminal multiplexor to listening port + tmxr_attach_line - attach line to serial port + tmxr_detach - detach terminal multiplexor to listening port + tmxr_detach_line - detach line from serial port + tmxr_line_free - return TRUE if line is disconnected + tmxr_mux_free - return TRUE if mux is disconnected + tmxr_ex - (null) examine + tmxr_dep - (null) deposit + tmxr_msg - send message to socket + tmxr_linemsg - send message to line + tmxr_fconns - output connection status + tmxr_fstats - output connection statistics + tmxr_set_log - enable logging for line + tmxr_set_nolog - disable logging for line + tmxr_show_log - show logging status for line + tmxr_dscln - disconnect line (SET routine) + tmxr_rqln - number of available characters for line + tmxr_tqln - number of buffered characters for line + tmxr_set_lnorder - set line connection order + tmxr_show_lnorder - show line connection order + tmxr_show_summ - show connection summary + tmxr_show_cstat - show line connections or status + tmxr_show_lines - show number of lines All routines are OS-independent. + + + This library supports the simulation of multiple-line terminal multiplexers. + It may also be used to create single-line "multiplexers" to provide + additional terminals beyond the simulation console. Multiplexer lines may be + connected to terminal emulators supporting the Telnet protocol via sockets, + or to hardware terminals via host serial ports. Concurrent Telnet and serial + connections may be mixed on a given multiplexer. + + When connecting via sockets, the simulated multiplexer is attached to a + listening port on the host system: + + sim> attach MUX 23 + Listening on port 23 (socket nnn) + + Once attached, the listening port must be polled for incoming connections. + When a connection attempt is received, it will be associated with the next + multiplexer line in the user-specified line order, or with the next line in + sequence if no order has been specified. Individual lines may be forcibly + disconnected either by: + + sim> set MUX2 disconnect + + or: + + sim> set MUX disconnect=2 + + or the listening port and all Telnet sessions may be detached: + + sim> detach MUX + + + When connecting via serial ports, individual multiplexer lines are attached + to specific host ports using port names appropriate for the host system: + + sim> attach MUX2 com1 (or /dev/ttyS0) + + or: + + sim> set MUX connect=2:com1 + + Serial port parameters may be optionally specified: + + sim> attach MUX2 com1;9600-8n1 + + If the port parameters are omitted, then the host system defaults for the + specified port are used. The port is allocated during the attach call, but + the actual connection is deferred until the multiplexer is polled for + connections. + + Individual lines may be disconnected either with: + + sim> detach MUX2 + + or: + + sim> set MUX2 disconnect + + or: + + sim> set MUX disconnect=2 + + + This library supports multiplexer device simulators that are modelled in + three possible ways: + + 1. as single-line devices (e.g., a second TTY) + + 2. as multi-line devices with a unit per line and a separate scanner unit + + 3. as multi-line devices with only a scanner unit + + Single-line devices may be attached either to a Telnet listening port or to a + serial port. The device attach routine may be passed either a port number or + a serial port name. This routine should call "tmxr_attach" first. If the + return value is SCPE_OK, then a port number was passed and was opened. If + the return value is SCPE_ARG, then a port number was not passed, and + "tmxr_attach_line" should be called. If that return value is SCPE_OK, then a + serial port name was passed and was opened. Otherwise, the attachment + failed, and the returned status code value should be reported. + + The device detach routine should call "tmxr_detach_line" first, passing 0 for + the "val" parameter. If the return value is SCPE_OK, then the attached + serial port was closed. If the return value is SCPE_UNATT, then a serial + port was not attached, and "tmxr_detach" should be called to close the Telnet + listening port. To maintain compatibility with earlier versions of this + library, "tmxr_detach" always returns SCPE_OK, regardless of whether a + listening port was attached. + + The system ATTACH and DETACH commands specify the device name, although unit + 0 is actually passed to the device attach and detach routines. The in-use + status of the multiplexer -- and therefore whether the multiplexer must be + polled for input -- may be determined by checking whether the UNIT_ATT flag + is present on unit 0. + + + Multi-line devices with a unit per line and a separate scanner unit attach + serial ports to the former and a Telnet listening port to the latter. Both + types of attachments may be made concurrently. The system ATTACH and DETACH + commands are used. + + The programmer may elect to use separate device attach routines for the lines + and the scanner or a common attach routine for both. In the latter case, if + the scanner unit is passed, "tmxr_attach" should be called. Otherwise, + "tmxr_attach_line" should be called, passing 0 as the "val" parameter. + + Similarly, either separate or common detach routines may be used. When a + line detach is intended, the detach routine should call "tmxr_detach_line" + for the specified unit. Reception on the specified line should then be + inhibited by clearing the "rcve" field. Finally, "tmxr_mux_free" should be + called to determine if the multiplexer is now free (listening port is + detached and no other serial connections exist). If it is, then the input + poll may be stopped. + + To detach the scanner, the detach routine should call "tmxr_detach". Then + "tmxr_line_free" should be called for each line, and reception on the line + should be inhibited if the routine returns TRUE. Finally, the multiplexer + poll should be stopped if the multiplexer is now free. + + The in-use status of the multiplexer cannot be determined solely by examining + the UNIT_ATT flag of the scanner unit, as that reflects only Telnet + connections. Each line must also be checked for serial connections. The + "tmxr_line_free" and "tmxr_mux_free" routines indicate respectively whether a + given line or the entire multiplexer is free. + + + Multi-line devices with only a scanner unit use the system ATTACH and DETACH + commands for the Telnet listening port. For serial ports, SET CONNECT + and SET DISCONNECT commands are used. These latter commands are + specified in the device MTAB structure and call "tmxr_attach_line" and + "tmxr_detach_line", respectively. Because MTAB processing passes the scanner + unit to these routines, the invocations pass a non-zero "val" parameter to + indicate that the unit should not be used, and that the line number should be + parsed from the command string. In this mode, "tmxr_detach_line" also serves + to disconnect Telnet sessions from lines, so no special processing or calls + to "tmxr_dscln" are required. + + In-use status of the multiplexer is determined in the same manner as the + unit-per-line case. + + + Implementation notes: + + 1. The system RESTORE command does not restore devices having the DEV_NET + flag. This flag indicates that the device employs host-specific port + names that are non-transportable across RESTOREs. + + If a multiplexer specifies DEV_NET, the device connection state will not + be altered when a RESTORE is done. That is, all current connections, + including Telnet sessions, will remain untouched, and connections + specified at the time of the SAVE will not be reestablished during the + RESTORE. If DEV_NET is not specified, then the system will attempt to + restore the attachment state present at the time of the SAVE, including + Telnet listening and serial ports. Telnet client sessions on individual + multiplexer lines cannot be reestablished by RESTORE and must be + reestablished manually. + + 2. Single-line multiplexers should have UNIT_ATTABLE on the unit + representing the line, and multi-line unit-per-line multiplexers should + not have UNIT_ATTABLE on the units representing the lines. UNIT_ATTABLE + does not affect the attachability when VM-specific attach routines are + employed. UNIT_ATTABLE does control the reporting of attached units for + the SHOW command. + + A single-line device will be either detached, attached to a listening + socket, or attached to a serial port. With UNIT_ATTABLE, the device will + be reported as "not attached," "attached to 23" (e.g.), or "attached to + COM1" (e.g.), which is desirable. + + A unit-per-line device will report the listening socket as attached to + the device (or to a separate device). The units representing lines + either will be connected to a Telnet session or attached to a serial + port. Telnet sessions are not reported by SHOW , so having + UNIT_ATTABLE present will cause each non-serial line to be reported as + "not attached," even if there may be a current Telnet connection. This + will be confusing to users. Without UNIT_ATTABLE, attachment status will + be reported only if the line is attached to a serial port, which is + preferable. + + 3. For devices without a unit per line, the MTAB entry that calls + "sim_attach_line" (e.g., CONNECT) should use the MTAB_NC flag to avoid + upper-casing the device name. Device names may be case-sensitive, + depending on the host system. */ + +#include + #include "sim_defs.h" +#include "sim_serial.h" #include "sim_sock.h" +#include "sim_timer.h" #include "sim_tmxr.h" #include "scp.h" -#include /* Telnet protocol constants - negatives are for init'ing signed char data */ @@ -129,14 +331,276 @@ #define TNS_DO 006 /* DO request pending rejection */ -void tmxr_rmvrc (TMLN *lp, int32 p); -int32 tmxr_send_buffered_data (TMLN *lp); -TMLN *tmxr_find_ldsc (UNIT *uptr, int32 val, TMXR *mp); + +/* External variables */ extern int32 sim_switches; extern char sim_name[]; extern FILE *sim_log; -extern uint32 sim_os_msec (void); + + + +/* Local routines */ + + +/* Initialize the line state. + + Reset the line state to represent an idle line. Note that we do not clear + all of the line structure members, so a connected line remains connected + after this call. + + Because a line break is represented by a flag in the "receive break status" + array, we must zero that array in order to clear any pending break + indications. +*/ + +static void tmxr_init_line (TMLN *lp) +{ +lp->tsta = 0; /* init telnet state */ +lp->xmte = 1; /* enable transmit */ +lp->dstb = 0; /* default bin mode */ +lp->rxbpr = lp->rxbpi = lp->rxcnt = 0; /* init receive indexes */ +if (!lp->txbfd) /* if not buffered */ + lp->txbpr = lp->txbpi = lp->txcnt = 0; /* init transmit indexes */ +memset (lp->rbr, 0, TMXR_MAXBUF); /* clear break status array */ +lp->txdrp = 0; +if (!lp->mp->buffered) { + lp->txbfd = 0; + lp->txbsz = TMXR_MAXBUF; + lp->txb = (char *)realloc(lp->txb, lp->txbsz); + } +return; +} + + +/* Report a connection to a line. + + A notification of the form: + + Connected to the simulator device, line + + is sent to the newly connected line. If the device has only one line, the + "line " part is omitted. If the device has not been defined, the " + device" part is omitted. +*/ + +static void tmxr_report_connection (TMXR *mp, TMLN *lp, int32 i) +{ +int32 written, psave; +char line [20]; +char cmsg[80]; +char dmsg[80] = ""; +char lmsg[80] = ""; +char msgbuf[256]; + +sprintf (cmsg, "\n\r\nConnected to the %s simulator ", sim_name); + +if (mp->dptr) { /* device defined? */ + sprintf (dmsg, "%s device", /* report device name */ + sim_dname (mp->dptr)); + + if (mp->lines > 1) /* more than one line? */ + sprintf (lmsg, ", line %d", i); /* report the line number */ + } + +sprintf (msgbuf, "%s%s%s\r\n\n", cmsg, dmsg, lmsg); + +if (!mp->buffered) { + lp->txbpi = 0; /* init buf pointers */ + lp->txbpr = (int32)(lp->txbsz - strlen (msgbuf)); + lp->rxcnt = lp->txcnt = lp->txdrp = 0; /* init counters */ + } +else + if (lp->txcnt > lp->txbsz) + lp->txbpr = (lp->txbpi + 1) % lp->txbsz; + else + lp->txbpr = (int32)(lp->txbsz - strlen (msgbuf)); + +psave = lp->txbpi; /* save insertion pointer */ +lp->txbpi = lp->txbpr; /* insert connection message */ +tmxr_linemsg (lp, msgbuf); /* beginning of buffer */ +lp->txbpi = psave; /* restore insertion pointer */ + +written = tmxr_send_buffered_data (lp); /* send the message */ + +if (written == 0) /* buffer now empty? */ + lp->xmte = 1; /* reenable transmission if paused */ + +lp->txcnt -= (int32)strlen (msgbuf); /* adjust statistics */ +return; +} + + +/* Report a disconnection to a line. + + A notification of the form: + + Disconnected from the simulator + + is sent to the line about to be disconnected. We do not flush the buffer + here, because the disconnect routines will do that just after calling us. +*/ + +static void tmxr_report_disconnection (TMLN *lp) +{ +tmxr_linemsg (lp, "\r\nDisconnected from the "); /* report disconnection */ +tmxr_linemsg (lp, sim_name); +tmxr_linemsg (lp, " simulator\r\n\n"); +return; +} + + +/* Read from a line. + + Up to "length" characters are read into the character buffer associated with + line "lp". The actual number of characters read is returned. If no + characters are available, 0 is returned. If an error occurred while reading, + -1 is returned. + + If a line break was detected on serial input, the associated receive break + status flag will be set. Line break indication for Telnet connections is + embedded in the Telnet protocol and must be determined externally. +*/ + +static int32 tmxr_read (TMLN *lp, int32 length) +{ +int32 i = lp->rxbpi; + +if (lp->serport) /* serial port connection? */ + return sim_read_serial (lp->serport, &(lp->rxb[i]), length, &(lp->rbr[i])); +else /* Telnet connection */ + return sim_read_sock (lp->conn, &(lp->rxb[i]), length); +} + + +/* Write to a line. + + Up to "length" characters are written from the character buffer associated + with "lp". The actual number of characters written is returned. If an error + occurred while writing, -1 is returned. +*/ + +static int32 tmxr_write (TMLN *lp, int32 length) +{ +int32 written; +int32 i = lp->txbpr; + +if (lp->serport) /* serial port connection? */ + return sim_write_serial (lp->serport, &(lp->txb[i]), length); + +else { /* Telnet connection */ + written = sim_write_sock (lp->conn, &(lp->txb[i]), length); + + if (written == SOCKET_ERROR) /* did an error occur? */ + return -1; /* return error indication */ + else + return written; + } +} + + +/* Remove a character from the read buffer. + + The character at position "p" in the read buffer associated with line "lp" is + removed by moving all of the following received characters down one position. + The receive break status array is adjusted accordingly. +*/ + +static void tmxr_rmvrc (TMLN *lp, int32 p) +{ +for ( ; p < lp->rxbpi; p++) { /* work from "p" through end of buffer */ + lp->rxb[p] = lp->rxb[p + 1]; /* slide following character down */ + lp->rbr[p] = lp->rbr[p + 1]; /* adjust break status too */ + } + +lp->rbr[p] = 0; /* clear potential break from vacated slot */ +lp->rxbpi = lp->rxbpi - 1; /* drop buffer insert index */ +return; +} + + +/* Find a line descriptor indicated by unit or number. + + If "uptr" is NULL, then the line descriptor is determined by the line number + passed in "val". If "uptr" is not NULL, then it must point to a unit + associated with a line, and the line descriptor is determined by the unit + number, which is derived by the position of the unit in the device's unit + array. + + Note: This routine may be called with a UNIT that does not belong to the + device indicated in the TMXR structure. That is, the multiplexer lines may + belong to a device other than the one attached to the socket (the HP 2100 MUX + device is one example). Therefore, we must look up the device from the unit + at each call, rather than depending on the DEVICE pointer stored in the TMXR. +*/ + +static TMLN *tmxr_find_ldsc (UNIT *uptr, int32 val, TMXR *mp) +{ +if (mp == NULL) /* invalid multiplexer descriptor? */ + return NULL; /* programming error! */ + +if (uptr) { /* called from SET? */ + DEVICE *dptr = find_dev_from_unit (uptr); /* find device */ + if (dptr == NULL) return NULL; /* what?? */ + val = (int32) (uptr - dptr->units); /* implicit line # */ + } +if ((val < 0) || (val >= mp->lines)) return NULL; /* invalid line? */ +return mp->ldsc + val; /* line descriptor */ +} + + +/* Get a line descriptor indicated by a string or unit. + + A pointer to the line descriptor associated with multiplexer "mp" and unit + "uptr" or specified by string "cptr" is returned. If "uptr" is non-null, + then the unit number within its associated device implies the line number. + If "uptr" is null, then the string "cptr" is parsed for a decimal line + number. If the line number is missing, malformed, or outside of the range of + line numbers associated with "mp", then NULL is returned with status set to + SCPE_ARG. + + Implementation note: + + 1. A return status of SCPE_IERR implies a programming error (passing an + invalid pointer or an invalid unit). +*/ + +static TMLN *tmxr_get_ldsc (UNIT *uptr, char *cptr, TMXR *mp, t_stat *status) +{ +t_value ln; +TMLN *lp = NULL; +t_stat code = SCPE_OK; + +if (mp == NULL) /* missing mux descriptor? */ + code = SCPE_IERR; /* programming error! */ + +else if (uptr) { /* implied line form? */ + lp = tmxr_find_ldsc (uptr, mp->lines, mp); /* determine line from unit */ + + if (lp == NULL) /* invalid line number? */ + code = SCPE_IERR; /* programming error! */ + } + +else if (cptr == NULL) /* named line form, parameter supplied? */ + code = SCPE_ARG; /* no, so report missing */ + +else { + ln = get_uint (cptr, 10, mp->lines - 1, &code); /* get line number */ + + if (code == SCPE_OK) /* line number OK? */ + lp = mp->ldsc + (int32) ln; /* use as index to determine line */ + } + +if (status) /* return value pointer supplied? */ + *status = code; /* store return status value */ + +return lp; /* return pointer to line descriptor */ +} + + + +/* Global routines */ + /* Poll for new connection @@ -150,6 +614,19 @@ extern uint32 sim_os_msec (void); If a connection order is defined for the descriptor, and the first value is not -1 (indicating default order), then the order array is used to find an open line. Otherwise, a search is made of all lines in numerical sequence. + + Implementation notes: + + 1. When a serial port is attached to a line, the connection is made pending + until we are called to poll for new connections. This is because + multiplexer service routines recognize new connections only as a result + of calls to this routine. + + 2. A pending serial (re)connection may also be deferred. This is needed + when a line clear drops DTR, as DTR must remain low for a period of time + in order to be recognized by the serial device. If the "cnms" value + specifies a time in the future, the connection is deferred until that + time is reached. This leaves DTR low for the necessary time. */ int32 tmxr_poll_conn (TMXR *mp) @@ -157,12 +634,9 @@ int32 tmxr_poll_conn (TMXR *mp) SOCKET newsock; TMLN *lp; int32 *op; -int32 i, j, psave; -uint32 ipaddr; -char cmsg[80]; -char dmsg[80] = ""; -char lmsg[80] = ""; -char msgbuf[256]; +int32 i, j; +uint32 ipaddr, current_time; +t_bool deferrals; static char mantra[] = { TN_IAC, TN_WILL, TN_LINE, TN_IAC, TN_WILL, TN_SGA, @@ -171,7 +645,38 @@ static char mantra[] = { TN_IAC, TN_DO, TN_BIN }; +/* Check for a pending serial connection */ + +if (mp->pending) { /* is there a pending serial connection? */ + current_time = sim_os_msec (); /* get the current time */ + deferrals = FALSE; /* assume no deferrals */ + + for (i = 0; i < mp->lines; i++) { /* check each line in sequence */ + lp = mp->ldsc + i; /* get pointer to line descriptor */ + + if ((lp->serport != 0) && (lp->conn == 0)) /* have handle but no connection? */ + if (current_time < lp->cnms) /* time to connect hasn't arrived? */ + deferrals = TRUE; /* note the deferral */ + + else { /* line is ready to connect */ + tmxr_init_line (lp); /* init the line state */ + sim_control_serial (lp->serport, TRUE); /* connect line by raising DTR */ + lp->conn = 1; /* mark as connected */ + lp->cnms = current_time; /* record time of connection */ + tmxr_report_connection (mp, lp, i); /* report the connection to the line */ + mp->pending = mp->pending - 1; /* drop the pending count */ + return i; /* return the line number */ + } + } + + if (deferrals == FALSE) /* any deferred connections? */ + mp->pending = 0; /* no, and none pending, so correct count */ + } + +/* Check for a pending Telnet connection */ + newsock = sim_accept_conn (mp->master, &ipaddr); /* poll connect */ + if (newsock != INVALID_SOCKET) { /* got a live one? */ op = mp->lnorder; /* get line connection order list pointer */ i = mp->lines; /* play it safe in case lines == 0 */ @@ -193,71 +698,87 @@ if (newsock != INVALID_SOCKET) { /* got a live one? */ } else { lp = mp->ldsc + i; /* get line desc */ + tmxr_init_line (lp); /* init line */ lp->conn = newsock; /* record connection */ lp->ipad = ipaddr; /* ip address */ - lp->mp = mp; /* save mux */ sim_write_sock (newsock, mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", mantra, sizeof(mantra)); - sprintf (cmsg, "\n\r\nConnected to the %s simulator ", sim_name); - - if (mp->dptr) { /* device defined? */ - sprintf (dmsg, "%s device", /* report device name */ - sim_dname (mp->dptr)); - - if (mp->lines > 1) /* more than one line? */ - sprintf (lmsg, ", line %d", i); /* report the line number */ - } - - sprintf (msgbuf, "%s%s%s\r\n\n", cmsg, dmsg, lmsg); + tmxr_report_connection (mp, lp, i); lp->cnms = sim_os_msec (); /* time of conn */ - if (!mp->buffered) { - lp->txbpi = 0; /* init buf pointers */ - lp->txbpr = (int32)(lp->txbsz - strlen (msgbuf)); - lp->rxcnt = lp->txcnt = lp->txdrp = 0; /* init counters */ - } - else - if (lp->txcnt > lp->txbsz) - lp->txbpr = (lp->txbpi + 1) % lp->txbsz; - else - lp->txbpr = (int32)(lp->txbsz - strlen (msgbuf)); - lp->tsta = 0; /* init telnet state */ - lp->xmte = 1; /* enable transmit */ - lp->dstb = 0; /* default bin mode */ - psave = lp->txbpi; /* save insertion pointer */ - lp->txbpi = lp->txbpr; /* insert connection message */ - tmxr_linemsg (lp, msgbuf); /* beginning of buffer */ - lp->txbpi = psave; /* restore insertion pointer */ - tmxr_poll_tx (mp); /* flush output */ - lp->txcnt -= (int32)strlen (msgbuf); /* adjust statistics */ return i; } } /* end if newsock */ -return -1; +return -1; /* no new connections made */ } -/* Reset line */ +/* Reset a line. + + A Telnet session associated with line descriptor "lp" is disconnected, and + the socket is deallocated. If the line has a serial connection instead, then + no action is taken. + + This routine is provided for backward compatibility. Use "tmxr_clear_ln" in + new code to disconnect both Telnet and serial connections. +*/ void tmxr_reset_ln (TMLN *lp) { if (lp->txlog) /* dump log */ fflush (lp->txlog); tmxr_send_buffered_data (lp); /* send buffered data */ -sim_close_sock (lp->conn, 0); /* reset conn */ -lp->conn = lp->tsta = 0; /* reset state */ -lp->rxbpr = lp->rxbpi = 0; -if (!lp->txbfd) - lp->txbpr = lp->txbpi = 0; -lp->xmte = 1; -lp->dstb = 0; + +if (!lp->serport) { /* Telnet connection? */ + sim_close_sock (lp->conn, 0); /* close socket */ + tmxr_init_line (lp); /* initialize line state */ + lp->conn = 0; /* remove socket */ + } return; } +/* Clear a line connection. + + The Telnet or serial session associated with multiplexer descriptor "mp" and + line descriptor "lp" is disconnected. An associated Telnet socket is + deallocated; a serial port is not, although DTR is dropped to disconnect the + attached serial device. Serial lines will be scheduled for reconnection + after a short delay for DTR recognition. +*/ + +t_stat tmxr_clear_ln (TMXR *mp, TMLN *lp) +{ +if ((mp == NULL) || (lp == NULL)) /* no multiplexer or line descriptors? */ + return SCPE_IERR; /* programming error! */ + +if (lp->txlog) /* logging? */ + fflush (lp->txlog); /* flush log */ + +tmxr_send_buffered_data (lp); /* send any buffered data */ + +if (lp->serport) { /* serial connection? */ + sim_control_serial (lp->serport, FALSE); /* disconnect line by dropping DTR */ + lp->cnms = sim_os_msec () + 500; /* reconnect 500 msec from now */ + mp->pending = mp->pending + 1; /* mark line reconnection as pending */ + } +else /* Telnet connection */ + sim_close_sock (lp->conn, 0); /* close socket */ + +tmxr_init_line (lp); /* initialize line state */ +lp->conn = 0; /* remove socket or connection flag */ +return SCPE_OK; +} + /* Get character from specific line Inputs: *lp = pointer to terminal line descriptor Output: valid + char, 0 if line + + Implementation note: + + 1. If a line break was detected coincident with the current character, the + receive break status associated with the character is cleared, and + SCPE_BREAK is ORed into the return value. */ int32 tmxr_getc_ln (TMLN *lp) @@ -270,8 +791,10 @@ if (lp->conn && lp->rcve) { /* conn & enb? */ if (j) { /* any? */ tmp = lp->rxb[lp->rxbpr]; /* get char */ val = TMXR_VALID | (tmp & 0377); /* valid + chr */ - if (lp->rbr[lp->rxbpr]) /* break? */ - val = val | SCPE_BREAK; + if (lp->rbr[lp->rxbpr]) { /* break? */ + lp->rbr[lp->rxbpr] = 0; /* clear status */ + val = val | SCPE_BREAK; /* indicate to caller */ + } lp->rxbpr = lp->rxbpr + 1; /* adv pointer */ } } /* end if conn */ @@ -280,6 +803,7 @@ if (lp->rxbpi == lp->rxbpr) /* empty? zero ptrs */ return val; } + /* Poll for input Inputs: @@ -299,24 +823,26 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ nbytes = 0; if (lp->rxbpi == 0) /* need input? */ - nbytes = sim_read_sock (lp->conn, /* yes, read */ - &(lp->rxb[lp->rxbpi]), /* leave spc for */ - TMXR_MAXBUF - TMXR_GUARD); /* Telnet cruft */ + nbytes = tmxr_read (lp, /* yes, read */ + TMXR_MAXBUF - TMXR_GUARD); /* leave spc for Telnet cruft */ else if (lp->tsta) /* in Telnet seq? */ - nbytes = sim_read_sock (lp->conn, /* yes, read to end */ - &(lp->rxb[lp->rxbpi]), + nbytes = tmxr_read (lp, /* yes, read to end */ TMXR_MAXBUF - lp->rxbpi); - if (nbytes < 0) /* closed? reset ln */ - tmxr_reset_ln (lp); + + if (nbytes < 0) /* line error? */ + tmxr_clear_ln (mp, lp); /* disconnect line */ + else if (nbytes > 0) { /* if data rcvd */ tmxr_debug (TMXR_DBG_RCV, lp, "Received", &(lp->rxb[lp->rxbpi]), nbytes); j = lp->rxbpi; /* start of data */ - memset (&lp->rbr[j], 0, nbytes); /* clear status */ lp->rxbpi = lp->rxbpi + nbytes; /* adv pointers */ lp->rxcnt = lp->rxcnt + nbytes; + if (lp->serport) /* is this a serial reception? */ + continue; /* yes, so no further processing needed */ + /* Examine new data, remove TELNET cruft before making input available */ for (; j < lp->rxbpi; ) { /* loop thru char */ @@ -425,6 +951,7 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ return; } + /* Return count of available characters for line */ int32 tmxr_rqln (TMLN *lp) @@ -432,17 +959,6 @@ int32 tmxr_rqln (TMLN *lp) return (lp->rxbpi - lp->rxbpr + ((lp->rxbpi < lp->rxbpr)? TMXR_MAXBUF: 0)); } -/* Remove character p (and matching status) from line l input buffer */ - -void tmxr_rmvrc (TMLN *lp, int32 p) -{ -for ( ; p < lp->rxbpi; p++) { - lp->rxb[p] = lp->rxb[p + 1]; - lp->rbr[p] = lp->rbr[p + 1]; - } -lp->rxbpi = lp->rxbpi - 1; -return; -} /* Store character in line buffer @@ -451,10 +967,17 @@ return; chr = characters Outputs: status = ok, connection lost, or stall + + Implementation note: + + 1. If the line is not connected, SCPE_LOST is returned. For serial + connections, this may also occur when the connection is pending, either + before the first "tmxr_poll_conn" call, or during a DTR drop deferral. */ t_stat tmxr_putc_ln (TMLN *lp, int32 chr) { +// [JDB] isn't this wrong? it's logging the char before it determines if it can output it! if (lp->txlog) /* log if available */ fputc (chr, lp->txlog); if ((lp->conn == 0) && (!lp->txbfd)) /* no conn & not buffered? */ @@ -483,6 +1006,7 @@ if ((lp->txbfd) || (TXBUF_AVAIL(lp) > 1)) { /* room for char (+ IAC) return SCPE_STALL; /* char not sent */ } + /* Poll for output Inputs: @@ -507,6 +1031,7 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ return; } + /* Send buffered data across network Inputs: @@ -522,11 +1047,11 @@ int32 nbytes, sbytes; nbytes = tmxr_tqln(lp); /* avail bytes */ if (nbytes) { /* >0? write */ if (lp->txbpr < lp->txbpi) /* no wrap? */ - sbytes = sim_write_sock (lp->conn, /* write all data */ - &(lp->txb[lp->txbpr]), nbytes); - else sbytes = sim_write_sock (lp->conn, /* write to end buf */ - &(lp->txb[lp->txbpr]), lp->txbsz - lp->txbpr); - if (sbytes != SOCKET_ERROR) { /* ok? */ + sbytes = tmxr_write (lp, nbytes); /* write all data */ + else + sbytes = tmxr_write (lp, TMXR_MAXBUF - lp->txbpr); /* write to end buf */ + + if (sbytes > 0) { /* ok? */ tmxr_debug (TMXR_DBG_XMT, lp, "Sent", &(lp->txb[lp->txbpr]), sbytes); lp->txbpr = (lp->txbpr + sbytes); /* update remove ptr */ if (lp->txbpr >= lp->txbsz) /* wrap? */ @@ -534,9 +1059,10 @@ if (nbytes) { /* >0? write */ lp->txcnt = lp->txcnt + sbytes; /* update counts */ nbytes = nbytes - sbytes; } + if (nbytes && (lp->txbpr == 0)) { /* more data and wrap? */ - sbytes = sim_write_sock (lp->conn, lp->txb, nbytes); - if (sbytes != SOCKET_ERROR) { /* ok */ + sbytes = tmxr_write (lp, nbytes); + if (sbytes > 0) { /* ok */ tmxr_debug (TMXR_DBG_XMT, lp, "Sent", lp->txb, sbytes); lp->txbpr = (lp->txbpr + sbytes); /* update remove ptr */ if (lp->txbpr >= lp->txbsz) /* wrap? */ @@ -549,6 +1075,7 @@ if (nbytes) { /* >0? write */ return nbytes; } + /* Return count of buffered characters for line */ int32 tmxr_tqln (TMLN *lp) @@ -556,7 +1083,14 @@ int32 tmxr_tqln (TMLN *lp) return (lp->txbpi - lp->txbpr + ((lp->txbpi < lp->txbpr)? lp->txbsz: 0)); } -/* Open master socket */ + +/* Open a master listening socket. + + A listening socket for the port number described by "cptr" is opened for the + multiplexer associated with descriptor "mp". If the open is successful, all + lines not currently possessing serial connections are initialized for Telnet + connections. +*/ t_stat tmxr_open_master (TMXR *mp, char *cptr) { @@ -653,17 +1187,12 @@ mp->port = port; /* save port */ mp->master = sock; /* save master socket */ for (i = 0; i < mp->lines; i++) { /* initialize lines */ lp = mp->ldsc + i; - lp->conn = lp->tsta = 0; - lp->rxbpi = lp->rxbpr = 0; - lp->txbpi = lp->txbpr = 0; - if (!mp->buffered) { - lp->txbfd = lp->txbpi = lp->txbpr = 0; - lp->txbsz = TMXR_MAXBUF; - lp->txb = (char *)realloc(lp->txb, lp->txbsz); + + if (lp->serport == 0) { /* no serial port attached? */ + lp->mp = mp; /* set the back pointer */ + tmxr_init_line (lp); /* initialize line state */ + lp->conn = 0; /* clear the socket */ } - lp->rxcnt = lp->txcnt = lp->txdrp = 0; - lp->xmte = 1; - lp->dstb = 0; } return SCPE_OK; } @@ -684,7 +1213,7 @@ if (tptr == NULL) /* no more mem? */ r = tmxr_open_master (mp, cptr); /* open master socket */ if (r != SCPE_OK) { /* error? */ free (tptr); /* release buf */ - return SCPE_OPENERR; + return r; } sprintf (pmsg, "%d", mp->port); /* copy port */ if (mp->buffered) @@ -701,7 +1230,184 @@ if (mp->dptr == NULL) /* has device been set? return SCPE_OK; } -/* Close master socket */ + +/* Attach a line to a serial port. + + Attach a line of the multiplexer associated with descriptor "desc" to a + serial port. Two calling sequences are supported: + + 1. If "val" is zero, then "uptr" is implicitly associated with the line + number corresponding to the position of the unit in the zero-based array + of units belonging to the associated device, and "cptr" points to the + serial port name. For example, if "uptr" points to unit 3 in a given + device, and "cptr" points to the string "COM1", then line 3 will be + attached to serial port "COM1". + + 2. If "val" is non-zero, then "cptr" points to a string that is parsed for + an explicit line number and serial port name, and "uptr" is ignored. The + number and name are delimited by the character represented by "val". For + example, if "val" is 58 (':'), and "cptr" points to the string "3:COM1", + then line 3 will be attached to serial port "COM1". + + An optional configuration string may be present after the port name. If + present, it must be separated from the port name with a semicolon and has + this form: + + - + + where: + + rate = communication rate in bits per second + charsize = character size in bits (5-8, including optional parity) + parity = parity designator (N/E/O/M/S for no/even/odd/mark/space parity) + stopbits = number of stop bits (1, 1.5, or 2) + + As an example: + + 9600-8n1 + + The supported rates, sizes, and parity options are host-specific. If a + configuration string is not supplied, then host system defaults are used. + + If the serial port allocation is successful, then if "val" is zero, then the + port name is stored in the UNIT structure, and the UNIT_ATT flag is set. If + "val" is non-zero, then this is not done, as there is no unit corresponding + to the attached line. + + Implementation notes: + + 1. If the device associated with the unit referenced by "uptr" does not have + the DEV_NET flag set, then the optional configuration string is saved + with the port name in the UNIT structure. This allows a RESTORE to + reconfigure the attached serial port during reattachment. The combined + string will be displayed when the unit is SHOWed. + + If the unit has the DEV_NET flag, the optional configuration string is + removed before the attached port name is saved in the UNIT structure, as + RESTORE will not reattach the port, and so reconfiguration is not needed. + + 2. This function may be called as an MTAB processing routine. +*/ + +t_stat tmxr_attach_line (UNIT *uptr, int32 val, char *cptr, void *desc) +{ +TMXR *mp = (TMXR *) desc; +TMLN *lp; +DEVICE *dptr; +char *pptr, *sptr, *tptr; +SERHANDLE serport; +SERCONFIG config = { 0 }; +t_stat status; +char portname [1024]; +t_bool arg_error = FALSE; + +if (val) { /* explicit line? */ + uptr = NULL; /* indicate to get routine */ + tptr = strchr (cptr, (char) val); /* search for separator */ + + if (tptr == NULL) /* not found? */ + return SCPE_ARG; /* report bad argument */ + else /* found */ + *tptr = '\0'; /* terminate for get_uint */ + } + +lp = tmxr_get_ldsc (uptr, cptr, mp, &status); /* get referenced line */ + +if (lp == NULL) /* bad line number? */ + return status; /* report it */ + +if (lp->conn) /* line connected via Telnet? */ + return SCPE_NOFNC; /* command not allowed */ + +if (val) /* named line form? */ + cptr = tptr + 1; /* point at port name */ + +if (cptr == NULL) /* port name missing? */ + return SCPE_ARG; /* report it */ + +pptr = get_glyph_nc (cptr, portname, ';'); /* separate port name from optional params */ + +if (*pptr) { /* parameter string present? */ + config.baudrate = (uint32) strtotv (pptr, &sptr, 10); /* parse baud rate */ + arg_error = (pptr == sptr); /* check for bad argument */ + + if (*sptr) /* separator present? */ + sptr++; /* skip it */ + + config.charsize = (uint32) strtotv (sptr, &tptr, 10); /* parse character size */ + arg_error = arg_error || (sptr == tptr); /* check for bad argument */ + + if (*tptr) /* parity character present? */ + config.parity = toupper (*tptr++); /* save parity character */ + + config.stopbits = (uint32) strtotv (tptr, &sptr, 10); /* parse number of stop bits */ + arg_error = arg_error || (tptr == sptr); /* check for bad argument */ + + if (arg_error) /* bad conversions? */ + return SCPE_ARG; /* report argument error */ + + else if (strcmp (sptr, ".5") == 0) /* 1.5 stop bits requested? */ + config.stopbits = 0; /* code request */ + } + +serport = sim_open_serial (portname); /* open the serial port */ + +if (serport == INVALID_HANDLE) /* not a valid port name */ + return SCPE_OPENERR; /* cannot attach */ + +else { /* good serial port */ + if (*pptr) { /* parameter string specified? */ + status = sim_config_serial (serport, config); /* set serial configuration */ + + if (status != SCPE_OK) { /* port configuration error? */ + sim_close_serial (serport); /* close the port */ + return status; /* report error */ + } + } + + if (val == 0) { /* unit implies line? */ + dptr = find_dev_from_unit (uptr); /* find associated device */ + + if (dptr && (dptr->flags & DEV_NET)) /* will RESTORE be inhibited? */ + cptr = portname; /* yes, so save just port name */ + + if (mp->dptr == NULL) /* has device been set? */ + mp->dptr = dptr; /* no, so set device now */ + } + + tptr = (char *) malloc (strlen (cptr) + 1); /* get buffer for port name and maybe params */ + + if (tptr == NULL) { /* allocation problem? */ + sim_close_serial (serport); /* close the port */ + return SCPE_MEM; /* report allocation failure */ + } + + strcpy (tptr, cptr); /* copy the port name into the buffer */ + + if (val == 0) { /* unit implies line? */ + uptr->filename = tptr; /* save buffer pointer in UNIT */ + uptr->flags = uptr->flags | UNIT_ATT; /* mark unit as attached */ + } + + lp->mp = mp; /* set the back pointer */ + tmxr_init_line (lp); /* initialize the line state */ + lp->serport = serport; /* set serial port handle */ + lp->sername = tptr; /* set serial port name */ + lp->cnms = 0; /* schedule for immediate connection */ + lp->conn = 0; /* indicate no connection yet */ + mp->pending = mp->pending + 1; /* but connection is pending */ + } + +return SCPE_OK; /* line has been connected */ +} + + +/* Close a master listening socket. + + The listening socket associated with multiplexer descriptor "mp" is closed + and deallocated. In addition, all current Telnet sessions are disconnected. + Serial sessions are not affected. +*/ t_stat tmxr_close_master (TMXR *mp) { @@ -710,19 +1416,26 @@ TMLN *lp; for (i = 0; i < mp->lines; i++) { /* loop thru conn */ lp = mp->ldsc + i; - if (lp->conn) { - tmxr_linemsg (lp, "\r\nDisconnected from the "); - tmxr_linemsg (lp, sim_name); - tmxr_linemsg (lp, " simulator\r\n\n"); - tmxr_reset_ln (lp); - } /* end if conn */ - } /* end for */ + + if (!lp->serport && lp->conn) { /* not serial and is connected? */ + tmxr_report_disconnection (lp); /* report disconnection */ + tmxr_reset_ln (lp); /* disconnect line */ + } + } + sim_close_sock (mp->master, 1); /* close master socket */ mp->master = 0; return SCPE_OK; } -/* Detach unit from master socket */ + +/* Detach unit from master socket. + + Note that we return SCPE_OK, regardless of whether a listening socket was + attached. For single-line multiplexers that may be attached either to a + listening socket or to a serial port, call "tmxr_detach_line" first. If that + routine returns SCPE_UNATT, then call "tmxr_detach". +*/ t_stat tmxr_detach (TMXR *mp, UNIT *uptr) { @@ -735,6 +1448,134 @@ uptr->flags = uptr->flags & ~UNIT_ATT; /* not attached */ return SCPE_OK; } + +/* Detach a line from serial port. + + Disconnect and detach a line of the multiplexer associated with descriptor + "desc" from a serial port. Two calling sequences are supported: + + 1. If "val" is zero, then "uptr" is implicitly associated with the line + number corresponding to the position of the unit in the zero-based array + of units belonging to the associated device, and "cptr" points to the + serial port name. For example, if "uptr" points to unit 3 in a given + device, then line 3 will be detached from the associated serial port. + + 2. If "val" is non-zero, then "cptr" points to a string that is parsed for + an explicit line number, and "uptr" is ignored. For example, if "cptr" + points to the string "3", then line 3 will be detached from the + associated serial port. + + Calling sequence 2 allows serial ports to be used with multiplexers that do + not implement unit-per-line. In this configuration, there is no unit + associated with a given line, so the ATTACH and DETACH commands cannot be + used. Instead, SET commands directed to the device must specify the line + number and port name to open (e.g., "SET CONNECT=:") or close + (e.g., "SET DISCONNECT="). These commands call "tmxr_attach_line" + and "tmxr_detach_line", respectively, with non-zero "val" parameters. + + As an aid for this configuration, we do not verify serial port connections + when "val" is non-zero. That is, we will disconnect the line without regard + to whether a serial or Telnet connection is present. Then, if a serial + connection was present, the serial port is closed. This allows the SET + DISCONNECT command to be used to disconnect (close) both Telnet and serial + sessions. + + Implementation notes: + + 1. If "val" is zero, and the specified line is not connected to a serial + port, then SCPE_UNATT is returned. This allows a common VM-provided + detach routine in a single-line device to attempt to detach a serial port + first, and then, if that fails, to detach a Telnet session via + "tmxr_detach". Note that the latter will always succeed, even if the + unit is not attached, and so cannot be called first. + + 2. If the serial connection was completed, we drop the line to ensure that a + modem will disconnect. This increments the pending connection count in + preparation for reconnecting. If the connection was not completed, it + will still be pending. In either case, we drop the pending connection + count, as we will be closing the serial port. + + 3. This function may be called as an MTAB processing routine. +*/ + +t_stat tmxr_detach_line (UNIT *uptr, int32 val, char *cptr, void *desc) +{ +TMXR *mp = (TMXR *) desc; +TMLN *lp; +t_stat status; + +if (val) /* explicit line? */ + uptr = NULL; /* indicate to get routine */ + +lp = tmxr_get_ldsc (uptr, cptr, mp, &status); /* get referenced line */ + +if (lp == NULL) /* bad line number? */ + return status; /* report it */ + +if (uptr && lp->serport == 0) /* serial port attached to unit? */ + return SCPE_UNATT; /* no, so report status to caller */ + +if (lp->conn) { /* was connection made? */ + tmxr_report_disconnection (lp); /* report disconnection */ + tmxr_clear_ln (mp, lp); /* close line */ + } + +if (lp->serport) { /* serial port attached? */ + mp->pending = mp->pending - 1; /* drop pending connection count */ + + sim_close_serial (lp->serport); /* close serial port */ + lp->serport = 0; /* clear handle */ + free (lp->sername); /* free port name */ + lp->sername = 0; /* clear pointer */ + + if (uptr) { /* unit implies line? */ + uptr->filename = NULL; /* clear attached name pointer */ + uptr->flags = uptr->flags & ~UNIT_ATT; /* no longer attached */ + } + } + +return SCPE_OK; +} + + +/* Check if a line is free. + + A line is free if it is not connected to a Telnet session or a serial port. +*/ + +t_bool tmxr_line_free (TMLN *lp) +{ +return lp && (lp->conn == 0) && (lp->serport == 0); /* free if no connection */ +} + + +/* Check if a multiplexer is free. + + A multiplexer is free if it is not listening for new Telnet connections and + no lines are connected to serial ports. Note that if the listening socket is + detached, then no Telnet sessions can exist, so we only need to check for + serial connections on the lines. +*/ + +t_bool tmxr_mux_free (TMXR *mp) +{ +TMLN* lp; +int32 ln; + +if (mp == NULL || mp->master || mp->pending) /* listening for Telnet or serial connection? */ + return FALSE; /* not free */ + +for (ln = 0; ln < mp->lines; ln++) { /* check each line for serial connection */ + lp = mp->ldsc + ln; /* get pointer to line descriptor */ + + if (lp->serport) /* serial connection? */ + return FALSE; /* not free */ + } + +return TRUE; /* no connections, so mux is free */ +} + + /* Stub examine and deposit */ t_stat tmxr_ex (t_value *vptr, t_addr addr, UNIT *uptr, int32 sw) @@ -747,7 +1588,8 @@ t_stat tmxr_dep (t_value val, t_addr addr, UNIT *uptr, int32 sw) return SCPE_NOFNC; } -/* Output message to socket or line descriptor */ + +/* Write a message directly to a socket */ void tmxr_msg (SOCKET sock, char *msg) { @@ -756,6 +1598,9 @@ if (sock) return; } + +/* Write a message to a line */ + void tmxr_linemsg (TMLN *lp, char *msg) { int32 len; @@ -765,25 +1610,33 @@ for (len = (int32)strlen (msg); len > 0; --len) return; } + /* Print connections - used only in named SHOW command */ void tmxr_fconns (FILE *st, TMLN *lp, int32 ln) { if (ln >= 0) fprintf (st, "line %d: ", ln); + if (lp->conn) { int32 o1, o2, o3, o4, hr, mn, sc; uint32 ctime; - o1 = (lp->ipad >> 24) & 0xFF; - o2 = (lp->ipad >> 16) & 0xFF; - o3 = (lp->ipad >> 8) & 0xFF; - o4 = (lp->ipad) & 0xFF; + if (lp->serport) /* serial connection? */ + fprintf (st, "Serial port %s", lp->sername); /* print port name */ + + else { /* socket connection */ + o1 = (lp->ipad >> 24) & 0xFF; + o2 = (lp->ipad >> 16) & 0xFF; + o3 = (lp->ipad >> 8) & 0xFF; + o4 = (lp->ipad) & 0xFF; + fprintf (st, "IP address %d.%d.%d.%d", o1, o2, o3, o4); + } + ctime = (sim_os_msec () - lp->cnms) / 1000; hr = ctime / 3600; mn = (ctime / 60) % 60; sc = ctime % 60; - fprintf (st, "IP address %d.%d.%d.%d", o1, o2, o3, o4); if (ctime) fprintf (st, ", connected %02d:%02d:%02d\n", hr, mn, sc); } @@ -793,6 +1646,7 @@ if (lp->txlog) return; } + /* Print statistics - used only in named SHOW command */ void tmxr_fstats (FILE *st, TMLN *lp, int32 ln) @@ -822,37 +1676,56 @@ if (lp->txdrp) return; } -/* Disconnect line */ + +/* Disconnect a line. + + Disconnect a line of the multiplexer associated with descriptor "desc" from a + Telnet session or a serial port. Two calling sequences are supported: + + 1. If "val" is zero, then "uptr" is implicitly associated with the line + number corresponding to the position of the unit in the zero-based array + of units belonging to the associated device, and "cptr" is ignored. For + example, if "uptr" points to unit 3 in a given device, then line 3 will + be disconnected. + + 2. If "val" is non-zero, then "cptr" points to a string that is parsed for + an explicit line number, and "uptr" is ignored. For example, if "cptr" + points to the string "3", then line 3 will be disconnected. + + If the line was connected to a Telnet session, the socket associated with the + line will be closed. If the line was connected to a serial port, the port + will NOT be closed, but DTR will be dropped. The line will be reconnected + after a short delay to allow the serial device to recognize the DTR state + change. + + Implementation notes: + + 1. This function may be called as an MTAB processing routine. +*/ t_stat tmxr_dscln (UNIT *uptr, int32 val, char *cptr, void *desc) { TMXR *mp = (TMXR *) desc; TMLN *lp; -int32 ln; -t_stat r; +t_stat status; -if (mp == NULL) - return SCPE_IERR; -if (val) { /* = n form */ - if (cptr == NULL) - return SCPE_ARG; - ln = (int32) get_uint (cptr, 10, mp->lines - 1, &r); - if (r != SCPE_OK) - return SCPE_ARG; - lp = mp->ldsc + ln; - } -else { - lp = tmxr_find_ldsc (uptr, 0, mp); - if (lp == NULL) - return SCPE_IERR; - } -if (lp->conn) { - tmxr_linemsg (lp, "\r\nOperator disconnected line\r\n\n"); - tmxr_reset_ln (lp); +if (val) /* explicit line? */ + uptr = NULL; /* indicate to get routine */ + +lp = tmxr_get_ldsc (uptr, cptr, mp, &status); /* get referenced line */ + +if (lp == NULL) /* bad line number? */ + return status; /* report it */ + +if (lp->conn) { /* connection active? */ + tmxr_linemsg (lp, "\r\nOperator disconnected line\r\n\n"); /* report closure */ + tmxr_clear_ln (mp, lp); /* drop the line */ } + return SCPE_OK; } + /* Enable logging for line */ t_stat tmxr_set_log (UNIT *uptr, int32 val, char *cptr, void *desc) @@ -879,6 +1752,7 @@ if (lp->txlog == NULL) { /* error? */ return SCPE_OK; } + /* Disable logging for line */ t_stat tmxr_set_nolog (UNIT *uptr, int32 val, char *cptr, void *desc) @@ -900,6 +1774,7 @@ if (lp->txlog) { /* logging? */ return SCPE_OK; } + /* Show logging status for line */ t_stat tmxr_show_log (FILE *st, UNIT *uptr, int32 val, void *desc) @@ -916,27 +1791,6 @@ else fprintf (st, "no logging"); return SCPE_OK; } -/* Find line descriptor. - - Note: This routine may be called with a UNIT that does not belong to the - device indicated in the TMXR structure. That is, the multiplexer lines may - belong to a device other than the one attached to the socket (the HP 2100 MUX - device is one example). Therefore, we must look up the device from the unit - at each call, rather than depending on the DPTR stored in the TMXR. -*/ - -TMLN *tmxr_find_ldsc (UNIT *uptr, int32 val, TMXR *mp) -{ -if (uptr) { /* called from SET? */ - DEVICE *dptr = find_dev_from_unit (uptr); /* find device */ - if (dptr == NULL) /* what?? */ - return NULL; - val = (int32) (uptr - dptr->units); /* implicit line # */ - } -if ((val < 0) || (val >= mp->lines)) /* invalid line? */ - return NULL; -return mp->ldsc + val; /* line descriptor */ -} /* Set the line connection order. @@ -1043,6 +1897,7 @@ free (set); /* free set allocation * return result; } + /* Show line connection order. Parameters: @@ -1235,4 +2090,3 @@ if ((lp->mp->dptr) && (dbits & lp->mp->dptr->dctrl)) { sim_debug (dbits, lp->mp->dptr, "%s %d bytes '%s'\n", msg, bufsize, tmxr_debug_buf); } } - diff --git a/sim_tmxr.h b/sim_tmxr.h index 72826a04..94e6dabe 100644 --- a/sim_tmxr.h +++ b/sim_tmxr.h @@ -28,6 +28,9 @@ 17-Jan-11 MP Added buffered line capabilities 20-Nov-08 RMS Added three new standardized SHOW routines + 07-Oct-08 JDB [serial] Added serial port support to TMXR, TMLN, + added tmxr_attach_line, tmxr_detach_line, + tmxr_line_free, tmxr_mux_free 27-May-08 JDB Added lnorder to TMXR structure, added tmxr_set_lnorder and tmxr_set_lnorder 14-May-08 JDB Added dptr to TMXR structure @@ -44,6 +47,8 @@ #ifndef _SIM_TMXR_H_ #define _SIM_TMXR_H_ 0 +#include "sim_serial.h" + #define TMXR_V_VALID 15 #define TMXR_VALID (1 << TMXR_V_VALID) #define TMXR_MAXBUF 256 /* buffer size */ @@ -79,6 +84,8 @@ struct tmln { char rbr[TMXR_MAXBUF]; /* rcv break */ char *txb; /* xmt buffer */ TMXR *mp; /* back pointer to mux */ + SERHANDLE serport; /* serial port handle */ + char *sername; /* serial port name */ }; struct tmxr { @@ -90,18 +97,25 @@ struct tmxr { DEVICE *dptr; /* multiplexer device */ char logfiletmpl[FILENAME_MAX]; /* template logfile name */ int32 buffered; /* Buffered Line Behavior and Buffer Size Flag */ + uint32 pending; /* count of pending serial connections */ }; int32 tmxr_poll_conn (TMXR *mp); void tmxr_reset_ln (TMLN *lp); +t_stat tmxr_clear_ln (TMXR *mp, TMLN *lp); int32 tmxr_getc_ln (TMLN *lp); void tmxr_poll_rx (TMXR *mp); t_stat tmxr_putc_ln (TMLN *lp, int32 chr); void tmxr_poll_tx (TMXR *mp); +int32 tmxr_send_buffered_data (TMLN *lp); t_stat tmxr_open_master (TMXR *mp, char *cptr); t_stat tmxr_close_master (TMXR *mp); t_stat tmxr_attach (TMXR *mp, UNIT *uptr, char *cptr); t_stat tmxr_detach (TMXR *mp, UNIT *uptr); +t_stat tmxr_attach_line (UNIT *uptr, int32 val, char *cptr, void *desc); +t_stat tmxr_detach_line (UNIT *uptr, int32 val, char *cptr, void *desc); +t_bool tmxr_line_free (TMLN *lp); +t_bool tmxr_mux_free (TMXR *mp); t_stat tmxr_ex (t_value *vptr, t_addr addr, UNIT *uptr, int32 sw); t_stat tmxr_dep (t_value val, t_addr addr, UNIT *uptr, int32 sw); void tmxr_msg (SOCKET sock, char *msg); From 1fb1756b65ada38e51e2ed83662420668e79fd10 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 20 Apr 2012 05:26:11 -0700 Subject: [PATCH 02/63] Added sim_serial to all simulator Visual Studio Projects --- Visual Studio Projects/ALTAIR.vcproj | 8 ++++++++ Visual Studio Projects/AltairZ80.vcproj | 8 ++++++++ Visual Studio Projects/ECLIPSE.vcproj | 8 ++++++++ Visual Studio Projects/GRI.vcproj | 8 ++++++++ Visual Studio Projects/H316.vcproj | 8 ++++++++ Visual Studio Projects/HP2100.vcproj | 8 ++++++++ Visual Studio Projects/I1401.vcproj | 8 ++++++++ Visual Studio Projects/I1620.vcproj | 8 ++++++++ Visual Studio Projects/I7094.vcproj | 8 ++++++++ Visual Studio Projects/IBM1130.vcproj | 8 ++++++++ Visual Studio Projects/ID16.vcproj | 8 ++++++++ Visual Studio Projects/ID32.vcproj | 8 ++++++++ Visual Studio Projects/NOVA.vcproj | 8 ++++++++ Visual Studio Projects/PDP1.vcproj | 8 ++++++++ Visual Studio Projects/PDP10.vcproj | 8 ++++++++ Visual Studio Projects/PDP11.vcproj | 8 ++++++++ Visual Studio Projects/PDP15.vcproj | 8 ++++++++ Visual Studio Projects/PDP4.vcproj | 8 ++++++++ Visual Studio Projects/PDP7.vcproj | 8 ++++++++ Visual Studio Projects/PDP8.vcproj | 8 ++++++++ Visual Studio Projects/PDP9.vcproj | 8 ++++++++ Visual Studio Projects/S3.vcproj | 8 ++++++++ Visual Studio Projects/SDS.vcproj | 8 ++++++++ Visual Studio Projects/SWTP.vcproj | 8 ++++++++ Visual Studio Projects/VAX.vcproj | 8 ++++++++ Visual Studio Projects/VAX780.vcproj | 8 ++++++++ Visual Studio Projects/lgp.vcproj | 8 ++++++++ 27 files changed, 216 insertions(+) diff --git a/Visual Studio Projects/ALTAIR.vcproj b/Visual Studio Projects/ALTAIR.vcproj index 50953c79..20741a3b 100644 --- a/Visual Studio Projects/ALTAIR.vcproj +++ b/Visual Studio Projects/ALTAIR.vcproj @@ -218,6 +218,10 @@ RelativePath="..\sim_fio.c" > + + @@ -267,6 +271,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/AltairZ80.vcproj b/Visual Studio Projects/AltairZ80.vcproj index 9125307d..12d0702f 100644 --- a/Visual Studio Projects/AltairZ80.vcproj +++ b/Visual Studio Projects/AltairZ80.vcproj @@ -321,6 +321,10 @@ RelativePath="..\AltairZ80\sim_imd.c" > + + @@ -378,6 +382,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/ECLIPSE.vcproj b/Visual Studio Projects/ECLIPSE.vcproj index ca98d455..4dfbc491 100644 --- a/Visual Studio Projects/ECLIPSE.vcproj +++ b/Visual Studio Projects/ECLIPSE.vcproj @@ -249,6 +249,10 @@ RelativePath="..\sim_fio.c" > + + @@ -294,6 +298,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/GRI.vcproj b/Visual Studio Projects/GRI.vcproj index 3f88b5bb..29b5acba 100644 --- a/Visual Studio Projects/GRI.vcproj +++ b/Visual Studio Projects/GRI.vcproj @@ -213,6 +213,10 @@ RelativePath="..\sim_fio.c" > + + @@ -262,6 +266,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/H316.vcproj b/Visual Studio Projects/H316.vcproj index 8bd7530e..a48ef4fe 100644 --- a/Visual Studio Projects/H316.vcproj +++ b/Visual Studio Projects/H316.vcproj @@ -229,6 +229,10 @@ RelativePath="..\sim_fio.c" > + + @@ -278,6 +282,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/HP2100.vcproj b/Visual Studio Projects/HP2100.vcproj index 2978e132..8cdd3fbc 100644 --- a/Visual Studio Projects/HP2100.vcproj +++ b/Visual Studio Projects/HP2100.vcproj @@ -317,6 +317,10 @@ RelativePath="..\sim_fio.c" > + + @@ -390,6 +394,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/I1401.vcproj b/Visual Studio Projects/I1401.vcproj index e9b6d64e..3de4930f 100644 --- a/Visual Studio Projects/I1401.vcproj +++ b/Visual Studio Projects/I1401.vcproj @@ -229,6 +229,10 @@ RelativePath="..\sim_fio.c" > + + @@ -282,6 +286,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/I1620.vcproj b/Visual Studio Projects/I1620.vcproj index 7a3afc53..4f1eb453 100644 --- a/Visual Studio Projects/I1620.vcproj +++ b/Visual Studio Projects/I1620.vcproj @@ -233,6 +233,10 @@ RelativePath="..\sim_fio.c" > + + @@ -282,6 +286,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/I7094.vcproj b/Visual Studio Projects/I7094.vcproj index 6f04a6b1..d1871c95 100644 --- a/Visual Studio Projects/I7094.vcproj +++ b/Visual Studio Projects/I7094.vcproj @@ -249,6 +249,10 @@ RelativePath="..\sim_fio.c" > + + @@ -302,6 +306,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/IBM1130.vcproj b/Visual Studio Projects/IBM1130.vcproj index 2a116ced..c59f1b04 100644 --- a/Visual Studio Projects/IBM1130.vcproj +++ b/Visual Studio Projects/IBM1130.vcproj @@ -253,6 +253,10 @@ RelativePath="..\sim_fio.c" > + + @@ -326,6 +330,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/ID16.vcproj b/Visual Studio Projects/ID16.vcproj index 0c50ccc7..340ec469 100644 --- a/Visual Studio Projects/ID16.vcproj +++ b/Visual Studio Projects/ID16.vcproj @@ -261,6 +261,10 @@ RelativePath="..\sim_fio.c" > + + @@ -310,6 +314,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/ID32.vcproj b/Visual Studio Projects/ID32.vcproj index 9474205e..c7b34690 100644 --- a/Visual Studio Projects/ID32.vcproj +++ b/Visual Studio Projects/ID32.vcproj @@ -261,6 +261,10 @@ RelativePath="..\sim_fio.c" > + + @@ -310,6 +314,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/NOVA.vcproj b/Visual Studio Projects/NOVA.vcproj index ed896b38..be2bc396 100644 --- a/Visual Studio Projects/NOVA.vcproj +++ b/Visual Studio Projects/NOVA.vcproj @@ -249,6 +249,10 @@ RelativePath="..\sim_fio.c" > + + @@ -298,6 +302,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP1.vcproj b/Visual Studio Projects/PDP1.vcproj index d367998d..c1954faa 100644 --- a/Visual Studio Projects/PDP1.vcproj +++ b/Visual Studio Projects/PDP1.vcproj @@ -233,6 +233,10 @@ RelativePath="..\sim_fio.c" > + + @@ -282,6 +286,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP10.vcproj b/Visual Studio Projects/PDP10.vcproj index 36c52831..766ca9e9 100644 --- a/Visual Studio Projects/PDP10.vcproj +++ b/Visual Studio Projects/PDP10.vcproj @@ -267,6 +267,10 @@ RelativePath="..\sim_fio.c" > + + @@ -316,6 +320,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP11.vcproj b/Visual Studio Projects/PDP11.vcproj index fc4f4b67..ae07e30c 100644 --- a/Visual Studio Projects/PDP11.vcproj +++ b/Visual Studio Projects/PDP11.vcproj @@ -375,6 +375,10 @@ RelativePath="..\sim_fio.c" > + + @@ -464,6 +468,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP15.vcproj b/Visual Studio Projects/PDP15.vcproj index 8241c99f..8ecf0638 100644 --- a/Visual Studio Projects/PDP15.vcproj +++ b/Visual Studio Projects/PDP15.vcproj @@ -245,6 +245,10 @@ RelativePath="..\sim_fio.c" > + + @@ -294,6 +298,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP4.vcproj b/Visual Studio Projects/PDP4.vcproj index b7049eca..c6accca9 100644 --- a/Visual Studio Projects/PDP4.vcproj +++ b/Visual Studio Projects/PDP4.vcproj @@ -245,6 +245,10 @@ RelativePath="..\sim_fio.c" > + + @@ -294,6 +298,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP7.vcproj b/Visual Studio Projects/PDP7.vcproj index 0364ef2e..cd589e1b 100644 --- a/Visual Studio Projects/PDP7.vcproj +++ b/Visual Studio Projects/PDP7.vcproj @@ -245,6 +245,10 @@ RelativePath="..\sim_fio.c" > + + @@ -294,6 +298,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP8.vcproj b/Visual Studio Projects/PDP8.vcproj index a71bbc0a..758c4555 100644 --- a/Visual Studio Projects/PDP8.vcproj +++ b/Visual Studio Projects/PDP8.vcproj @@ -273,6 +273,10 @@ RelativePath="..\sim_fio.c" > + + @@ -322,6 +326,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/PDP9.vcproj b/Visual Studio Projects/PDP9.vcproj index 781b2de3..58360e59 100644 --- a/Visual Studio Projects/PDP9.vcproj +++ b/Visual Studio Projects/PDP9.vcproj @@ -249,6 +249,10 @@ RelativePath="..\sim_fio.c" > + + @@ -298,6 +302,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/S3.vcproj b/Visual Studio Projects/S3.vcproj index 752d9fba..6037598e 100644 --- a/Visual Studio Projects/S3.vcproj +++ b/Visual Studio Projects/S3.vcproj @@ -225,6 +225,10 @@ RelativePath="..\sim_fio.c" > + + @@ -274,6 +278,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/SDS.vcproj b/Visual Studio Projects/SDS.vcproj index c15a9b5c..1df76ae1 100644 --- a/Visual Studio Projects/SDS.vcproj +++ b/Visual Studio Projects/SDS.vcproj @@ -241,6 +241,10 @@ RelativePath="..\sim_fio.c" > + + @@ -290,6 +294,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/SWTP.vcproj b/Visual Studio Projects/SWTP.vcproj index e573d26e..b25d737b 100644 --- a/Visual Studio Projects/SWTP.vcproj +++ b/Visual Studio Projects/SWTP.vcproj @@ -201,6 +201,10 @@ RelativePath="..\sim_fio.c" > + + @@ -262,6 +266,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/VAX.vcproj b/Visual Studio Projects/VAX.vcproj index 3aaebaa1..9470b3a8 100644 --- a/Visual Studio Projects/VAX.vcproj +++ b/Visual Studio Projects/VAX.vcproj @@ -288,6 +288,10 @@ RelativePath="..\sim_fio.c" > + + @@ -413,6 +417,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/VAX780.vcproj b/Visual Studio Projects/VAX780.vcproj index 52c14deb..2330cab2 100644 --- a/Visual Studio Projects/VAX780.vcproj +++ b/Visual Studio Projects/VAX780.vcproj @@ -302,6 +302,10 @@ RelativePath="..\sim_fio.c" > + + @@ -435,6 +439,10 @@ RelativePath="..\sim_rev.h" > + + diff --git a/Visual Studio Projects/lgp.vcproj b/Visual Studio Projects/lgp.vcproj index 67701a97..bc15eb08 100644 --- a/Visual Studio Projects/lgp.vcproj +++ b/Visual Studio Projects/lgp.vcproj @@ -213,6 +213,10 @@ RelativePath="..\sim_fio.c" > + + @@ -262,6 +266,10 @@ RelativePath="..\sim_rev.h" > + + From 6912ad167ee89288ad3448c36ad3262582baec4d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 20 Apr 2012 17:58:21 -0700 Subject: [PATCH 03/63] Fixed tmxr Buffering functionality broken in the Serial merge from Dave --- sim_tmxr.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sim_tmxr.c b/sim_tmxr.c index 3d9c0ddf..d99d1ed7 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -387,7 +387,6 @@ return; static void tmxr_report_connection (TMXR *mp, TMLN *lp, int32 i) { int32 written, psave; -char line [20]; char cmsg[80]; char dmsg[80] = ""; char lmsg[80] = ""; @@ -977,7 +976,6 @@ return (lp->rxbpi - lp->rxbpr + ((lp->rxbpi < lp->rxbpr)? TMXR_MAXBUF: 0)); t_stat tmxr_putc_ln (TMLN *lp, int32 chr) { -// [JDB] isn't this wrong? it's logging the char before it determines if it can output it! if (lp->txlog) /* log if available */ fputc (chr, lp->txlog); if ((lp->conn == 0) && (!lp->txbfd)) /* no conn & not buffered? */ @@ -1049,7 +1047,7 @@ if (nbytes) { /* >0? write */ if (lp->txbpr < lp->txbpi) /* no wrap? */ sbytes = tmxr_write (lp, nbytes); /* write all data */ else - sbytes = tmxr_write (lp, TMXR_MAXBUF - lp->txbpr); /* write to end buf */ + sbytes = tmxr_write (lp, lp->txbsz - lp->txbpr);/* write to end buf */ if (sbytes > 0) { /* ok? */ tmxr_debug (TMXR_DBG_XMT, lp, "Sent", &(lp->txb[lp->txbpr]), sbytes); From b2ebd56f9cc7d3575eead2893bce1e21f48a2a88 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 22 Apr 2012 16:46:10 -0700 Subject: [PATCH 04/63] Generalized serial port naming syntax to refer to host serial ports by the name 'serN' while continuing to allow the use of specific host device names. Fixed some parsing issues in tmxr_attach_line. --- sim_serial.c | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++- sim_serial.h | 1 + sim_tmxr.c | 4 +- 3 files changed, 255 insertions(+), 3 deletions(-) diff --git a/sim_serial.c b/sim_serial.c index a75127b8..2f6ad369 100644 --- a/sim_serial.c +++ b/sim_serial.c @@ -45,6 +45,7 @@ sim_read_serial read from a serial port sim_write_serial write to a serial port sim_close_serial close a serial port + sim_show_serial shows the available host serial ports The calling sequences are as follows: @@ -102,13 +103,38 @@ -------------------------------------- The serial port indicated by "port" is closed. + + + int sim_serial_devices (int max, SERIAL_LIST* list) + --------------------------------------------------- + + enumerates the available host serial ports + + + t_stat sim_show_serial (FILE* st) + --------------------------------- + + displays the available host serial ports + */ #include "sim_defs.h" #include "sim_serial.h" +#include +#define SER_DEV_NAME_MAX 256 /* maximum device name size */ +#define SER_DEV_DESC_MAX 256 /* maximum device description size */ +#define SER_MAX_DEVICE 64 /* maximum serial devices */ + +typedef struct serial_list { + char name[SER_DEV_NAME_MAX]; + char desc[SER_DEV_DESC_MAX]; + } SERIAL_LIST; + +static int sim_serial_os_devices (int max, SERIAL_LIST* list); +static SERHANDLE sim_open_os_serial (char *name); /* Generic error message handler. @@ -124,7 +150,149 @@ fprintf (stderr, "Serial: %s fails with error %d\n", routine, error); return; } +/* Used when sorting a list of serial port names */ +static int _serial_name_compare (const void *pa, const void *pb) +{ +SERIAL_LIST *a = (SERIAL_LIST *)pa; +SERIAL_LIST *b = (SERIAL_LIST *)pb; +return strcmp(a->name, b->name); +} + +t_stat sim_show_serial (FILE* st) +{ +SERIAL_LIST list[SER_MAX_DEVICE]; +int number = sim_serial_os_devices(SER_MAX_DEVICE, list); + +fprintf(st, "Serial devices:\n"); +if (number == -1) + fprintf(st, " serial support not available in simulator\n"); +else +if (number == 0) + fprintf(st, " no serial devices are available\n"); +else { + size_t min, len; + int i; + for (i=0, min=0; i min) + min = len; + for (i=0; i s2) + return 1; + if (s1 == 0) + return 0; +} +return 0; +} + +static char* sim_serial_getname_byname(char* name, char* temp) +{ +SERIAL_LIST list[SER_MAX_DEVICE]; +int count = sim_serial_os_devices(SER_MAX_DEVICE, list); +size_t n; +int i, found; + +found = 0; +n = strlen(name); +for (i=0; i 0)) + if (ports < max) + ++ports; + else + break; + /* Besure to clear the working entry before trying again */ + memset(list[ports].name, 0, sizeof(list[ports].name)); + memset(list[ports].desc, 0, sizeof(list[ports].desc)); + dwValueNameSize = sizeof(list[ports].desc); + dwDataSize = sizeof(list[ports].name); + ++dwIndex; + } + RegCloseKey(hSERIALCOMM); + } +if (ports) /* Order the list returned alphabetically by the port name */ + qsort (list, ports, sizeof(list[0]), _serial_name_compare); +return ports; +} + /* Open a serial port. The serial port designated by "name" is opened, and the handle to the port is @@ -157,7 +368,7 @@ return; interest to a DCB retrieved from a call to "GetCommState". */ -SERHANDLE sim_open_serial (char *name) +SERHANDLE sim_open_os_serial (char *name) { SERHANDLE port; DCB dcb; @@ -421,6 +632,44 @@ return; #elif defined (__unix__) +/* Enumerate the available serial ports. + + The serial port names generated by attempting to open /dev/ttyS0 thru + /dev/ttyS53 and /dev/ttyUSB0 thru /dev/ttyUSB0. Ones we can open and + are ttys (as determined by isatty()) are added to the list. The list + is sorted alphabetically by device name. + +*/ + +static int sim_serial_os_devices (int max, SERIAL_LIST* list) +{ +int i; +int port; +int ports = 0; + +memset(list, 0, max*sizeof(*list)); +for (i=0; (ports < max) && (i < 64); ++i) { + sprintf (list[ports].name, "/dev/ttyS%d", i); + port = open (list[ports].name, O_RDWR | O_NOCTTY | O_NONBLOCK); /* open the port */ + if (port != -1) { /* open OK? */ + if (isatty (port)) /* is device a TTY? */ + ++ports; + close (port); + } + } +for (i=0; (ports < max) && (i < 64); ++i) { + sprintf (list[ports].name, "/dev/ttyUSB%d", i); + port = open (list[ports].name, O_RDWR | O_NOCTTY | O_NONBLOCK); /* open the port */ + if (port != -1) { /* open OK? */ + if (isatty (port)) /* is device a TTY? */ + ++ports; + close (port); + } + } +if (ports) /* Order the list returned alphabetically by the port name */ + qsort (list, ports, sizeof(list[0]), _serial_name_compare); +return ports; +} /* Open a serial port. @@ -442,7 +691,7 @@ return; reading. */ -SERHANDLE sim_open_serial (char *name) +SERHANDLE sim_open_os_serial (char *name) { static const tcflag_t i_clear = IGNBRK | /* ignore BREAK */ BRKINT | /* signal on BREAK */ diff --git a/sim_serial.h b/sim_serial.h index 64ffdeb1..e6a217eb 100644 --- a/sim_serial.h +++ b/sim_serial.h @@ -95,5 +95,6 @@ extern t_bool sim_control_serial (SERHANDLE port, t_bool connect); extern int32 sim_read_serial (SERHANDLE port, char *buffer, int32 count, char *brk); extern int32 sim_write_serial (SERHANDLE port, char *buffer, int32 count); extern void sim_close_serial (SERHANDLE port); +extern t_stat sim_show_serial (FILE* st); #endif diff --git a/sim_tmxr.c b/sim_tmxr.c index d99d1ed7..3112c73b 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1300,6 +1300,8 @@ char portname [1024]; t_bool arg_error = FALSE; if (val) { /* explicit line? */ + if (cptr == NULL) /* arguments supplied? */ + return SCPE_ARG; /* report bad argument */ uptr = NULL; /* indicate to get routine */ tptr = strchr (cptr, (char) val); /* search for separator */ @@ -1320,7 +1322,7 @@ if (lp->conn) /* line connected via Te if (val) /* named line form? */ cptr = tptr + 1; /* point at port name */ -if (cptr == NULL) /* port name missing? */ +if ((cptr == NULL) || (!*cptr)) /* port name missing? */ return SCPE_ARG; /* report it */ pptr = get_glyph_nc (cptr, portname, ';'); /* separate port name from optional params */ From 7929c1179211a6912742a611bdb43c63d6356381 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 25 Apr 2012 12:19:11 -0700 Subject: [PATCH 05/63] Merge branch 'master' into SerialMux --- doc/simh_doc.doc | Bin 198144 -> 189440 bytes doc/simh_faq.doc | Bin 85504 -> 101888 bytes scp.c | 271 ++++++++++++++++++++++++++++++----------------- sim_defs.h | 3 + sim_ether.c | 64 ++++++++++- sim_ether.h | 6 +- 6 files changed, 242 insertions(+), 102 deletions(-) diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index aaa7d367d200afefc014e167bbe25f806f487530..2d69a5118fae9a6e9875e3a1eac7b7b6a107d042 100644 GIT binary patch literal 189440 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 At^fc4 literal 198144 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 literal 85504 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 diff --git a/scp.c b/scp.c index d4ab078f..54d111f6 100644 --- a/scp.c +++ b/scp.c @@ -216,6 +216,7 @@ #include "sim_defs.h" #include "sim_rev.h" +#include "sim_ether.h" #include #include #include @@ -409,9 +410,11 @@ t_stat shift_args (char *do_arg[], size_t arg_count); t_stat set_on (int32 flag, char *cptr); t_stat set_verify (int32 flag, char *cptr); t_stat set_message (int32 flag, char *cptr); +t_stat set_quiet (int32 flag, char *cptr); t_stat set_asynch (int32 flag, char *cptr); t_stat do_cmd_label (int32 flag, char *cptr, char *label); - +void int_handler (int signal); +void run_cmd_message (const char *unechod_cmdline, t_stat r); /* Global data */ @@ -448,7 +451,7 @@ FILEREF *sim_log_ref = NULL; /* log file file referen FILE *sim_deb = NULL; /* debug file */ FILEREF *sim_deb_ref = NULL; /* debug file file reference */ static FILE *sim_gotofile; /* the currently open do file */ -static int32 sim_goto_line; /* the current line number in the currently open do file */ +static int32 sim_goto_line[MAX_DO_NEST_LVL+1]; /* the current line number in the currently open do file */ static int32 sim_do_echo = 0; /* the echo status of the currently open do file */ static int32 sim_show_message = 1; /* the message display status of the currently open do file */ static int32 sim_on_inherit = 0; /* the inherit status of on state and conditions when executing do files */ @@ -457,6 +460,7 @@ int32 sim_do_depth = 0; static int32 sim_on_check[MAX_DO_NEST_LVL+1]; static char *sim_on_actions[MAX_DO_NEST_LVL+1][SCPE_MAX_ERR+1]; static char sim_do_filename[MAX_DO_NEST_LVL+1][CBUFSIZE]; +static char *sim_do_label[MAX_DO_NEST_LVL+1]; static t_stat sim_last_cmd_stat; /* Command Status */ @@ -577,15 +581,15 @@ static CTAB cmd_table[] = { { "EVALUATE", &eval_cmd, 0, "ev{aluate} evaluate symbolic expression\n" }, { "RUN", &run_cmd, RU_RUN, - "ru{n} {new PC} reset and start simulation\n" }, + "ru{n} {new PC} reset and start simulation\n", &run_cmd_message }, { "GO", &run_cmd, RU_GO, - "go {new PC} start simulation\n" }, + "go {new PC} start simulation\n", &run_cmd_message }, { "STEP", &run_cmd, RU_STEP, - "s{tep} {n} simulate n instructions\n" }, + "s{tep} {n} simulate n instructions\n", &run_cmd_message }, { "CONT", &run_cmd, RU_CONT, - "c{ont} continue simulation\n" }, + "c{ont} continue simulation\n", &run_cmd_message }, { "BOOT", &run_cmd, RU_BOOT, - "b{oot} bootstrap unit\n" }, + "b{oot} bootstrap unit\n", &run_cmd_message }, { "BREAK", &brk_cmd, SSH_ST, "br{eak} set breakpoints\n" }, { "NOBREAK", &brk_cmd, SSH_CL, @@ -655,9 +659,13 @@ static CTAB cmd_table[] = { "set on inherit enables inheritance of ON state and actions into do command files\n" "set on noinherit disables inheritance of ON state and actions into do command files\n" "set verify re-enables display of command file processed commands\n" + "set verbose re-enables display of command file processed commands\n" "set noverify disables display of command file processed commands\n" + "set noverbose disables display of command file processed commands\n" "set message re-enables display of command file error messages\n" "set nomessage disables display of command file error messages\n" + "set quiet disables suppression of some output and messages\n" + "set noquiet re-enables suppression of some output and messages\n" "set OCT|DEC|HEX set device display radix\n" "set ENABLED enable device\n" "set DISABLED disable device\n" @@ -688,9 +696,10 @@ static CTAB cmd_table[] = { "sh{ow} SHOW show device SHOW commands\n" "sh{ow} {arg,...} show device parameters\n" "sh{ow} {arg,...} show unit parameters\n" + "sh{ow} ethernet show ethernet devices\n" "sh{ow} on show on condition actions\n" }, { "DO", &do_cmd, 1, - "do {-V} {-O} {-E} {arg,arg...}\b" + "do {-V} {-O} {-E} {-Q} {arg,arg...}\b" " process command file\n" }, { "GOTO", &goto_cmd, 1, "goto

set the current directory\n" "set log log_file specify the log destination\n" " (STDOUT,DEBUG or filename)\n" "set nolog disables any currently active logging\n" @@ -695,6 +708,7 @@ static CTAB cmd_table[] = { "sh{ow} th{rottle} show simulation rate\n" "sh{ow} a{synch} show asynchronouse I/O state\n" "sh{ow} ve{rsion} show simulator version\n" + "sh{ow} def{ault} show current directory\n" "sh{ow} RADIX show device display radix\n" "sh{ow} DEBUG show device debug flags\n" "sh{ow} MODIFIERS show device modifiers\n" @@ -1767,6 +1781,7 @@ C1TAB *ctbr, *glbr; static CTAB set_glob_tab[] = { { "CONSOLE", &sim_set_console, 0 }, { "BREAK", &brk_cmd, SSH_ST }, + { "DEFAULT", &set_default_cmd, 1 }, { "NOBREAK", &brk_cmd, SSH_CL }, { "TELNET", &sim_set_telnet, 0 }, /* deprecated */ { "NOTELNET", &sim_set_notelnet, 0 }, /* deprecated */ @@ -2046,6 +2061,7 @@ static SHTAB show_glob_tab[] = { { "NAMES", &show_log_names, 0 }, { "SHOW", &show_show_commands, 0 }, { "VERSION", &show_version, 1 }, + { "DEFAULT", &show_default, 0 }, { "CONSOLE", &sim_show_console, 0 }, { "BREAK", &show_break, 0 }, { "LOG", &sim_show_log, 0 }, /* deprecated */ @@ -2559,6 +2575,33 @@ if (dptr->modifiers) { return SCPE_OK; } +/* Show/change the current working directiory commands */ + +t_stat show_default (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr) +{ +char buffer[PATH_MAX]; +char *wd = getcwd(buffer, PATH_MAX); +fprintf (st, "%s\n", wd); +return SCPE_OK; +} + +t_stat set_default_cmd (int32 flg, char *cptr) +{ +if ((!cptr) || (*cptr == 0)) + return SCPE_2FARG; +sim_trim_endspc(cptr); +if (chdir(cptr) != 0) { + printf("Unable to change to: %s\n", cptr); + return SCPE_IOERR & SCPE_NOMESSAGE; +} +return SCPE_OK; +} + +t_stat pwd_cmd (int32 flg, char *cptr) +{ +return show_cmd (0, "DEFAULT"); +} + /* Breakpoint commands */ t_stat brk_cmd (int32 flg, char *cptr) From 1fda1b17088d24bf6bbe32ebf99c9c269e87a487 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 23 Oct 2012 14:37:19 -0700 Subject: [PATCH 18/63] scp.h, sim_console.h, sim_console.c - Changed SET CONSOLE DEBUG= and SET CONSOLE NODEBUG to enable/disable debugging for the console device --- scp.h | 2 ++ sim_console.c | 27 +++++++++++++++++++++------ sim_console.h | 3 ++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/scp.h b/scp.h index 26dfe5dd..2eb1872d 100644 --- a/scp.h +++ b/scp.h @@ -126,6 +126,8 @@ BRKTAB *sim_brk_fnd (t_addr loc); uint32 sim_brk_test (t_addr bloc, uint32 btyp); void sim_brk_clrspc (uint32 spc); char *match_ext (char *fnam, char *ext); +t_stat set_dev_debug (DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); +t_stat show_dev_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); const char *sim_error_text (t_stat stat); t_stat sim_string_to_stat (char *cptr, t_stat *cond); t_stat sim_cancel_step (void); diff --git a/sim_console.c b/sim_console.c index 2e4e4889..3ab9029e 100644 --- a/sim_console.c +++ b/sim_console.c @@ -119,6 +119,7 @@ #include "sim_defs.h" #include "sim_tmxr.h" +#include "sim_timer.h" #include /* Forward Declaraations of Platform specific routines */ @@ -211,8 +212,8 @@ static CTAB set_con_tab[] = { { "NOSERIAL", &sim_set_noserial, 0 }, { "LOG", &sim_set_logon, 0 }, { "NOLOG", &sim_set_logoff, 0 }, - { "DEBUG", &sim_set_debon, 0 }, - { "NODEBUG", &sim_set_deboff, 0 }, + { "DEBUG", &sim_set_cons_debug, 1 }, + { "NODEBUG", &sim_set_cons_debug, 0 }, { NULL, NULL, 0 } }; @@ -223,7 +224,7 @@ static SHTAB show_con_tab[] = { { "PCHAR", &sim_show_pchar, 0 }, { "LOG", &sim_show_cons_log, 0 }, { "TELNET", &sim_show_telnet, 0 }, - { "DEBUG", &sim_show_debug, 0 }, + { "DEBUG", &sim_show_cons_debug, 0 }, { "BUFFERED", &sim_show_cons_buff, 0 }, { NULL, NULL, 0 } }; @@ -611,6 +612,20 @@ else return SCPE_OK; } +/* Set console Debug Mode */ + +t_stat sim_set_cons_debug (int32 flg, char *cptr) +{ +return set_dev_debug (&sim_con_telnet, &sim_con_unit, flg, cptr); +} + +t_stat sim_show_cons_debug (FILE *st, DEVICE *dunused, UNIT *uunused, int32 flag, char *cptr) +{ +if (cptr && (*cptr != 0)) + return SCPE_2MARG; +return show_dev_debug (st, &sim_con_telnet, &sim_con_unit, flag, cptr); +} + /* Set console to Serial port (and parameters) */ t_stat sim_set_serial (int32 flag, char *cptr) @@ -1040,7 +1055,7 @@ run_mode.stat2 = cmd_mode.stat2 | TT2$M_PASTHRU; return SCPE_OK; } -t_stat sim_ttrun (void) +t_stat sim_os_ttrun (void) { unsigned int status; IOSB iosb; @@ -1052,7 +1067,7 @@ if ((status != SS$_NORMAL) || (iosb.status != SS$_NORMAL)) return SCPE_OK; } -t_stat sim_ttcmd (void) +t_stat sim_os_ttcmd (void) { unsigned int status; IOSB iosb; @@ -1130,7 +1145,7 @@ else if (sim_brk_char && (buf[0] == sim_brk_char)) buffered_character = SCPE_BREAK; else - buffered_character = (buf[0] | SCPE_KFLAG) + buffered_character = (buf[0] | SCPE_KFLAG); return TRUE; } diff --git a/sim_console.h b/sim_console.h index 9ad4342b..df032838 100644 --- a/sim_console.h +++ b/sim_console.h @@ -60,6 +60,7 @@ t_stat sim_set_noserial (int32 flag, char *cptr); t_stat sim_set_logon (int32 flag, char *cptr); t_stat sim_set_logoff (int32 flag, char *cptr); t_stat sim_set_debon (int32 flag, char *cptr); +t_stat sim_set_cons_debug (int32 flg, char *cptr); t_stat sim_set_cons_buff (int32 flg, char *cptr); t_stat sim_set_cons_unbuff (int32 flg, char *cptr); t_stat sim_set_cons_log (int32 flg, char *cptr); @@ -74,6 +75,7 @@ t_stat sim_show_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cpt t_stat sim_show_pchar (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); t_stat sim_show_cons_buff (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); t_stat sim_show_cons_log (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); +t_stat sim_show_cons_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); t_stat sim_check_console (int32 sec); t_stat sim_open_logfile (char *filename, t_bool binary, FILE **pf, FILEREF **pref); t_stat sim_close_logfile (FILEREF **pref); @@ -87,7 +89,6 @@ t_stat sim_ttcmd (void); t_stat sim_ttclose (void); t_bool sim_ttisatty(void); t_stat sim_os_poll_kbd (void); -t_stat sim_os_putchar (int32 out); int32 sim_tt_inpcvt (int32 c, uint32 mode); int32 sim_tt_outcvt (int32 c, uint32 mode); From 15e648f560190945bb9e1374634dd2e8db4cee05 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 23 Oct 2012 14:40:56 -0700 Subject: [PATCH 19/63] sim_tmxr.c Fixed console behaviors the console is directed to a serial port. --- sim_tmxr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sim_tmxr.c b/sim_tmxr.c index d83a63fc..1bd4d9e9 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1950,7 +1950,8 @@ for (i = 0; i < mp->lines; i++) { /* loop thru conn */ } } -sim_close_sock (mp->master, 1); /* close master socket */ +if (mp->master) + sim_close_sock (mp->master, 1); /* close master socket */ mp->master = 0; free (mp->port); mp->port = NULL; From 5cd9449b29f51ddda59dfa782a2aa8f92eafad51 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 23 Oct 2012 14:41:26 -0700 Subject: [PATCH 20/63] sim_defs.h fixed compile on VMS --- sim_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim_defs.h b/sim_defs.h index 4e81aed2..fbc3b4ec 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -588,7 +588,7 @@ extern int32 sim_asynch_inst_latency; /* Thread local storage */ #if defined(__GNUC__) && !defined(__APPLE__) #define AIO_TLS __thread -#elif defined(__DECC_VER) || defined(_MSC_VER) +#elif defined(_MSC_VER) #define AIO_TLS __declspec(thread) #else /* Other compiler environment, then don't worry about thread local storage. */ From 9411f3f4bd78992817459c0191497b5714982fa8 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 24 Oct 2012 12:53:55 -0700 Subject: [PATCH 21/63] Added missing comments for HP2100 multiplexer source modules (Dave Bryan) --- HP2100/hp2100_baci.c | 1 + HP2100/hp2100_mpx.c | 1 + HP2100/hp2100_mux.c | 1 + 3 files changed, 3 insertions(+) diff --git a/HP2100/hp2100_baci.c b/HP2100/hp2100_baci.c index 063705a6..0fa2d2c7 100644 --- a/HP2100/hp2100_baci.c +++ b/HP2100/hp2100_baci.c @@ -26,6 +26,7 @@ BACI 12966A BACI card 10-Feb-12 JDB Deprecated DEVNO in favor of SC + Removed DEV_NET to allow restoration of listening port 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines diff --git a/HP2100/hp2100_mpx.c b/HP2100/hp2100_mpx.c index a4d91dd9..3c0a0180 100644 --- a/HP2100/hp2100_mpx.c +++ b/HP2100/hp2100_mpx.c @@ -26,6 +26,7 @@ MPX 12792C 8-channel multiplexer card 10-Feb-12 JDB Deprecated DEVNO in favor of SC + Removed DEV_NET to allow restoration of listening port 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines diff --git a/HP2100/hp2100_mux.c b/HP2100/hp2100_mux.c index f341a51d..672ba3cf 100644 --- a/HP2100/hp2100_mux.c +++ b/HP2100/hp2100_mux.c @@ -26,6 +26,7 @@ MUX,MUXL,MUXM 12920A terminal multiplexor 10-Feb-12 JDB Deprecated DEVNO in favor of SC + Removed DEV_NET to allow restoration of listening port 28-Mar-11 JDB Tidied up signal handling 26-Oct-10 JDB Changed I/O signal handler for revised signal model 25-Nov-08 JDB Revised for new multiplexer library SHOW routines From 99f042f7dcde8b2e10f9f6875b8aa556e40d0e20 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 24 Oct 2012 12:56:03 -0700 Subject: [PATCH 22/63] scp.c - Fixed RESTORE command to detach all attached devices before actually restoring. The goal here is to make restore behavior consistent without regard to the current VM state prior to the restore. --- scp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scp.c b/scp.c index 4f57e1df..5141bff4 100644 --- a/scp.c +++ b/scp.c @@ -3333,7 +3333,7 @@ if (v32) { /* [V3.2+] time as strin } else READ_I (sim_time); /* sim time */ READ_I (sim_rtime); /* [V2.6+] sim rel time */ - +detach_all (0, 0); /* Detach everything to start from a consistent state */ for ( ;; ) { /* device loop */ READ_S (buf); /* read device name */ if (buf[0] == 0) /* last? */ From ef147d20587791a73866b5b202ce4c4c6ced2234 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 24 Oct 2012 12:57:37 -0700 Subject: [PATCH 23/63] HP2100 fixes to avoid potential namespace clashes with names defined in unistd.h. (Dave Bryan) --- HP2100/hp2100_di_da.c | 9 ++- HP2100/hp2100_ds.c | 57 +++++++------- HP2100/hp_disclib.c | 169 +++++++++++++++++++++--------------------- HP2100/hp_disclib.h | 49 ++++++------ 4 files changed, 144 insertions(+), 140 deletions(-) diff --git a/HP2100/hp2100_di_da.c b/HP2100/hp2100_di_da.c index 9ce38860..a3d73fdd 100644 --- a/HP2100/hp2100_di_da.c +++ b/HP2100/hp2100_di_da.c @@ -25,6 +25,7 @@ DA 12821A Disc Interface with Amigo disc drives + 24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash 07-May-12 JDB Cancel the intersector delay if an untalk is received 29-Mar-12 JDB First release 04-Nov-11 JDB Created DA device @@ -757,7 +758,7 @@ switch (if_state [unit]) { /* dispatch the inte case disc_command: /* execute a disc command */ result = dl_service_drive (cvptr, uptr); /* service the disc unit */ - if (cvptr->opcode == clear) /* is this a Clear command? */ + if (cvptr->opcode == Clear) /* is this a Clear command? */ if_dsj [unit] = 2; /* indicate that the self test is complete */ if (cvptr->state != cntlr_busy) { /* has the controller stopped? */ @@ -857,7 +858,7 @@ switch (if_state [unit]) { /* dispatch the inte if (cvptr->length == 0 || cvptr->eod == SET) { /* is the data phase complete? */ uptr->PHASE = end_phase; /* set the end phase */ - if (cvptr->opcode == request_status) /* is it a Request Status command? */ + if (cvptr->opcode == Request_Status) /* is it a Request Status command? */ if_dsj [unit] = 0; /* clear the DSJ value */ if_state [unit] = command_exec; /* set to execute the command */ @@ -981,7 +982,7 @@ if (result == SCPE_IERR && DEBUG_PRI (da_dev, DEB_RWSC)) { /* did an internal e if (if_state [unit] == idle) { /* is the command now complete? */ if (if_command [unit] == disc_command) { /* did a disc command complete? */ - if (cvptr->opcode != end) /* yes; if the command was not End, */ + if (cvptr->opcode != End) /* yes; if the command was not End, */ di_poll_response (da, unit, SET); /* then enable PPR */ if (DEBUG_PRI (da_dev, DEB_RWSC)) @@ -1267,7 +1268,7 @@ result = dl_load_unload (&icd_cntlr [unit], uptr, load); /* load or unload th if (result == SCPE_OK && ! load) { /* was the unload successful? */ icd_cntlr [unit].status = drive_attention; /* set Drive Attention status */ - if (uptr->OP == end) /* is the controller in idle state 2? */ + if (uptr->OP == End) /* is the controller in idle state 2? */ di_poll_response (da, unit, SET); /* enable PPR */ } diff --git a/HP2100/hp2100_ds.c b/HP2100/hp2100_ds.c index 29df4589..f42a7c8c 100644 --- a/HP2100/hp2100_ds.c +++ b/HP2100/hp2100_ds.c @@ -26,6 +26,7 @@ DS 13037D/13175D disc controller/interface + 24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash 29-Mar-12 JDB Rewritten to use the MAC/ICD disc controller library ioIOO now notifies controller service of parameter output 14-Feb-12 JDB Corrected SRQ generation and FIFO under/overrun detection @@ -705,10 +706,10 @@ result = dl_service_drive (&mac_cntlr, uptr); /* service the drive */ if ((CNTLR_PHASE) uptr->PHASE == data_phase) /* is the drive in the data phase? */ switch ((CNTLR_OPCODE) uptr->OP) { /* dispatch the current operation */ - case read: /* read operations */ - case read_full_sector: - case read_with_offset: - case read_without_verify: + case Read: /* read operations */ + case Read_Full_Sector: + case Read_With_Offset: + case Read_Without_Verify: if (mac_cntlr.length == 0 || ds.edt == SET) { /* is the data phase complete? */ mac_cntlr.eod = ds.edt; /* set EOD if DCPC is done */ uptr->PHASE = end_phase; /* set the end phase */ @@ -729,9 +730,9 @@ if ((CNTLR_PHASE) uptr->PHASE == data_phase) /* is the drive in the d break; - case write: /* write operations */ - case write_full_sector: - case initialize: + case Write: /* write operations */ + case Write_Full_Sector: + case Initialize: if (entry_phase == start_phase) { /* is this the phase transition? */ ds.srq = SET; /* start the DCPC transfer */ ds_io (&ds_dib, ioSIR, 0); /* and recalculate the interrupts */ @@ -850,19 +851,19 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current case end_phase: /* start and end on the same phase */ switch (opcode) { /* dispatch the current operation */ - case request_status: - case request_sector_address: - case address_record: - case request_syndrome: - case load_tio_register: - case request_disc_address: - case end: + case Request_Status: + case Request_Sector_Address: + case Address_Record: + case Request_Syndrome: + case Load_TIO_Register: + case Request_Disc_Address: + case End: break; /* complete the operation without setting the flag */ - case clear: - case set_file_mask: - case wakeup: + case Clear: + case Set_File_Mask: + case Wakeup: ds_io (&ds_dib, ioENF, 0); /* complete the operation and set the flag */ break; @@ -877,11 +878,11 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current case data_phase: switch (opcode) { /* dispatch the current operation */ - case seek: /* operations that accept parameters */ - case verify: - case address_record: - case read_with_offset: - case load_tio_register: + case Seek: /* operations that accept parameters */ + case Verify: + case Address_Record: + case Read_With_Offset: + case Load_TIO_Register: buffer [mac_cntlr.index++] = fifo_unload (); /* unload the next word from the FIFO */ mac_cntlr.length--; /* count it */ @@ -891,7 +892,7 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current else { /* all parameters have been received */ uptr->PHASE = end_phase; /* set the end phase */ - if (opcode == read_with_offset) /* a Read With Offset command sets the flag */ + if (opcode == Read_With_Offset) /* a Read With Offset command sets the flag */ ds_io (&ds_dib, ioENF, 0); /* to indicate that offsetting is complete */ start_command (); /* the command is now ready to execute */ @@ -899,10 +900,10 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current break; - case request_status: /* operations that supply parameters */ - case request_sector_address: - case request_syndrome: - case request_disc_address: + case Request_Status: /* operations that supply parameters */ + case Request_Sector_Address: + case Request_Syndrome: + case Request_Disc_Address: if (mac_cntlr.length) { /* are there more words to return? */ fifo_load (buffer [mac_cntlr.index++]); /* load the next word into the FIFO */ mac_cntlr.length--; /* count it */ @@ -1258,7 +1259,7 @@ unit = GET_S1UNIT (mac_cntlr.spd_unit); /* get the (prepared) un if (unit <= DL_MAXDRIVE) /* is the unit number valid? */ drive_command = (CNTLR_OPCODE) ds_unit [unit].OP; /* get the opcode from the unit that will be used */ else /* the unit is invalid, so the command will not start */ - drive_command = end; /* but the compiler doesn't know this! */ + drive_command = End; /* but the compiler doesn't know this! */ uptr = dl_start_command (&mac_cntlr, ds_unit, DL_MAXDRIVE); /* ask the controller to start the command */ diff --git a/HP2100/hp_disclib.c b/HP2100/hp_disclib.c index ea51945e..128d64da 100644 --- a/HP2100/hp_disclib.c +++ b/HP2100/hp_disclib.c @@ -24,6 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the authors. + 24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash 07-May-12 JDB Corrected end-of-track delay time logic 02-May-12 JDB First release 09-Nov-11 JDB Created disc controller common library from DS simulator @@ -594,8 +595,8 @@ set_timer (cvptr, CLEAR); /* stop the command wait opcode = GET_OPCODE (cvptr->buffer [0]); /* get the opcode from the command */ -if (opcode > last_opcode) /* is the opcode invalid? */ - props = &cmd_props [invalid_opcode]; /* undefined commands clear prior status */ +if (opcode > Last_Opcode) /* is the opcode invalid? */ + props = &cmd_props [Invalid_Opcode]; /* undefined commands clear prior status */ else /* the opcode is potentially valid */ props = &cmd_props [opcode]; /* get the command properties */ @@ -794,7 +795,7 @@ cvptr->eod = CLEAR; /* clear the end of data switch (cvptr->opcode) { /* dispatch the command */ - case cold_load_read: + case Cold_Load_Read: cvptr->cylinder = 0; /* set the cylinder address to 0 */ cvptr->head = GET_CHEAD (cvptr->buffer [0]); /* set the head */ cvptr->sector = GET_CSECT (cvptr->buffer [0]); /* and sector from the command */ @@ -802,7 +803,7 @@ switch (cvptr->opcode) { /* dispatch the command if (is_seeking) { /* if a seek is in progress, */ uptr->STAT |= DL_S2SC; /* a Seek Check occurs */ cvptr->file_mask = DL_FSPEN; /* enable sparing */ - uptr->OP = read; /* start the read on the seek completion */ + uptr->OP = Read; /* start the read on the seek completion */ uptr->PHASE = start_phase; /* and reset the command phase */ return uptr; /* to allow the seek to complete normally */ } @@ -813,7 +814,7 @@ switch (cvptr->opcode) { /* dispatch the command break; - case seek: + case Seek: cvptr->cylinder = cvptr->buffer [1]; /* get the supplied cylinder */ cvptr->head = GET_HEAD (cvptr->buffer [2]); /* and head */ cvptr->sector = GET_SECTOR (cvptr->buffer [2]); /* and sector addresses */ @@ -827,7 +828,7 @@ switch (cvptr->opcode) { /* dispatch the command break; - case request_status: + case Request_Status: cvptr->buffer [0] = /* set the Status-1 value */ cvptr->spd_unit | SET_S1STAT (cvptr->status); /* into the buffer */ @@ -854,12 +855,12 @@ switch (cvptr->opcode) { /* dispatch the command break; - case request_disc_address: + case Request_Disc_Address: set_address (cvptr, 0); /* return the CHS values in buffer 0-1 */ break; - case request_sector_address: + case Request_Sector_Address: if (unit > unit_limit) /* if the unit number is invalid */ rptr = NULL; /* it does not correspond to a unit */ else /* otherwise, the unit is valid */ @@ -872,7 +873,7 @@ switch (cvptr->opcode) { /* dispatch the command break; - case request_syndrome: + case Request_Syndrome: cvptr->buffer [0] = /* return the Status-1 value in buffer 0 */ cvptr->spd_unit | SET_S1STAT (cvptr->status); @@ -885,7 +886,7 @@ switch (cvptr->opcode) { /* dispatch the command break; - case address_record: + case Address_Record: cvptr->cylinder = cvptr->buffer [1]; /* get the supplied cylinder */ cvptr->head = GET_HEAD (cvptr->buffer [2]); /* and head */ cvptr->sector = GET_SECTOR (cvptr->buffer [2]); /* and sector addresses */ @@ -893,7 +894,7 @@ switch (cvptr->opcode) { /* dispatch the command break; - case set_file_mask: + case Set_File_Mask: cvptr->file_mask = GET_FMASK (cvptr->buffer [0]); /* get the supplied file mask */ if (cvptr->type == MAC) /* if this is a MAC controller, */ @@ -901,14 +902,14 @@ switch (cvptr->opcode) { /* dispatch the command break; - case initialize: + case Initialize: if (uptr) /* if the unit is valid, */ cvptr->spd_unit |= /* merge the SPD flags */ SET_S1SPD (GET_SPD (cvptr->buffer [0])); /* from the command word */ break; - case verify: + case Verify: cvptr->verify_count = cvptr->buffer [1]; /* get the supplied sector count */ break; @@ -1078,35 +1079,35 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ case start_phase: switch (opcode) { /* dispatch the current operation */ - case recalibrate: - case seek: + case Recalibrate: + case Seek: if (start_seek (cvptr, uptr, opcode, end_phase) /* start the seek; if it succeeded, */ && (cvptr->type == MAC)) /* and this a MAC controller, */ dl_idle_controller (cvptr); /* then go idle until it completes */ break; - case cold_load_read: - if (start_seek (cvptr, uptr, read, start_phase)) /* start the seek; did it succeed? */ + case Cold_Load_Read: + if (start_seek (cvptr, uptr, Read, start_phase)) /* start the seek; did it succeed? */ cvptr->file_mask = DL_FSPEN; /* set sparing enabled now */ break; - case read: - case read_with_offset: - case read_without_verify: + case Read: + case Read_With_Offset: + case Read_Without_Verify: cvptr->length = DL_WPSEC; /* transfer just the data */ result = start_read (cvptr, uptr); /* start the sector read */ break; - case read_full_sector: + case Read_Full_Sector: cvptr->length = DL_WPFSEC; /* transfer the header/data/trailer */ result = start_read (cvptr, uptr); /* start the sector read */ break; - case verify: + case Verify: cvptr->length = 0; /* no data transfer needed */ result = start_read (cvptr, uptr); /* start the sector read */ @@ -1118,29 +1119,29 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ break; - case write: - case initialize: + case Write: + case Initialize: cvptr->length = DL_WPSEC; /* transfer just the data */ start_write (cvptr, uptr); /* start the sector write */ break; - case write_full_sector: + case Write_Full_Sector: cvptr->length = DL_WPFSEC; /* transfer the header/data/trailer */ start_write (cvptr, uptr); /* start the sector write */ break; - case request_status: - case request_sector_address: - case clear: - case address_record: - case request_syndrome: - case set_file_mask: - case load_tio_register: - case request_disc_address: - case end: - case wakeup: + case Request_Status: + case Request_Sector_Address: + case Clear: + case Address_Record: + case Request_Syndrome: + case Set_File_Mask: + case Load_TIO_Register: + case Request_Disc_Address: + case End: + case Wakeup: dl_service_controller (cvptr, uptr); /* the controller service handles these */ break; @@ -1154,13 +1155,13 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ case data_phase: switch (opcode) { /* dispatch the current operation */ - case read: - case read_full_sector: - case read_with_offset: - case read_without_verify: - case write: - case write_full_sector: - case initialize: + case Read: + case Read_Full_Sector: + case Read_With_Offset: + case Read_Without_Verify: + case Write: + case Write_Full_Sector: + case Initialize: break; /* data transfers are handled by the caller */ @@ -1174,8 +1175,8 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ case end_phase: switch (opcode) { /* dispatch the operation command */ - case recalibrate: - case seek: + case Recalibrate: + case Seek: if (cvptr->type == ICD) /* is this an ICD controller? */ dl_end_command (cvptr, drive_attention); /* seeks end with Drive Attention status */ else /* if not an ICD controller, */ @@ -1183,22 +1184,22 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ break; - case read: - case read_full_sector: - case read_with_offset: + case Read: + case Read_Full_Sector: + case Read_With_Offset: end_read (cvptr, uptr); /* end the sector read */ break; - case read_without_verify: + case Read_Without_Verify: if (cvptr->sector == 0) /* have we reached the end of the track? */ - uptr->OP = read; /* begin verifying the next time */ + uptr->OP = Read; /* begin verifying the next time */ end_read (cvptr, uptr); /* end the sector read */ break; - case verify: + case Verify: cvptr->verify_count = /* decrement the count */ (cvptr->verify_count - 1) & DMASK; /* modulo 65536 */ @@ -1209,16 +1210,16 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ break; - case write: - case write_full_sector: - case initialize: + case Write: + case Write_Full_Sector: + case Initialize: result = end_write (cvptr, uptr); /* end the sector write */ break; - case request_status: - case request_sector_address: - case request_disc_address: + case Request_Status: + case Request_Sector_Address: + case Request_Disc_Address: dl_service_controller (cvptr, uptr); /* the controller service handles these */ break; @@ -1278,33 +1279,33 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ case start_phase: case end_phase: switch (opcode) { /* dispatch the current operation */ - case request_status: + case Request_Status: dl_end_command (cvptr, cvptr->status); /* the command completes with no status change */ break; - case clear: + case Clear: dl_clear_controller (cvptr, uptr, soft_clear); /* clear the controller */ dl_end_command (cvptr, normal_completion); /* the command is complete */ break; - case request_sector_address: - case address_record: - case request_syndrome: - case set_file_mask: - case load_tio_register: - case request_disc_address: + case Request_Sector_Address: + case Address_Record: + case Request_Syndrome: + case Set_File_Mask: + case Load_TIO_Register: + case Request_Disc_Address: dl_end_command (cvptr, normal_completion); /* the command is complete */ break; - case end: + case End: dl_idle_controller (cvptr); /* the command completes with the controller idle */ break; - case wakeup: + case Wakeup: dl_end_command (cvptr, unit_available); /* the command completes with Unit Available status */ break; @@ -1319,11 +1320,11 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ case data_phase: switch (opcode) { /* dispatch the current operation */ - case seek: - case verify: - case address_record: - case read_with_offset: - case load_tio_register: + case Seek: + case Verify: + case Address_Record: + case Read_With_Offset: + case Load_TIO_Register: if (cvptr->length > 1) /* at least one more parameter to input? */ set_timer (cvptr, SET); /* restart the timer for the next parameter */ else /* this is the last one */ @@ -1331,10 +1332,10 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the phase */ break; - case request_status: - case request_sector_address: - case request_syndrome: - case request_disc_address: + case Request_Status: + case Request_Sector_Address: + case Request_Syndrome: + case Request_Disc_Address: if (cvptr->length > 0) /* at least one more to parameter output? */ set_timer (cvptr, SET); /* restart the timer for the next parameter */ else /* this is the last one */ @@ -1505,8 +1506,8 @@ for (unit = 0; unit < unit_count; unit++) { /* loop through the unit if (!(uptr->flags & UNIT_DIS)) { /* is the unit enabled? */ if (clear_type == hard_clear /* a hard clear cancels */ - && uptr->OP != seek /* only if not seeking */ - && uptr->OP != recalibrate) /* or recalibrating */ + && uptr->OP != Seek /* only if not seeking */ + && uptr->OP != Recalibrate) /* or recalibrating */ sim_cancel (uptr); /* cancel the service */ uptr->STAT &= ~DL_S2CPS; /* do "Controller Preset" for the unit */ @@ -1597,7 +1598,7 @@ return SCPE_OK; CNTLR_CLASS dl_classify (CNTLR_VARS cntlr) { if (cntlr.type <= last_type /* if the controller type is legal */ - && cntlr.opcode <= last_opcode /* and the opcode is legal */ + && cntlr.opcode <= Last_Opcode /* and the opcode is legal */ && cmd_props [cntlr.opcode].valid [cntlr.type]) /* and is defined for this controller, */ return cmd_props [cntlr.opcode].classification; /* then return the command classification */ else /* the type or opcode is illegal */ @@ -1615,7 +1616,7 @@ else /* the type or opcode is const char *dl_opcode_name (CNTLR_TYPE controller, CNTLR_OPCODE opcode) { if (controller <= last_type /* if the controller type is legal */ - && opcode <= last_opcode /* and the opcode is legal */ + && opcode <= Last_Opcode /* and the opcode is legal */ && cmd_props [opcode].valid [controller]) /* and is defined for this controller, */ return opcode_name [opcode]; /* then return the opcode name */ else /* the type or opcode is illegal, */ @@ -1776,7 +1777,7 @@ if (cvptr->eod == SET) { /* is the end of data in return SCPE_OK; } -if (opcode == read_full_sector) { /* are we starting a Read Full Sector command? */ +if (opcode == Read_Full_Sector) { /* are we starting a Read Full Sector command? */ if (cvptr->type == ICD) /* is this an ICD controller? */ cvptr->buffer [0] = 0100377; /* ICD does not support ECC */ else @@ -1789,7 +1790,7 @@ if (opcode == read_full_sector) { /* are we starting a Rea else { /* it's another read command */ offset = 0; /* data starts at the beginning */ - verify = (opcode != read_without_verify); /* set for address verification unless it's a RWV */ + verify = (opcode != Read_Without_Verify); /* set for address verification unless it's a RWV */ } if (! position_sector (cvptr, uptr, verify)) /* position the sector */ @@ -1911,7 +1912,7 @@ return; static void start_write (CVPTR cvptr, UNIT *uptr) { -const t_bool verify = (CNTLR_OPCODE) uptr->OP == write; /* only Write verifies the sector address */ +const t_bool verify = (CNTLR_OPCODE) uptr->OP == Write; /* only Write verifies the sector address */ if ((uptr->flags & UNIT_WPROT) /* is the unit write protected, */ || !verify && !(uptr->flags & UNIT_FMT)) /* or is formatting required but not enabled? */ @@ -1959,7 +1960,7 @@ static t_stat end_write (CVPTR cvptr, UNIT *uptr) uint32 count; uint16 pad; const CNTLR_OPCODE opcode = (CNTLR_OPCODE) uptr->OP; -const uint32 offset = (opcode == write_full_sector ? 3 : 0); +const uint32 offset = (opcode == Write_Full_Sector ? 3 : 0); if (uptr->flags & UNIT_UNLOAD) { /* if the drive is not ready, */ dl_end_command (cvptr, access_not_ready); /* terminate the command with an error */ @@ -2200,7 +2201,7 @@ if (uptr->flags & UNIT_UNLOAD) { /* are the heads unloade return FALSE; /* as the drive was not ready */ } -if ((CNTLR_OPCODE) uptr->OP == recalibrate) /* is the unit recalibrating? */ +if ((CNTLR_OPCODE) uptr->OP == Recalibrate) /* is the unit recalibrating? */ target_cylinder = 0; /* seek to cylinder 0 and don't reset the EOC flag */ else { /* it's a Seek command or an auto-seek request */ diff --git a/HP2100/hp_disclib.h b/HP2100/hp_disclib.h index 90b2d82b..fb5d6ef8 100644 --- a/HP2100/hp_disclib.h +++ b/HP2100/hp_disclib.h @@ -24,6 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the authors. + 24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash 07-May-12 JDB Added end-of-track delay time as a controller variable 02-May-12 JDB First release 09-Nov-11 JDB Created disc controller common library from DS simulator @@ -206,29 +207,29 @@ typedef enum { /* Controller opcodes */ typedef enum { - cold_load_read = 000, - recalibrate = 001, - seek = 002, - request_status = 003, - request_sector_address = 004, - read = 005, - read_full_sector = 006, - verify = 007, - write = 010, - write_full_sector = 011, - clear = 012, - initialize = 013, - address_record = 014, - request_syndrome = 015, - read_with_offset = 016, - set_file_mask = 017, - invalid_opcode = 020, - read_without_verify = 022, - load_tio_register = 023, - request_disc_address = 024, - end = 025, - wakeup = 026, - last_opcode = wakeup /* last valid opcode */ + Cold_Load_Read = 000, + Recalibrate = 001, + Seek = 002, + Request_Status = 003, + Request_Sector_Address = 004, + Read = 005, + Read_Full_Sector = 006, + Verify = 007, + Write = 010, + Write_Full_Sector = 011, + Clear = 012, + Initialize = 013, + Address_Record = 014, + Request_Syndrome = 015, + Read_With_Offset = 016, + Set_File_Mask = 017, + Invalid_Opcode = 020, + Read_Without_Verify = 022, + Load_TIO_Register = 023, + Request_Disc_Address = 024, + End = 025, + Wakeup = 026, + Last_Opcode = Wakeup /* last valid opcode */ } CNTLR_OPCODE; #define DL_OPCODE_MASK 037 @@ -353,7 +354,7 @@ typedef CNTLR_VARS *CVPTR; /* pointer to controller */ #define CNTLR_INIT(ctype,bufptr,auxptr) \ - (ctype), cntlr_idle, end, normal_completion, \ + (ctype), cntlr_idle, End, normal_completion, \ CLEAR, CLEAR, \ 0, 0, 0, 0, 0, 0, 0, 0, \ (bufptr), 0, 0, (auxptr), \ From b356a98ea9024440184cefd46cb2d8d259b2c62b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 26 Oct 2012 05:02:44 -0700 Subject: [PATCH 24/63] hp2100_ipl.c - Removed DEV_NET to allow restoration of listening ports --- HP2100/hp2100_ipl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/HP2100/hp2100_ipl.c b/HP2100/hp2100_ipl.c index d20d0678..6622e258 100644 --- a/HP2100/hp2100_ipl.c +++ b/HP2100/hp2100_ipl.c @@ -25,6 +25,7 @@ IPLI, IPLO 12875A interprocessor link + 25-Oct-12 JDB Removed DEV_NET to allow restoration of listening ports 09-May-12 JDB Separated assignments from conditional expressions 10-Feb-12 JDB Deprecated DEVNO in favor of SC Added CARD_INDEX casts to dib.card_index @@ -188,7 +189,7 @@ DEVICE ipli_dev = { 1, 10, 31, 1, 16, 16, &tmxr_ex, &tmxr_dep, &ipl_reset, &ipl_boot, &ipl_attach, &ipl_detach, - &ipli_dib, DEV_NET | DEV_DISABLE | DEV_DIS | DEV_DEBUG, + &ipli_dib, DEV_DISABLE | DEV_DIS | DEV_DEBUG, 0, ipl_deb, NULL, NULL }; @@ -217,7 +218,7 @@ DEVICE iplo_dev = { 1, 10, 31, 1, 16, 16, &tmxr_ex, &tmxr_dep, &ipl_reset, &ipl_boot, &ipl_attach, &ipl_detach, - &iplo_dib, DEV_NET | DEV_DISABLE | DEV_DIS | DEV_DEBUG, + &iplo_dib, DEV_DISABLE | DEV_DIS | DEV_DEBUG, 0, ipl_deb, NULL, NULL }; From 8b59f2a12af6f8642fc2fe66d0386f28394bc0f9 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 27 Oct 2012 12:50:50 -0700 Subject: [PATCH 25/63] sim_tmxr.c - Fixed behavior when I/O errors happen on serial port connections. Now a message is displayed and the serial port is closed as opposed to the prior behavior where messages would be spewed incessantly with no benefit. --- sim_tmxr.c | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/sim_tmxr.c b/sim_tmxr.c index 1bd4d9e9..7d02743d 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -392,7 +392,7 @@ return; static void tmxr_report_connection (TMXR *mp, TMLN *lp) { -int32 written, psave; +int32 unwritten, psave; char cmsg[80]; char dmsg[80] = ""; char lmsg[80] = ""; @@ -428,9 +428,9 @@ lp->txbpi = lp->txbpr; /* insert connection mes tmxr_linemsg (lp, msgbuf); /* beginning of buffer */ lp->txbpi = psave; /* restore insertion pointer */ -written = tmxr_send_buffered_data (lp); /* send the message */ +unwritten = tmxr_send_buffered_data (lp); /* send the message */ -if (written == 0) /* buffer now empty? */ +if (unwritten == 0) /* buffer now empty? */ lp->xmte = 1; /* reenable transmission if paused */ lp->txcnt -= (int32)strlen (msgbuf); /* adjust statistics */ @@ -816,19 +816,27 @@ return -1; /* no new connections ma DTR is dropped and raised again after 500ms to signal the attached serial device. */ -t_stat tmxr_reset_ln (TMLN *lp) +static t_stat tmxr_reset_ln_ex (TMLN *lp, t_bool closeserial) { -tmxr_debug_trace_line (lp, "tmxr_reset_ln()"); - if (lp->txlog) /* logging? */ fflush (lp->txlog); /* flush log */ tmxr_send_buffered_data (lp); /* send any buffered data */ -if ((lp->serport) && (!lp->mp->modem_control)) { /* serial connection? */ - sim_control_serial (lp->serport, 0, TMXR_MDM_DTR|TMXR_MDM_RTS, NULL);/* drop DTR and RTS */ - sim_os_ms_sleep (TMXR_DTR_DROP_TIME); - sim_control_serial (lp->serport, TMXR_MDM_DTR|TMXR_MDM_RTS, 0, NULL);/* raise DTR and RTS */ +if (lp->serport) { + if (closeserial) { + sim_close_serial (lp->serport); + lp->serport = 0; + free (lp->serconfig); + lp->serconfig = NULL; + lp->cnms = 0; + } + else + if (!lp->mp->modem_control) { /* serial connection? */ + sim_control_serial (lp->serport, 0, TMXR_MDM_DTR|TMXR_MDM_RTS, NULL);/* drop DTR and RTS */ + sim_os_ms_sleep (TMXR_DTR_DROP_TIME); + sim_control_serial (lp->serport, TMXR_MDM_DTR|TMXR_MDM_RTS, 0, NULL);/* raise DTR and RTS */ + } } else /* Telnet connection */ if (lp->conn) { @@ -852,6 +860,18 @@ else { return SCPE_OK; } +t_stat tmxr_close_ln (TMLN *lp) +{ +tmxr_debug_trace_line (lp, "tmxr_close_ln()"); +return tmxr_reset_ln_ex (lp, TRUE); +} + +t_stat tmxr_reset_ln (TMLN *lp) +{ +tmxr_debug_trace_line (lp, "tmxr_reset_ln()"); +return tmxr_reset_ln_ex (lp, FALSE); +} + /* Enable modem control pass thru Inputs: @@ -1048,7 +1068,7 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ TMXR_MAXBUF - lp->rxbpi); if (nbytes < 0) /* line error? */ - tmxr_reset_ln (lp); /* disconnect line */ + tmxr_close_ln (lp); /* disconnect line */ else if (nbytes > 0) { /* if data rcvd */ @@ -1273,6 +1293,10 @@ if (nbytes) { /* >0? write */ lp->txcnt = lp->txcnt + sbytes; /* update counts */ nbytes = nbytes - sbytes; } + if (sbytes < 0) { /* I/O Error? */ + tmxr_close_ln (lp); /* close line/port on error */ + return nbytes; /* done now. */ + } if (nbytes && (lp->txbpr == 0)) { /* more data and wrap? */ sbytes = tmxr_write (lp, nbytes); if (sbytes > 0) { /* ok */ @@ -1843,7 +1867,10 @@ if (r != SCPE_OK) { /* error? */ mp->uptr = uptr; /* save unit for polling */ uptr->filename = _mux_attach_string (uptr->filename, mp);/* save */ uptr->flags = uptr->flags | UNIT_ATT; /* no more errors */ -if (mp->lines > 1) +if ((mp->lines > 1) || + ((mp->master == 0) && + (mp->ldsc[0].connecting == 0) && + (mp->ldsc[0].serport == 0))) uptr->flags = uptr->flags | UNIT_ATTMULT; /* allow multiple attach commands */ if (mp->dptr == NULL) /* has device been set? */ From 3e78dc6732dfef2baf2b41e33264f56dc2b1a80c Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 6 Nov 2012 16:38:43 -0800 Subject: [PATCH 26/63] sim_sock.c - preferred a bare textual IPv4 address be returned over an IPv4-mapped format address when returning the connecting IP address string in sim_accept_conn. --- sim_sock.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sim_sock.c b/sim_sock.c index 9f6444d1..fab7f64d 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -733,6 +733,8 @@ if (connectaddr != NULL) { *connectaddr = calloc(1, NI_MAXHOST+1); #ifdef AF_INET6 p_getnameinfo((struct sockaddr *)&clientname, size, *connectaddr, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if (0 == memcmp("::ffff:", *connectaddr, 7)) /* is this a IPv4-mapped IPv6 address? */ + strcpy(*connectaddr, 7+*connectaddr); /* prefer bare IPv4 address if possible */ #else strcpy(*connectaddr, inet_ntoa(((struct sockaddr_in *)&connectaddr)->s_addr)); #endif From c9b31427b48989a5c225b940497a55c5113a3769 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 6 Nov 2012 16:40:06 -0800 Subject: [PATCH 27/63] sim_defs.h - Make MATCH_CMD match at least one character instead of having an empty string match everything --- sim_defs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sim_defs.h b/sim_defs.h index fbc3b4ec..8aa2d94c 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -275,9 +275,9 @@ typedef uint32 t_addr; #define SWMASK(x) (1u << (((int) (x)) - ((int) 'A'))) -/* String match */ +/* String match - at least one character required */ -#define MATCH_CMD(ptr,cmd) strncmp ((ptr), (cmd), strlen (ptr)) +#define MATCH_CMD(ptr,cmd) (*(ptr) && strncmp ((ptr), (cmd), strlen (ptr))) /* End of Linked List/Queue value */ /* Chosen for 2 reasons: */ From d51df0eba56181904ebaa68cbc9d8836a1f668f4 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 6 Nov 2012 17:00:54 -0800 Subject: [PATCH 28/63] Merge of working DMC-11 device from Rob Jarratt. pdp11_dmc.c - Fixed DMA bug which wrote data into the wrong simulated memory address. - Fixed incoming IP address checking. pdp11_io_lib.c - Added the DMC device to the autoconfigure device table vax780_defs.h - Added comment for DMC11 --- PDP11/pdp11_dmc.c | 3025 +++++++++++++++++++++--------------------- PDP11/pdp11_io_lib.c | 2 +- VAX/vax780_defs.h | 2 +- 3 files changed, 1528 insertions(+), 1501 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 7e420b83..3ed1bd42 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -72,7 +72,7 @@ The other test was to configure DECnet on VMS 4.6 and do SET HOST. // TODO: Show active connections like DZ does, for multipoint. // TODO: Test MOP. // TODO: Implement actual DDCMP protocol and run over UDP. -// TODO: Allow NCP SHOW COUNTERS to work (think this is the base address thing) +// TODO: Allow NCP SHOW COUNTERS to work (think this is the base address thing). Since fixing how I get the addresses this should work now. #include #include @@ -83,118 +83,118 @@ The other test was to configure DECnet on VMS 4.6 and do SET HOST. #define TRACE_BYTES_PER_LINE 16 struct csrs { - uint16 sel0; - uint16 sel2; - uint16 sel4; - uint16 sel6; + uint16 sel0; + uint16 sel2; + uint16 sel4; + uint16 sel6; }; typedef struct csrs CSRS; typedef enum { - Initialised, /* after MASTER CLEAR */ - Running /* after any transmit or receive buffer has been supplied */ + Initialised, /* after MASTER CLEAR */ + Running /* after any transmit or receive buffer has been supplied */ } ControllerState; typedef enum { - Idle, - InputTransfer, - OutputTransfer + Idle, + InputTransfer, + OutputTransfer } TransferState; typedef enum { - Available, /* when empty or partially filled on read */ - ContainsData, - TransferInProgress + Available, /* when empty or partially filled on read */ + ContainsData, + TransferInProgress } BufferState; typedef struct { - int isPrimary; - SOCKET socket; // socket used bidirectionally - int receive_readable; - char *receive_port; - int transmit_writeable; - char transmit_host[80]; - int transmit_is_loopback; /* if true the transmit socket is the loopback to the receive */ - int speed; /* bits per second in each direction, 0 for no limit */ - int last_second; - int bytes_sent_in_last_second; - int bytes_received_in_last_second; - time_t last_connect_attempt; + int isPrimary; + SOCKET socket; // socket used bidirectionally + int receive_readable; + char *receive_port; + int transmit_writeable; + char transmit_host[80]; + int transmit_is_loopback; /* if true the transmit socket is the loopback to the receive */ + int speed; /* bits per second in each direction, 0 for no limit */ + int last_second; + int bytes_sent_in_last_second; + int bytes_received_in_last_second; + time_t last_connect_attempt; } LINE; /* A partially filled buffer (during a read from the socket) will have block_len_bytes_read = 1 or actual_bytes_transferred < actual_block_len */ typedef struct buffer { - uint32 address; /* unibus address of the buffer */ - uint16 count; /* size of the buffer passed to the device by the driver */ - uint16 actual_block_len; /* actual length of the received block */ - uint8 *transfer_buffer; /* the buffer into which data is received or from which it is transmitted*/ - int block_len_bytes_read; /* the number of bytes read so far for the block length */ - int actual_bytes_transferred; /* the number of bytes from the actual block that have been read or written so far*/ - struct buffer *next; /* next buffer in the queue */ - BufferState state; /* state of this buffer */ - int is_loopback; /* loopback was requested when this buffer was queued */ + uint32 address; /* unibus address of the buffer */ + uint16 count; /* size of the buffer passed to the device by the driver */ + uint16 actual_block_len; /* actual length of the received block */ + uint8 *transfer_buffer; /* the buffer into which data is received or from which it is transmitted*/ + int block_len_bytes_read; /* the number of bytes read so far for the block length */ + int actual_bytes_transferred; /* the number of bytes from the actual block that have been read or written so far*/ + struct buffer *next; /* next buffer in the queue */ + BufferState state; /* state of this buffer */ + int is_loopback; /* loopback was requested when this buffer was queued */ } BUFFER; typedef struct { - char * name; - BUFFER queue[BUFFER_QUEUE_SIZE]; - int head; - int tail; - int count; - struct dmc_controller *controller; /* back pointer to the containing controller */ + char * name; + BUFFER queue[BUFFER_QUEUE_SIZE]; + int head; + int tail; + int count; + struct dmc_controller *controller; /* back pointer to the containing controller */ } BUFFER_QUEUE; typedef struct { - int started; - clock_t start_time; - clock_t cumulative_time; + int started; + clock_t start_time; + clock_t cumulative_time; } TIMER; typedef struct { - TIMER between_polls_timer; - TIMER poll_timer; - uint32 poll_count; + TIMER between_polls_timer; + TIMER poll_timer; + uint32 poll_count; } UNIT_STATS; typedef enum { - DMC, - DMR, - DMP + DMC, + DMR, + DMP } DEVTYPE; struct dmc_controller { - CSRS *csrs; - DEVICE *device; - ControllerState state; - TransferState transfer_state; /* current transfer state (type of transfer) */ - int transfer_type; - int transfer_in_io; // remembers IN I/O setting at start of input transfer as host changes it during transfer! - LINE *line; - BUFFER_QUEUE *receive_queue; - BUFFER_QUEUE *transmit_queue; - SOCKET master_socket; - int32 svc_poll_interval; - int32 connect_poll_interval; - DEVTYPE dev_type; - uint32 rxi; - uint32 txi; - uint32 buffers_received_from_net; - uint32 buffers_transmitted_to_net; - uint32 receive_buffer_output_transfers_completed; - uint32 transmit_buffer_output_transfers_completed; - uint32 receive_buffer_input_transfers_completed; - uint32 transmit_buffer_input_transfers_completed; + CSRS *csrs; + DEVICE *device; + ControllerState state; + TransferState transfer_state; /* current transfer state (type of transfer) */ + int transfer_type; + int transfer_in_io; // remembers IN I/O setting at start of input transfer as host changes it during transfer! + LINE *line; + BUFFER_QUEUE *receive_queue; + BUFFER_QUEUE *transmit_queue; + SOCKET master_socket; + int32 svc_poll_interval; + int32 connect_poll_interval; + DEVTYPE dev_type; + uint32 rxi; + uint32 txi; + uint32 buffers_received_from_net; + uint32 buffers_transmitted_to_net; + uint32 receive_buffer_output_transfers_completed; + uint32 transmit_buffer_output_transfers_completed; + uint32 receive_buffer_input_transfers_completed; + uint32 transmit_buffer_input_transfers_completed; }; typedef struct dmc_controller CTLR; @@ -236,7 +236,7 @@ int dmc_buffer_queue_full(BUFFER_QUEUE *q); void dmc_buffer_queue_get_stats(BUFFER_QUEUE *q, int *available, int *contains_data, int *transfer_in_progress); void dmc_start_transfer_transmit_buffer(CTLR *controller); void dmc_error_and_close_receive(CTLR *controller, char *format); -void dmc_close_receive(CTLR *controller, char *reason); +void dmc_close_receive(CTLR *controller, char *reason, char *from); void dmc_close_transmit(CTLR *controller, char *reason); int dmc_get_socket(CTLR *controller, int forRead); int dmc_get_receive_socket(CTLR *controller, int forRead); @@ -246,26 +246,26 @@ UNIT_STATS *dmc_get_unit_stats(UNIT *uptr); void dmc_set_unit_stats(UNIT *uptr, UNIT_STATS *stats); DEBTAB dmc_debug[] = { - {"TRACE", DBG_TRC}, - {"WARN", DBG_WRN}, - {"REG", DBG_REG}, - {"INFO", DBG_INF}, - {"DATA", DBG_DAT}, - {"DATASUM",DBG_DTS}, - {"SOCKET", DBG_SOK}, - {"CONNECT", DBG_CON}, - {0} + {"TRACE", DBG_TRC}, + {"WARN", DBG_WRN}, + {"REG", DBG_REG}, + {"INFO", DBG_INF}, + {"DATA", DBG_DAT}, + {"DATASUM",DBG_DTS}, + {"SOCKET", DBG_SOK}, + {"CONNECT", DBG_CON}, + {0} }; UNIT dmc_unit[] = { - { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, - { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, - { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, - { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) } + { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, + { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, + { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, + { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) } }; UNIT dmp_unit[] = { - { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) } + { UDATA (&dmc_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) } }; CSRS dmc_csrs[DMC_NUMDEVICE]; @@ -273,164 +273,175 @@ CSRS dmc_csrs[DMC_NUMDEVICE]; CSRS dmp_csrs[DMP_NUMDEVICE]; REG dmca_reg[] = { - { HRDATA (SEL0, dmc_csrs[0].sel0, 16) }, - { HRDATA (SEL2, dmc_csrs[0].sel2, 16) }, - { HRDATA (SEL4, dmc_csrs[0].sel4, 16) }, - { HRDATA (SEL6, dmc_csrs[0].sel6, 16) }, - { GRDATA (BSEL0, dmc_csrs[0].sel0, DEV_RDX, 8, 0) }, - { GRDATA (BSEL1, dmc_csrs[0].sel0, DEV_RDX, 8, 8) }, - { GRDATA (BSEL2, dmc_csrs[0].sel2, DEV_RDX, 8, 0) }, - { GRDATA (BSEL3, dmc_csrs[0].sel2, DEV_RDX, 8, 8) }, - { GRDATA (BSEL4, dmc_csrs[0].sel4, DEV_RDX, 8, 0) }, - { GRDATA (BSEL5, dmc_csrs[0].sel4, DEV_RDX, 8, 8) }, - { GRDATA (BSEL6, dmc_csrs[0].sel6, DEV_RDX, 8, 0) }, - { GRDATA (BSEL7, dmc_csrs[0].sel6, DEV_RDX, 8, 8) }, - { NULL } }; + { HRDATA (SEL0, dmc_csrs[0].sel0, 16) }, + { HRDATA (SEL2, dmc_csrs[0].sel2, 16) }, + { HRDATA (SEL4, dmc_csrs[0].sel4, 16) }, + { HRDATA (SEL6, dmc_csrs[0].sel6, 16) }, + { GRDATA (BSEL0, dmc_csrs[0].sel0, DEV_RDX, 8, 0) }, + { GRDATA (BSEL1, dmc_csrs[0].sel0, DEV_RDX, 8, 8) }, + { GRDATA (BSEL2, dmc_csrs[0].sel2, DEV_RDX, 8, 0) }, + { GRDATA (BSEL3, dmc_csrs[0].sel2, DEV_RDX, 8, 8) }, + { GRDATA (BSEL4, dmc_csrs[0].sel4, DEV_RDX, 8, 0) }, + { GRDATA (BSEL5, dmc_csrs[0].sel4, DEV_RDX, 8, 8) }, + { GRDATA (BSEL6, dmc_csrs[0].sel6, DEV_RDX, 8, 0) }, + { GRDATA (BSEL7, dmc_csrs[0].sel6, DEV_RDX, 8, 8) }, + { NULL } }; REG dmcb_reg[] = { - { HRDATA (SEL0, dmc_csrs[1].sel0, 16) }, - { HRDATA (SEL2, dmc_csrs[1].sel2, 16) }, - { HRDATA (SEL4, dmc_csrs[1].sel4, 16) }, - { HRDATA (SEL6, dmc_csrs[1].sel6, 16) }, - { GRDATA (BSEL0, dmc_csrs[1].sel0, DEV_RDX, 8, 0) }, - { GRDATA (BSEL1, dmc_csrs[1].sel0, DEV_RDX, 8, 8) }, - { GRDATA (BSEL2, dmc_csrs[1].sel2, DEV_RDX, 8, 0) }, - { GRDATA (BSEL3, dmc_csrs[1].sel2, DEV_RDX, 8, 8) }, - { GRDATA (BSEL4, dmc_csrs[1].sel4, DEV_RDX, 8, 0) }, - { GRDATA (BSEL5, dmc_csrs[1].sel4, DEV_RDX, 8, 8) }, - { GRDATA (BSEL6, dmc_csrs[1].sel6, DEV_RDX, 8, 0) }, - { GRDATA (BSEL7, dmc_csrs[1].sel6, DEV_RDX, 8, 8) }, - { NULL } }; + { HRDATA (SEL0, dmc_csrs[1].sel0, 16) }, + { HRDATA (SEL2, dmc_csrs[1].sel2, 16) }, + { HRDATA (SEL4, dmc_csrs[1].sel4, 16) }, + { HRDATA (SEL6, dmc_csrs[1].sel6, 16) }, + { GRDATA (BSEL0, dmc_csrs[1].sel0, DEV_RDX, 8, 0) }, + { GRDATA (BSEL1, dmc_csrs[1].sel0, DEV_RDX, 8, 8) }, + { GRDATA (BSEL2, dmc_csrs[1].sel2, DEV_RDX, 8, 0) }, + { GRDATA (BSEL3, dmc_csrs[1].sel2, DEV_RDX, 8, 8) }, + { GRDATA (BSEL4, dmc_csrs[1].sel4, DEV_RDX, 8, 0) }, + { GRDATA (BSEL5, dmc_csrs[1].sel4, DEV_RDX, 8, 8) }, + { GRDATA (BSEL6, dmc_csrs[1].sel6, DEV_RDX, 8, 0) }, + { GRDATA (BSEL7, dmc_csrs[1].sel6, DEV_RDX, 8, 8) }, + { NULL } }; REG dmcc_reg[] = { - { HRDATA (SEL0, dmc_csrs[2].sel0, 16) }, - { HRDATA (SEL2, dmc_csrs[2].sel2, 16) }, - { HRDATA (SEL4, dmc_csrs[2].sel4, 16) }, - { HRDATA (SEL6, dmc_csrs[2].sel6, 16) }, - { GRDATA (BSEL0, dmc_csrs[2].sel0, DEV_RDX, 8, 0) }, - { GRDATA (BSEL1, dmc_csrs[2].sel0, DEV_RDX, 8, 8) }, - { GRDATA (BSEL2, dmc_csrs[2].sel2, DEV_RDX, 8, 0) }, - { GRDATA (BSEL3, dmc_csrs[2].sel2, DEV_RDX, 8, 8) }, - { GRDATA (BSEL4, dmc_csrs[2].sel4, DEV_RDX, 8, 0) }, - { GRDATA (BSEL5, dmc_csrs[2].sel4, DEV_RDX, 8, 8) }, - { GRDATA (BSEL6, dmc_csrs[2].sel6, DEV_RDX, 8, 0) }, - { GRDATA (BSEL7, dmc_csrs[2].sel6, DEV_RDX, 8, 8) }, - { NULL } }; + { HRDATA (SEL0, dmc_csrs[2].sel0, 16) }, + { HRDATA (SEL2, dmc_csrs[2].sel2, 16) }, + { HRDATA (SEL4, dmc_csrs[2].sel4, 16) }, + { HRDATA (SEL6, dmc_csrs[2].sel6, 16) }, + { GRDATA (BSEL0, dmc_csrs[2].sel0, DEV_RDX, 8, 0) }, + { GRDATA (BSEL1, dmc_csrs[2].sel0, DEV_RDX, 8, 8) }, + { GRDATA (BSEL2, dmc_csrs[2].sel2, DEV_RDX, 8, 0) }, + { GRDATA (BSEL3, dmc_csrs[2].sel2, DEV_RDX, 8, 8) }, + { GRDATA (BSEL4, dmc_csrs[2].sel4, DEV_RDX, 8, 0) }, + { GRDATA (BSEL5, dmc_csrs[2].sel4, DEV_RDX, 8, 8) }, + { GRDATA (BSEL6, dmc_csrs[2].sel6, DEV_RDX, 8, 0) }, + { GRDATA (BSEL7, dmc_csrs[2].sel6, DEV_RDX, 8, 8) }, + { NULL } }; REG dmcd_reg[] = { - { HRDATA (SEL0, dmc_csrs[3].sel0, 16) }, - { HRDATA (SEL2, dmc_csrs[3].sel2, 16) }, - { HRDATA (SEL4, dmc_csrs[3].sel4, 16) }, - { HRDATA (SEL6, dmc_csrs[3].sel6, 16) }, - { GRDATA (BSEL0, dmc_csrs[3].sel0, DEV_RDX, 8, 0) }, - { GRDATA (BSEL1, dmc_csrs[3].sel0, DEV_RDX, 8, 8) }, - { GRDATA (BSEL2, dmc_csrs[3].sel2, DEV_RDX, 8, 0) }, - { GRDATA (BSEL3, dmc_csrs[3].sel2, DEV_RDX, 8, 8) }, - { GRDATA (BSEL4, dmc_csrs[3].sel4, DEV_RDX, 8, 0) }, - { GRDATA (BSEL5, dmc_csrs[3].sel4, DEV_RDX, 8, 8) }, - { GRDATA (BSEL6, dmc_csrs[3].sel6, DEV_RDX, 8, 0) }, - { GRDATA (BSEL7, dmc_csrs[3].sel6, DEV_RDX, 8, 8) }, - { NULL } }; + { HRDATA (SEL0, dmc_csrs[3].sel0, 16) }, + { HRDATA (SEL2, dmc_csrs[3].sel2, 16) }, + { HRDATA (SEL4, dmc_csrs[3].sel4, 16) }, + { HRDATA (SEL6, dmc_csrs[3].sel6, 16) }, + { GRDATA (BSEL0, dmc_csrs[3].sel0, DEV_RDX, 8, 0) }, + { GRDATA (BSEL1, dmc_csrs[3].sel0, DEV_RDX, 8, 8) }, + { GRDATA (BSEL2, dmc_csrs[3].sel2, DEV_RDX, 8, 0) }, + { GRDATA (BSEL3, dmc_csrs[3].sel2, DEV_RDX, 8, 8) }, + { GRDATA (BSEL4, dmc_csrs[3].sel4, DEV_RDX, 8, 0) }, + { GRDATA (BSEL5, dmc_csrs[3].sel4, DEV_RDX, 8, 8) }, + { GRDATA (BSEL6, dmc_csrs[3].sel6, DEV_RDX, 8, 0) }, + { GRDATA (BSEL7, dmc_csrs[3].sel6, DEV_RDX, 8, 8) }, + { NULL } }; REG dmp_reg[] = { - { HRDATA (SEL0, dmc_csrs[3].sel0, 16) }, - { HRDATA (SEL2, dmc_csrs[3].sel2, 16) }, - { HRDATA (SEL4, dmc_csrs[3].sel4, 16) }, - { HRDATA (SEL6, dmc_csrs[3].sel6, 16) }, - { GRDATA (BSEL0, dmc_csrs[3].sel0, DEV_RDX, 8, 0) }, - { GRDATA (BSEL1, dmc_csrs[3].sel0, DEV_RDX, 8, 8) }, - { GRDATA (BSEL2, dmc_csrs[3].sel2, DEV_RDX, 8, 0) }, - { GRDATA (BSEL3, dmc_csrs[3].sel2, DEV_RDX, 8, 8) }, - { GRDATA (BSEL4, dmc_csrs[3].sel4, DEV_RDX, 8, 0) }, - { GRDATA (BSEL5, dmc_csrs[3].sel4, DEV_RDX, 8, 8) }, - { GRDATA (BSEL6, dmc_csrs[3].sel6, DEV_RDX, 8, 0) }, - { GRDATA (BSEL7, dmc_csrs[3].sel6, DEV_RDX, 8, 8) }, - { NULL } }; + { HRDATA (SEL0, dmc_csrs[3].sel0, 16) }, + { HRDATA (SEL2, dmc_csrs[3].sel2, 16) }, + { HRDATA (SEL4, dmc_csrs[3].sel4, 16) }, + { HRDATA (SEL6, dmc_csrs[3].sel6, 16) }, + { GRDATA (BSEL0, dmc_csrs[3].sel0, DEV_RDX, 8, 0) }, + { GRDATA (BSEL1, dmc_csrs[3].sel0, DEV_RDX, 8, 8) }, + { GRDATA (BSEL2, dmc_csrs[3].sel2, DEV_RDX, 8, 0) }, + { GRDATA (BSEL3, dmc_csrs[3].sel2, DEV_RDX, 8, 8) }, + { GRDATA (BSEL4, dmc_csrs[3].sel4, DEV_RDX, 8, 0) }, + { GRDATA (BSEL5, dmc_csrs[3].sel4, DEV_RDX, 8, 8) }, + { GRDATA (BSEL6, dmc_csrs[3].sel6, DEV_RDX, 8, 0) }, + { GRDATA (BSEL7, dmc_csrs[3].sel6, DEV_RDX, 8, 8) }, + { NULL } }; MTAB dmc_mod[] = { - { MTAB_XTD | MTAB_VDV, 0, "TRANSMIT", "TRANSMIT=address:port" ,&dmc_settransmit, &dmc_showtransmit, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "SPEED", "SPEED" ,&dmc_setspeed, &dmc_showspeed, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "TYPE", "TYPE" ,&dmc_settype, &dmc_showtype, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "LINEMODE", "LINEMODE" ,&dmc_setlinemode, &dmc_showlinemode, NULL }, - { MTAB_XTD | MTAB_VDV | MTAB_NMO, 0, "STATS", "STATS" ,&dmc_setstats, &dmc_showstats, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "POLL", "POLL" ,&dmc_setpoll, &dmc_showpoll, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "CONNECTPOLL", "CONNECTPOLL" ,&dmc_setconnectpoll, &dmc_showconnectpoll, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "TRANSMIT", "TRANSMIT=address:port" ,&dmc_settransmit, &dmc_showtransmit, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "SPEED", "SPEED" ,&dmc_setspeed, &dmc_showspeed, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "TYPE", "TYPE" ,&dmc_settype, &dmc_showtype, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "LINEMODE", "LINEMODE" ,&dmc_setlinemode, &dmc_showlinemode, NULL }, + { MTAB_XTD | MTAB_VDV | MTAB_NMO, 0, "STATS", "STATS" ,&dmc_setstats, &dmc_showstats, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "POLL", "POLL" ,&dmc_setpoll, &dmc_showpoll, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "CONNECTPOLL", "CONNECTPOLL" ,&dmc_setconnectpoll, &dmc_showconnectpoll, NULL }, { MTAB_XTD | MTAB_VDV, 006, "ADDRESS", "ADDRESS", &set_addr, &show_addr, NULL }, { MTAB_XTD |MTAB_VDV, 0, "VECTOR", "VECTOR", &set_vec, &show_vec, NULL }, - { 0 }, + { 0 }, }; DIB dmc_dib[] = { - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } + { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, + { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, + { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, + { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } }; DIB dmp_dib[] = { - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } + { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } }; DEVICE dmc_dev[] = { - { "DMA", &dmc_unit[0], dmca_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, - NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, - &dmc_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, - { "DMB", &dmc_unit[1], dmcb_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, - NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, - &dmc_dib[1], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, - { "DMC", &dmc_unit[2], dmcc_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, - NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, - &dmc_dib[2], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, - { "DMD", &dmc_unit[3], dmcd_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, - NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, - &dmc_dib[3], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } + { "DMA", &dmc_unit[0], dmca_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, + NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, + &dmc_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, + { "DMB", &dmc_unit[1], dmcb_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, + NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, + &dmc_dib[1], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, + { "DMC", &dmc_unit[2], dmcc_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, + NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, + &dmc_dib[2], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug }, + { "DMD", &dmc_unit[3], dmcd_reg, dmc_mod, DMC_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, + NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, + &dmc_dib[3], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; DEVICE dmp_dev[] = { - { "DMP", &dmp_unit[0], dmp_reg, dmc_mod, DMP_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, - NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, - &dmp_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } + { "DMP", &dmp_unit[0], dmp_reg, dmc_mod, DMP_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, + NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, + &dmp_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; -LINE dmc_line[DMC_NUMDEVICE]; +LINE dmc_line[DMC_NUMDEVICE] = +{ + { 0, INVALID_SOCKET }, + { 0, INVALID_SOCKET }, + { 0, INVALID_SOCKET }, + { 0, INVALID_SOCKET } +}; BUFFER_QUEUE dmc_receive_queues[DMC_NUMDEVICE]; BUFFER_QUEUE dmc_transmit_queues[DMC_NUMDEVICE]; -LINE dmp_line[DMP_NUMDEVICE]; +LINE dmp_line[DMP_NUMDEVICE] = +{ + { 0, INVALID_SOCKET } +}; BUFFER_QUEUE dmp_receive_queues[DMP_NUMDEVICE]; BUFFER_QUEUE dmp_transmit_queues[DMP_NUMDEVICE]; CTLR dmc_ctrls[] = { - { &dmc_csrs[0], &dmc_dev[0], Initialised, Idle, 0, 0, &dmc_line[0], &dmc_receive_queues[0], &dmc_transmit_queues[0], INVALID_SOCKET, -1, 30, DMC }, - { &dmc_csrs[1], &dmc_dev[1], Initialised, Idle, 0, 0, &dmc_line[1], &dmc_receive_queues[1], &dmc_transmit_queues[1], INVALID_SOCKET, -1, 30, DMC }, - { &dmc_csrs[2], &dmc_dev[2], Initialised, Idle, 0, 0, &dmc_line[2], &dmc_receive_queues[2], &dmc_transmit_queues[2], INVALID_SOCKET, -1, 30, DMC }, - { &dmc_csrs[3], &dmc_dev[3], Initialised, Idle, 0, 0, &dmc_line[3], &dmc_receive_queues[3], &dmc_transmit_queues[3], INVALID_SOCKET, -1, 30, DMC }, - { &dmp_csrs[0], &dmp_dev[0], Initialised, Idle, 0, 0, &dmp_line[0], &dmp_receive_queues[0], &dmp_transmit_queues[0], INVALID_SOCKET, -1, 30, DMP } + { &dmc_csrs[0], &dmc_dev[0], Initialised, Idle, 0, 0, &dmc_line[0], &dmc_receive_queues[0], &dmc_transmit_queues[0], INVALID_SOCKET, -1, 30, DMC }, + { &dmc_csrs[1], &dmc_dev[1], Initialised, Idle, 0, 0, &dmc_line[1], &dmc_receive_queues[1], &dmc_transmit_queues[1], INVALID_SOCKET, -1, 30, DMC }, + { &dmc_csrs[2], &dmc_dev[2], Initialised, Idle, 0, 0, &dmc_line[2], &dmc_receive_queues[2], &dmc_transmit_queues[2], INVALID_SOCKET, -1, 30, DMC }, + { &dmc_csrs[3], &dmc_dev[3], Initialised, Idle, 0, 0, &dmc_line[3], &dmc_receive_queues[3], &dmc_transmit_queues[3], INVALID_SOCKET, -1, 30, DMC }, + { &dmp_csrs[0], &dmp_dev[0], Initialised, Idle, 0, 0, &dmp_line[0], &dmp_receive_queues[0], &dmp_transmit_queues[0], INVALID_SOCKET, -1, 30, DMP } }; +extern int32 tmxr_poll; /* calibrated delay */ + UNIT_STATS *dmc_get_unit_stats(UNIT *uptr) { - UNIT_STATS *ans = NULL; + UNIT_STATS *ans = NULL; #ifdef USE_ADDR64 - ans = (UNIT_STATS *)(((t_uint64)uptr->u3 << 32) | uptr->u4); + ans = (UNIT_STATS *)(((t_uint64)uptr->u3 << 32) | uptr->u4); #else ans = (UNIT_STATS *)(uptr->u3); #endif - return ans; + return ans; } void dmc_set_unit_stats(UNIT *uptr, UNIT_STATS *stats) { #ifdef USE_ADDR64 - uptr->u3 = (int32)((t_uint64)stats >> 32); - uptr->u4 = (int32)((t_uint64)stats & 0xFFFFFFFF); + uptr->u3 = (int32)((t_uint64)stats >> 32); + uptr->u4 = (int32)((t_uint64)stats & 0xFFFFFFFF); #else uptr->u3 = (int32)stats; #endif @@ -439,238 +450,238 @@ void dmc_set_unit_stats(UNIT *uptr, UNIT_STATS *stats) void dmc_reset_unit_stats(UNIT_STATS *s) { s->between_polls_timer.started = FALSE; - s->poll_timer.started = FALSE; - s->poll_count = 0; + s->poll_timer.started = FALSE; + s->poll_count = 0; } int dmc_timer_started(TIMER *t) { - return t->started; + return t->started; } void dmc_timer_start(TIMER *t) { - t->start_time = clock(); - t->cumulative_time = 0; - t->started = TRUE; + t->start_time = clock(); + t->cumulative_time = 0; + t->started = TRUE; } void dmc_timer_stop(TIMER *t) { - clock_t end_time = clock(); - t->cumulative_time += end_time - t->start_time; + clock_t end_time = clock(); + t->cumulative_time += end_time - t->start_time; } void dmc_timer_resume(TIMER *t) { - t->start_time = clock(); + t->start_time = clock(); } double dmc_timer_cumulative_seconds(TIMER *t) { - return (double)t->cumulative_time/CLOCKS_PER_SEC; + return (double)t->cumulative_time/CLOCKS_PER_SEC; } int dmc_is_dmc(CTLR *controller) { - return controller->dev_type != DMP; + return controller->dev_type != DMP; } CTLR *dmc_get_controller_from_unit(UNIT *unit) { - int i; - CTLR *ans = NULL; - for (i = 0; i < DMC_NUMDEVICE + DMP_NUMDEVICE; i++) - { - if (dmc_ctrls[i].device->units == unit) - { - ans = &dmc_ctrls[i]; - break; - } - } + int i; + CTLR *ans = NULL; + for (i = 0; i < DMC_NUMDEVICE + DMP_NUMDEVICE; i++) + { + if (dmc_ctrls[i].device->units == unit) + { + ans = &dmc_ctrls[i]; + break; + } + } - return ans; + return ans; } CTLR* dmc_get_controller_from_address(uint32 address) { - int i; - for (i=0; ictxt; - if ((address >= dib->ba) && (address < (dib->ba + dib->lnt))) - return &dmc_ctrls[i]; - } - /* not found */ - return 0; + int i; + for (i=0; ictxt; + if ((address >= dib->ba) && (address < (dib->ba + dib->lnt))) + return &dmc_ctrls[i]; + } + /* not found */ + return 0; } CTLR *dmc_get_controller_from_device(DEVICE *device) { - int i; - CTLR *ans = NULL; - for (i = 0; i < DMC_NUMDEVICE + DMP_NUMDEVICE; i++) - { - if (dmc_ctrls[i].device == device) - { - ans = &dmc_ctrls[i]; - break; - } - } + int i; + CTLR *ans = NULL; + for (i = 0; i < DMC_NUMDEVICE + DMP_NUMDEVICE; i++) + { + if (dmc_ctrls[i].device == device) + { + ans = &dmc_ctrls[i]; + break; + } + } - return ans; + return ans; } t_stat dmc_showtransmit (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "TRANSMIT=%s", controller->line->transmit_host); - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + fprintf(st, "TRANSMIT=%s", controller->line->transmit_host); + return SCPE_OK; } t_stat dmc_settransmit (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; + t_stat status = SCPE_OK; char host[CBUFSIZE], port[CBUFSIZE]; - CTLR *controller = dmc_get_controller_from_unit(uptr); + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (uptr->flags & UNIT_ATT) return SCPE_ALATT; + if (!cptr) return SCPE_IERR; + if (uptr->flags & UNIT_ATT) return SCPE_ALATT; status = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL); if (status != SCPE_OK) return status; if (host[0] == '\0') return SCPE_ARG; - strncpy(controller->line->transmit_host, cptr, sizeof(controller->line->transmit_host)-1); + strncpy(controller->line->transmit_host, cptr, sizeof(controller->line->transmit_host)-1); - return status; + return status; } t_stat dmc_showspeed (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "SPEED=%d", controller->line->speed); - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + fprintf(st, "SPEED=%d", controller->line->speed); + return SCPE_OK; } t_stat dmc_setspeed (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (uptr->flags & UNIT_ATT) return SCPE_ALATT; - if (sscanf(cptr, "%d", &controller->line->speed) != 1) - { - status = SCPE_ARG; - } + if (!cptr) return SCPE_IERR; + if (uptr->flags & UNIT_ATT) return SCPE_ALATT; + if (sscanf(cptr, "%d", &controller->line->speed) != 1) + { + status = SCPE_ARG; + } - return status; + return status; } t_stat dmc_showtype (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - switch (controller->dev_type) - { - case DMC: - { - fprintf(st, "TYPE=DMC"); - break; - } - case DMR: - { - fprintf(st, "TYPE=DMR"); - break; - } - case DMP: - { - fprintf(st, "TYPE=DMP"); - break; - } - default: - { - fprintf(st, "TYPE=???"); - break; - } - } - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + switch (controller->dev_type) + { + case DMC: + { + fprintf(st, "TYPE=DMC"); + break; + } + case DMR: + { + fprintf(st, "TYPE=DMR"); + break; + } + case DMP: + { + fprintf(st, "TYPE=DMP"); + break; + } + default: + { + fprintf(st, "TYPE=???"); + break; + } + } + return SCPE_OK; } t_stat dmc_settype (UNIT* uptr, int32 val, char* cptr, void* desc) { - char buf[80]; - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + char buf[80]; + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (uptr->flags & UNIT_ATT) return SCPE_ALATT; - if (sscanf(cptr, "%s", buf) != 1) - { - status = SCPE_ARG; - } - else - { - if (strcmp(buf,"DMC")==0) - { - controller->dev_type = DMC; - } - else if (strcmp(buf,"DMR")==0) - { - controller->dev_type = DMR; - } - else if (strcmp(buf,"DMP")==0) - { - controller->dev_type = DMP; - } - else - { - status = SCPE_ARG; - } - } + if (!cptr) return SCPE_IERR; + if (uptr->flags & UNIT_ATT) return SCPE_ALATT; + if (sscanf(cptr, "%s", buf) != 1) + { + status = SCPE_ARG; + } + else + { + if (strcmp(buf,"DMC")==0) + { + controller->dev_type = DMC; + } + else if (strcmp(buf,"DMR")==0) + { + controller->dev_type = DMR; + } + else if (strcmp(buf,"DMP")==0) + { + controller->dev_type = DMP; + } + else + { + status = SCPE_ARG; + } + } - return status; + return status; } t_stat dmc_showstats (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - TIMER *poll_timer = &dmc_get_unit_stats(uptr)->poll_timer; - TIMER *between_polls_timer = &dmc_get_unit_stats(uptr)->between_polls_timer; - uint32 poll_count = dmc_get_unit_stats(uptr)->poll_count; + CTLR *controller = dmc_get_controller_from_unit(uptr); + TIMER *poll_timer = &dmc_get_unit_stats(uptr)->poll_timer; + TIMER *between_polls_timer = &dmc_get_unit_stats(uptr)->between_polls_timer; + uint32 poll_count = dmc_get_unit_stats(uptr)->poll_count; - if (dmc_timer_started(between_polls_timer) && poll_count > 0) - { - fprintf(st, "Average time between polls=%f (sec)\n", dmc_timer_cumulative_seconds(between_polls_timer)/poll_count); - } - else - { - fprintf(st, "Average time between polls=n/a\n"); - } + if (dmc_timer_started(between_polls_timer) && poll_count > 0) + { + fprintf(st, "Average time between polls=%f (sec)\n", dmc_timer_cumulative_seconds(between_polls_timer)/poll_count); + } + else + { + fprintf(st, "Average time between polls=n/a\n"); + } - if (dmc_timer_started(poll_timer) && poll_count > 0) - { - fprintf(st, "Average time within poll=%f (sec)\n", dmc_timer_cumulative_seconds(poll_timer)/poll_count); - } - else - { - fprintf(st, "Average time within poll=n/a\n"); - } + if (dmc_timer_started(poll_timer) && poll_count > 0) + { + fprintf(st, "Average time within poll=%f (sec)\n", dmc_timer_cumulative_seconds(poll_timer)/poll_count); + } + else + { + fprintf(st, "Average time within poll=n/a\n"); + } - fprintf(st, "Buffers received from the network=%d\n", controller->buffers_received_from_net); - fprintf(st, "Buffers sent to the network=%d\n", controller->buffers_transmitted_to_net); - fprintf(st, "Output transfers completed for receive buffers=%d\n", controller->receive_buffer_output_transfers_completed); - fprintf(st, "Output transfers completed for transmit buffers=%d\n", controller->transmit_buffer_output_transfers_completed); - fprintf(st, "Input transfers completed for receive buffers=%d\n", controller->receive_buffer_input_transfers_completed); - fprintf(st, "Input transfers completed for transmit buffers=%d\n", controller->transmit_buffer_input_transfers_completed); + fprintf(st, "Buffers received from the network=%d\n", controller->buffers_received_from_net); + fprintf(st, "Buffers sent to the network=%d\n", controller->buffers_transmitted_to_net); + fprintf(st, "Output transfers completed for receive buffers=%d\n", controller->receive_buffer_output_transfers_completed); + fprintf(st, "Output transfers completed for transmit buffers=%d\n", controller->transmit_buffer_output_transfers_completed); + fprintf(st, "Input transfers completed for receive buffers=%d\n", controller->receive_buffer_input_transfers_completed); + fprintf(st, "Input transfers completed for transmit buffers=%d\n", controller->transmit_buffer_input_transfers_completed); - return SCPE_OK; + return SCPE_OK; } t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); dmc_reset_unit_stats(dmc_get_unit_stats(uptr)); @@ -679,1595 +690,1611 @@ t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc) controller->receive_buffer_input_transfers_completed = 0; controller->transmit_buffer_input_transfers_completed = 0; - printf("Statistics reset\n" ); + printf("Statistics reset\n" ); - return status; + return status; } t_stat dmc_showpoll (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "POLL=%d", controller->svc_poll_interval); - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + fprintf(st, "POLL=%d", controller->svc_poll_interval); + return SCPE_OK; } t_stat dmc_setpoll (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (sscanf(cptr, "%d", &controller->svc_poll_interval) != 1) - { - status = SCPE_ARG; - } + if (!cptr) return SCPE_IERR; + if (sscanf(cptr, "%d", &controller->svc_poll_interval) != 1) + { + status = SCPE_ARG; + } - return status; + return status; } t_stat dmc_showconnectpoll (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "CONNECTPOLL=%d", controller->connect_poll_interval); - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + fprintf(st, "CONNECTPOLL=%d", controller->connect_poll_interval); + return SCPE_OK; } t_stat dmc_setconnectpoll (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (sscanf(cptr, "%d", &controller->connect_poll_interval) != 1) - { - status = SCPE_ARG; - } + if (!cptr) return SCPE_IERR; + if (sscanf(cptr, "%d", &controller->connect_poll_interval) != 1) + { + status = SCPE_ARG; + } - return status; + return status; } t_stat dmc_showlinemode (FILE* st, UNIT* uptr, int32 val, void* desc) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "LINEMODE=%s", controller->line->isPrimary? "PRIMARY" : "SECONDARY"); - return SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + fprintf(st, "LINEMODE=%s", controller->line->isPrimary? "PRIMARY" : "SECONDARY"); + return SCPE_OK; } t_stat dmc_setlinemode (UNIT* uptr, int32 val, char* cptr, void* desc) { - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat status = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); - if (!cptr) return SCPE_IERR; - if (uptr->flags & UNIT_ATT) return SCPE_ALATT; + if (!cptr) return SCPE_IERR; + if (uptr->flags & UNIT_ATT) return SCPE_ALATT; - if (strcmp(cptr, "PRIMARY") == 0) - { - controller->line->isPrimary = 1; - } - else if (strcmp(cptr, "SECONDARY") == 0) - { - controller->line->isPrimary = 0; - } - else - { - status = SCPE_ARG; - } + if (MATCH_CMD(cptr, "PRIMARY") == 0) + { + controller->line->isPrimary = 1; + } + else if (MATCH_CMD(cptr, "SECONDARY") == 0) + { + controller->line->isPrimary = 0; + } + else + { + status = SCPE_ARG; + } - return status; + return status; } void dmc_setrxint(CTLR *controller) { - controller->rxi = 1; - SET_INT(DMCRX); + controller->rxi = 1; + SET_INT(DMCRX); } void dmc_clrrxint(CTLR *controller) { - controller->rxi = 0; - CLR_INT(DMCRX); + controller->rxi = 0; + CLR_INT(DMCRX); } void dmc_settxint(CTLR *controller) { - controller->txi = 1; - SET_INT(DMCTX); + controller->txi = 1; + SET_INT(DMCTX); } void dmc_clrtxint(CTLR *controller) { - controller->txi = 0; - CLR_INT(DMCTX); + controller->txi = 0; + CLR_INT(DMCTX); } int dmc_getsel(int addr) { - return (addr >> 1) & 03; + return (addr >> 1) & 03; } uint16 dmc_bitfld(int data, int start_bit, int length) { - uint16 ans = data >> start_bit; - uint32 mask = (1 << (length))-1; - ans &= mask; - return ans; + uint16 ans = data >> start_bit; + uint32 mask = (1 << (length))-1; + ans &= mask; + return ans; } void dmc_dumpregsel0(CTLR *controller, int trace_level, char * prefix, uint16 data) { - char *type_str = ""; - uint16 type = dmc_bitfld(data, SEL0_TYPEI_BIT, 2); + char *type_str = ""; + uint16 type = dmc_bitfld(data, SEL0_TYPEI_BIT, 2); - if (dmc_is_dmc(controller)) - { - if (dmc_is_rqi_set(controller)) - { - if (type==TYPE_BACCI) - type_str = "BA/CC I"; - else if (type==TYPE_CNTLI) - type_str = "CNTL I"; - else if (type==TYPE_BASEI) - type_str = "BASE I"; - else - type_str = "?????"; - } + if (dmc_is_dmc(controller)) + { + if (dmc_is_rqi_set(controller)) + { + if (type==TYPE_BACCI) + type_str = "BA/CC I"; + else if (type==TYPE_CNTLI) + type_str = "CNTL I"; + else if (type==TYPE_BASEI) + type_str = "BASE I"; + else + type_str = "?????"; + } - sim_debug( - trace_level, - controller->device, - "%s SEL0 (0x%04x) %s%s%s%s%s%s%s%s\n", - prefix, - data, - dmc_bitfld(data, SEL0_RUN_BIT, 1) ? "RUN " : "", - dmc_bitfld(data, SEL0_MCLR_BIT, 1) ? "MCLR " : "", - dmc_bitfld(data, SEL0_LU_LOOP_BIT, 1) ? "LU LOOP " : "", - dmc_bitfld(data, SEL0_RDI_BIT, 1) ? "RDI " : "", - dmc_bitfld(data, SEL0_DMC_IEI_BIT, 1) ? "IEI " : "", - dmc_bitfld(data, SEL0_DMC_RQI_BIT, 1) ? "RQI " : "", - dmc_bitfld(data, SEL0_IN_IO_BIT, 1) ? "IN I/O " : "", - type_str - ); - } - else - { - sim_debug( - trace_level, - controller->device, - "%s SEL0 (0x%04x) %s%s%s%s%s%s\n", - prefix, - data, - dmc_bitfld(data, SEL0_RUN_BIT, 1) ? "RUN " : "", - dmc_bitfld(data, SEL0_MCLR_BIT, 1) ? "MCLR " : "", - dmc_bitfld(data, SEL0_LU_LOOP_BIT, 1) ? "LU LOOP " : "", - dmc_bitfld(data, SEL0_DMP_RQI_BIT, 1) ? "RQI " : "", - dmc_bitfld(data, SEL0_DMP_IEO_BIT, 1) ? "IEO " : "", - dmc_bitfld(data, SEL0_DMP_IEI_BIT, 1) ? "IEI " : "" - ); - } + sim_debug( + trace_level, + controller->device, + "%s SEL0 (0x%04x) %s%s%s%s%s%s%s%s\n", + prefix, + data, + dmc_bitfld(data, SEL0_RUN_BIT, 1) ? "RUN " : "", + dmc_bitfld(data, SEL0_MCLR_BIT, 1) ? "MCLR " : "", + dmc_bitfld(data, SEL0_LU_LOOP_BIT, 1) ? "LU LOOP " : "", + dmc_bitfld(data, SEL0_RDI_BIT, 1) ? "RDI " : "", + dmc_bitfld(data, SEL0_DMC_IEI_BIT, 1) ? "IEI " : "", + dmc_bitfld(data, SEL0_DMC_RQI_BIT, 1) ? "RQI " : "", + dmc_bitfld(data, SEL0_IN_IO_BIT, 1) ? "IN I/O " : "", + type_str + ); + } + else + { + sim_debug( + trace_level, + controller->device, + "%s SEL0 (0x%04x) %s%s%s%s%s%s\n", + prefix, + data, + dmc_bitfld(data, SEL0_RUN_BIT, 1) ? "RUN " : "", + dmc_bitfld(data, SEL0_MCLR_BIT, 1) ? "MCLR " : "", + dmc_bitfld(data, SEL0_LU_LOOP_BIT, 1) ? "LU LOOP " : "", + dmc_bitfld(data, SEL0_DMP_RQI_BIT, 1) ? "RQI " : "", + dmc_bitfld(data, SEL0_DMP_IEO_BIT, 1) ? "IEO " : "", + dmc_bitfld(data, SEL0_DMP_IEI_BIT, 1) ? "IEI " : "" + ); + } } void dmc_dumpregsel2(CTLR *controller, int trace_level, char *prefix, uint16 data) { - char *type_str = ""; - uint16 type = dmc_bitfld(data, SEL2_TYPEO_BIT, 2); + char *type_str = ""; + uint16 type = dmc_bitfld(data, SEL2_TYPEO_BIT, 2); - if (type==TYPE_BACCO) - type_str = "BA/CC O"; - else if (type==TYPE_CNTLO) - type_str = "CNTL O"; - else - type_str = "?????"; + if (type==TYPE_BACCO) + type_str = "BA/CC O"; + else if (type==TYPE_CNTLO) + type_str = "CNTL O"; + else + type_str = "?????"; - sim_debug( - trace_level, - controller->device, - "%s SEL2 (0x%04x) PRIO=%d LINE=%d %s%s%s%s\n", - prefix, - data, - dmc_bitfld(data, SEL2_PRIO_BIT, SEL2_PRIO_BIT_LENGTH), - dmc_bitfld(data, SEL2_LINE_BIT, SEL2_LINE_BIT_LENGTH), - dmc_bitfld(data, SEL2_RDO_BIT, 1) ? "RDO " : "", - dmc_bitfld(data, SEL2_IEO_BIT, 1) ? "IEO " : "", - dmc_bitfld(data, SEL2_OUT_IO_BIT, 1) ? "OUT I/O " : "", - type_str - ); + sim_debug( + trace_level, + controller->device, + "%s SEL2 (0x%04x) PRIO=%d LINE=%d %s%s%s%s\n", + prefix, + data, + dmc_bitfld(data, SEL2_PRIO_BIT, SEL2_PRIO_BIT_LENGTH), + dmc_bitfld(data, SEL2_LINE_BIT, SEL2_LINE_BIT_LENGTH), + dmc_bitfld(data, SEL2_RDO_BIT, 1) ? "RDO " : "", + dmc_bitfld(data, SEL2_IEO_BIT, 1) ? "IEO " : "", + dmc_bitfld(data, SEL2_OUT_IO_BIT, 1) ? "OUT I/O " : "", + type_str + ); } void dmc_dumpregsel4(CTLR *controller, int trace_level, char *prefix, uint16 data) { - sim_debug(trace_level, controller->device, "%s SEL4 (0x%04x)\n", prefix, data); + sim_debug(trace_level, controller->device, "%s SEL4 (0x%04x)\n", prefix, data); } void dmc_dumpregsel6(CTLR *controller, int trace_level, char *prefix, uint16 data) { - sim_debug( - trace_level, - controller->device, - "%s SEL6 (0x%04x) %s\n", - prefix, - data, - dmc_bitfld(data, SEL6_LOST_DATA_BIT, 1) ? "LOST_DATA " : ""); + sim_debug( + trace_level, + controller->device, + "%s SEL6 (0x%04x) %s\n", + prefix, + data, + dmc_bitfld(data, SEL6_LOST_DATA_BIT, 1) ? "LOST_DATA " : ""); } uint16 dmc_getreg(CTLR *controller, int reg, int ext) { - uint16 ans = 0; - switch (dmc_getsel(reg)) - { - case 00: - ans = controller->csrs->sel0; - if (ext) dmc_dumpregsel0(controller, DBG_REG, "Getting", ans); - break; - case 01: - ans = controller->csrs->sel2; - if (ext) dmc_dumpregsel2(controller, DBG_REG, "Getting", ans); - break; - case 02: - ans = controller->csrs->sel4; - if (ext) dmc_dumpregsel4(controller, DBG_REG, "Getting", ans); - break; - case 03: - ans = controller->csrs->sel6; - if (ext) dmc_dumpregsel6(controller, DBG_REG, "Getting", ans); - break; - default: - { - sim_debug(DBG_WRN, controller->device, "dmc_getreg(). Invalid register %d", reg); - } - } + uint16 ans = 0; + switch (dmc_getsel(reg)) + { + case 00: + ans = controller->csrs->sel0; + if (ext) dmc_dumpregsel0(controller, DBG_REG, "Getting", ans); + break; + case 01: + ans = controller->csrs->sel2; + if (ext) dmc_dumpregsel2(controller, DBG_REG, "Getting", ans); + break; + case 02: + ans = controller->csrs->sel4; + if (ext) dmc_dumpregsel4(controller, DBG_REG, "Getting", ans); + break; + case 03: + ans = controller->csrs->sel6; + if (ext) dmc_dumpregsel6(controller, DBG_REG, "Getting", ans); + break; + default: + { + sim_debug(DBG_WRN, controller->device, "dmc_getreg(). Invalid register %d", reg); + } + } - return ans; + return ans; } void dmc_setreg(CTLR *controller, int reg, uint16 data, int ext) { - char *trace = (ext) ? "Writing" : "Setting"; - switch (dmc_getsel(reg)) - { - case 00: - dmc_dumpregsel0(controller, DBG_REG, trace, data); - controller->csrs->sel0 = data; - break; - case 01: - dmc_dumpregsel2(controller, DBG_REG, trace, data); - controller->csrs->sel2 = data; - break; - case 02: - dmc_dumpregsel4(controller, DBG_REG, trace, data); - controller->csrs->sel4 = data; - break; - case 03: - dmc_dumpregsel6(controller, DBG_REG, trace, data); - controller->csrs->sel6 = data; - break; - default: - { - sim_debug(DBG_WRN, controller->device, "dmc_setreg(). Invalid register %d", reg); - } - } + char *trace = (ext) ? "Writing" : "Setting"; + switch (dmc_getsel(reg)) + { + case 00: + dmc_dumpregsel0(controller, DBG_REG, trace, data); + controller->csrs->sel0 = data; + break; + case 01: + dmc_dumpregsel2(controller, DBG_REG, trace, data); + controller->csrs->sel2 = data; + break; + case 02: + dmc_dumpregsel4(controller, DBG_REG, trace, data); + controller->csrs->sel4 = data; + break; + case 03: + dmc_dumpregsel6(controller, DBG_REG, trace, data); + controller->csrs->sel6 = data; + break; + default: + { + sim_debug(DBG_WRN, controller->device, "dmc_setreg(). Invalid register %d", reg); + } + } } int dmc_is_master_clear_set(CTLR *controller) { - return controller->csrs->sel0 & MASTER_CLEAR_MASK; + return controller->csrs->sel0 & MASTER_CLEAR_MASK; } int dmc_is_lu_loop_set(CTLR *controller) { - return controller->csrs->sel0 & LU_LOOP_MASK; + return controller->csrs->sel0 & LU_LOOP_MASK; } int dmc_is_rqi_set(CTLR *controller) { - int ans = 0; - if (dmc_is_dmc(controller)) - { - ans = controller->csrs->sel0 & DMC_RQI_MASK; - } - else - { - ans = controller->csrs->sel0 & DMP_RQI_MASK; - } - return ans; + int ans = 0; + if (dmc_is_dmc(controller)) + { + ans = controller->csrs->sel0 & DMC_RQI_MASK; + } + else + { + ans = controller->csrs->sel0 & DMP_RQI_MASK; + } + return ans; } int dmc_is_rdyi_set(CTLR *controller) { - int ans = 0; - if (dmc_is_dmc(controller)) - { - ans = controller->csrs->sel0 & DMC_RDYI_MASK; - } - else - { - ans = controller->csrs->sel2 & DMP_RDYI_MASK; - } - return ans; + int ans = 0; + if (dmc_is_dmc(controller)) + { + ans = controller->csrs->sel0 & DMC_RDYI_MASK; + } + else + { + ans = controller->csrs->sel2 & DMP_RDYI_MASK; + } + return ans; } int dmc_is_iei_set(CTLR *controller) { - int ans = 0; - if (dmc_is_dmc(controller)) - { - ans = controller->csrs->sel0 & DMC_IEI_MASK; - } - else - { - ans = controller->csrs->sel0 & DMP_IEI_MASK; - } + int ans = 0; + if (dmc_is_dmc(controller)) + { + ans = controller->csrs->sel0 & DMC_IEI_MASK; + } + else + { + ans = controller->csrs->sel0 & DMP_IEI_MASK; + } - return ans; + return ans; } int dmc_is_ieo_set(CTLR *controller) { - int ans = 0; - if (dmc_is_dmc(controller)) - { - ans = controller->csrs->sel2 & DMC_IEO_MASK; - } - else - { - ans = controller->csrs->sel0 & DMP_IEO_MASK; - } + int ans = 0; + if (dmc_is_dmc(controller)) + { + ans = controller->csrs->sel2 & DMC_IEO_MASK; + } + else + { + ans = controller->csrs->sel0 & DMP_IEO_MASK; + } - return ans; + return ans; } int dmc_is_in_io_set(CTLR *controller) { - int ans = 0; - if (dmc_is_dmc(controller)) + int ans = 0; + if (dmc_is_dmc(controller)) { - ans = controller->csrs->sel0 & DMC_IN_IO_MASK; - } - else - { - ans = !controller->csrs->sel2 & DMP_IN_IO_MASK; - } + ans = controller->csrs->sel0 & DMC_IN_IO_MASK; + } + else + { + ans = !controller->csrs->sel2 & DMP_IN_IO_MASK; + } - return ans; + return ans; } int dmc_is_out_io_set(CTLR *controller) { - int ans = controller->csrs->sel2 & OUT_IO_MASK; - return ans; + int ans = controller->csrs->sel2 & OUT_IO_MASK; + return ans; } int dmc_is_rdyo_set(CTLR *controller) { - return controller->csrs->sel2 & DMC_RDYO_MASK; + return controller->csrs->sel2 & DMC_RDYO_MASK; } void dmc_set_rdyi(CTLR *controller) { - if (dmc_is_dmc(controller)) - { - dmc_setreg(controller, 0, controller->csrs->sel0 | DMC_RDYI_MASK, 0); - } - else - { - dmc_setreg(controller, 2, controller->csrs->sel2 | DMP_RDYI_MASK, 0); - } + if (dmc_is_dmc(controller)) + { + dmc_setreg(controller, 0, controller->csrs->sel0 | DMC_RDYI_MASK, 0); + } + else + { + dmc_setreg(controller, 2, controller->csrs->sel2 | DMP_RDYI_MASK, 0); + } - if (dmc_is_iei_set(controller)) - { - dmc_setrxint(controller); - } + if (dmc_is_iei_set(controller)) + { + dmc_setrxint(controller); + } } void dmc_clear_rdyi(CTLR *controller) { - if (dmc_is_dmc(controller)) - { + if (dmc_is_dmc(controller)) + { dmc_setreg(controller, 0, controller->csrs->sel0 & ~DMC_RDYI_MASK, 0); - } - else - { + } + else + { dmc_setreg(controller, 2, controller->csrs->sel2 & ~DMP_RDYI_MASK, 0); - } + } } void dmc_set_rdyo(CTLR *controller) { - dmc_setreg(controller, 2, controller->csrs->sel2 | DMC_RDYO_MASK, 0); + dmc_setreg(controller, 2, controller->csrs->sel2 | DMC_RDYO_MASK, 0); - if (dmc_is_ieo_set(controller)) - { - dmc_settxint(controller); - } + if (dmc_is_ieo_set(controller)) + { + dmc_settxint(controller); + } } void dmc_set_lost_data(CTLR *controller) { - dmc_setreg(controller, 6, controller->csrs->sel6 | LOST_DATA_MASK, 0); + dmc_setreg(controller, 6, controller->csrs->sel6 | LOST_DATA_MASK, 0); } void dmc_clear_master_clear(CTLR *controller) { - dmc_setreg(controller, 0, controller->csrs->sel0 & ~MASTER_CLEAR_MASK, 0); + dmc_setreg(controller, 0, controller->csrs->sel0 & ~MASTER_CLEAR_MASK, 0); } void dmc_set_run(CTLR *controller) { - dmc_setreg(controller, 0, controller->csrs->sel0 | RUN_MASK, 0); + dmc_setreg(controller, 0, controller->csrs->sel0 | RUN_MASK, 0); } int dmc_get_input_transfer_type(CTLR *controller) { - int ans = 0; + int ans = 0; - if (dmc_is_dmc(controller)) - { - ans = controller->csrs->sel0 & DMC_TYPE_INPUT_MASK; - } - else - { - ans = controller->csrs->sel2 & DMP_TYPE_INPUT_MASK; - } + if (dmc_is_dmc(controller)) + { + ans = controller->csrs->sel0 & DMC_TYPE_INPUT_MASK; + } + else + { + ans = controller->csrs->sel2 & DMP_TYPE_INPUT_MASK; + } - return ans; + return ans; } int dmc_get_output_transfer_type(CTLR *controller) { - return controller->csrs->sel2 & TYPE_OUTPUT_MASK; + return controller->csrs->sel2 & TYPE_OUTPUT_MASK; } void dmc_set_type_output(CTLR *controller, int type) { - dmc_setreg(controller, 2, controller->csrs->sel2 | (type & TYPE_OUTPUT_MASK), 0); + dmc_setreg(controller, 2, controller->csrs->sel2 | (type & TYPE_OUTPUT_MASK), 0); } void dmc_set_out_io(CTLR *controller) { - dmc_setreg(controller, 2, controller->csrs->sel2 | OUT_IO_MASK, 0); + dmc_setreg(controller, 2, controller->csrs->sel2 | OUT_IO_MASK, 0); } void dmc_clear_out_io(CTLR *controller) { - dmc_setreg(controller, 2, controller->csrs->sel2 & ~OUT_IO_MASK, 0); + dmc_setreg(controller, 2, controller->csrs->sel2 & ~OUT_IO_MASK, 0); } void dmc_process_master_clear(CTLR *controller) { - sim_debug(DBG_INF, controller->device, "Master clear\n"); - dmc_clear_master_clear(controller); - controller->state = Initialised; - dmc_setreg(controller, 0, 0, 0); - if (controller->dev_type == DMR) - { - /* DMR-11 indicates microdiagnostics complete when this is set */ - dmc_setreg(controller, 2, 0x8000, 0); - } - else - { - /* preserve contents of BSEL3 if DMC-11 */ - dmc_setreg(controller, 2, controller->csrs->sel2 & 0xFF00, 0); - } - if (controller->dev_type == DMP) - { - dmc_setreg(controller, 4, 077, 0); - } - else - { - dmc_setreg(controller, 4, 0, 0); - } + sim_debug(DBG_INF, controller->device, "Master clear\n"); + dmc_clear_master_clear(controller); + controller->state = Initialised; + dmc_setreg(controller, 0, 0, 0); + if (controller->dev_type == DMR) + { + /* DMR-11 indicates microdiagnostics complete when this is set */ + dmc_setreg(controller, 2, 0x8000, 0); + } + else + { + /* preserve contents of BSEL3 if DMC-11 */ + dmc_setreg(controller, 2, controller->csrs->sel2 & 0xFF00, 0); + } + if (controller->dev_type == DMP) + { + dmc_setreg(controller, 4, 077, 0); + } + else + { + dmc_setreg(controller, 4, 0, 0); + } - if (controller->dev_type == DMP) - { - dmc_setreg(controller, 6, 0305, 0); - } - else - { - dmc_setreg(controller, 6, 0, 0); - } - dmc_buffer_queue_init(controller, controller->receive_queue, "receive"); - dmc_buffer_queue_init(controller, controller->transmit_queue, "transmit"); - //dmc_close_receive(controller, "master clear"); - //dmc_close_transmit(controller, "master clear"); + if (controller->dev_type == DMP) + { + dmc_setreg(controller, 6, 0305, 0); + } + else + { + dmc_setreg(controller, 6, 0, 0); + } + dmc_buffer_queue_init(controller, controller->receive_queue, "receive"); + dmc_buffer_queue_init(controller, controller->transmit_queue, "transmit"); + //dmc_close_receive(controller, "master clear", NULL); + //dmc_close_transmit(controller, "master clear"); - controller->transfer_state = Idle; - dmc_set_run(controller); + controller->transfer_state = Idle; + dmc_set_run(controller); - sim_cancel (controller->device->units); /* stop poll */ - sim_activate_abs(controller->device->units, clk_cosched (controller->svc_poll_interval)); + sim_cancel (controller->device->units); /* stop poll */ + sim_activate_abs(controller->device->units, clk_cosched (controller->svc_poll_interval)); } void dmc_start_input_transfer(CTLR *controller) { - int ok = 1; - int type = dmc_get_input_transfer_type(controller); + int ok = 1; + int type = dmc_get_input_transfer_type(controller); - /* if this is a BA/CC I then check that the relevant queue has room first */ - if (type == TYPE_BACCI) - { - ok = (dmc_is_in_io_set(controller) && !dmc_buffer_queue_full(controller->receive_queue)) - || - (!dmc_is_in_io_set(controller) && !dmc_buffer_queue_full(controller->transmit_queue)); - } + /* if this is a BA/CC I then check that the relevant queue has room first */ + if (type == TYPE_BACCI) + { + ok = (dmc_is_in_io_set(controller) && !dmc_buffer_queue_full(controller->receive_queue)) + || + (!dmc_is_in_io_set(controller) && !dmc_buffer_queue_full(controller->transmit_queue)); + } - if (ok) - { - sim_debug(DBG_INF, controller->device, "Starting input transfer\n"); - controller->transfer_state = InputTransfer; - controller->transfer_type = type; - controller->transfer_in_io = dmc_is_in_io_set(controller); - dmc_set_rdyi(controller); - } - else - { - sim_debug(DBG_WRN, controller->device, "Input transfer request not granted as queue is full\n"); - } + if (ok) + { + sim_debug(DBG_INF, controller->device, "Starting input transfer\n"); + controller->transfer_state = InputTransfer; + controller->transfer_type = type; + controller->transfer_in_io = dmc_is_in_io_set(controller); + dmc_set_rdyi(controller); + } + else + { + sim_debug(DBG_WRN, controller->device, "Input transfer request not granted as queue is full\n"); + } } void dmc_start_data_output_transfer(CTLR *controller, uint32 addr, int16 count, int is_receive) { - if (is_receive) - { - sim_debug(DBG_INF, controller->device, "Starting data output transfer for receive, address=0x%08x, count=%d\n", addr, count); - dmc_set_out_io(controller); - } - else - { - sim_debug(DBG_INF, controller->device, "Starting data output transfer for transmit, address=0x%08x, count=%d\n", addr, count); - dmc_clear_out_io(controller); - } + if (is_receive) + { + sim_debug(DBG_INF, controller->device, "Starting data output transfer for receive, address=0x%08x, count=%d\n", addr, count); + dmc_set_out_io(controller); + } + else + { + sim_debug(DBG_INF, controller->device, "Starting data output transfer for transmit, address=0x%08x, count=%d\n", addr, count); + dmc_clear_out_io(controller); + } - dmc_setreg(controller, 4, addr & 0xFFFF, 0); - dmc_setreg(controller, 6, (((addr & 0x30000)) >> 2) | count, 0); - controller->transfer_state = OutputTransfer; - dmc_set_type_output(controller, TYPE_BACCO); - dmc_set_rdyo(controller); + dmc_setreg(controller, 4, addr & 0xFFFF, 0); + dmc_setreg(controller, 6, (((addr & 0x30000)) >> 2) | count, 0); + controller->transfer_state = OutputTransfer; + dmc_set_type_output(controller, TYPE_BACCO); + dmc_set_rdyo(controller); } void dmc_start_control_output_transfer(CTLR *controller) { - sim_debug(DBG_INF, controller->device, "Starting control output transfer\n"); - controller->transfer_state = OutputTransfer; - dmc_set_type_output(controller, TYPE_CNTLO); - dmc_set_rdyo(controller); + sim_debug(DBG_INF, controller->device, "Starting control output transfer\n"); + controller->transfer_state = OutputTransfer; + dmc_set_type_output(controller, TYPE_CNTLO); + dmc_set_rdyo(controller); } t_stat dmc_svc(UNIT* uptr) { - CTLR *controller; + CTLR *controller; + int32 poll; - TIMER *poll_timer = &dmc_get_unit_stats(uptr)->poll_timer; - TIMER *between_polls_timer = &dmc_get_unit_stats(uptr)->between_polls_timer; + TIMER *poll_timer = &dmc_get_unit_stats(uptr)->poll_timer; + TIMER *between_polls_timer = &dmc_get_unit_stats(uptr)->between_polls_timer; - if (dmc_timer_started(between_polls_timer)) - { - dmc_timer_stop(between_polls_timer); - } + poll = clk_cosched (tmxr_poll); - if (dmc_timer_started(poll_timer)) - { - dmc_timer_resume(poll_timer); - } - else - { - dmc_timer_start(poll_timer); - } + if (dmc_timer_started(between_polls_timer)) + { + dmc_timer_stop(between_polls_timer); + } - controller = dmc_get_controller_from_unit(uptr); + if (dmc_timer_started(poll_timer)) + { + dmc_timer_resume(poll_timer); + } + else + { + dmc_timer_start(poll_timer); + } - dmc_line_update_speed_stats(controller->line); + controller = dmc_get_controller_from_unit(uptr); - if (dmc_buffer_fill_receive_buffers(controller)) - { -// poll = 200; /* if we received data then lets poll quicker as there seems to be some activity */ - } - if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); + dmc_line_update_speed_stats(controller->line); - if (dmc_buffer_send_transmit_buffers(controller)) - { -// poll = 200; /* if we transmitted data then lets poll quicker as there seems to be some activity */ - } - if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); + if (dmc_buffer_fill_receive_buffers(controller)) + { +// poll = 200; /* if we received data then lets poll quicker as there seems to be some activity */ + } + if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); - /* resubmit service timer */ - sim_activate(controller->device->units, controller->svc_poll_interval); + if (dmc_buffer_send_transmit_buffers(controller)) + { +// poll = 200; /* if we transmitted data then lets poll quicker as there seems to be some activity */ + } + if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); - dmc_timer_stop(poll_timer); - if (dmc_timer_started(between_polls_timer)) - { - dmc_timer_resume(between_polls_timer); - } - else - { - dmc_timer_start(between_polls_timer); - } + /* resubmit service timer */ + sim_activate(controller->device->units, poll/*controller->svc_poll_interval*/); + + dmc_timer_stop(poll_timer); + if (dmc_timer_started(between_polls_timer)) + { + dmc_timer_resume(between_polls_timer); + } + else + { + dmc_timer_start(between_polls_timer); + } dmc_get_unit_stats(uptr)->poll_count++; - return SCPE_OK; + return SCPE_OK; } void dmc_line_update_speed_stats(LINE *line) { - clock_t current = clock(); - int current_second = current / CLOCKS_PER_SEC; - if (current_second != line->last_second) - { - line->bytes_received_in_last_second = 0; - line->bytes_sent_in_last_second = 0; - line->last_second = current_second; - } + clock_t current = clock(); + int current_second = current / CLOCKS_PER_SEC; + if (current_second != line->last_second) + { + line->bytes_received_in_last_second = 0; + line->bytes_sent_in_last_second = 0; + line->last_second = current_second; + } } /* given the number of bytes sent/received in the last second, the number of bytes to send or receive and the line speed, calculate how many bytes can be sent/received now */ int dmc_line_speed_calculate_byte_length(int bytes_in_last_second, int num_bytes, int speed) { - int ans; + int ans; - if (speed == 0) - { - ans = num_bytes; - } - else - { - int clocks_this_second = clock() % CLOCKS_PER_SEC; - int allowable_bytes_to_date = ((speed/8) * clocks_this_second)/CLOCKS_PER_SEC; - int allowed_bytes = allowable_bytes_to_date - bytes_in_last_second; - if (allowed_bytes < 0) - { - allowed_bytes = 0; - } + if (speed == 0) + { + ans = num_bytes; + } + else + { + int clocks_this_second = clock() % CLOCKS_PER_SEC; + int allowable_bytes_to_date = ((speed/8) * clocks_this_second)/CLOCKS_PER_SEC; + int allowed_bytes = allowable_bytes_to_date - bytes_in_last_second; + if (allowed_bytes < 0) + { + allowed_bytes = 0; + } - if (num_bytes > allowed_bytes) - { - ans = allowed_bytes; - } - else - { - ans = num_bytes; - } + if (num_bytes > allowed_bytes) + { + ans = allowed_bytes; + } + else + { + ans = num_bytes; + } //sim_debug(DBG_WRN, dmc_ctrls[0].device, "Bytes in last second %4d, clocks this sec %3d allowable bytes %4d, requested %4d allowed %4d\n", bytes_in_last_second, clocks_this_second, allowable_bytes_to_date, num_bytes, ans); - } + } - return ans; + return ans; } void dmc_buffer_trace_line(int tracelevel, CTLR *controller, uint8 *buf, int length, char *prefix) { - char hex[TRACE_BYTES_PER_LINE*3+1]; - char ascii[TRACE_BYTES_PER_LINE+1]; - //char ts[9]; - //time_t t; - int i; - hex[0] = 0; - ascii[TRACE_BYTES_PER_LINE] = 0; + char hex[TRACE_BYTES_PER_LINE*3+1]; + char ascii[TRACE_BYTES_PER_LINE+1]; + //char ts[9]; + //time_t t; + int i; + hex[0] = 0; + ascii[TRACE_BYTES_PER_LINE] = 0; - //t = time(NULL); - //strftime(ts, 9, "%H:%M:%S", localtime(&t)); - for (i = 0; i=length) - { - strcat(hex, " "); - ascii[i] = ' '; - } - else - { - char hexByte[4]; - sprintf(hexByte, "%02X ", buf[i]); - strcat(hex, hexByte); - if (isprint(buf[i])) - { - ascii[i] = (char)buf[i]; - } - else - { - ascii[i] = '.'; - } - } - } + //t = time(NULL); + //strftime(ts, 9, "%H:%M:%S", localtime(&t)); + for (i = 0; i=length) + { + strcat(hex, " "); + ascii[i] = ' '; + } + else + { + char hexByte[4]; + sprintf(hexByte, "%02X ", buf[i]); + strcat(hex, hexByte); + if (isprint(buf[i])) + { + ascii[i] = (char)buf[i]; + } + else + { + ascii[i] = '.'; + } + } + } - sim_debug(tracelevel, controller->device, "%s %s %s\n", prefix, hex, ascii); + sim_debug(tracelevel, controller->device, "%s %s %s\n", prefix, hex, ascii); } -void dmc_buffer_trace(CTLR *controller, uint8 *buf, int length, char *prefix) +void dmc_buffer_trace(CTLR *controller, uint8 *buf, int length, char *prefix, uint32 address) { - int i; - if (length >= 0 && controller->device->dctrl & DBG_DAT) - { - for(i = 0; i < length / TRACE_BYTES_PER_LINE; i++) - { - dmc_buffer_trace_line(DBG_DAT, controller, buf + i*TRACE_BYTES_PER_LINE, TRACE_BYTES_PER_LINE, prefix); - } + int i; + if (length >= 0 && controller->device->dctrl & DBG_DAT) + { + sim_debug(DBG_DAT, controller->device, "%s Buffer address 0x%08x (%d bytes)\n", prefix, address, length); + for(i = 0; i < length / TRACE_BYTES_PER_LINE; i++) + { + dmc_buffer_trace_line(DBG_DAT, controller, buf + i*TRACE_BYTES_PER_LINE, TRACE_BYTES_PER_LINE, prefix); + } - if (length %TRACE_BYTES_PER_LINE > 0) - { - dmc_buffer_trace_line(DBG_DAT, controller, buf + length/TRACE_BYTES_PER_LINE, length % TRACE_BYTES_PER_LINE, prefix); - } - } - else if (length >= 0 && controller->device->dctrl & DBG_DTS) - { - char prefix2[80]; - sprintf(prefix2, "%s (len=%d)", prefix, length); - dmc_buffer_trace_line(DBG_DTS, controller, buf, (length > TRACE_BYTES_PER_LINE)? TRACE_BYTES_PER_LINE : length, prefix2); - } + if (length %TRACE_BYTES_PER_LINE > 0) + { + dmc_buffer_trace_line(DBG_DAT, controller, buf + length/TRACE_BYTES_PER_LINE, length % TRACE_BYTES_PER_LINE, prefix); + } + } + else if (length >= 0 && controller->device->dctrl & DBG_DTS) + { + char prefix2[80]; + sprintf(prefix2, "%s (len=%d)", prefix, length); + dmc_buffer_trace_line(DBG_DTS, controller, buf, (length > TRACE_BYTES_PER_LINE)? TRACE_BYTES_PER_LINE : length, prefix2); + } } void dmc_buffer_queue_init(CTLR *controller, BUFFER_QUEUE *q, char *name) { - q->name = name; - q->head = 0; - q->tail = 0; - q->count = 0; - q->controller = controller; + q->name = name; + q->head = 0; + q->tail = 0; + q->count = 0; + q->controller = controller; } int dmc_buffer_queue_full(BUFFER_QUEUE *q) { - return q->count > BUFFER_QUEUE_SIZE; + return q->count > BUFFER_QUEUE_SIZE; } void dmc_buffer_queue_add(BUFFER_QUEUE *q, uint32 address, uint16 count) { - if (!dmc_buffer_queue_full(q)) - { - int new_buffer = 0; - if (q->count > 0) - { - int last_buffer = q->tail; - new_buffer = (q->tail +1) % BUFFER_QUEUE_SIZE; + if (!dmc_buffer_queue_full(q)) + { + int new_buffer = 0; + if (q->count > 0) + { + int last_buffer = q->tail; + new_buffer = (q->tail +1) % BUFFER_QUEUE_SIZE; - /* Link last buffer to the new buffer */ - q->queue[last_buffer].next = &q->queue[new_buffer]; - } - else - { - q->head = 0; - new_buffer = 0; - } + /* Link last buffer to the new buffer */ + q->queue[last_buffer].next = &q->queue[new_buffer]; + } + else + { + q->head = 0; + new_buffer = 0; + } - q->tail = new_buffer; - q->queue[new_buffer].address = address; - q->queue[new_buffer].count = count; - q->queue[new_buffer].actual_block_len = 0; - q->queue[new_buffer].transfer_buffer = NULL; - q->queue[new_buffer].block_len_bytes_read = 0; - q->queue[new_buffer].actual_bytes_transferred = 0; - q->queue[new_buffer].next = NULL; - q->queue[new_buffer].state = Available; - q->queue[new_buffer].is_loopback = dmc_is_lu_loop_set(q->controller); - q->count++; - sim_debug(DBG_INF, q->controller->device, "Queued %s buffer address=0x%08x count=%d\n", q->name, address, count); - } - else - { - sim_debug(DBG_WRN, q->controller->device, "Failed to queue %s buffer, queue full\n", q->name); - // TODO: Report error here. - } + q->tail = new_buffer; + q->queue[new_buffer].address = address; + q->queue[new_buffer].count = count; + q->queue[new_buffer].actual_block_len = 0; + q->queue[new_buffer].transfer_buffer = NULL; + q->queue[new_buffer].block_len_bytes_read = 0; + q->queue[new_buffer].actual_bytes_transferred = 0; + q->queue[new_buffer].next = NULL; + q->queue[new_buffer].state = Available; + q->queue[new_buffer].is_loopback = dmc_is_lu_loop_set(q->controller); + q->count++; + sim_debug(DBG_INF, q->controller->device, "Queued %s buffer address=0x%08x count=%d\n", q->name, address, count); + } + else + { + sim_debug(DBG_WRN, q->controller->device, "Failed to queue %s buffer address=0x%08x, queue full\n", q->name, address); + // TODO: Report error here. + } } void dmc_buffer_queue_release_head(BUFFER_QUEUE *q) { - if (q->count > 0) - { - q->head = (q->head + 1) % BUFFER_QUEUE_SIZE; - q->count--; - } - else - { - sim_debug(DBG_INF, q->controller->device, "Failed to release %s buffer, queue already empty\n", q->name); - } + if (q->count > 0) + { + q->head = (q->head + 1) % BUFFER_QUEUE_SIZE; + q->count--; + } + else + { + sim_debug(DBG_INF, q->controller->device, "Failed to release %s buffer, queue already empty\n", q->name); + } } BUFFER *dmc_buffer_queue_head(BUFFER_QUEUE *q) { - BUFFER *ans = NULL; - if (q->count >0) - { - ans = &q->queue[q->head]; - } + BUFFER *ans = NULL; + if (q->count >0) + { + ans = &q->queue[q->head]; + } - return ans; + return ans; } BUFFER *dmc_buffer_queue_find_first_available(BUFFER_QUEUE *q) { - BUFFER *ans = dmc_buffer_queue_head(q); - while (ans != NULL) - { - if (ans->state == Available) - { - break; - } + BUFFER *ans = dmc_buffer_queue_head(q); + while (ans != NULL) + { + if (ans->state == Available) + { + break; + } - ans = ans->next; - } + ans = ans->next; + } - return ans; + return ans; } BUFFER *dmc_buffer_queue_find_first_contains_data(BUFFER_QUEUE *q) { - BUFFER *ans = dmc_buffer_queue_head(q); - while (ans != NULL) - { - if (ans->state == ContainsData) - { - break; - } + BUFFER *ans = dmc_buffer_queue_head(q); + while (ans != NULL) + { + if (ans->state == ContainsData) + { + break; + } - ans = ans->next; - } + ans = ans->next; + } - return ans; + return ans; } void dmc_buffer_queue_get_stats(BUFFER_QUEUE *q, int *available, int *contains_data, int *transfer_in_progress) { - BUFFER *buf = dmc_buffer_queue_head(q); + BUFFER *buf = dmc_buffer_queue_head(q); *available = 0; - *contains_data = 0; - *transfer_in_progress = 0; + *contains_data = 0; + *transfer_in_progress = 0; - while (buf != NULL) - { - switch (buf->state) - { - case Available: - { - (*available)++; - break; - } + while (buf != NULL) + { + switch (buf->state) + { + case Available: + { + (*available)++; + break; + } - case ContainsData: - { - (*contains_data)++; - break; - } + case ContainsData: + { + (*contains_data)++; + break; + } - case TransferInProgress: - { - (*transfer_in_progress)++; - break; - } - } + case TransferInProgress: + { + (*transfer_in_progress)++; + break; + } + } - buf = buf->next; - } + buf = buf->next; + } } t_stat dmc_open_master_socket(CTLR *controller, char *port) { - t_stat ans; - ans = SCPE_OK; - if (controller->master_socket == INVALID_SOCKET) - { - controller->master_socket = sim_master_sock(port, &ans); - if (controller->master_socket == INVALID_SOCKET) - { - sim_debug(DBG_WRN, controller->device, "Failed to open master socket\n"); - ans = SCPE_OPENERR; - } - else - { - printf ("DMC-11 %s listening on port %s (socket %d)\n", controller->device->name, port, controller->master_socket); - } - } + t_stat ans; + ans = SCPE_OK; + if (controller->master_socket == INVALID_SOCKET) + { + controller->master_socket = sim_master_sock(port, &ans); + if (controller->master_socket == INVALID_SOCKET) + { + sim_debug(DBG_WRN, controller->device, "Failed to open master socket on port %s\n", port); + ans = SCPE_OPENERR; + } + else + { + printf ("DMC-11 %s listening on port %s\n", controller->device->name, port); + } + } - return ans; + return ans; } t_stat dmc_close_master_socket(CTLR *controller) { - sim_close_sock (controller->master_socket, TRUE); - controller->master_socket = INVALID_SOCKET; - return SCPE_OK; + sim_close_sock (controller->master_socket, TRUE); + controller->master_socket = INVALID_SOCKET; + return SCPE_OK; } // Gets the bidirectional socket and handles arbitration of determining which socket to use. int dmc_get_socket(CTLR *controller, int forRead) { - static int lastans = 0; - int ans = 0; +// static int lastans = 0; + int ans = 0; if (controller->line->isPrimary) - { - ans = dmc_get_transmit_socket(controller, 0, forRead); // TODO: After change to single socket, loopback may not work. - } - else - { - ans = dmc_get_receive_socket(controller, forRead); // TODO: After change to single socket, loopback may not work. - } - - if (lastans != ans) - { -sim_debug(DBG_SOK, controller->device, "Get Socket forread=%d, changed to %d\n", forRead, ans); - } - lastans = ans; + { + ans = dmc_get_transmit_socket(controller, 0, forRead); // TODO: After change to single socket, loopback may not work. + } + else + { + ans = dmc_get_receive_socket(controller, forRead); // TODO: After change to single socket, loopback may not work. + } +// if (lastans != ans) +// { +//sim_debug(DBG_SOK, controller->device, "Get Socket forread=%d, changed to %d\n", forRead, ans); +// } +// lastans = ans; +// return ans; } int dmc_get_receive_socket(CTLR *controller, int forRead) { - int ans = 0; - if (controller->line->socket == INVALID_SOCKET) - { - char *ipaddr; - //sim_debug(DBG_SOK, controller->device, "Trying to open receive socket\n"); - controller->line->socket = sim_accept_conn (controller->master_socket, &ipaddr); /* poll connect */ - if (controller->line->socket != INVALID_SOCKET) - { - if (strcmp(ipaddr, controller->line->transmit_host)) - { - sim_debug(DBG_WRN, controller->device, "Received connection from unexpected source IP %s. Closing the connection.\n", ipaddr); - dmc_close_receive(controller, "Unathorized connection"); - } - else - { - sim_debug(DBG_SOK, controller->device, "Opened receive socket %d\n", controller->line->socket); - controller->line->receive_readable = FALSE; - } + int ans = 0; + if (controller->line->socket == INVALID_SOCKET) + { + char *ipaddr; + //sim_debug(DBG_SOK, controller->device, "Trying to open receive socket\n"); + controller->line->socket = sim_accept_conn (controller->master_socket, &ipaddr); /* poll connect */ + if (controller->line->socket != INVALID_SOCKET) + { + char host[sizeof(controller->line->transmit_host)]; + + sim_parse_addr (controller->line->transmit_host, host, sizeof(host), NULL, NULL, 0, NULL); + if (strcmp(ipaddr, host)) + { + sim_debug(DBG_WRN, controller->device, "Received connection from unexpected source IP %s. Closing the connection.\n", ipaddr); + dmc_close_receive(controller, "Unathorized connection", ipaddr); + } + else + { + sim_debug(DBG_SOK, controller->device, "Opened receive socket %d\n", controller->line->socket); + controller->line->receive_readable = FALSE; + } free(ipaddr); - } - } + } + } - if (controller->line->socket != INVALID_SOCKET) - { - int readable = sim_check_conn(controller->line->socket, forRead); - if (readable == 0) /* Still opening */ - { - // Socket is still being opened, or is open but there is no data ready to be read. - ans = 0; - } - else if (readable == -1) /* Failed to open */ - { - dmc_close_receive(controller, "failed to connect"); - ans = 0; - } - else /* connected */ - { - if (!controller->line->receive_readable) - { - sim_debug(DBG_CON, controller->device, "Receive socket is now readable\n"); - } - controller->line->receive_readable = TRUE; - ans = 1; - } - } + if (controller->line->socket != INVALID_SOCKET) + { + int readable = sim_check_conn(controller->line->socket, forRead); + if (readable == 0) /* Still opening */ + { + // Socket is still being opened, or is open but there is no data ready to be read. + ans = 0; + } + else if (readable == -1) /* Failed to open */ + { + dmc_close_receive(controller, "failed to connect", NULL); + ans = 0; + } + else /* connected */ + { + if (!controller->line->receive_readable) + { + sim_debug(DBG_CON, controller->device, "Receive socket is now readable\n"); + } + controller->line->receive_readable = TRUE; + ans = 1; + } + } - return ans; + return ans; } int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) { - int ans = 0; - /* close transmit socket if there is a change in the loopback setting */ - if (is_loopback ^ controller->line->transmit_is_loopback) - { - dmc_close_transmit(controller, "loopback change"); - } + int ans = 0; + /* close transmit socket if there is a change in the loopback setting */ + if (is_loopback ^ controller->line->transmit_is_loopback) + { + dmc_close_transmit(controller, "loopback change"); + } - if (controller->line->socket == INVALID_SOCKET && (time(NULL) - controller->line->last_connect_attempt) > controller->connect_poll_interval) - { - char hostport[CBUFSIZE]; + if (controller->line->socket == INVALID_SOCKET && ((int32)(time(NULL) - controller->line->last_connect_attempt)) > controller->connect_poll_interval) + { + char hostport[CBUFSIZE]; - controller->line->transmit_is_loopback = is_loopback; - - controller->line->last_connect_attempt = time(NULL); + controller->line->transmit_is_loopback = is_loopback; + + controller->line->last_connect_attempt = time(NULL); if (is_loopback) sprintf(hostport, "localhost:%s", controller->line->receive_port); else sprintf(hostport, "%s", controller->line->transmit_host); sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", hostport); + controller->line->last_connect_attempt = time(NULL); controller->line->socket = sim_connect_sock(hostport, NULL, NULL); - if (controller->line->socket != INVALID_SOCKET) - { - sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %d, socket %d\n", hostport, controller->line->socket); - controller->line->transmit_writeable = FALSE; - } - } + if (controller->line->socket != INVALID_SOCKET) + { + sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %s\n", hostport); + controller->line->transmit_writeable = FALSE; + } + } - if (controller->line->socket != INVALID_SOCKET) - { - int writeable = sim_check_conn(controller->line->socket, forRead); - if (writeable == 0) /* Still opening */ - { - //sim_debug(DBG_SOK, controller->device, "Waiting for transmit socket to become writeable\n"); - ans = 0; - } - else if (writeable == -1) /* Failed to open */ - { - dmc_close_transmit(controller, "failed to connect"); - ans = 0; - } - else /* connected */ - { - if (!controller->line->transmit_writeable) - { - sim_debug(DBG_CON, controller->device, "Transmit socket is now writeable\n"); - } - controller->line->transmit_writeable = TRUE; - ans = 1; - } - } + if (controller->line->socket != INVALID_SOCKET) + { + int writeable = sim_check_conn(controller->line->socket, forRead); + if (writeable == 0) /* Still opening */ + { + //sim_debug(DBG_SOK, controller->device, "Waiting for transmit socket to become writeable\n"); + ans = 0; + } + else if (writeable == -1) /* Failed to open */ + { + dmc_close_transmit(controller, "failed to connect"); + ans = 0; + } + else /* connected */ + { + if (!controller->line->transmit_writeable) + { + sim_debug(DBG_CON, controller->device, "Transmit socket is now writeable\n"); + } + controller->line->transmit_writeable = TRUE; + ans = 1; + } + } - return ans; + return ans; } -void dmc_close_receive(CTLR *controller, char *reason) +void dmc_close_receive(CTLR *controller, char *reason, char *from) { - sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %d, socket %d, reason: %s\n", controller->line->receive_port, controller->line->socket, reason); - sim_close_sock(controller->line->socket, FALSE); - controller->line->socket = INVALID_SOCKET; +sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %s, reason: %s%s%s\n", controller->line->receive_port, reason, from ? " from " : "", from ? from : ""); + sim_close_sock(controller->line->socket, FALSE); + controller->line->socket = INVALID_SOCKET; - if (controller->line->receive_readable) - { - sim_debug(DBG_CON, controller->device, "Readable receive socket closed, reason: %s\n", reason); - } - controller->line->receive_readable = FALSE; + if (controller->line->receive_readable) + { + sim_debug(DBG_CON, controller->device, "Readable receive socket closed, reason: %s\n", reason); + } + controller->line->receive_readable = FALSE; } void dmc_error_and_close_receive(CTLR *controller, char *format) { int err = WSAGetLastError(); - char errmsg[80]; - sprintf(errmsg, format, err); - if (controller->line->isPrimary) - { + char errmsg[80]; + sprintf(errmsg, format, err); + if (controller->line->isPrimary) + { dmc_close_transmit(controller, errmsg); - } - else - { - dmc_close_receive(controller, errmsg); - } + } + else + { + dmc_close_receive(controller, errmsg, NULL); + } } void dmc_close_transmit(CTLR *controller, char *reason) { - sim_debug(DBG_SOK, controller->device, "Closing transmit socket to port %s, socket %d, reason: %s\n", controller->line->transmit_host, controller->line->socket, reason); - sim_close_sock(controller->line->socket, FALSE); - controller->line->socket = INVALID_SOCKET; + sim_debug(DBG_SOK, controller->device, "Closing transmit socket to port %s, socket %d, reason: %s\n", controller->line->transmit_host, controller->line->socket, reason); + sim_close_sock(controller->line->socket, FALSE); + controller->line->socket = INVALID_SOCKET; - if (controller->line->transmit_writeable) - { - sim_debug(DBG_CON, controller->device, "Writeable transmit socket closed, reason: %s\n", reason); - } - controller->line->transmit_writeable = FALSE; + if (controller->line->transmit_writeable) + { + sim_debug(DBG_CON, controller->device, "Writeable transmit socket closed, reason: %s\n", reason); + } + controller->line->transmit_writeable = FALSE; } /* returns true if some data was received */ int dmc_buffer_fill_receive_buffers(CTLR *controller) { - int ans = FALSE; - int socket; - if (controller->state == Initialised) - { - /* accept any inbound connection but just throw away any data */ - if (dmc_get_socket(controller, TRUE)) - { - char buffer[1000]; - int bytes_read = 0; - socket = controller->line->socket; - bytes_read = sim_read_sock(socket, buffer, sizeof(buffer)); - if (bytes_read < 0) - { -printf("Socket error was when trying to fill receive buffers when controller initialised.\n"); - //dmc_error_and_close_receive(controller, "read error, code=%d"); - } - else if (bytes_read > 0) - { - sim_debug(DBG_SOK, controller->device, "Discarding received data while controller is not running\n"); - } - } - } - else - { - BUFFER *buffer = dmc_buffer_queue_find_first_available(controller->receive_queue); - while (buffer != NULL && buffer->state == Available) - { - if (dmc_get_socket(controller, TRUE)) - { - int bytes_read = 0; - int lost_data = 0; + int ans = FALSE; + SOCKET socket; + if (controller->state == Initialised) + { + /* accept any inbound connection but just throw away any data */ + if (dmc_get_socket(controller, TRUE)) + { + char buffer[1000]; + int bytes_read = 0; + socket = controller->line->socket; + bytes_read = sim_read_sock(socket, buffer, sizeof(buffer)); + if (bytes_read < 0) + { + dmc_error_and_close_receive(controller, "read error, code=%d"); + } + else if (bytes_read > 0) + { + sim_debug(DBG_SOK, controller->device, "Discarding received data while controller is not running\n"); + } + } + } + else + { + BUFFER *buffer = dmc_buffer_queue_find_first_available(controller->receive_queue); + while (buffer != NULL && buffer->state == Available) + { + if (dmc_get_socket(controller, TRUE)) + { + int bytes_read = 0; + int lost_data = 0; - socket = controller->line->socket; - /* read block length and allocate buffer */ - if (buffer->block_len_bytes_read < sizeof(buffer->actual_block_len)) - { - char *start_addr = ((char *)&buffer->actual_block_len) + buffer->block_len_bytes_read; - bytes_read = sim_read_sock(socket, start_addr, sizeof(buffer->actual_block_len) - buffer->block_len_bytes_read); - if (bytes_read >= 0) - { - buffer->block_len_bytes_read += bytes_read; - if (buffer->block_len_bytes_read == sizeof(buffer->actual_block_len)) - { - buffer->actual_block_len = ntohs(buffer->actual_block_len); - if (buffer->actual_block_len > buffer->count) - { - sim_debug(DBG_WRN, controller->device, "LOST DATA, buffer available has %d bytes, but the block is %d bytes\n", buffer->count, buffer->actual_block_len); - dmc_setreg(controller, 4, 0, 0); - dmc_setreg(controller, 6, 0, 0); - dmc_set_lost_data(controller); - dmc_start_control_output_transfer(controller); - lost_data = 1; - } + socket = controller->line->socket; + /* read block length and allocate buffer */ + if (buffer->block_len_bytes_read < sizeof(buffer->actual_block_len)) + { + char *start_addr = ((char *)&buffer->actual_block_len) + buffer->block_len_bytes_read; + bytes_read = sim_read_sock(socket, start_addr, sizeof(buffer->actual_block_len) - buffer->block_len_bytes_read); + if (bytes_read >= 0) + { + buffer->block_len_bytes_read += bytes_read; + if (buffer->block_len_bytes_read == sizeof(buffer->actual_block_len)) + { + buffer->actual_block_len = ntohs(buffer->actual_block_len); + if (buffer->actual_block_len > buffer->count) + { + sim_debug(DBG_WRN, controller->device, "LOST DATA, buffer available has %d bytes, but the block is %d bytes\n", buffer->count, buffer->actual_block_len); + dmc_setreg(controller, 4, 0, 0); + dmc_setreg(controller, 6, 0, 0); + dmc_set_lost_data(controller); + dmc_start_control_output_transfer(controller); + lost_data = 1; + } - if (buffer->actual_block_len > 0) - { - buffer->transfer_buffer = (uint8 *)malloc(buffer->actual_block_len); /* read full buffer regardless, so bad buffer is flushed */ - } - } - } - else - { + if (buffer->actual_block_len > 0) + { + buffer->transfer_buffer = (uint8 *)malloc(buffer->actual_block_len); /* read full buffer regardless, so bad buffer is flushed */ + } + } + } + else + { //printf("Socket error was when trying to read the header.\n"); - } - } - else - { - lost_data = buffer->actual_block_len > buffer->count; /* need to preserve this variable if need more than one attempt to read the buffer */ - } + } + } + else + { + lost_data = buffer->actual_block_len > buffer->count; /* need to preserve this variable if need more than one attempt to read the buffer */ + } - /* read the actual block */ - if (buffer->block_len_bytes_read == sizeof(buffer->actual_block_len)) - { - bytes_read = 0; - if (buffer->actual_block_len > 0) - { - int bytes_to_read = dmc_line_speed_calculate_byte_length(controller->line->bytes_received_in_last_second, buffer->actual_block_len - buffer->actual_bytes_transferred, controller->line->speed); - if (bytes_to_read > 0) - { - bytes_read = sim_read_sock(controller->line->socket, buffer->transfer_buffer + buffer->actual_bytes_transferred, bytes_to_read); - } - } + /* read the actual block */ + if (buffer->block_len_bytes_read == sizeof(buffer->actual_block_len)) + { + bytes_read = 0; + if (buffer->actual_block_len > 0) + { + int bytes_to_read = dmc_line_speed_calculate_byte_length(controller->line->bytes_received_in_last_second, buffer->actual_block_len - buffer->actual_bytes_transferred, controller->line->speed); + if (bytes_to_read > 0) + { + bytes_read = sim_read_sock(controller->line->socket, (char *)(buffer->transfer_buffer + buffer->actual_bytes_transferred), bytes_to_read); + } + } - if (bytes_read >= 0) - { - buffer->actual_bytes_transferred += bytes_read; - controller->line->bytes_received_in_last_second += bytes_read; + if (bytes_read >= 0) + { + buffer->actual_bytes_transferred += bytes_read; + controller->line->bytes_received_in_last_second += bytes_read; - if (buffer->actual_bytes_transferred >= buffer->actual_block_len) - { - dmc_buffer_trace(controller, buffer->transfer_buffer, buffer->actual_bytes_transferred, "REC "); - controller->buffers_received_from_net++; - buffer->state = ContainsData; - if (!lost_data) - { - Map_WriteB(buffer->address, buffer->actual_bytes_transferred, buffer->transfer_buffer); - } - else - { - buffer->actual_block_len = 0; /* so an empty buffer is returned to the driver */ - } + if (buffer->actual_bytes_transferred >= buffer->actual_block_len) + { + dmc_buffer_trace(controller, buffer->transfer_buffer, buffer->actual_bytes_transferred, "REC ", buffer->address); + controller->buffers_received_from_net++; + buffer->state = ContainsData; + if (!lost_data) + { + Map_WriteB(buffer->address, buffer->actual_bytes_transferred, buffer->transfer_buffer); + } + else + { + buffer->actual_block_len = 0; /* so an empty buffer is returned to the driver */ + } - if (buffer->actual_block_len > 0) - { - free(buffer->transfer_buffer); - buffer->transfer_buffer = NULL; - } + if (buffer->actual_block_len > 0) + { + free(buffer->transfer_buffer); + buffer->transfer_buffer = NULL; + } - ans = TRUE; - } - } - else - { + ans = TRUE; + } + } + else + { printf("Socket error was when trying to fill receive buffers when trying to read the body.\n"); - } - } + } + } - /* Only close the socket if there was an error or no more data */ - if (bytes_read < 0) - { - dmc_error_and_close_receive(controller, "read error, code=%d"); - break; - } + /* Only close the socket if there was an error or no more data */ + if (bytes_read < 0) + { + dmc_error_and_close_receive(controller, "read error, code=%d"); + break; + } - /* if buffer is incomplete do not try to read any more buffers and continue filling this one later */ - if (buffer->state == Available) - { - break; /* leave buffer available and continue filling it later */ - } - } - else - { - break; - } + /* if buffer is incomplete do not try to read any more buffers and continue filling this one later */ + if (buffer->state == Available) + { + break; /* leave buffer available and continue filling it later */ + } + } + else + { + break; + } - buffer = buffer ->next; - } - } + buffer = buffer ->next; + } + } - return ans; + return ans; } /* returns true if some data was actually sent */ int dmc_buffer_send_transmit_buffers(CTLR *controller) { - int ans = FALSE; - int socket; - /* when transmit buffer is queued it is marked as available, not as ContainsData */ - BUFFER *buffer = dmc_buffer_queue_find_first_available(controller->transmit_queue); - while (buffer != NULL) - { - if (dmc_get_socket(controller, FALSE)) // TODO: , buffer->is_loopback); - { - int bytes = 0; - uint16 block_len; - int total_buffer_len = (buffer->count > 0) ? buffer->count + sizeof(block_len) : 0; + int ans = FALSE; + /* when transmit buffer is queued it is marked as available, not as ContainsData */ + BUFFER *buffer = dmc_buffer_queue_find_first_available(controller->transmit_queue); + while (buffer != NULL) + { + if (dmc_get_socket(controller, FALSE)) // TODO: , buffer->is_loopback); + { + int bytes = 0; + int bytes_to_send; + uint16 block_len; + int total_buffer_len = (buffer->count > 0) ? buffer->count + sizeof(block_len) : 0; - socket = controller->line->socket; - /* only send the buffer if it actually has some data, sometimes get zero length buffers - don't send these */ - if (total_buffer_len > 0) - { - if (buffer->actual_bytes_transferred <= 0) - { - /* construct buffer and include block length bytes */ - buffer->transfer_buffer = (uint8 *)malloc(total_buffer_len); - block_len = htons(buffer->count); - memcpy(buffer->transfer_buffer, (char *)&block_len, sizeof(block_len)); - Map_ReadB(buffer->address, buffer->count, buffer->transfer_buffer + sizeof(block_len)); - } + /* only send the buffer if it actually has some data, sometimes get zero length buffers - don't send these */ + if (total_buffer_len > 0) + { + if (buffer->transfer_buffer == NULL) + { + int n; + /* construct buffer and include block length bytes */ + buffer->transfer_buffer = (uint8 *)malloc(total_buffer_len); + block_len = htons(buffer->count); + memcpy(buffer->transfer_buffer, (char *)&block_len, sizeof(block_len)); + n = Map_ReadB(buffer->address, buffer->count, buffer->transfer_buffer + sizeof(block_len)); + if (n > 0) + { + sim_debug(DBG_WRN, controller->device, "DMA error\n"); + } + } - bytes = sim_write_sock (controller->line->socket, buffer->transfer_buffer + buffer->actual_bytes_transferred, buffer->count + sizeof(block_len) - buffer->actual_bytes_transferred); - if (bytes >= 0) - { - buffer->actual_bytes_transferred += bytes; - } + bytes_to_send = dmc_line_speed_calculate_byte_length(controller->line->bytes_sent_in_last_second, buffer->count + sizeof(block_len) - buffer->actual_bytes_transferred, controller->line->speed); + if (bytes_to_send > 0) + { + bytes = sim_write_sock (controller->line->socket, (char *)(buffer->transfer_buffer + buffer->actual_bytes_transferred), bytes_to_send); + if (bytes >= 0) + { + buffer->actual_bytes_transferred += bytes; + controller->line->bytes_sent_in_last_second += bytes; + } - if (buffer->actual_bytes_transferred >= total_buffer_len || bytes < 0) - { - dmc_buffer_trace(controller, buffer->transfer_buffer+sizeof(block_len), buffer->count, "TRAN"); - free(buffer->transfer_buffer); - } - } + if (buffer->actual_bytes_transferred >= total_buffer_len || bytes < 0) + { + dmc_buffer_trace(controller, buffer->transfer_buffer+sizeof(block_len), buffer->count, "TRAN", buffer->address); + free(buffer->transfer_buffer); + } + } + } - if (buffer->actual_bytes_transferred >= total_buffer_len) - { - controller->buffers_transmitted_to_net++; - buffer->state = ContainsData; // so won't try to transmit again - ans = TRUE; - } - else if (bytes < 0) - { - int err = WSAGetLastError (); - char errmsg[80]; - sprintf(errmsg, "write failure, code=%d", err); + if (buffer->actual_bytes_transferred >= total_buffer_len) + { + controller->buffers_transmitted_to_net++; + buffer->state = ContainsData; // so won't try to transmit again + ans = TRUE; + } + else if (bytes < 0) + { + int err = WSAGetLastError (); + char errmsg[80]; + sprintf(errmsg, "write failure, code=%d", err); - dmc_close_transmit(controller, errmsg); - break; - } - else - { - break; /* poll again later to send more bytes */ - } + dmc_close_transmit(controller, errmsg); + break; + } + else + { + break; /* poll again later to send more bytes */ + } - } - else - { - break; - } + } + else + { + break; + } - buffer = buffer ->next; - } + buffer = buffer ->next; + } - return ans; + return ans; } void dmc_start_transfer_receive_buffer(CTLR *controller) { - BUFFER *head = dmc_buffer_queue_head(controller->receive_queue); - if (head != NULL) - { - if (head->state == ContainsData) - { - head->state = TransferInProgress; - dmc_start_data_output_transfer(controller, head->address, head->actual_block_len, TRUE); - } - } + BUFFER *head = dmc_buffer_queue_head(controller->receive_queue); + if (head != NULL) + { + if (head->state == ContainsData) + { + head->state = TransferInProgress; + dmc_start_data_output_transfer(controller, head->address, head->actual_block_len, TRUE); + } + } } void dmc_start_transfer_transmit_buffer(CTLR *controller) { - BUFFER *head = dmc_buffer_queue_head(controller->transmit_queue); - if (head != NULL) - { - if (head->state == ContainsData) - { - head->state = TransferInProgress; - dmc_start_data_output_transfer(controller, head->address, head->count, FALSE); - } - } + BUFFER *head = dmc_buffer_queue_head(controller->transmit_queue); + if (head != NULL) + { + if (head->state == ContainsData) + { + head->state = TransferInProgress; + dmc_start_data_output_transfer(controller, head->address, head->count, FALSE); + } + } } void dmc_check_for_output_transfer_completion(CTLR *controller) { - if (!dmc_is_rdyo_set(controller)) - { - sim_debug(DBG_INF, controller->device, "Output transfer completed\n"); - controller->transfer_state = Idle; - if (dmc_get_output_transfer_type(controller) == TYPE_BACCO) - { - if (dmc_is_out_io_set(controller)) - { - dmc_buffer_queue_release_head(controller->receive_queue); - controller->receive_buffer_output_transfers_completed++; - } - else - { - dmc_buffer_queue_release_head(controller->transmit_queue); - controller->transmit_buffer_output_transfers_completed++; - } - } - dmc_process_command(controller); // check for any input transfers - } + if (!dmc_is_rdyo_set(controller)) + { + sim_debug(DBG_INF, controller->device, "Output transfer completed\n"); + controller->transfer_state = Idle; + if (dmc_get_output_transfer_type(controller) == TYPE_BACCO) + { + if (dmc_is_out_io_set(controller)) + { + dmc_buffer_queue_release_head(controller->receive_queue); + controller->receive_buffer_output_transfers_completed++; + } + else + { + dmc_buffer_queue_release_head(controller->transmit_queue); + controller->transmit_buffer_output_transfers_completed++; + } + } + dmc_process_command(controller); // check for any input transfers + } } void dmc_process_input_transfer_completion(CTLR *controller) { - if (dmc_is_dmc(controller)) - { - if (!dmc_is_rqi_set(controller)) - { - uint16 sel4 = controller->csrs->sel4; - uint16 sel6 = controller->csrs->sel6; - dmc_clear_rdyi(controller); - //dmc_clrrxint(); - if (controller->transfer_type == TYPE_BASEI) - { - //int i; - uint32 baseaddr = sel6 >> 14 | sel4; - uint16 count = sel6 & 0x3FFF; - sim_debug(DBG_INF, controller->device, "Completing Base In input transfer, base address=0x%08x count=%d\n", baseaddr, count); - //for (i = 0; i < count; i++) - //{ - // uint8 t = ((uint8)i + 1)*2; - // Map_WriteB(baseaddr + i, 1, &t); - //} - } - else if (controller->transfer_type == TYPE_BACCI) - { - uint32 addr = sel6 >> 14 | sel4; - uint16 count = sel6 & 0x3FFF; - if (controller->transfer_in_io != dmc_is_in_io_set(controller)) - { - sim_debug(DBG_TRC, controller->device, "IN IO MISMATCH\n"); - } + if (dmc_is_dmc(controller)) + { + if (!dmc_is_rqi_set(controller)) + { + uint16 sel4 = controller->csrs->sel4; + uint16 sel6 = controller->csrs->sel6; + dmc_clear_rdyi(controller); + //dmc_clrrxint(); + if (controller->transfer_type == TYPE_BASEI) + { + //int i; + uint32 baseaddr = ((sel6 >> 14) << 16) | sel4; + uint16 count = sel6 & 0x3FFF; + sim_debug(DBG_INF, controller->device, "Completing Base In input transfer, base address=0x%08x count=%d\n", baseaddr, count); + //for (i = 0; i < count; i++) + //{ + // uint8 t = ((uint8)i + 1)*2; + // Map_WriteB(baseaddr + i, 1, &t); + //} + } + else if (controller->transfer_type == TYPE_BACCI) + { + uint32 addr = ((sel6 >> 14) << 16) | sel4; + uint16 count = sel6 & 0x3FFF; + if (controller->transfer_in_io != dmc_is_in_io_set(controller)) + { + sim_debug(DBG_TRC, controller->device, "IN IO MISMATCH\n"); + } - controller->transfer_in_io = dmc_is_in_io_set(controller); // using evdmc the flag is set when the transfer completes - not when it starts, evdca seems to set in only at the start of the transfer - clearing it when it completes - controller->state = Running; - if (controller->transfer_in_io) - { - dmc_buffer_queue_add(controller->receive_queue, addr, count); - dmc_buffer_fill_receive_buffers(controller); - controller->receive_buffer_input_transfers_completed++; - } - else - { - dmc_buffer_queue_add(controller->transmit_queue, addr, count); - dmc_buffer_send_transmit_buffers(controller); - controller->transmit_buffer_input_transfers_completed++; - } - } + controller->transfer_in_io = dmc_is_in_io_set(controller); // using evdmc the flag is set when the transfer completes - not when it starts, evdca seems to set in only at the start of the transfer - clearing it when it completes + controller->state = Running; + if (controller->transfer_in_io) + { + dmc_buffer_queue_add(controller->receive_queue, addr, count); + dmc_buffer_fill_receive_buffers(controller); + controller->receive_buffer_input_transfers_completed++; + } + else + { + dmc_buffer_queue_add(controller->transmit_queue, addr, count); + dmc_buffer_send_transmit_buffers(controller); + controller->transmit_buffer_input_transfers_completed++; + } + } - controller->transfer_state = Idle; - } - } - else - { - if (!dmc_is_rdyi_set(controller)) - { - uint16 sel4 = controller->csrs->sel4; - uint16 sel6 = controller->csrs->sel6; - //dmc_clrrxint(); - if (controller->transfer_type == TYPE_DMP_MODE) - { - uint16 mode = sel6 & DMP_TYPE_INPUT_MASK; - char * duplex = (mode & 1) ? "Full-Duplex" : "Half-Duplex"; - char * config; - if (mode & 4) - { - config = "Point-to-point"; - } - else - { - config = (mode & 2) ? "Tributary station" : "Control Station"; - } + controller->transfer_state = Idle; + } + } + else + { + if (!dmc_is_rdyi_set(controller)) + { + uint16 sel4 = controller->csrs->sel4; + uint16 sel6 = controller->csrs->sel6; + //dmc_clrrxint(); + if (controller->transfer_type == TYPE_DMP_MODE) + { + uint16 mode = sel6 & DMP_TYPE_INPUT_MASK; + char * duplex = (mode & 1) ? "Full-Duplex" : "Half-Duplex"; + char * config; + if (mode & 4) + { + config = "Point-to-point"; + } + else + { + config = (mode & 2) ? "Tributary station" : "Control Station"; + } - sim_debug(DBG_INF, controller->device, "Completing Mode input transfer, %s %s\n", duplex, config); - } - else if (controller->transfer_type == TYPE_DMP_CONTROL) - { - sim_debug(DBG_WRN, controller->device, "Control command (not processed yet)\n"); - } - else if (controller->transfer_type == TYPE_DMP_RECEIVE) - { - sim_debug(DBG_WRN, controller->device, "Receive Buffer command (not processed yet)\n"); - } - else if (controller->transfer_type == TYPE_DMP_TRANSMIT) - { - sim_debug(DBG_WRN, controller->device, "Transmit Buffer command (not processed yet)\n"); - } - else - { - sim_debug(DBG_WRN, controller->device, "Unrecognised command code %hu\n", controller->transfer_type); - } + sim_debug(DBG_INF, controller->device, "Completing Mode input transfer, %s %s\n", duplex, config); + } + else if (controller->transfer_type == TYPE_DMP_CONTROL) + { + sim_debug(DBG_WRN, controller->device, "Control command (not processed yet)\n"); + } + else if (controller->transfer_type == TYPE_DMP_RECEIVE) + { + sim_debug(DBG_WRN, controller->device, "Receive Buffer command (not processed yet)\n"); + } + else if (controller->transfer_type == TYPE_DMP_TRANSMIT) + { + sim_debug(DBG_WRN, controller->device, "Transmit Buffer command (not processed yet)\n"); + } + else + { + sim_debug(DBG_WRN, controller->device, "Unrecognised command code %hu\n", controller->transfer_type); + } - controller->transfer_state = Idle; - } - } + controller->transfer_state = Idle; + } + } } void dmc_process_command(CTLR *controller) { - if (dmc_is_master_clear_set(controller)) - { - dmc_process_master_clear(controller); - } - else - { - if (controller->transfer_state == InputTransfer) - { - dmc_process_input_transfer_completion(controller); - } - else if (controller->transfer_state == OutputTransfer) - { - dmc_check_for_output_transfer_completion(controller); - } - else if (dmc_is_rqi_set(controller)) - { - dmc_start_input_transfer(controller); - } - } + if (dmc_is_master_clear_set(controller)) + { + dmc_process_master_clear(controller); + } + else + { + if (controller->transfer_state == InputTransfer) + { + dmc_process_input_transfer_completion(controller); + } + else if (controller->transfer_state == OutputTransfer) + { + dmc_check_for_output_transfer_completion(controller); + } + else if (dmc_is_rqi_set(controller)) + { + dmc_start_input_transfer(controller); + } + } } t_stat dmc_rd(int32 *data, int32 PA, int32 access) { - CTLR *controller = dmc_get_controller_from_address(PA); - int reg = PA & 07; - sim_debug(DBG_TRC, controller->device, "dmc_rd(), addr=0x%x access=%d\n", PA, access); - *data = dmc_getreg(controller, PA, 1); + CTLR *controller = dmc_get_controller_from_address(PA); + int reg = PA & 07; + sim_debug(DBG_TRC, controller->device, "dmc_rd(), addr=0x%x access=%d\n", PA, access); + *data = dmc_getreg(controller, PA, 1); - return SCPE_OK; + return SCPE_OK; } t_stat dmc_wr(int32 data, int32 PA, int32 access) { - CTLR *controller = dmc_get_controller_from_address(PA); - int reg = PA & 07; - uint16 oldValue = dmc_getreg(controller, PA, 0); - if (access == WRITE) - { - sim_debug(DBG_TRC, controller->device, "dmc_wr(), addr=0x%08x, SEL%d, data=0x%04x\n", PA, reg, data); - } - else - { - sim_debug(DBG_TRC, controller->device, "dmc_wr(), addr=0x%08x, BSEL%d, data=%04x\n", PA, reg, data); - } + CTLR *controller = dmc_get_controller_from_address(PA); + int reg = PA & 07; + uint16 oldValue = dmc_getreg(controller, PA, 0); + if (access == WRITE) + { + sim_debug(DBG_TRC, controller->device, "dmc_wr(), addr=0x%08x, SEL%d, data=0x%04x\n", PA, reg, data); + } + else + { + sim_debug(DBG_TRC, controller->device, "dmc_wr(), addr=0x%08x, BSEL%d, data=%04x\n", PA, reg, data); + } - if (access == WRITE) - { - if (PA & 1) - sim_debug(DBG_WRN, controller->device, "dmc_wr(), Unexpected non-16-bit write access to SEL%d\n", reg); - dmc_setreg(controller, PA, data, 1); - } - else - { - uint16 mask; - if (PA & 1) - { - mask = 0xFF00; - data = data << 8; - } - else - { - mask = 0x00FF; - } + if (access == WRITE) + { + if (PA & 1) + sim_debug(DBG_WRN, controller->device, "dmc_wr(), Unexpected non-16-bit write access to SEL%d\n", reg); + dmc_setreg(controller, PA, data, 1); + } + else + { + uint16 mask; + if (PA & 1) + { + mask = 0xFF00; + data = data << 8; + } + else + { + mask = 0x00FF; + } - dmc_setreg(controller, PA, (oldValue & ~mask) | (data & mask), 1); - } + dmc_setreg(controller, PA, (oldValue & ~mask) | (data & mask), 1); + } - if (dmc_getsel(reg) == 0 || dmc_getsel(reg) == 1) - { - dmc_process_command(controller); - } + if (dmc_getsel(reg) == 0 || dmc_getsel(reg) == 1) + { + dmc_process_command(controller); + } - return SCPE_OK; + return SCPE_OK; } int32 dmc_rxint (void) { - int i; - int32 ans = 0; /* no interrupt request active */ - for (i=0; irxi != 0) - { - DIB *dib = (DIB *)controller->device->ctxt; - ans = dib->vec; - dmc_clrrxint(controller); - break; - } - } + int i; + int32 ans = 0; /* no interrupt request active */ + for (i=0; irxi != 0) + { + DIB *dib = (DIB *)controller->device->ctxt; + ans = dib->vec; + dmc_clrrxint(controller); + break; + } + } - return ans; - } + return ans; + } int32 dmc_txint (void) { - int i; - int32 ans = 0; /* no interrupt request active */ - for (i=0; itxi != 0) - { - DIB *dib = (DIB *)controller->device->ctxt; - ans = dib->vec + 4; - dmc_clrtxint(controller); - break; - } - } + int i; + int32 ans = 0; /* no interrupt request active */ + for (i=0; itxi != 0) + { + DIB *dib = (DIB *)controller->device->ctxt; + ans = dib->vec + 4; + dmc_clrtxint(controller); + break; + } + } - return ans; + return ans; - //int32 ans = 0; /* no interrupt request active */ - //if (controller->txi != 0) - //{ - // DIB *dib = (DIB *)controller->device->ctxt; - // ans = dib->vec + 4; - // dmc_clrtxint(); - //} + //int32 ans = 0; /* no interrupt request active */ + //if (controller->txi != 0) + //{ + // DIB *dib = (DIB *)controller->device->ctxt; + // ans = dib->vec + 4; + // dmc_clrtxint(); + //} - //return ans; + //return ans; } t_stat dmc_reset (DEVICE *dptr) { - t_stat ans = SCPE_OK; - //int32 ndev; - CTLR *controller = dmc_get_controller_from_device(dptr); + t_stat ans = SCPE_OK; + //int32 ndev; + CTLR *controller = dmc_get_controller_from_device(dptr); - sim_debug(DBG_TRC, dptr, "dmc_reset()\n"); + sim_debug(DBG_TRC, dptr, "dmc_reset()\n"); - if (dmc_get_unit_stats(dptr->units) == NULL) - { - dmc_set_unit_stats(dptr->units, (UNIT_STATS *)malloc(sizeof(UNIT_STATS))); - dmc_reset_unit_stats(dmc_get_unit_stats(dptr->units)); - } + if (dmc_get_unit_stats(dptr->units) == NULL) + { + dmc_set_unit_stats(dptr->units, (UNIT_STATS *)malloc(sizeof(UNIT_STATS))); + dmc_reset_unit_stats(dmc_get_unit_stats(dptr->units)); + } - dmc_clrrxint(controller); - dmc_clrtxint(controller); - sim_cancel (controller->device->units); /* stop poll */ - if (controller->svc_poll_interval == -1) controller->svc_poll_interval = POLL; + dmc_clrrxint(controller); + dmc_clrtxint(controller); + sim_cancel (controller->device->units); /* stop poll */ + if (controller->svc_poll_interval == -1) controller->svc_poll_interval = POLL; - if (!(dptr->flags & DEV_DIS)) - { + if (!(dptr->flags & DEV_DIS)) + { ans = auto_config (dptr->name, DMC_UNITSPERDEVICE); - } - return ans; + } + return ans; } t_stat dmc_attach (UNIT *uptr, char *cptr) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - t_stat ans = SCPE_OK; + CTLR *controller = dmc_get_controller_from_unit(uptr); + t_stat ans = SCPE_OK; ans = dmc_open_master_socket(controller, cptr); - if (ans == SCPE_OK) - { - controller->line->socket = INVALID_SOCKET; - uptr->flags = uptr->flags | UNIT_ATT; /* set unit attached flag */ - uptr->filename = (char *)malloc(strlen(cptr)+1); - strcpy(uptr->filename, cptr); - controller->line->receive_port = uptr->filename; - } + if (ans == SCPE_OK) + { + controller->line->socket = INVALID_SOCKET; + uptr->flags = uptr->flags | UNIT_ATT; /* set unit attached flag */ + uptr->filename = (char *)malloc(strlen(cptr)+1); + strcpy(uptr->filename, cptr); + controller->line->receive_port = uptr->filename; + } - return ans; + return ans; } t_stat dmc_detach (UNIT *uptr) { - CTLR *controller = dmc_get_controller_from_unit(uptr); - dmc_close_master_socket(controller); - uptr->flags = uptr->flags & ~UNIT_ATT; /* clear unit attached flag */ - free(uptr->filename); - uptr->filename = NULL; + CTLR *controller = dmc_get_controller_from_unit(uptr); + dmc_close_master_socket(controller); + uptr->flags = uptr->flags & ~UNIT_ATT; /* clear unit attached flag */ + free(uptr->filename); + uptr->filename = NULL; - return SCPE_OK; + return SCPE_OK; } diff --git a/PDP11/pdp11_io_lib.c b/PDP11/pdp11_io_lib.c index 167d5d10..fdbb6cd9 100644 --- a/PDP11/pdp11_io_lib.c +++ b/PDP11/pdp11_io_lib.c @@ -352,7 +352,7 @@ AUTO_CON auto_tab[] = { { { NULL }, 1, 2, 8, 8 }, /* DU11 */ { { NULL }, 1, 2, 8, 8 }, /* DUP11 */ { { NULL }, 10, 2, 8, 8 }, /* LK11A */ - { { NULL }, 1, 2, 8, 8 }, /* DMC11 */ + { { "DMC" }, 1, 2, 8, 8 }, /* DMC11 */ { { "DZ" }, DZ_MUXES, 2, 8, 8 }, /* DZ11 */ { { NULL }, 1, 2, 8, 8 }, /* KMC11 */ { { NULL }, 1, 2, 8, 8 }, /* LPP11 */ diff --git a/VAX/vax780_defs.h b/VAX/vax780_defs.h index f47b8656..7700ac3c 100644 --- a/VAX/vax780_defs.h +++ b/VAX/vax780_defs.h @@ -313,7 +313,7 @@ typedef struct { #define IOLN_PTR 004 #define IOBA_PTP (IOPAGEBASE + 017554) /* PC11 punch */ #define IOLN_PTP 004 -#define IOBA_DMC (IOPAGEBASE + 0760060) +#define IOBA_DMC (IOPAGEBASE + 0760060) /* DMC11 */ #define IOLN_DMC 010 /* Interrupt assignments; within each level, priority is right to left */ From faa5c61fe4269530c8e4c5325319cbeccb07a9f5 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 7 Nov 2012 05:18:14 -0800 Subject: [PATCH 29/63] Added validation of an incoming connection's IP address when a mux line is configured both with a listening port and an outbound connection destination. In this case, connections will only be accepted from the IP address of the target destination. --- sim_tmxr.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sim_tmxr.c b/sim_tmxr.c index 7d02743d..0637489b 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -698,6 +698,7 @@ TMLN *lp; int32 *op; int32 i, j; char *address; +char msg[512]; uint32 poll_time = sim_os_msec (); static char mantra[] = { TN_IAC, TN_WILL, TN_LINE, @@ -719,6 +720,8 @@ mp->last_poll_time = poll_time; newsock = sim_accept_conn (mp->master, &address); /* poll connect */ if (newsock != INVALID_SOCKET) { /* got a live one? */ + sprintf (msg, "tmxr_poll_conn() - Connection from %s", address); + tmxr_debug_trace (mp, msg); op = mp->lnorder; /* get line connection order list pointer */ i = mp->lines; /* play it safe in case lines == 0 */ ++mp->sessions; /* count the new session */ @@ -738,6 +741,7 @@ if (newsock != INVALID_SOCKET) { /* got a live one? */ if (i >= mp->lines) { /* all busy? */ tmxr_msg (newsock, "All connections busy\r\n"); + tmxr_debug_trace (mp, "tmxr_poll_conn() - All connections busy"); sim_close_sock (newsock, 0); free (address); } @@ -783,8 +787,23 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se newsock = sim_accept_conn (lp->master, &address); /* poll connect */ if (newsock != INVALID_SOCKET) { /* got a live one? */ + sprintf (msg, "tmxr_poll_conn() - Line Connection from %s", address); + tmxr_debug_trace_line (lp, msg); ++mp->sessions; /* count the new session */ + if (lp->destination) { /* Virtual Null Modem Cable? */ + char host[CBUFSIZE]; + + sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL); + if (strcmp(address, host)) { + tmxr_msg (newsock, "Rejecting connection from unexpected source\r\n"); + sprintf (msg, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host); + tmxr_debug_trace_line (lp, msg); + sim_close_sock (newsock, 0); + free (address); + continue; /* Move on to next line */ + } + } if (lp->conn == 0) { /* is the line available? */ tmxr_init_line (lp); /* init line */ lp->conn = newsock; /* record connection */ @@ -799,6 +818,7 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se } else { tmxr_msg (newsock, "Line connection busy\r\n"); + tmxr_debug_trace_line (lp, "tmxr_poll_conn() - Line connection busy"); sim_close_sock (newsock, 0); free (address); } From f8ae8d2741361efbbfafe0ab1f296a58d48bfa99 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 7 Nov 2012 14:26:07 -0800 Subject: [PATCH 30/63] Periodically flush buffered console mux data. This is necessary to cover the situation when data was buffered and sending data out the connection stalled due to OS/network buffering and no more output traffic happens to be generated. --- sim_console.c | 2 ++ sim_tmxr.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sim_console.c b/sim_console.c index 3ab9029e..f1fb5354 100644 --- a/sim_console.c +++ b/sim_console.c @@ -185,6 +185,8 @@ if (sim_con_tmxr.master == 0) /* not Telnet? done */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ sim_activate_after(uptr, 1000000); /* check again in 1 second */ +if (sim_con_ldsc.xmte == 0) /* xmt disabled? */ + tmxr_send_buffered_data (&sim_con_ldsc); /* try to flush buffered data */ return SCPE_OK; } diff --git a/sim_tmxr.c b/sim_tmxr.c index 0637489b..7da4b16a 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -850,6 +850,7 @@ if (lp->serport) { free (lp->serconfig); lp->serconfig = NULL; lp->cnms = 0; + lp->rcve = lp->xmte = 0; } else if (!lp->mp->modem_control) { /* serial connection? */ @@ -862,6 +863,7 @@ else /* Telnet connection */ if (lp->conn) { sim_close_sock (lp->conn, 0); /* close socket */ lp->conn = 0; + lp->rcve = lp->xmte = 0; } free(lp->ipad); lp->ipad = NULL; From ecbbcc7228c00ec4707069afc86c685fdf1f02fe Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 7 Nov 2012 14:50:32 -0800 Subject: [PATCH 31/63] Added DMC11 Device to the VAX simulator --- VAX/vax_syslist.c | 7 +++++++ VAX/vaxmod_defs.h | 10 ++++++++++ Visual Studio Projects/VAX.vcproj | 8 ++++++++ descrip.mms | 6 ++++-- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index 054c5e43..1e278ca6 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -51,6 +51,8 @@ extern DEVICE dz_dev; extern DEVICE csi_dev, cso_dev; extern DEVICE xq_dev, xqb_dev; extern DEVICE vh_dev; +extern DEVICE dmc_dev[]; +extern DEVICE dmp_dev[]; extern int32 sim_switches; extern void WriteB (uint32 pa, int32 val); @@ -83,6 +85,11 @@ DEVICE *sim_devices[] = { &tq_dev, &xq_dev, &xqb_dev, + &dmc_dev[0], + &dmc_dev[1], + &dmc_dev[2], + &dmc_dev[3], + &dmp_dev[0], NULL }; diff --git a/VAX/vaxmod_defs.h b/VAX/vaxmod_defs.h index 2f235481..5b0cf736 100644 --- a/VAX/vaxmod_defs.h +++ b/VAX/vaxmod_defs.h @@ -318,6 +318,8 @@ typedef struct { #define IOLN_PTR 004 #define IOBA_PTP (IOPAGEBASE + 017554) /* PC11 punch */ #define IOLN_PTP 004 +#define IOBA_DMC (IOPAGEBASE + 017060) /* DMC11 */ +#define IOLN_DMC 010 /* The KA65x maintains 4 separate hardware IPL levels, IPL 17 to IPL 14; however, DEC Qbus controllers all interrupt on IPL 14 @@ -356,6 +358,8 @@ typedef struct { #define INT_V_VHTX 18 #define INT_V_QDSS 19 /* QDSS */ #define INT_V_CR 20 +#define INT_V_DMCRX 21 /* DMC11 */ +#define INT_V_DMCTX 22 #define INT_CLK (1u << INT_V_CLK) #define INT_RQ (1u << INT_V_RQ) @@ -379,6 +383,8 @@ typedef struct { #define INT_VHTX (1u << INT_V_VHTX) #define INT_QDSS (1u << INT_V_QDSS) #define INT_CR (1u << INT_V_CR) +#define INT_DMCRX (1u << INT_V_DMCRX) +#define INT_DMCTX (1u << INT_V_DMCTX) #define IPL_CLK (0x16 - IPL_HMIN) /* relative IPL */ #define IPL_RQ (0x14 - IPL_HMIN) @@ -402,6 +408,8 @@ typedef struct { #define IPL_VHTX (0x14 - IPL_HMIN) #define IPL_QDSS (0x14 - IPL_HMIN) #define IPL_CR (0x14 - IPL_HMIN) +#define IPL_DMCRX (0x14 - IPL_HMIN) +#define IPL_DMCTX (0x14 - IPL_HMIN) #define IPL_HMAX 0x17 /* highest hwre level */ #define IPL_HMIN 0x14 /* lowest hwre level */ @@ -428,6 +436,8 @@ typedef struct { #define VEC_DZTX (VEC_Q + 0304) #define VEC_VHRX (VEC_Q + 0310) #define VEC_VHTX (VEC_Q + 0314) +#define VEC_DMCRX (VEC_Q + 0310) +#define VEC_DMCTX (VEC_Q + 0314) /* Interrupt macros */ diff --git a/Visual Studio Projects/VAX.vcproj b/Visual Studio Projects/VAX.vcproj index 71ea3fd3..acd574fa 100644 --- a/Visual Studio Projects/VAX.vcproj +++ b/Visual Studio Projects/VAX.vcproj @@ -207,6 +207,10 @@ RelativePath="..\PDP11\pdp11_cr.c" > + + @@ -365,6 +369,10 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc" > + + diff --git a/descrip.mms b/descrip.mms index 5063d27e..ca932e0b 100644 --- a/descrip.mms +++ b/descrip.mms @@ -616,7 +616,8 @@ VAX_SOURCE2 = $(PDP11_DIR)PDP11_IO_LIB.C,\ $(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\ $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\ $(PDP11_DIR)PDP11_XQ.C,$(PDP11_DIR)PDP11_CR.C,\ - $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_VH.C + $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_VH.C,\ + $(PDP11_DIR)PDP11_DMC.C .IFDEF ALPHA_OR_IA64 VAX_OPTIONS = /INCL=($(SIMH_DIR),$(VAX_DIR),$(PDP11_DIR)$(PCAP_INC))\ /DEF=($(CC_DEFS),"VM_VAX=1","USE_ADDR64=1","USE_INT64=1"$(PCAP_DEFS)) @@ -646,7 +647,8 @@ VAX780_SOURCE2 = $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RQ.C,\ $(PDP11_DIR)PDP11_XU.C,$(PDP11_DIR)PDP11_RY.C,\ $(PDP11_DIR)PDP11_CR.C,$(PDP11_DIR)PDP11_RP.C,\ $(PDP11_DIR)PDP11_TU.C,$(PDP11_DIR)PDP11_HK.C,\ - $(PDP11_DIR)PDP11_VH.C,$(PDP11_DIR)PDP11_IO_LIB.C + $(PDP11_DIR)PDP11_VH.C,$(PDP11_DIR)PDP11_DMC.C,\ + $(PDP11_DIR)PDP11_IO_LIB.C .IFDEF ALPHA_OR_IA64 VAX780_OPTIONS = /INCL=($(SIMH_DIR),$(VAX780_DIR),$(PDP11_DIR)$(PCAP_INC))\ /DEF=($(CC_DEFS),"VM_VAX=1","USE_ADDR64=1","USE_INT64=1"$(PCAP_DEFS),"VAX_780=1") From 05707907a49b2daf7367c6ef4d9da0d70eeb68cf Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 7 Nov 2012 15:34:45 -0800 Subject: [PATCH 32/63] Fixed autogen table for DMC11 and DMP11 devices. --- PDP11/pdp11_io_lib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PDP11/pdp11_io_lib.c b/PDP11/pdp11_io_lib.c index fdbb6cd9..7e7e566f 100644 --- a/PDP11/pdp11_io_lib.c +++ b/PDP11/pdp11_io_lib.c @@ -352,7 +352,7 @@ AUTO_CON auto_tab[] = { { { NULL }, 1, 2, 8, 8 }, /* DU11 */ { { NULL }, 1, 2, 8, 8 }, /* DUP11 */ { { NULL }, 10, 2, 8, 8 }, /* LK11A */ - { { "DMC" }, 1, 2, 8, 8 }, /* DMC11 */ + { { "DMA", "DMB", "DMC", "DMD" }, 1, 2, 8, 8 }, /* DMC11 */ { { "DZ" }, DZ_MUXES, 2, 8, 8 }, /* DZ11 */ { { NULL }, 1, 2, 8, 8 }, /* KMC11 */ { { NULL }, 1, 2, 8, 8 }, /* LPP11 */ @@ -369,7 +369,7 @@ AUTO_CON auto_tab[] = { { { "RX", "RY" }, 1, 1, 8, 4, {IOBA_RX} , {VEC_RX} }, /* RX11/RX211 */ { { NULL }, 1, 1, 8, 4 }, /* DR11W */ { { NULL }, 1, 1, 8, 4, { 0, 0 }, { 0 } }, /* DR11B - fx CSRs,vec */ - { { NULL }, 1, 2, 8, 8 }, /* DMP11 */ + { { "DMP" }, 1, 2, 8, 8 }, /* DMP11 */ { { NULL }, 1, 2, 8, 8 }, /* DPV11 */ { { NULL }, 1, 2, 8, 8 }, /* ISB11 */ { { NULL }, 1, 2, 16, 8 }, /* DMV11 */ From fbb74de9b70fbcb8b8d4f21bd9846a127b5371e8 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 8 Nov 2012 15:45:43 -0800 Subject: [PATCH 33/63] TMXR fixes to support Virtual Null Modem Connections sim_tmxr.c sim_defs.h - Fixed parsing issues with NOTELNET option. - Fixed line closing logic to drop buffered contents when line errors occur before closing link. - Fixed logic to allow bidirectional line connections (i.e. listen=1234;connect=ip:2345 on both sides of a a virtual null modem). --- sim_defs.h | 2 +- sim_tmxr.c | 48 ++++++++++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/sim_defs.h b/sim_defs.h index 8aa2d94c..12bf64af 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -277,7 +277,7 @@ typedef uint32 t_addr; /* String match - at least one character required */ -#define MATCH_CMD(ptr,cmd) (*(ptr) && strncmp ((ptr), (cmd), strlen (ptr))) +#define MATCH_CMD(ptr,cmd) ((!*(ptr)) || strncmp ((ptr), (cmd), strlen (ptr))) /* End of Linked List/Queue value */ /* Chosen for 2 reasons: */ diff --git a/sim_tmxr.c b/sim_tmxr.c index 7da4b16a..97298f95 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -708,11 +708,11 @@ static char mantra[] = { TN_IAC, TN_DO, TN_BIN }; -tmxr_debug_trace (mp, "tmxr_poll_conn()"); - if ((poll_time - mp->last_poll_time) < TMXR_CONNECT_POLL_INTERVAL) return -1; /* */ +tmxr_debug_trace (mp, "tmxr_poll_conn()"); + mp->last_poll_time = poll_time; /* Check for a pending Telnet connection */ @@ -765,21 +765,18 @@ if (newsock != INVALID_SOCKET) { /* got a live one? */ for (i = 0; i < mp->lines; i++) { /* check each line in sequence */ lp = mp->ldsc + i; /* get pointer to line descriptor */ - if (0 == lp->master) { /* not listening? */ - if (lp->connecting) { /* connecting? */ - switch (sim_check_conn(lp->connecting, FALSE)) - { - case 1: /* successful connection */ - lp->conn = lp->connecting; /* it now looks normal */ - lp->connecting = 0; - lp->cnms = sim_os_msec (); - break; - case -1: /* failed connection */ - tmxr_reset_ln (lp); /* retry */ - break; - } + if (lp->connecting) { /* connecting? */ + switch (sim_check_conn(lp->connecting, FALSE)) + { + case 1: /* successful connection */ + lp->conn = lp->connecting; /* it now looks normal */ + lp->connecting = 0; + lp->cnms = sim_os_msec (); + break; + case -1: /* failed connection */ + tmxr_reset_ln (lp); /* retry */ + break; } - continue; /* skip this line */ } /* Check for a pending Telnet connection */ @@ -803,6 +800,10 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se free (address); continue; /* Move on to next line */ } + if (lp->connecting) { + sim_close_sock (lp->connecting, 0); /* abort our as yet unconnnected socket */ + lp->connecting = 0; + } } if (lp->conn == 0) { /* is the line available? */ tmxr_init_line (lp); /* init line */ @@ -1089,8 +1090,10 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ nbytes = tmxr_read (lp, /* yes, read to end */ TMXR_MAXBUF - lp->rxbpi); - if (nbytes < 0) /* line error? */ + if (nbytes < 0) { /* line error? */ + lp->txbpi = lp->txbpr = 0; /* Drop the data we already know we can't send */ tmxr_close_ln (lp); /* disconnect line */ + } else if (nbytes > 0) { /* if data rcvd */ @@ -1316,6 +1319,7 @@ if (nbytes) { /* >0? write */ nbytes = nbytes - sbytes; } if (sbytes < 0) { /* I/O Error? */ + lp->txbpi = lp->txbpr = 0; /* Drop the data we already know we can't send */ tmxr_close_ln (lp); /* close line/port on error */ return nbytes; /* done now. */ } @@ -1445,7 +1449,9 @@ while (*tptr) { sim_close_sock (sock, 0); else return SCPE_ARG; - if (cptr && (0 == MATCH_CMD (cptr, "NOTELNET"))) + if (cptr) + get_glyph (cptr, cptr, 0); /* upcase this string */ + if (0 == MATCH_CMD (cptr, "NOTELNET")) notelnet = TRUE; cptr = hostport; } @@ -1455,7 +1461,9 @@ while (*tptr) { cptr = get_glyph (gbuf, port, ';'); if (SCPE_OK != sim_parse_addr (port, NULL, 0, NULL, NULL, 0, NULL)) return SCPE_ARG; - if (cptr && (0 == MATCH_CMD (cptr, "NOTELNET"))) + if (cptr) + get_glyph (cptr, cptr, 0); /* upcase this string */ + if (0 == MATCH_CMD (cptr, "NOTELNET")) listennotelnet = TRUE; cptr = init_cptr; } @@ -1468,7 +1476,7 @@ while (*tptr) { sim_close_sock (sock, 1); strcpy(listen, port); cptr = get_glyph (cptr, option, ';'); - if (option[0] && (0 == MATCH_CMD (option, "NOTELNET"))) + if (0 == MATCH_CMD (option, "NOTELNET")) listennotelnet = TRUE; } if (line == -1) { From 3eb373a71e7df8b50cfc6f9d66d29b1feb02037b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 8 Nov 2012 15:46:18 -0800 Subject: [PATCH 34/63] makefile fix to build VAX simulator with new pdp11_dmc device --- makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile b/makefile index ccfcd8fa..3f8a5703 100644 --- a/makefile +++ b/makefile @@ -466,7 +466,7 @@ VAX = ${VAXD}/vax_cpu.c ${VAXD}/vax_cpu1.c ${VAXD}/vax_fpa.c ${VAXD}/vax_io.c \ ${PDP11D}/pdp11_rl.c ${PDP11D}/pdp11_rq.c ${PDP11D}/pdp11_ts.c \ ${PDP11D}/pdp11_dz.c ${PDP11D}/pdp11_lp.c ${PDP11D}/pdp11_tq.c \ ${PDP11D}/pdp11_xq.c ${PDP11D}/pdp11_ry.c ${PDP11D}/pdp11_vh.c \ - ${PDP11D}/pdp11_cr.c ${PDP11D}/pdp11_io_lib.c + ${PDP11D}/pdp11_cr.c ${PDP11D}/pdp11_dmc.c ${PDP11D}/pdp11_io_lib.c VAX_OPT = -DVM_VAX -DUSE_INT64 -DUSE_ADDR64 -I ${VAXD} -I ${PDP11D} ${NETWORK_OPT} From e7032c6bd5d7aa453a8c78e74a3e4fdb766ea4a0 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 10 Nov 2012 06:38:48 -0800 Subject: [PATCH 35/63] Fixed regression recently introduced in string compare macro MATCH_CMD --- sim_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim_defs.h b/sim_defs.h index 12bf64af..558573ea 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -277,7 +277,7 @@ typedef uint32 t_addr; /* String match - at least one character required */ -#define MATCH_CMD(ptr,cmd) ((!*(ptr)) || strncmp ((ptr), (cmd), strlen (ptr))) +#define MATCH_CMD(ptr,cmd) ((!(ptr)) || (!*(ptr)) || strncmp ((ptr), (cmd), strlen (ptr))) /* End of Linked List/Queue value */ /* Chosen for 2 reasons: */ From ed463a94fc782e614eb10241b6bb2d6be30967dd Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 12 Nov 2012 13:46:05 -0800 Subject: [PATCH 36/63] sim_disk.c - Fixed differencing disk expansion and end of drive access bugs - Added an attach option to merge a differencing disk into its parent when an attach is done with an -M flag --- sim_disk.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 159 insertions(+), 8 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 8397c15b..02fe047a 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -244,6 +244,7 @@ static t_stat sim_vhd_disk_implemented (void); static FILE *sim_vhd_disk_open (const char *rawdevicename, const char *openmode); static FILE *sim_vhd_disk_create (const char *szVHDPath, t_addr desiredsize); static FILE *sim_vhd_disk_create_diff (const char *szVHDPath, const char *szParentVHDPath); +static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD); static int sim_vhd_disk_close (FILE *f); static void sim_vhd_disk_flush (FILE *f); static t_addr sim_vhd_disk_size (FILE *f); @@ -812,7 +813,7 @@ if (sim_switches & SWMASK ('D')) { /* create difference dis } return SCPE_ARG; } -if (sim_switches & SWMASK ('C')) { /* create vhd disk & copy contents? */ +else if (sim_switches & SWMASK ('C')) { /* create vhd disk & copy contents? */ char gbuf[CBUFSIZE]; FILE *vhd; int saved_sim_switches = sim_switches; @@ -883,6 +884,24 @@ if (sim_switches & SWMASK ('C')) { /* create vhd disk & cop /* fall through and open/return the newly created & copied vhd */ } } +else if (sim_switches & SWMASK ('M')) { /* merge difference disk? */ + char gbuf[CBUFSIZE], *Parent; + FILE *vhd; + + sim_switches = sim_switches & ~(SWMASK ('M')); + get_glyph_nc (cptr, gbuf, 0); /* get spec */ + vhd = sim_vhd_disk_merge (gbuf, &Parent); + if (vhd) { + t_stat r; + + sim_vhd_disk_close (vhd); + r = sim_disk_attach (uptr, Parent, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay); + free (Parent); + return r; + } + return SCPE_ARG; + } + switch (DK_GET_FMT (uptr)) { /* case on format */ case DKUF_F_STD: /* SIMH format */ if (NULL == (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { @@ -1820,7 +1839,12 @@ static t_stat sim_vhd_disk_implemented (void) return SCPE_NOFNC; } -static FILE *sim_vhd_disk_open (const char *rawdevicename, const char *openmode) +static FILE *sim_vhd_disk_open (const char *vhdfilename, const char *openmode) +{ +return NULL; +} + +static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) { return NULL; } @@ -2591,6 +2615,127 @@ Cleanup_Return: return (FILE *)hVHD; } +static t_stat +WriteVirtualDiskSectors(VHDHANDLE hVHD, + uint8 *buf, + t_seccnt sects, + t_seccnt *sectswritten, + uint32 SectorSize, + t_lba lba); + +static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) + { + VHDHANDLE hVHD = calloc (1, sizeof(*hVHD)); + VHDHANDLE Parent = NULL; + int Status; + uint32 SectorSize, SectorsPerBlock, BlockSize, BlockNumber, BitMapBytes, BitMapSectors, BlocksToMerge, NeededBlock; + uint64 BlockOffset; + size_t BytesRead, SectorsWritten; + void *BlockData = NULL; + + if (!hVHD) + return (FILE *)hVHD; + if (0 != (Status = GetVHDFooter (szVHDPath, + &hVHD->Footer, + &hVHD->Dynamic, + &hVHD->BAT, + NULL, + hVHD->ParentVHDPath, + sizeof (hVHD->ParentVHDPath)))) + goto Cleanup_Return; + if (NtoHl (hVHD->Footer.DiskType) != VHD_DT_Differencing) { + Status = EINVAL; + goto Cleanup_Return; + } + if (hVHD->Footer.SavedState) { + Status = EAGAIN; /* Busy */ + goto Cleanup_Return; + } + SectorSize = 512; + BlockSize = NtoHl (hVHD->Dynamic.BlockSize); + BlockData = malloc (BlockSize*SectorSize); + if (NULL == BlockData) { + Status = errno; + goto Cleanup_Return; + } + Parent = (VHDHANDLE)sim_vhd_disk_open (hVHD->ParentVHDPath, "rb+"); + if (!Parent) { + Status = errno; + goto Cleanup_Return; + } + hVHD->File = sim_fopen (szVHDPath, "rb"); + if (!hVHD->File) { + Status = errno; + goto Cleanup_Return; + } + SectorsPerBlock = NtoHl (hVHD->Dynamic.BlockSize)/SectorSize; + BitMapBytes = (7+(NtoHl (hVHD->Dynamic.BlockSize)/SectorSize))/8; + BitMapSectors = (BitMapBytes+SectorSize-1)/SectorSize; + for (BlockNumber=BlocksToMerge=0; BlockNumber< NtoHl (hVHD->Dynamic.MaxTableEntries); ++BlockNumber) { + if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) + continue; + ++BlocksToMerge; + } + if (!sim_quiet) + printf ("Merging %s\ninto %s\n", szVHDPath, hVHD->ParentVHDPath); + for (BlockNumber=NeededBlock=0; BlockNumber < NtoHl (hVHD->Dynamic.MaxTableEntries); ++BlockNumber) { + uint32 BlockSectors = SectorsPerBlock; + + if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) + continue; + ++NeededBlock; + BlockOffset = SectorSize*((uint64)(NtoHl (hVHD->BAT[BlockNumber]) + BitMapSectors)); + if ((BlockNumber*SectorsPerBlock + BlockSectors) > ((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize) + BlockSectors = (uint32)(((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize - (BlockNumber*SectorsPerBlock)); + if (ReadFilePosition(hVHD->File, + BlockData, + SectorSize*BlockSectors, + &BytesRead, + BlockOffset)) + break; + if (WriteVirtualDiskSectors (Parent, + BlockData, + BlockSectors, + &SectorsWritten, + SectorSize, + SectorsPerBlock*BlockNumber)) + break; + if (!sim_quiet) + printf ("Merged %dMB. %d%% complete.\r", (int)(((float)NeededBlock*SectorsPerBlock)*SectorSize/1000000), (int)((NeededBlock*100)/BlocksToMerge)); + hVHD->BAT[BlockNumber] = VHD_BAT_FREE_ENTRY; + } + if (BlockNumber < NtoHl (hVHD->Dynamic.MaxTableEntries)) { + Status = errno; + } + else { + Status = 0; + if (!sim_quiet) + printf ("Merged %dMB. 100%% complete.\n", (int)(((float)NeededBlock*SectorsPerBlock)*SectorSize/1000000)); + fclose (hVHD->File); + hVHD->File = NULL; + remove (szVHDPath); + *ParentVHD = malloc (strlen (hVHD->ParentVHDPath)+1); + strcpy (*ParentVHD, hVHD->ParentVHDPath); + } +Cleanup_Return: + free (BlockData); + if (hVHD->File) + fclose (hVHD->File); + if (Status) { + free (hVHD->BAT); + free (hVHD); + hVHD = NULL; + sim_vhd_disk_close ((FILE *)Parent); + } + else { + free (hVHD->BAT); + free (hVHD); + hVHD = Parent; + } + errno = Status; + return (FILE *)hVHD; + } + static int sim_vhd_disk_close (FILE *f) { VHDHANDLE hVHD = (VHDHANDLE)f; @@ -3306,11 +3451,12 @@ while (sects) { NULL, BlockOffset)) goto Fatal_IO_Error; + /* Write back just the aligned sector which contains the updated BAT entry */ BATUpdateBufferAddress = ((uint8 *)hVHD->BAT) + - (((((size_t)&hVHD->BAT[BlockNumber]) - ((size_t)hVHD->BAT) + VHD_DATA_BLOCK_ALIGNMENT - 1)/VHD_DATA_BLOCK_ALIGNMENT)*VHD_DATA_BLOCK_ALIGNMENT); - BATUpdateBufferSize = SectorSize*((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries)+511)/512); - if (BATUpdateBufferSize > VHD_DATA_BLOCK_ALIGNMENT) - BATUpdateBufferSize = VHD_DATA_BLOCK_ALIGNMENT; + (((((size_t)&hVHD->BAT[BlockNumber]) - (size_t)hVHD->BAT)/VHD_DATA_BLOCK_ALIGNMENT)*VHD_DATA_BLOCK_ALIGNMENT); + BATUpdateBufferSize = VHD_DATA_BLOCK_ALIGNMENT; + if ((size_t)(BATUpdateBufferAddress - (uint8 *)hVHD->BAT + BATUpdateBufferSize) > 512*((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries) + 511)/512)) + BATUpdateBufferSize = 512*((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries) + 511)/512) - (BATUpdateBufferAddress - ((uint8 *)hVHD->BAT)); BATUpdateStorageAddress = NtoHll(hVHD->Dynamic.TableOffset) + BATUpdateBufferAddress - ((uint8 *)hVHD->BAT); if (WriteFilePosition(hVHD->File, BATUpdateBufferAddress, @@ -3320,17 +3466,22 @@ while (sects) { goto Fatal_IO_Error; if (hVHD->Parent) { /* Need to populate data block contents from parent VHD */ + uint32 BlockSectors = SectorsPerBlock; + BlockData = malloc(SectorsPerBlock*SectorSize); + + if (((lba/SectorsPerBlock)*SectorsPerBlock + BlockSectors) > ((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize) + BlockSectors = (uint32)(((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize - (lba/SectorsPerBlock)*SectorsPerBlock); if (ReadVirtualDiskSectors(hVHD->Parent, BlockData, - SectorsPerBlock, + BlockSectors, NULL, SectorSize, (lba/SectorsPerBlock)*SectorsPerBlock)) goto Fatal_IO_Error; if (WriteVirtualDiskSectors(hVHD, BlockData, - SectorsPerBlock, + BlockSectors, NULL, SectorSize, (lba/SectorsPerBlock)*SectorsPerBlock)) From a74c2d22dda4dd07bfedaa4e5e6082bd40e93ffe Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 12 Nov 2012 14:36:35 -0800 Subject: [PATCH 37/63] sim_disk.c - Optimized read operations from unallocated VHD blocks --- sim_disk.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 02fe047a..9be5ff8b 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -3244,14 +3244,13 @@ while (sects) { uint32 BitMapBytes = (7+(NtoHl (hVHD->Dynamic.BlockSize)/SectorSize))/8; uint32 BitMapSectors = (BitMapBytes+SectorSize-1)/SectorSize; - SectorsInRead = 1; + SectorsInRead = SectorsPerBlock - lba%SectorsPerBlock; + if (SectorsInRead > sects) + SectorsInRead = sects; if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) { if (!hVHD->Parent) - memset (buf, 0, SectorSize); + memset (buf, 0, SectorSize*SectorSize); else { - SectorsInRead = SectorsPerBlock - lba%SectorsPerBlock; - if (SectorsInRead > sects) - SectorsInRead = sects; if (ReadVirtualDiskSectors(hVHD->Parent, buf, SectorsInRead, @@ -3266,9 +3265,6 @@ while (sects) { } else { BlockOffset = SectorSize*((uint64)(NtoHl (hVHD->BAT[BlockNumber]) + lba%SectorsPerBlock + BitMapSectors)); - SectorsInRead = SectorsPerBlock - lba%SectorsPerBlock; - if (SectorsInRead > sects) - SectorsInRead = sects; if (ReadFilePosition(hVHD->File, buf, SectorsInRead*SectorSize, From 223e3e0254ab766a261a6e0d1884aaeecd59a54b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 16 Nov 2012 15:35:13 -0800 Subject: [PATCH 38/63] sim_disk.c - Added a VHD merge option when attaching a vhd differencing disk - Cross platform VHD differencing disk fixes (dealing with file names). - Optimization of VHD differencing disk meta data alignment - General cleanup and casting of pointer function arguments and assignments --- sim_disk.c | 343 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 223 insertions(+), 120 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 9be5ff8b..ad8fa5b5 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -136,7 +136,7 @@ if ((!callback) || !ctx->asynch_io) \ sim_debug (ctx->dbit, ctx->dptr, \ "sim_disk AIO_CALL(op=%d, unit=%d, lba=0x%X, sects=%d)\n",\ - op, uptr-ctx->dptr->units, _lba, _sects); \ + op, (int)(uptr-ctx->dptr->units), _lba, _sects);\ \ if (ctx->callback) \ abort(); /* horrible mistake, stop */ \ @@ -174,7 +174,7 @@ pthread_getschedparam (pthread_self(), &sched_policy, &sched_priority); ++sched_priority.sched_priority; pthread_setschedparam (pthread_self(), sched_policy, &sched_priority); -sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) starting\n", uptr-ctx->dptr->units); +sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) starting\n", (int)(uptr-ctx->dptr->units)); pthread_mutex_lock (&ctx->io_lock); pthread_cond_signal (&ctx->startup_cond); /* Signal we're ready to go */ @@ -200,7 +200,7 @@ while (ctx->asynch_io) { } pthread_mutex_unlock (&ctx->io_lock); -sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) exiting\n", uptr-ctx->dptr->units); +sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) exiting\n", (int)(uptr-ctx->dptr->units)); return NULL; } @@ -221,7 +221,7 @@ static void _disk_completion_dispatch (UNIT *uptr) struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; DISK_PCALLBACK callback = ctx->callback; -sim_debug (ctx->dbit, ctx->dptr, "_disk_completion_dispatch(unit=%d, dop=%d, callback=%p)\n", uptr-ctx->dptr->units, ctx->io_dop, ctx->callback); +sim_debug (ctx->dbit, ctx->dptr, "_disk_completion_dispatch(unit=%d, dop=%d, callback=%p)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop, ctx->callback); if (ctx->io_dop != DOP_DONE) abort(); /* horribly wrong, stop */ @@ -263,6 +263,8 @@ static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *s static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); static t_stat sim_os_disk_info_raw (FILE *f, uint32 *sector_size, uint32 *removable); static t_stat sim_disk_pdp11_bad_block (UNIT *uptr, int32 sec); +static char *HostPathToVhdPath (const char *szHostPath, char *szVhdPath, size_t VhdPathSize); +static char *VhdPathToHostPath (const char *szVhdPath, char *szHostPath, size_t HostPathSize); struct sim_disk_fmt { char *name; /* name */ @@ -475,7 +477,7 @@ uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); da = ((t_addr)lba) * ctx->sector_size; tbc = sects * ctx->sector_size; @@ -499,7 +501,7 @@ t_stat r; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_seccnt sread; -sim_debug (ctx->dbit, ctx->dptr, "sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); if ((sects == 1) && /* Single sector reads */ (lba >= (uptr->capac*ctx->capac_factor)/ctx->sector_size)) {/* beyond the end of the disk */ @@ -532,7 +534,7 @@ if ((0 == (ctx->sector_size & (ctx->storage_sector_size - 1))) || /* Sector Al return r; } else { /* Unaligned and/or partial sector transfers */ - uint8 *tbuf = malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size); + uint8 *tbuf = (uint8*) malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size); t_lba sspsts = ctx->storage_sector_size/ctx->sector_size; /* sim sectors in a storage sector */ t_lba tlba = lba & ~(sspsts - 1); t_seccnt tsects = sects + (lba - tlba); @@ -591,7 +593,7 @@ uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; -sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); da = ((t_addr)lba) * ctx->sector_size; tbc = sects * ctx->sector_size; @@ -614,7 +616,7 @@ uint32 f = DK_GET_FMT (uptr); t_stat r; uint8 *tbuf = NULL; -sim_debug (ctx->dbit, ctx->dptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); if (f == DKUF_F_STD) return _sim_disk_wrsect (uptr, lba, buf, sectswritten, sects); @@ -632,7 +634,7 @@ if ((0 == (ctx->sector_size & (ctx->storage_sector_size - 1))) || /* Sector Al return SCPE_NOFNC; } - tbuf = malloc (sects * ctx->sector_size); + tbuf = (uint8*) malloc (sects * ctx->sector_size); if (NULL == tbuf) return SCPE_MEM; sim_buf_copy_swapped (tbuf, buf, ctx->xfer_element_size, (sects * ctx->sector_size) / ctx->xfer_element_size); @@ -654,7 +656,7 @@ else { /* Unaligned and/or partial sector transfers */ t_lba tlba = lba & ~(sspsts - 1); t_seccnt tsects = sects + (lba - tlba); - tbuf = malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size); + tbuf = (uint8*) malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size); tsects = (tsects + (sspsts - 1)) & ~(sspsts - 1); if (sectswritten) *sectswritten = 0; @@ -813,7 +815,7 @@ if (sim_switches & SWMASK ('D')) { /* create difference dis } return SCPE_ARG; } -else if (sim_switches & SWMASK ('C')) { /* create vhd disk & copy contents? */ +if (sim_switches & SWMASK ('C')) { /* create vhd disk & copy contents? */ char gbuf[CBUFSIZE]; FILE *vhd; int saved_sim_switches = sim_switches; @@ -844,7 +846,7 @@ else if (sim_switches & SWMASK ('C')) { /* create vhd disk return SCPE_OPENERR; } else { - uint8 *copy_buf = malloc (1024*1024); + uint8 *copy_buf = (uint8*) malloc (1024*1024); t_lba lba; t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/sector_size); @@ -1170,7 +1172,7 @@ void sim_disk_data_trace(UNIT *uptr, const uint8 *data, size_t lba, size_t len, struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; if (ctx->dptr->dctrl & reason) { - sim_debug (reason, ctx->dptr, "%s%d %s lbn: %08X len: %08X\n", ctx->dptr->name, uptr-ctx->dptr->units, txt, lba, len); + sim_debug (reason, ctx->dptr, "%s%d %s lbn: %08X len: %08X\n", ctx->dptr->name, (int)(uptr-ctx->dptr->units), txt, lba, len); if (detail) { size_t i, same, group, sidx, oidx; char outbuf[80], strbuf[18]; @@ -1620,7 +1622,7 @@ OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; long long addr; -sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); addr = ((long long)lba) * ctx->sector_size; memset (&pos, 0, sizeof (pos)); @@ -1641,7 +1643,7 @@ OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; long long addr; -sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); addr = ((long long)lba) * ctx->sector_size; memset (&pos, 0, sizeof (pos)); @@ -1722,7 +1724,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; off_t addr; ssize_t bytesread; -sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); addr = ((off_t)lba) * ctx->sector_size; bytesread = pread((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr); @@ -1742,7 +1744,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; off_t addr; ssize_t byteswritten; -sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", uptr-ctx->dptr->units, lba, sects); +sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects); addr = ((off_t)lba) * ctx->sector_size; byteswritten = pwrite((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr); @@ -1918,7 +1920,7 @@ typedef struct _VHD_Footer { table displays the list of features. Any fields not listed are reserved. - Feature Value: + Feature Value: No features enabled 0x00000000 Temporary 0x00000001 Reserved 0x00000002 @@ -2320,7 +2322,7 @@ static int GetVHDFooter(const char *szVHDPath, VHD_Footer *sFooter, - VHD_DynamicDiskHeader *sDynamic, + VHD_DynamicDiskHeader *sDynamic, uint32 **aBAT, uint32 *ModifiedTimeStamp, char *szParentVHDPath, @@ -2412,9 +2414,8 @@ if ((sDynamic) && Return = errno; goto Return_Cleanup; } - if (aBAT) - { - *aBAT = malloc(512*((sizeof(**aBAT)*NtoHl(sDynamic->MaxTableEntries)+511)/512)); + if (aBAT) { + *aBAT = (uint32*) malloc(512*((sizeof(**aBAT)*NtoHl(sDynamic->MaxTableEntries)+511)/512)); if (ReadFilePosition(File, *aBAT, sizeof (**aBAT)*NtoHl(sDynamic->MaxTableEntries), @@ -2428,27 +2429,27 @@ if ((sDynamic) && VHD_Footer sParentFooter; memset (szParentVHDPath, '\0', ParentVHDPathSize); - if (NtoHl (sFooter->DiskType) == VHD_DT_Differencing) - { + if (NtoHl (sFooter->DiskType) == VHD_DT_Differencing) { size_t i, j; - for (j=0; j<8; ++j) - { + for (j=0; j<8; ++j) { uint8 *Pdata; - char ParentName[256]; - char CheckPath[256]; + uint32 PdataSize; + char ParentName[512]; + char CheckPath[512]; uint32 ParentModificationTime; if ('\0' == sDynamic->ParentLocatorEntries[j].PlatformCode[0]) continue; memset (ParentName, '\0', sizeof(ParentName)); memset (CheckPath, '\0', sizeof(CheckPath)); - Pdata = calloc (1, NtoHl(sDynamic->ParentLocatorEntries[j].PlatformDataSpace)+1); + PdataSize = NtoHl(sDynamic->ParentLocatorEntries[j].PlatformDataSpace); + Pdata = (uint8*) calloc (1, PdataSize+2); if (!Pdata) continue; if (ReadFilePosition(File, Pdata, - NtoHl (sDynamic->ParentLocatorEntries[j].PlatformDataSpace), + PdataSize, NULL, NtoHll (sDynamic->ParentLocatorEntries[j].PlatformDataOffset))) { free (Pdata); @@ -2464,14 +2465,15 @@ if ((sDynamic) && free (Pdata); if (0 == memcmp (sDynamic->ParentLocatorEntries[j].PlatformCode, "W2ku", 4)) strncpy (CheckPath, ParentName, sizeof (CheckPath)-1); - else - if (0 == memcmp (sDynamic->ParentLocatorEntries[j].PlatformCode, "W2ru", 4)) { - char *c; + else + if (0 == memcmp (sDynamic->ParentLocatorEntries[j].PlatformCode, "W2ru", 4)) { + const char *c; - if ((c = strrchr (szVHDPath, '/')) || (c = strrchr (szVHDPath, '\\'))) - memcpy (CheckPath, szVHDPath, c-szVHDPath+1); - strncpy (CheckPath+strlen(CheckPath), ParentName, sizeof (CheckPath)-(strlen (CheckPath)+1)); - } + if ((c = strrchr (szVHDPath, '\\'))) + memcpy (CheckPath, szVHDPath, c-szVHDPath+1); + strncpy (CheckPath+strlen(CheckPath), ParentName, sizeof (CheckPath)-(strlen (CheckPath)+1)); + } + VhdPathToHostPath (CheckPath, CheckPath, sizeof (CheckPath)); if ((0 == GetVHDFooter(CheckPath, &sParentFooter, NULL, @@ -2480,12 +2482,11 @@ if ((sDynamic) && NULL, 0)) && (0 == memcmp (sDynamic->ParentUniqueID, sParentFooter.UniqueID, sizeof (sParentFooter.UniqueID))) && - (sDynamic->ParentTimeStamp == ParentModificationTime)) - { + (sDynamic->ParentTimeStamp == ParentModificationTime)) { strncpy (szParentVHDPath, CheckPath, ParentVHDPathSize); break; } - } + } if (!szParentVHDPath) Return = EINVAL; /* File Corrupt */ } @@ -2576,25 +2577,43 @@ return (char *)(&hVHD->Footer.DriveType[0]); static FILE *sim_vhd_disk_open (const char *szVHDPath, const char *DesiredAccess) { - VHDHANDLE hVHD = calloc (1, sizeof(*hVHD)); + VHDHANDLE hVHD = (VHDHANDLE) calloc (1, sizeof(*hVHD)); int Status; if (!hVHD) return (FILE *)hVHD; - if (0 != (Status = GetVHDFooter (szVHDPath, - &hVHD->Footer, - &hVHD->Dynamic, - &hVHD->BAT, - NULL, - hVHD->ParentVHDPath, - sizeof (hVHD->ParentVHDPath)))) + Status = GetVHDFooter (szVHDPath, + &hVHD->Footer, + &hVHD->Dynamic, + &hVHD->BAT, + NULL, + hVHD->ParentVHDPath, + sizeof (hVHD->ParentVHDPath)); + if (Status) goto Cleanup_Return; if (NtoHl (hVHD->Footer.DiskType) == VHD_DT_Differencing) { + uint32 ParentModifiedTimeStamp; + VHD_Footer ParentFooter; + VHD_DynamicDiskHeader ParentDynamic; + hVHD->Parent = (VHDHANDLE)sim_vhd_disk_open (hVHD->ParentVHDPath, "rb"); if (!hVHD->Parent) { Status = errno; goto Cleanup_Return; } + Status = GetVHDFooter (hVHD->ParentVHDPath, + &ParentFooter, + &ParentDynamic, + NULL, + &ParentModifiedTimeStamp, + NULL, + 0); + if (Status) + goto Cleanup_Return; + if (ParentModifiedTimeStamp != hVHD->Dynamic.ParentTimeStamp) { + Status = EBADF; + goto Cleanup_Return; + } } if (hVHD->Footer.SavedState) { Status = EAGAIN; /* Busy */ @@ -2607,8 +2626,7 @@ static FILE *sim_vhd_disk_open (const char *szVHDPath, const char *DesiredAccess } Cleanup_Return: if (Status) { - free (hVHD->BAT); - free (hVHD); + sim_vhd_disk_close ((FILE *)hVHD); hVHD = NULL; } errno = Status; @@ -2625,12 +2643,13 @@ WriteVirtualDiskSectors(VHDHANDLE hVHD, static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) { - VHDHANDLE hVHD = calloc (1, sizeof(*hVHD)); + VHDHANDLE hVHD = (VHDHANDLE) calloc (1, sizeof(*hVHD)); VHDHANDLE Parent = NULL; int Status; uint32 SectorSize, SectorsPerBlock, BlockSize, BlockNumber, BitMapBytes, BitMapSectors, BlocksToMerge, NeededBlock; uint64 BlockOffset; - size_t BytesRead, SectorsWritten; + size_t BytesRead; + t_seccnt SectorsWritten; void *BlockData = NULL; if (!hVHD) @@ -2694,7 +2713,7 @@ static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) BlockOffset)) break; if (WriteVirtualDiskSectors (Parent, - BlockData, + (uint8*)BlockData, BlockSectors, &SectorsWritten, SectorSize, @@ -2714,7 +2733,7 @@ static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) fclose (hVHD->File); hVHD->File = NULL; remove (szVHDPath); - *ParentVHD = malloc (strlen (hVHD->ParentVHDPath)+1); + *ParentVHD = (char*) malloc (strlen (hVHD->ParentVHDPath)+1); strcpy (*ParentVHD, hVHD->ParentVHDPath); } Cleanup_Return: @@ -2794,7 +2813,7 @@ RPC_STATUS (RPC_ENTRY *UuidCreate_c) (void *); if (!UuidCreate_c) { - HMODULE hDll; + HINSTANCE hDll; hDll = LoadLibraryA("rpcrt4.dll"); UuidCreate_c = (RPC_STATUS (RPC_ENTRY *) (void *))GetProcAddress(hDll, "UuidCreate"); } @@ -2816,7 +2835,7 @@ void *handle; #define __STR(tok) __STR_QUOTE(tok) handle = dlopen("libuuid." __STR(HAVE_DLOPEN), RTLD_NOW|RTLD_GLOBAL); if (handle) - uuid_generate_c = dlsym(handle, "uuid_generate"); + uuid_generate_c = (void (*)(void *)) dlsym(handle, "uuid_generate"); if (uuid_generate_c) uuid_generate_c(uuidaddr); else @@ -2847,6 +2866,7 @@ FILE *File = NULL; uint32 Status = 0; uint32 BytesPerSector = 512; uint64 SizeInBytes = ((uint64)SizeInSectors)*BytesPerSector; +uint64 TableOffset; uint32 MaxTableEntries; VHDHANDLE hVHD = NULL; @@ -2854,7 +2874,8 @@ if (SizeInBytes > ((uint64)(1024*1024*1024))*2040) { Status = EFBIG; goto Cleanup_Return; } -if (NULL != (File = sim_fopen (szVHDPath, "rb"))) { +File = sim_fopen (szVHDPath, "rb"); +if (File) { fclose (File); File = NULL; Status = EEXIST; @@ -2908,7 +2929,7 @@ if (1) { /* CHS Calculation */ { sectorsPerTrack = 31; heads = 16; - cylinderTimesHeads = totalSectors / sectorsPerTrack; + cylinderTimesHeads = totalSectors / sectorsPerTrack; } if (cylinderTimesHeads >= (heads * 1024)) { @@ -2936,7 +2957,10 @@ if (bFixedVHD) { memset (&Dynamic, 0, sizeof(Dynamic)); memcpy (Dynamic.Cookie, "cxsparse", 8); Dynamic.DataOffset = NtoHll (0xFFFFFFFFFFFFFFFFLL); -Dynamic.TableOffset = NtoHll ((uint64)(BytesPerSector*((sizeof(Dynamic)+sizeof(Footer)+BytesPerSector-1)/BytesPerSector))); +TableOffset = (uint64)(BytesPerSector*((sizeof(Dynamic)+sizeof(Footer)+BytesPerSector-1)/BytesPerSector)); +TableOffset += VHD_DATA_BLOCK_ALIGNMENT-1; +TableOffset &= ~(VHD_DATA_BLOCK_ALIGNMENT-1); +Dynamic.TableOffset = NtoHll (TableOffset); Dynamic.HeaderVersion = NtoHl (0x00010000); if (0 == BlockSize) BlockSize = 2*1024*1024; @@ -2944,7 +2968,7 @@ Dynamic.BlockSize = NtoHl (BlockSize); MaxTableEntries = (uint32)((SizeInBytes+BlockSize-1)/BlockSize); Dynamic.MaxTableEntries = NtoHl (MaxTableEntries); Dynamic.Checksum = NtoHl (CalculateVhdFooterChecksum(&Dynamic, sizeof(Dynamic))); -BAT = malloc (BytesPerSector*((MaxTableEntries*sizeof(*BAT)+BytesPerSector-1)/BytesPerSector)); +BAT = (uint32*) malloc (BytesPerSector*((MaxTableEntries*sizeof(*BAT)+BytesPerSector-1)/BytesPerSector)); memset (BAT, 0, BytesPerSector*((MaxTableEntries*sizeof(*BAT)+BytesPerSector-1)/BytesPerSector)); for (i=0; iDynamic.TableOffset)+BytesPerSector*((NtoHl (hVHD->Dynamic.MaxTableEntries)*sizeof(*hVHD->BAT)+BytesPerSector-1)/BytesPerSector); +LocatorPosition = ((sizeof (hVHD->Footer) + BytesPerSector - 1)/BytesPerSector + (sizeof (hVHD->Dynamic) + BytesPerSector - 1)/BytesPerSector)*BytesPerSector; hVHD->Dynamic.Checksum = 0; -RelativeParentVHDPath = calloc (1, BytesPerSector+2); -FullParentVHDPath = calloc (1, BytesPerSector+2); -RelativeParentVHDPathBuffer = calloc (1, BytesPerSector+2); -FullParentVHDPathBuffer = calloc (1, BytesPerSector+2); -FullVHDPath = calloc (1, BytesPerSector+2); +RelativeParentVHDPath = (char*) calloc (1, BytesPerSector+2); +FullParentVHDPath = (char*) calloc (1, BytesPerSector+2); +RelativeParentVHDPathUnicode = (char*) calloc (1, BytesPerSector+2); +FullParentVHDPathUnicode = (char*) calloc (1, BytesPerSector+2); +FullVHDPath = (char*) calloc (1, BytesPerSector+2); ExpandToFullPath (szParentVHDPath, FullParentVHDPath, BytesPerSector); +HostPathToVhdPath (FullParentVHDPath, FullParentVHDPath, BytesPerSector); for (i=0; i < strlen (FullParentVHDPath); i++) - hVHD->Dynamic.ParentUnicodeName[i*2+1] = FullParentVHDPath[i]; + hVHD->Dynamic.ParentUnicodeName[i*2+1] = FullParentVHDPath[i]; /* Big Endian Unicode */ for (i=0; i < strlen (FullParentVHDPath); i++) - FullParentVHDPathBuffer[i*2] = FullParentVHDPath[i]; + FullParentVHDPathUnicode[i*2] = FullParentVHDPath[i]; /* Little Endian Unicode */ ExpandToFullPath (szVHDPath, FullVHDPath, BytesPerSector); +HostPathToVhdPath (FullVHDPath, FullVHDPath, BytesPerSector); for (i=0, RelativeMatch=UpDirectories=0; iDynamic.ParentTimeStamp = ParentTimeStamp; memcpy (hVHD->Dynamic.ParentUniqueID, ParentFooter.UniqueID, sizeof (hVHD->Dynamic.ParentUniqueID)); hVHD->Dynamic.ParentLocatorEntries[7].PlatformDataSpace = NtoHl (BytesPerSector); +hVHD->Dynamic.ParentLocatorEntries[7].Reserved = 0; hVHD->Dynamic.ParentLocatorEntries[7].PlatformDataOffset = NtoHll (LocatorPosition+LocatorsWritten*BytesPerSector); ++LocatorsWritten; +memcpy (hVHD->Dynamic.ParentLocatorEntries[6].PlatformCode, "Wi2k", 4); hVHD->Dynamic.ParentLocatorEntries[6].PlatformDataSpace = NtoHl (BytesPerSector); +hVHD->Dynamic.ParentLocatorEntries[6].Reserved = 0; hVHD->Dynamic.ParentLocatorEntries[6].PlatformDataOffset = NtoHll (LocatorPosition+LocatorsWritten*BytesPerSector); ++LocatorsWritten; if (RelativeMatch) { + memcpy (hVHD->Dynamic.ParentLocatorEntries[7].PlatformCode, "Wi2r", 4); + hVHD->Dynamic.ParentLocatorEntries[7].PlatformDataLength = NtoHl ((uint32)(strlen(RelativeParentVHDPath))); memcpy (hVHD->Dynamic.ParentLocatorEntries[5].PlatformCode, "W2ru", 4); hVHD->Dynamic.ParentLocatorEntries[5].PlatformDataSpace = NtoHl (BytesPerSector); hVHD->Dynamic.ParentLocatorEntries[5].PlatformDataLength = NtoHl ((uint32)(2*strlen(RelativeParentVHDPath))); @@ -3121,52 +3233,43 @@ if (WriteFilePosition (hVHD->File, Status = errno; goto Cleanup_Return; } -LocatorsWritten = 0; -if (RelativeMatch) { - if (WriteFilePosition (hVHD->File, - RelativeParentVHDPath, - BytesPerSector, - NULL, - LocatorPosition+LocatorsWritten*BytesPerSector)) { - Status = errno; - goto Cleanup_Return; - } - ++LocatorsWritten; +if (WriteFilePosition (hVHD->File, + &hVHD->Footer, + sizeof (hVHD->Footer), + NULL, + NtoHll (hVHD->Dynamic.TableOffset)+BytesPerSector*((NtoHl (hVHD->Dynamic.MaxTableEntries)*sizeof(*hVHD->BAT)+BytesPerSector-1)/BytesPerSector))) { + Status = errno; + goto Cleanup_Return; + } +if (WriteFilePosition (hVHD->File, + RelativeParentVHDPath, + BytesPerSector, + NULL, + NtoHll (hVHD->Dynamic.ParentLocatorEntries[7].PlatformDataOffset))) { + Status = errno; + goto Cleanup_Return; } if (WriteFilePosition (hVHD->File, FullParentVHDPath, BytesPerSector, NULL, - LocatorPosition+LocatorsWritten*BytesPerSector)) { + NtoHll (hVHD->Dynamic.ParentLocatorEntries[6].PlatformDataOffset))) { Status = errno; goto Cleanup_Return; } -++LocatorsWritten; -if (RelativeMatch) { - if (WriteFilePosition (hVHD->File, - RelativeParentVHDPathBuffer, - BytesPerSector, - NULL, - LocatorPosition+LocatorsWritten*BytesPerSector)) { - Status = errno; - goto Cleanup_Return; - } - ++LocatorsWritten; - } if (WriteFilePosition (hVHD->File, - FullParentVHDPathBuffer, + RelativeParentVHDPathUnicode, BytesPerSector, NULL, - LocatorPosition+LocatorsWritten*BytesPerSector)) { + NtoHll (hVHD->Dynamic.ParentLocatorEntries[5].PlatformDataOffset))) { Status = errno; goto Cleanup_Return; } -++LocatorsWritten; if (WriteFilePosition (hVHD->File, - &hVHD->Footer, - sizeof(hVHD->Footer), + FullParentVHDPathUnicode, + BytesPerSector, NULL, - LocatorPosition+LocatorsWritten*BytesPerSector)) { + NtoHll (hVHD->Dynamic.ParentLocatorEntries[4].PlatformDataOffset))) { Status = errno; goto Cleanup_Return; } @@ -3174,8 +3277,8 @@ if (WriteFilePosition (hVHD->File, Cleanup_Return: free (RelativeParentVHDPath); free (FullParentVHDPath); -free (RelativeParentVHDPathBuffer); -free (FullParentVHDPathBuffer); +free (RelativeParentVHDPathUnicode); +free (FullParentVHDPathUnicode); free (FullVHDPath); sim_vhd_disk_close ((FILE *)hVHD); hVHD = NULL; @@ -3213,7 +3316,7 @@ ReadVirtualDiskSectors(VHDHANDLE hVHD, uint64 BlockOffset = ((uint64)lba)*SectorSize; uint32 BlocksRead = 0; uint32 SectorsInRead; -size_t BytesRead; +size_t BytesRead = 0; if (!hVHD || (hVHD->File == NULL)) { errno = EBADF; @@ -3249,7 +3352,7 @@ while (sects) { SectorsInRead = sects; if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) { if (!hVHD->Parent) - memset (buf, 0, SectorSize*SectorSize); + memset (buf, 0, SectorSize*SectorsInRead); else { if (ReadVirtualDiskSectors(hVHD->Parent, buf, @@ -3343,7 +3446,7 @@ WriteVirtualDiskSectors(VHDHANDLE hVHD, uint64 BlockOffset = ((uint64)lba)*SectorSize; uint32 BlocksWritten = 0; uint32 SectorsInWrite; -size_t BytesWritten; +size_t BytesWritten = 0; if (!hVHD || !hVHD->File) { errno = EBADF; @@ -3397,7 +3500,7 @@ while (sects) { return SCPE_IOERR; if (BitMapSectors*SectorSize > BitMapBufferSize) BitMapBufferSize = BitMapSectors*SectorSize; - BitMapBuffer = calloc(1, BitMapBufferSize + SectorSize*SectorsPerBlock); + BitMapBuffer = (uint8 *)calloc(1, BitMapBufferSize + SectorSize*SectorsPerBlock); if (BitMapBufferSize > BitMapSectors*SectorSize) BitMap = BitMapBuffer + BitMapBufferSize-BitMapBytes; else @@ -3469,14 +3572,14 @@ while (sects) { if (((lba/SectorsPerBlock)*SectorsPerBlock + BlockSectors) > ((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize) BlockSectors = (uint32)(((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize - (lba/SectorsPerBlock)*SectorsPerBlock); if (ReadVirtualDiskSectors(hVHD->Parent, - BlockData, + (uint8*) BlockData, BlockSectors, NULL, SectorSize, (lba/SectorsPerBlock)*SectorsPerBlock)) goto Fatal_IO_Error; if (WriteVirtualDiskSectors(hVHD, - BlockData, + (uint8*) BlockData, BlockSectors, NULL, SectorSize, From c6c66487acf97aba43449716e57c7d4457328c70 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 30 Nov 2012 13:22:15 -0800 Subject: [PATCH 39/63] Compiler suggested cleanups --- ALTAIR/altair_cpu.c | 2 +- HP2100/hp2100_defs.h | 1 + Ibm1130/ibm1130_cpu.c | 10 +++++----- NOVA/nova_qty.c | 2 +- PDP18B/pdp18b_stddev.c | 2 +- SDS/sds_cpu.c | 2 +- sim_console.c | 6 +++--- sim_ether.c | 2 +- sim_serial.c | 14 +++++++------- 9 files changed, 21 insertions(+), 20 deletions(-) diff --git a/ALTAIR/altair_cpu.c b/ALTAIR/altair_cpu.c index 196893c4..834006b4 100644 --- a/ALTAIR/altair_cpu.c +++ b/ALTAIR/altair_cpu.c @@ -366,7 +366,7 @@ int32 sim_instr (void) if ((OP & 0xCF) == 0x01) { /* LXI */ DAR = M[PC] & 0x00ff; PC++; - DAR = DAR | (M[PC] <<8) & 0xFF00;; + DAR = DAR | ((M[PC] <<8) & 0xFF00); putpair((OP >> 4) & 0x03, DAR); PC++; continue; diff --git a/HP2100/hp2100_defs.h b/HP2100/hp2100_defs.h index 9ee83e32..d5126db4 100644 --- a/HP2100/hp2100_defs.h +++ b/HP2100/hp2100_defs.h @@ -81,6 +81,7 @@ #pragma GCC diagnostic ignored "-Wunknown-pragmas" #pragma GCC diagnostic ignored "-Wpragmas" #pragma GCC diagnostic ignored "-Wlogical-op-parentheses" +#pragma GCC diagnostic ignored "-Wbitwise-op-parentheses" #endif diff --git a/Ibm1130/ibm1130_cpu.c b/Ibm1130/ibm1130_cpu.c index d35bbcbd..bcc5ad19 100644 --- a/Ibm1130/ibm1130_cpu.c +++ b/Ibm1130/ibm1130_cpu.c @@ -768,7 +768,7 @@ t_stat sim_instr (void) CCC--; } C = (CCC != 0); - WriteIndex(TAG, ReadIndex(TAG) & 0xFF00 | CCC); /* put 6 bits back into low byte of index register */ + WriteIndex(TAG, (ReadIndex(TAG) & 0xFF00) | CCC); /* put 6 bits back into low byte of index register */ break; } /* if TAG == 0, fall through and treat like normal shift SLT */ @@ -814,8 +814,8 @@ t_stat sim_instr (void) while (CCC > 0) { xbit = (ACC & 0x0001) << 15; abit = (ACC & 0x8000); - ACC = (ACC >> 1) & 0x7FFF | abit; - EXT = (EXT >> 1) & 0x7FFF | xbit; + ACC = ((ACC >> 1) & 0x7FFF) | abit; + EXT = ((EXT >> 1) & 0x7FFF) | xbit; CCC--; } break; @@ -824,8 +824,8 @@ t_stat sim_instr (void) while (CCC > 0) { abit = (EXT & 0x0001) << 15; xbit = (ACC & 0x0001) << 15; - ACC = (ACC >> 1) & 0x7FFF | abit; - EXT = (EXT >> 1) & 0x7FFF | xbit; + ACC = ((ACC >> 1) & 0x7FFF) | abit; + EXT = ((EXT >> 1) & 0x7FFF) | xbit; CCC--; } break; diff --git a/NOVA/nova_qty.c b/NOVA/nova_qty.c index 215ac3fe..7a40e1bb 100644 --- a/NOVA/nova_qty.c +++ b/NOVA/nova_qty.c @@ -222,7 +222,7 @@ DEVICE qty_dev = #define QTY_LINE_RX_CHAR( line ) (qty_status[ (line) ] & QTY_S_DMASK) #define QTY_UNIT_ACTIVE( unitp ) ( (unitp)->conn ) -#define QTY_LINE_BITS( line, bits ) qty_status[ (line) ] & bits +#define QTY_LINE_BITS( line, bits ) (qty_status[ (line) ] & bits) #define QTY_LINE_SET_BIT( line, bit ) qty_status[ (line) ] |= (bit) ; #define QTY_LINE_CLEAR_BIT( line, bit ) qty_status[ (line) ] &= ~(bit) ; diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index 78cfeba3..9e5ed3a6 100644 --- a/PDP18B/pdp18b_stddev.c +++ b/PDP18B/pdp18b_stddev.c @@ -994,7 +994,7 @@ if (pulse & 001) { /* KSF */ } if (pulse & 002) { /* KRS/KRB */ CLR_INT (TTI); /* clear flag */ - dat = dat | tti_unit.buf & TTI_MASK; /* return buffer */ + dat = dat | (tti_unit.buf & TTI_MASK); /* return buffer */ #if defined (PDP15) if (pulse & 020) /* KRS? */ tti_fdpx = 1; diff --git a/SDS/sds_cpu.c b/SDS/sds_cpu.c index f045b6e7..0621dc4f 100644 --- a/SDS/sds_cpu.c +++ b/SDS/sds_cpu.c @@ -1341,7 +1341,7 @@ if (sc >= 24) { A = sgn; } else { - B = ((B >> sc) | (A << (24 - sc)) & DMASK); + B = ((B >> sc) | (A << (24 - sc))) & DMASK; A = ((A >> sc) | (sgn << (24 - sc))) & DMASK; } return; diff --git a/sim_console.c b/sim_console.c index f1fb5354..18173aa6 100644 --- a/sim_console.c +++ b/sim_console.c @@ -1766,7 +1766,7 @@ if (tcsetattr (0, TCSAFLUSH, &runtty) < 0) return SCPE_TTIERR; if (prior_norm) { /* at normal pri? */ errno = 0; - nice (10); /* try to lower pri */ + (void)nice (10); /* try to lower pri */ prior_norm = errno; /* if no error, done */ } return SCPE_OK; @@ -1778,7 +1778,7 @@ if (!isatty (fileno (stdin))) /* skip if !tty */ return SCPE_OK; if (!prior_norm) { /* priority down? */ errno = 0; - nice (-10); /* try to raise pri */ + (void)nice (-10); /* try to raise pri */ prior_norm = (errno == 0); /* if no error, done */ } if (tcsetattr (0, TCSAFLUSH, &cmdtty) < 0) @@ -1829,7 +1829,7 @@ t_stat sim_os_putchar (int32 out) char c; c = out; -write (1, &c, 1); +(void)write (1, &c, 1); return SCPE_OK; } diff --git a/sim_ether.c b/sim_ether.c index 8e43bbc5..5504cba2 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -1406,7 +1406,7 @@ static void eth_get_nic_hw_addr(ETH_DEV* dev, char *devname) memset(command, 0, sizeof(command)); for (i=0; patterns[i] && (0 == dev->have_host_nic_phy_addr); ++i) { snprintf(command, sizeof(command)-1, "ifconfig %s | %s >NIC.hwaddr", devname, patterns[i]); - system(command); + (void)system(command); if (NULL != (f = fopen("NIC.hwaddr", "r"))) { while (0 == dev->have_host_nic_phy_addr) { if (fgets(command, sizeof(command)-1, f)) { diff --git a/sim_serial.c b/sim_serial.c index 0110c8f0..2ee5b7fc 100644 --- a/sim_serial.c +++ b/sim_serial.c @@ -996,10 +996,10 @@ if (tcgetattr (port, &tio)) { /* get the terminal attr #if 1 -tio.c_iflag = tio.c_iflag & ~i_clear | i_set; /* configure the serial line for raw mode */ -tio.c_oflag = tio.c_oflag & ~o_clear | o_set; -tio.c_cflag = tio.c_cflag & ~c_clear | c_set; -tio.c_lflag = tio.c_lflag & ~l_clear | l_set; +tio.c_iflag = (tio.c_iflag & ~i_clear) | i_set; /* configure the serial line for raw mode */ +tio.c_oflag = (tio.c_oflag & ~o_clear) | o_set; +tio.c_cflag = (tio.c_cflag & ~c_clear) | c_set; +tio.c_lflag = (tio.c_lflag & ~l_clear) | l_set; #elif 0 @@ -1079,15 +1079,15 @@ for (i = 0; i < baud_count; i++) /* assign baud rate */ if (i == baud_count) /* baud rate assigned? */ return SCPE_ARG; /* invalid rate specified */ -if (config.charsize >= 5 && config.charsize <= 8) /* character size OK? */ - tio.c_cflag = tio.c_cflag & ~CSIZE | /* replace character size code */ +if ((config.charsize >= 5) && (config.charsize <= 8)) /* character size OK? */ + tio.c_cflag = (tio.c_cflag & ~CSIZE) | /* replace character size code */ charsize_map [config.charsize - 5]; else return SCPE_ARG; /* not a valid size */ switch (config.parity) { /* assign parity */ case 'E': - tio.c_cflag = tio.c_cflag & ~PARODD | PARENB; /* set for even parity */ + tio.c_cflag = (tio.c_cflag & ~PARODD) | PARENB; /* set for even parity */ break; case 'N': From b6dd86983f6d0f284d7c20672058d3af70f5177a Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 1 Dec 2012 08:07:49 -0800 Subject: [PATCH 40/63] Fixed the loopback setup when the receive port was specified with a specific interface (i.e. localhost:port) --- PDP11/pdp11_dmc.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 3ed1bd42..114a32dc 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -1,3 +1,25 @@ +/* +Bits still to deal with: + +I noticed that if you attach dmc 1234 and then start the simulator. You then detach dmc, and change some dmc parameter and then merely continue (without reattaching DMC), you get a Sockets: accept error message displayed incessantly. Some state isnt being recorded when the detach happens. + +Id like to suggest that SET DMC TRANSMIT=ip:port might be more obvious if it was SET DMC PEER=ip:port. Your call. +What is the point of SET DMC SPEED? +You might want to either remove the SET DMC POLL= option or make it do something useful. Likewise cleaning up commented out code. + +There is a line in vax780_defs.h which defines IOBA_DMC to (IOPAGEBASE + 0760060), Is this correct, or is it being masked by the autoconfigure fixups? + +I was thinking that using this DMC11 could be simplified if there was no need for a SET DMC LINEMODE. Both sides could be listening and when not connected periodically attempt an outgoing connection to the peer. Why is LINEMODE required? + +This leads me to realize that I dont think you can have your pdp11_dmc.c have a SET TYPE which would change a DMP device to a DMR/DMC device (DMC, DMR are register identical, right?) or change a DMR/DMC to a DMP. + +Since, I believe you had said that the DMP isnt really implemented yet, for now, you should probably have some code which fails an attach to a DMP device and with some sort of unimplemented message, along with anything else you deem appropriate. You can #ifdef DMP_WORKING this fake unimplemented code (for now) so you can work on the real implementation in the same source module which will be part of the distribution. Once youve got everything working the #ifdef stuff gets cut out and will build normally. + + +*/ + + + /* pdp11_dmc.c: DMC11 Emulation ------------------------------------------------------------------------------ @@ -1667,7 +1689,12 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) controller->line->last_connect_attempt = time(NULL); if (is_loopback) - sprintf(hostport, "localhost:%s", controller->line->receive_port); + { + if (strrchr(controller->line->receive_port, ':')) + sprintf(hostport, "%s", controller->line->receive_port); + else + sprintf(hostport, "localhost:%s", controller->line->receive_port); + } else sprintf(hostport, "%s", controller->line->transmit_host); sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", hostport); From e91ee504cadf9003d29c78a0ee28202c2aa0ce7f Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 1 Dec 2012 08:43:20 -0800 Subject: [PATCH 41/63] Updated VAX and VAX780 documentation to include DMC11 --- doc/vax780_doc.doc | Bin 125440 -> 129024 bytes doc/vax_doc.doc | Bin 123392 -> 135680 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/vax780_doc.doc b/doc/vax780_doc.doc index 07b7f872347d45714e46581bd3a85291a7d72724..f9bcb3ead2cd55417d7566f2d3b3be02493970c0 100644 GIT binary patch delta 35087 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

YM-dB>8 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 diff --git a/doc/vax_doc.doc b/doc/vax_doc.doc index 19a703292f90cda6f274d74be684cca6da71be7e..0a1ab6d2f5b8e920989564b9b3a6a3bd3ff416c9 100644 GIT binary patch delta 39123 zcmeIb33yXw_V|Bqo0b+RlpV?z5!nVxS7_O!v_-bEwFm+NX`9kO+tf4#if9mVVFX1Y zMg>&F1vfw|)KOGM5tSVg7q&siQO9vX1!sm4_K@EPgyfy>M z*0o(`R+Rh06{T}`MfseBLVGI88KN{KA<|JAvz1SMwp|Igb+V$oNW|Gwsr5om#F0QN z_k@rZ4UM}0y(fpQU6QkWjP2jaSw6;ABKm)f=*HHlkr76YQI?WPyw+^Hr|MS%x03#< zFeTBa6Cu212VQAJ~Gh|oAjgFl$Mb*VnolQE7B&BaZUU?G~^ zx(zU{25yZ?1fH)xc6Vs-aDq{{>eDqdt$m)%htyd{X_V&1*m&E@F%ciDjpF+E8Ec={ zCm}9A!QHpvJ!*pcjfRP8Lgh~lTZKg?CMCqjC&i~ExSK_H^*b68-N|>9=(a{*;dgY8 z-?b$7w&*^-Yf0{JqC3SJX(o3ut1S~^<749^)5lMWY+)Xsc1`BQ%;DylIrcnXAc^8j zpr3nYv-oJ^T0isjLXzn3zPDu?Uy%Op9nF5{3(`MWkQ8_O=6!uZQuH7xHBw1+FKnLR z3z8ZnNNSw>c=K2zNNQZLAo1=2EqWUzOO1EiTXbsXEqrQ%Ui-vI_dVII-Pg2j>I;|P z-rJ(H?~s&OsZ{X)xl-?e1-s8-c!_H(yrRUNONTr;$i z+FvhMQe=j$Y;IX_t)%vM-_*J~xfJ&stp@qBN~v)z)!n=G2;a3-ziSC`aqcHtCwT?J zkuJgbBtJ!9ltWVe%BJ+Z?sAET}yPUZL8xYxqG%X zM4Awnld3CnUOhWLRz1k zzV06$?%O%2APKHlI>8;^vh55bjTBu4{bErdr7R>9F<`$u#^`$&DUmSYr!}-+2$;?mpje25}VUzDY7lJmCQCf3$1!= zo73#DI?Ej;W!kyCa)-lO;xs#L#a79o!fJ7tUG{>4GON=(ztEOfs3kq$US5=MmUEI& zUXeX-uGwif+X}R+b4#rA^$T`V%k!qz!xn3eHRo2Ci!CMPmLkeiTJG#g0dop%WoCZ! zyrC^c#db7mDJs$uaoSvzrM#rbT2^MZXc>qtm9%XzD# zf^FX1@=|JOaazpUWMrjDYF$1@up^$WOBw`H#2?Axb)GYn#qL-*Y46S z470J7P_UX6@9j+$OPp_`;9fJMDrD|(qSf*er<7AuPMldPor^8!&nZWo`R06EK>@~H z;v~j=$quEFM_DPNE3oAuiwc){zQg83o>b8=TnZ;Pu4Rcri%YRGyU!wZ^DWW!CdOgz zfo&Rb&GRfp(lNj08^~}B|bF8`4;;!YZI1q-ispJi4D-ojjJx0N{iIPHD3 z9kf|oTwa1&#Nm{g^R4r2d9>;@nh$}=+l3dFW>r>dchH*hEl!KMyiD}3^*g$?Sc}Vx zFie!M#i#Of(XPdulRm!h$noN_OK=amxGRer!ijC4#S7a-(YTif8Mk?u?@3P}1kcsyMA?BKkX=zeStTfg&kI`#e=ZmAG@#52p(UnunxXhMs)iR<&oRUMy$-juYLXEt=rPTe7(K zNz^hWM3$YIgNde@$BZ1CnKdpWbFlfw@e@a8rA@qUQFdnfxUm`R-GpST{YatK5g`(> zW+{f=1!`7Ji_y!anR~Gf$D401cdy;n&eg+Vy`h{6>PF$sLldnpAE{yuIpq~v=|t&{ zNtbTJYMUokqB%{k`4-q_mrI)7iuW8)U89_dX=AgqM&=Bb0uLABHt3$e#PhvFBSIy{`7T98VU`v4a`SwP40~uj3+U}^ z){;D=K`cw2QwA&f7I9>Zv-Bn^S4s;j%A|i{AmYfMFJm)FMm&Pn8xSH_23OJndmAHN zt=I2qa`QTmI%}CdJ~K1plJ(QGzDlpH-fX0R0oggqao83-z{nC*MZNIc1V$Y4 zTU<&bw3fKUh%Mra^Q}de3hD6i?D=Afl4Nd$2*78QWsLj8r%b|hEZ$y~x-PUj(5Kx@ zj?$_N%4z2G=cKH4b|u)J!zrD+bTCfF>rN*EnJtEc`@$x4OV`G_-b&b+rihVPinM{I zHXhThMKfE9R={M&K3@uIU0{*gU@uwP5Xowe_ci^@v1!A`Wcm)hP1ARr<1!i&BcQY~ zBgSRt3`pP;m6nr}mOeuB9`SstlTPr(4M^J8(tQDZjnrJ7xR#h-;w~+>3~O%r?Ag>s z^YT6sU}>V6YWvQYa7+NS&RFYOMG+3FJ~8u}SaWuveSVoXsG`j>tTd-*Pt@Iu1t;&& zMpaH}kvKTfE`xuUHu~4bN3l^O#||H7q*7>`O)KkDL`vuk^ASngONuIDqb8?K9BTx# zl;HL)juNhx#YR!%^i1QDHYU%vIxUPw$&Vx$f|bx~7VEQ@sEo9nG?x)t%HwN$G(G8{ zwSszmQhux!K6_GDta%vimBwCPto2|Rpk^LMK)rf0B=P!ay=$i(Fn$+*iZ7F_MKWbB z%sDEX(QjssQ4-zAWtt`J2T?KIDPwRR<@G`}!x2RD7>s7U&J9tBW!ufOrMuT#gI;?~ zx7vkgWDc8jO_VEYgnhoIEniQ-h>QMOL}u50bPZ$IhRiYy5`AdNmiakKEz!Xk!$8sH zK+#mx=o0(<67$HivT|#g-vCgzGM5v(5Hl0`S2wA-S{$1eXMh$d-)8Yne;9ws^Vj~F-EoRyiSk6xH*mWm&gw48R_kJ(Zz6B;RNu@#fnFI6{Ds^)WG zy1#QjyyyKSZh>@#ZqOZiL0^c21W1S1;B|Ndet;j{SM2ZG_WP6jPVU>jW&M`b%jEag zEoEEEW=$M9QP%!PG;3Y>=c}75#Um6`36w{u?OPQ-Ir3gbKOZ-$o&UA2p>t%dH!#Gc z2-V&4z`z#srrxED8x^9A9~G)hU^`<}hOm^qk7c1JU!wTLa_SVy0H7C zB=?&K2CHpfJot(lvc=@yekdcNMH3d;Vb%LZuCG6Or}CYR4{p5U!Ho}oRQXXwX~k6U znGp|O84__z=$!d1yN5@p%_45mi%y~ZYSl{%bB@9jCP?}Hf+|5|;tGu77hcc)COzpo zvhS!1u8ylMedqm>Rl2v*RHN0#rKFE)jqps!)udS1_Y2uMuy7)Ozw32t%`Xr)t3-;T z-XIccT2q=GR((+9HhpMzo&DnQ8;4)m_`<5gOWs&=_KUNnUl?bmde2CLawkj@{|;pb zNxWv-iZ0I^^sqk3)C}aUva8xk1L~}2ct*F0K>5^6E113mWB3WG-fF3z*#8a7=rX9O zq6~&1?w%hGbeleo>+tQ#!zXtQ?#(rZ_T$>HQa%XgbTkFJL^8pzH2 zx@E09qt_e$8?vmQGfLBwuA?Hq8E3Rpx7fheTgw?me?Hx9`XcUEI-?hPxZ?7*tUIG* zJ!~BUt*0}3SvQKn>ipK7(f7^i?%@Y_>KDIro4y)aUx(C_IZWM+q<#+Rxv2Um@we)b z`s%f-!|ap}?xA1N4SzkN9v-P9&luJ%Y~3S0%GmkxEh0de_47zq>Pgp8li!R-dQvyp zz$RSFBaQgFtK0O=EZ1HhhWi4H*BbRQt^c!U zaPem^=O|ReF<=-%oE?>AKzsqx*PDj_*BQBSoLiahrZL*TW-Sq+Qf$xvK7wmgr%Ay9C||^h=t29 z%YVvy6Ll-LSBOg%hV%76zfN;9APbC9%lmyvA?wZ_@8^=`={kgZ`Sq$xtyNymX!TZ@ z73^+`Up2f-=X3OW1lG5vzvvL_jy%`iHG!}bAscdFGE9MDC;>YxgWtnlumbLedqCDS z?}b&c2{ywPcmZC7O4tYc;Q;&<0tS7q%iIN+(q2=^rK{q-3vi5=F6vfaa0$Dr?`7$o z>kK`S%VZcZQn`$E`7c@q7=f$C&6)q4uNBdM4S$1g;XC*q3S~|D2lx@1(6X9BG&F-A z&=Yz=24uo;7y%=J`+clu^U?~egc>&%e76;{(xlb67axdmpZUe?y}59p!>`v>psFV7 zY5Y1>{bpSF5#93Z@HR?Y5quWh;}!m+Y}doh7_bZOf;F%aw!&L*AVwLeNHh5g&O#`e zL_=HX0m+aK<6t`2U_LB`+uC~$^;4IsKf6D@aEtam+jFXc8s#!IRc7bkUGg*U>TwHA zWm4NgtU(H7WNxIrs3YD4svzzPMfn-Vc2SgT!48XIDck{f!ZO%(rK0SHg}kVCGpvOw zh`tJ|;=L%>M|_3zBHS!^8}96*D9d3DJOVqRYb@_t!4UYWucEY1z;(geeu^@zKc)=h z;5sOPdto))51U{+T!eNhit+?(gRE49l&VZtEbQC>H^I~av;}w?Dh84P9ELAo@E}Eb z4Bmk=FmW&ih0r02a_+m&_&N98x#N6&c90*>4UN=J5xY6{-Rs}IE=MigqYt$69BiaE zO_KZY0e8=N`>%DOs6p;-Dy{W>|1j>G4s>)8=IorUTA0zdwO5n};c3_kZ@~dL4qw4f za1k1JKw!`vk|6_fU=rA25iExXVH3Ox@4^xI48Dh7AhM(4e*eNrPe)a~$8$H?DgLt?GM!=0=*vs$P-v(kghv0p<2yHv@U;~VV>EM9n@E9Bh6K@yBKqA}#>)^b& zBmLuXg{VE_!7_Jzw1>CR` z#F+mMk72YM;1qlc3dY+NCc_GN5dH{n!WyqZSF-&lL4BWpDjt_fy~=ZwN$u|Yit%(D zsK$7PhUs5Xp2lHZy(mG93sIh_VQQ57ys5e8(=fHOOA?mW@-j4~#Yn5^4>RC4cn&^* zU!W@uX$nZIx(_}Cqj5E$Va@b5vNhg@wu|j?I01z{5D@QZw(C_>!o}^>rk-z`Bh&xt zS9`os^{3_m&$6`joNk~tb*Z8FDk*UsE+QVr!Z>&f#BF>7CR~QNkE>uUu45g13F1af zyw7Qdp)eih!Tqou{smXXR*V7nX6ff-jSZgm-C_m#`Jjya9HBc<7%%y!3>@x~IO2t$6E@A-cyN$aW%R!yK3kOW;;` z4i3S2#WOEjZ7c3&2}LU8o`014+Y8fN=s&Wl(sXHblV(c~hRk3)i>)FCsdb>zB}n3u zXy>6A5A1+Fa1MS>!?1=SlMEaiyp~DfM>0ek%{fTsMdHCw0MBRPD914ugPUOGI3{wF zClC={gZH7)L@X2Th7GV0wnIoZlQ*~(uFJuXOk#vESy7&X(CctoaQ!qAhK|z}r4x*X z?CTZ9X~Bk|C>L*@$Kz=EOa>u7pZce=GYw|Ky>Lwdub;z&*)*X-o>Q}t2uz$y&5KY8 z?197Z3n;~kay6vGI4CPol*ggifpaUPa84v89jf1t*1^iLr=pSC%KG8K5B;yQul2Tm z=jbivc{Hs@y-e?_J)K6c8~9vXV6Qt~?BZY0^=d}bumIM=4)`1*P_L-m47lR_2!a0& zorfb?m<6k0CwvXj*CGdMY@e3?@&iI@CkeJ(`PhNOLsGGa1XD0#zWb-~b$ipP==% z^r~2lG(|GNi$y;;{c*ZafNZZb%Vv3=uT z=>Oz__Ln=PU-24rgm>T&ZcN;&r*Q2>nv1}OPo4uSLHzSZcp7%X3HS$GWyQK+0eE0L zd=8NXOcp?V`Uoh1PU75Gz}>JF_P}2FC!8w?Hjp^Sl`CfJUBX1Rs|)q6VF%mO(9Bld zO*q+K4cp)&_y@F`!*~X!!6H}(ufx~Sfo?^*mTY*sNKu}FhQ%}tpx4fCr>>yG{yM-# z%GI$T9Zo5%hxgztw4w9K1nG#JumPk)dKI?ANl@*~vtcCIU?sc&hu|!9EXDQ0^-ux# z!=}<;vf0Fy{qQZcyMdMfMQ|s)3P&J5A_ zd^1i1rsMe9FJ@?Q3qpmB@FB!4q4QkA#e?j80H+{gDHArBdMAZ}9?K{M90$wq@zi&* zo(Ye`4`5o(m>292wSt}$2Ekkyvl3ZBG0cN?F#KM$4{O|L>^>anHGHK%Ky4uFA%=et zvxY7lM#2JUu$F>B54av~g}30(>-d8+4^x0gP(*2Gb+CLz_TGDD@2V0F7 zAmaU@M3o_Q8Jm6n=r`^H|=4beIZdumYZeJ@7R| z&qthaJuHF8VHbP>qSy198>{@}LfgQZfLv`1y+E`-0VYBPh$XB9v4*oC7SRgwK`diA z7}n7gOAreg0fv>VWq%#)0kM=n!{?yfs5RgtE!D-IM>?o~$2Mwo<8u89$O1b&0`I_I zq0u5m83={28s3EOp~Fom9d3a8VLN;S&9KaPxE_|l8W4-!0{cNMH~cSreQ|TJHv9!w zLMfjK+Cv8z2x9ElLktGr9x|aE*26ydC-lYmr7?_w7oigRV*An{?64Nr!Jk0dMA)tP z0+<2k759+~S8IboeB8DGA15Jx56{6-kk%9l{k^Sf9NY2WfYq=aPQZESdK;w$D=dQ- z;4u6EQMY3VFbs0x7I+>$0_Bci@=@-54;3h z;SjtJKR^WSUwlDN*b0VEIKh5<{6Ytq1?QEjBSX{>RqUr6J=Cxt2_R17E?5q4z+a&~ zjzk@4-*OVtmpq zu-5CJ_OWe?cju&7wR92Fbcv1GSMh<7R21sW!2dNo`X^D{_)~B{1v( z-EH2?R$S*RFyDxHbbJ(xgK6*#JPSwQ zL+G@glE4%21@w3fD}!{%fVbg1T!5n+lu+f^2KS*0*Bc^?@`+F@UmYTp9-<7Ez+E5( zo8m2qWGI>J1IeiU2AT*QgEo)jdEo|F^aNc!JPKQ3!BY%W;Qpr>*+Jr~r>fAJ|0lXtq0)0E&s52`HdXK1s_?$?S8+zZ z(?_+ewN!55oYF~;5#+jyx26a{GSvwO38sf)U7$+6&$mWUVSd%O?<-L7e!EuRE-Ul0 zV((sYAj*HGK1tNr2=$37+ro{gPE`4rSB=})&PR=+PPbR3kF#BkN=3EXyy|_M?GChR zX!j8Neb8Nx+Qg+bGF*bJb!qEd9mqg4t54Y; zf1VBm!Z9r|uTIbz(jX6RgQws<_#3pw{4${s?gBB#=Rr(TOwQvqHN(ulQ!8-=Ei_jk z_a10%HNM=QW5&FiiIGvp+4-V9#l)(VcQ4e~6NlDbjQ1FP1K+}T@I9P^(3dC?Y=ZY- zH%!`!V};4^I=lf#;6rG>jTYBp8-pO2124f=cpG-Xzp5Cn!Fg!#GQJABK_(1`Yhf~2 zzz$2`G1vf=aPEh5fBWI%cR$|w>dud!ecT8y@JqK4w!=<(0UWQ5oRauuB4GjirZxdSE9H7D0Xhk$= zXzyo#kESgXvsA2p<^KL?JLAaM{+hGNfA&xJt9l-=UeHQk))9d!HClysrn*(sxTdw3 z7=L3drHW#Vh9SPj{#i)<14AuX2pi!e==%zW3`^kFSFU9I!OmKE2A+lQ;WRXUl{qi` zEYeA?A-Q@UeB&-Y)Xw%Ne{uW=4~~*sHx|qIc2^vVYEq++-yrOkE={1)jWBxA?&(D0 zYyw1WGI37A=%bf9RMSq{yNLM~B&CazXS>)Bl;(GwGbHLVL`vtS%z&HVBDC6$uHK}> zfS6s3Y~iYR5&wIPes|;HV8I^lX~K(p>0Ds%KDu@|59)q=H=I3)x}e!1(uRibGf99x zhZ!OqR%R*9KVq~6?}66V6{5L1#~!|+hh$@fiU~4;iBS@y5oCd(sn%%grq{UJ z1}olR_7Bb-Or9X+&2(Lrd8l%wSEX;V?YWbA8MH&ShKk3q|GRg%WdvPOx2SvqoMZ8_ zowj)C?sOl53&CO24@)FAK8!DgVh-pc$EG5SlZK8NrR zi3DwL{6NW;N1M zQj{dm4_Rta9jBWHguZ{4T2h~Lp6|122Mm7lhTI?_ zt<}cFa|LN*)u#i}jn_05P&Aw$e}=wl@C;KYrMaRiJocwF@Qqka(!*XJPug6y`xWy- zxOw3voM^R>VC_AR&QTYs;j(|FXXspYsJ@@*SvgnTTeY}Iwd1Qjr*Ba2=J7L^L;YQs z>e-(RZMrEfhN?;k+bC}_OG7++9ct&u>ccY*wR`npRo61LsT!`uiuL@_p|ji(*qs6tj|}Sd|5e zlf87Mkh2a_Xw2BDx}bBEO0s)Vouf2v$wj94=8z`**?pT*ro|ht#j+@~iEB|xNrhDx zrM;|XxxT~sk@IB8xzQ*6%iHs;45g9Q;d2p7hys3^*8b@_h zU`Rtmd5!bBR;)?1X3z!G+Av6It3T;4&j8C~Oma(5mM&$%MCK+ksxKkGQnAAu z*l~E)EKz^wIrEX)(zTT174QITfG6Q;kb(`PF!I#1Jhmzij>_|ym0cMw_F_3Efss)% zL&brN*T__!WswI+sH~H&qEk!Q>8=+!2ynG2HkV&LX*f4?xz| zWzAYvhGq3l7OZ4FKqj{`?3OXC3?5~uCW9oYm7TQ8;8su6$26g&kJTQYS$su3&Pi72 zl&4^$XZ^=&o2m=9s)Zr0HB_kzUV&HPH8=syka-`7gLp`UY$$=>!wR??R>Bt84`0K# z@Ex3nX!O++GGPRagwY^6ZxQv<#THZUb6sq4Rm+R3cdp*c!T(_2^}ov4o3HD?RQuJ- z(dp?Fw2#fp8y8B5Nm{#S$erptu0b3}DKl|ib|sJhaKeaJ>Bs0dg>ER7y_(m2qhhWn z1YGlv*FWHzf4oHhYp#F{Q~WRb55r~X9B|D)!_WKz546MC>#2R7?kW66h{o@5nt-6AYxfNGU{rX1?6q|p+{~=HI%_=VD0@g43wIY zp~MTUy%x`f%}a)XV)Ks}SbP5r1EuC4FR=Fh@eHZC46o-Ov2LS@M^SZ4Cb0I^8A|J)Drq3ZxJ+TBjY`cB5Sk zb;jv@J)U6bChdk@QCIou5oz#7;H&%#Sk1#iOJupdssm+&?G2xs8}s4bZlKofAq@YNBz zK~G46{*VsCAsZ&a6c~YhjD|5VPGCNi4TYU~G86js;OR?9`yFF(7~7lK1W2p-2tt!k z9ZZK}Seb18#oWm zN027;fg!LNUW3E%ISd`iT?JS)68*1WCv6n#^-wqo(Zle`OsHT7?1UauxLW|NrXnqH zKsl_1M_?};fN$Y6G?~T>2S&hXSTl?FMBr_B7tX>zptZ|_gMj`p0H(k+sDMTA5Uhh& z;dM9;e}eO%W&^rhEYP-yQuj_o+f}92etNFHOs9YR$ZYi776nClG(-?&|9_M zW~8l%>CON#T`}1zcn!)i+X@)c22+RinC}Ld+J*K9*LP(L-Fwm`U^-Y~Ijn{^dSbfo zvhx%C0;_uQYzgdy_u%f{C=PbRClK0)DLlwKcmrS=+ynC7T@T2G0=N_Ig_6F^wBZfd z1q*3EH^Uup7fedRbf?jF?u2__13U=>X)lAJ2uk5iI0(!8Q*zh>e}E6*1pEWk6l6S@ zuy7K-gkJl{4NI;@FK`yZhtf&7_<9S<(kLB-XP|jlI+{Ykm+%w(Aq$biFVJc% zmH<5=1qQ-WSOMYV=*nOtJO_UR(|CL-w1w`_3(8;-xX#g~T!6t7F*C5h9H@Xr@HXs+ z(b?!8ZU%Wx<_XvcV{+(mpa^b*mGB^Jfj_`fdZlHsYC5WgUf1K|zyfowNBI;1$>b``{p~o{0m8fi%P+@DrSa9yG|l@C5DeY1j!T;JZS?K#YxB zbdUifZ7%f1&b!cm4h;@w&gK3a+z2I~9*?B|~K7fzmOZWzQ zmtv@p4cEfWuoU(==>Fi~Jl2+6e0>S>0Cm`WbO&k$TS$gffrdO7roaubTxCI`7HLwj_f8eX%Ef^ByE}{9r+i(b;xD_LUu%)a# zKq)MMqT48lunZpn%U}h(0XyMa_yMl`Jq8CeArIW(fp=j)RJhUq&2Aj(YMKOGaX=1VhHG%sIz$Z>kKkj$v!0#<7HpuE!Kd&A zL_CRj8b676SaRzFtKnf7h@Tt+Z#_q8Vdxfy8n6x?1GSQ-2EATK+;H^{3+l!&5}NO0UbwrCYS?7 zuo70mi|`UmIcW4KRp-~JjYBu7=k;gQj^5Bi8|k5kHma*+9`#wZqqj)%9dR!{K;wVP-6W9qc(OWi!ho^uixT-somphTbEBG zl7nU^(OzpIH^Xom1~Hs!YY8D_EG49OURhV%n)Xv2*Tu8)-pC=V>WVB@H0I)rrD8>6 zE>=elQ9`_Nl{z!7X;c1jLnSUg^Ae@5X=477O_wdS*qIbs?5t*?!~6;@`D>q=qONIn z{uzgRBiAkJnnvg!w?XYf_X*Ikn4*+gOtEIEBZyozOiKaeSxlcT3uG1NjJ|OkNGZtNQ=Fr}shYOZG9B z_nw~A$JLHik3Xy472?5y+qyzEf0km>-EN9W+%9?eIkLsozQ|~yx)Y3Opht>mAd&oA zm(PzasVnZsk$U5DeHOBrI{FaB z=g8_T^@!$rsYf&qEVR#&)tPbIR(i&5Tlp6nrx&9599f-_ziOjL{;G|CWQpr@WOWw$ z;A_w+V?+}!M*?SzUz^?+FE%8$JQ@`l5ei{Y*S@FYX0=Dxri5q*?V+xHPy5a4 zSQg6aO3DAckwGQZ$!Mf>Z0q#@6S$SnXZOKF%Fhlb*kPKGgM2l=S{82iRHM9L%|iT|kQ z@Mbkjjr3fxMQsszv6pfxZGo~Q(ldCATCN?YYlp9HQ9GCiuT&Q|3<(L3G=+pkgqkjf zD5w5){+&6^_0*I{Jb&M!cAwBcRvK$a)3A_`5L0M~7VP44%22~|JmTF+*B-30vGVKS zc`hdJBu~5sp^+gWVId}ylts_H{|jpO#AH3$M&YK=Fq4U7W0g;*%~E#s^yYq1{+uD7 z9Fi^M*^FYv;+gh>I`oQ8TC%1vqJ8cF#MpGV9J=vq^CPjDeL76(XyH3g7y1S>tH#JU1VVRwL-(?Mte$3e{bG(^fi zkwrc&*-D9$*oujZ#>JWL#>-jubea zt*CMWTT!LWdn|FKKr_dW%$PZXe}&C@v!o-UyT)$kf1k%@*z?NypQBD!S!@pfrgbj= zT2#xTL+v1CzQ7~%wd{k2naIC+FXP|26Gn>GHCQ_19R#wMm-&Td`p*h-(7;9I{CnJM ztqw_5t6q;_!LqE5+18OId6rU3uC2)CtQcNonO)}7LmF}Nk+0}bM38`HWsA{hThGRK z)E@2q-#^fA!}~&e*1V%8UlAA}&X-(kEt$tX>)%oP1_YBQ$&7ULU=IfmmJ$%`f#AWo zE#j?%p4zJ5!TJRRTOK@EazL=#g9l3r2(~zQu*8613xfws2ngm39xOf}SV{0;h8E(n zAW>>z?O^icilGG~SZ?rOh8B!q(}M>yv|t3gHh3^Y3r4WXcl^-JiVnA|V9Us7CLifB=;_fsT5d_up3xYYQR{&A3!5SN&kEE3leh-RA* z8yB0XQ9JimOb z7MhOAxx!D>4yMm!?@snyU$gf&_y#28cWl3h)9?fQ2tUCYkn2CQ{X6^v{t4&cU+@da z_49tn$T38EOpt3rIQtE}#~fC*IjNpd??0**H7VV`b*l_1c)dbd9OhYgR9zUpg;d9M z^qf1Yj*QYeVxnjt27q0|-{5MiX`Y40)KQJ4+n1hLu5z(QNbC&Hxnt@=^;=K*an*I@ zS*~eg1~yqdpKez&w1J;R$(G?C!$K?3dPc>Njh@BDiw$IgWqY*vIjvmdOZ4(dLdNF= zf72tcI7jky4V?7S=l-n=3139uJ=(}d(uv* ziPy=nMTRr-$)Ru)DD+3lL>~S-#sKgG#1XHYR7NRBDfAS^r29DcX5Gd239C_!;s+B} zt>Vjw$Xooboka}wt3tR8b|+TC7IV9T=_ zqrJWfadG|n=GtOKD++H@Fr!?y`Z04C?DE(2%HxD7u^H<;7}zPKmwC)tnfV zUp64$;jaZ#5cl4Dt3p|#jD(OOVe^H4G`ci6Oah6hWh zh9LSy~TuTN4^|6wR)cuJqt%(S%R;pxNr OC#C!rl=9>$RsDZ>1c7}3 delta 27342 zcmdtr2Y3|K{_ycRn@va|q=yg)gdUKRp3syMkS2tVQbX@GRK*QQ2WbNgAXPy`ia>x! zyMO{Bf>K1KSFeI}@v2-Q@AvF%OR@>!Uaxeh;If{N}$;ZdDXM!jHS66hEpc zg_Lgny7lvI>)Y16Hp?#$W3W=Cp-_g^)D{0kJ>Xhg9bkwyE%MY;%H_kt`s=)wfet$+ zo92AFh3G4tEswG36x%CtV%F{94HRV$@1GV?OiD%0D5AK&gWQ%bB^2dd7e!f9N>K{( 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 aco Date: Mon, 3 Dec 2012 16:56:15 -0800 Subject: [PATCH 42/63] =?UTF-8?q?pdp11=5Fdmc.c=20-=20Removed=20DMP=20?= =?UTF-8?q?=E2=80=9Csupport=E2=80=9D=20through=20conditional=20compilation?= =?UTF-8?q?,=20including=20removal=20of=20SET=20TYPE=20command.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed SET POLL command. - Changed SET TRANSMIT command to SET PEER - Fixed problem with detached device causing socket errors --- PDP11/pdp11_dmc.c | 157 +++++++++++++------------------------------ VAX/vax780_syslist.c | 2 - VAX/vax_syslist.c | 2 - doc/vax780_doc.doc | Bin 129024 -> 129024 bytes doc/vax_doc.doc | Bin 135680 -> 135168 bytes 5 files changed, 47 insertions(+), 114 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 114a32dc..4b19760d 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -1,21 +1,8 @@ /* Bits still to deal with: -I noticed that if you attach dmc 1234 and then start the simulator. You then detach dmc, and change some dmc parameter and then merely continue (without reattaching DMC), you get a Sockets: accept error message displayed incessantly. Some state isnt being recorded when the detach happens. - -Id like to suggest that SET DMC TRANSMIT=ip:port might be more obvious if it was SET DMC PEER=ip:port. Your call. -What is the point of SET DMC SPEED? -You might want to either remove the SET DMC POLL= option or make it do something useful. Likewise cleaning up commented out code. - There is a line in vax780_defs.h which defines IOBA_DMC to (IOPAGEBASE + 0760060), Is this correct, or is it being masked by the autoconfigure fixups? -I was thinking that using this DMC11 could be simplified if there was no need for a SET DMC LINEMODE. Both sides could be listening and when not connected periodically attempt an outgoing connection to the peer. Why is LINEMODE required? - -This leads me to realize that I dont think you can have your pdp11_dmc.c have a SET TYPE which would change a DMP device to a DMR/DMC device (DMC, DMR are register identical, right?) or change a DMR/DMC to a DMP. - -Since, I believe you had said that the DMP isnt really implemented yet, for now, you should probably have some code which fails an attach to a DMP device and with some sort of unimplemented message, along with anything else you deem appropriate. You can #ifdef DMP_WORKING this fake unimplemented code (for now) so you can work on the real implementation in the same source module which will be part of the distribution. Once youve got everything working the #ifdef stuff gets cut out and will build normally. - - */ @@ -86,8 +73,6 @@ You can add /PASS=n to the above commands to get the diagnostic to send and rece The other test was to configure DECnet on VMS 4.6 and do SET HOST. */ -// TODO: Copyright notices -// TODO: Compile on other platforms // TODO: Avoid need for manifests and newest runtime, compile with 2003 // TODO: Investigate line number and set parameters at the unit level (?) // TODO: Multipoint. In this case perhaps don't need transmit port, allow all lines to connect to port on control node. @@ -140,7 +125,7 @@ typedef struct int receive_readable; char *receive_port; int transmit_writeable; - char transmit_host[80]; + char transmit_host[CBUFSIZE]; int transmit_is_loopback; /* if true the transmit socket is the loopback to the receive */ int speed; /* bits per second in each direction, 0 for no limit */ int last_second; @@ -206,7 +191,6 @@ struct dmc_controller { BUFFER_QUEUE *receive_queue; BUFFER_QUEUE *transmit_queue; SOCKET master_socket; - int32 svc_poll_interval; int32 connect_poll_interval; DEVTYPE dev_type; uint32 rxi; @@ -226,19 +210,18 @@ t_stat dmc_wr(int32 data, int32 PA, int32 access); t_stat dmc_svc(UNIT * uptr); t_stat dmc_reset (DEVICE * dptr); t_stat dmc_attach (UNIT * uptr, char * cptr); +int dmc_isattached(CTLR *controller); t_stat dmc_detach (UNIT * uptr); int32 dmc_rxint (void); int32 dmc_txint (void); -t_stat dmc_settransmit (UNIT* uptr, int32 val, char* cptr, void* desc); -t_stat dmc_showtransmit (FILE* st, UNIT* uptr, int32 val, void* desc); +t_stat dmc_setpeer (UNIT* uptr, int32 val, char* cptr, void* desc); +t_stat dmc_showpeer (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setspeed (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showspeed (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_settype (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showtype (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showstats (FILE* st, UNIT* uptr, int32 val, void* desc); -t_stat dmc_setpoll (UNIT* uptr, int32 val, char* cptr, void* desc); -t_stat dmc_showpoll (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setconnectpoll (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showconnectpoll (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setlinemode (UNIT* uptr, int32 val, char* cptr, void* desc); @@ -370,12 +353,13 @@ REG dmp_reg[] = { { NULL } }; MTAB dmc_mod[] = { - { MTAB_XTD | MTAB_VDV, 0, "TRANSMIT", "TRANSMIT=address:port" ,&dmc_settransmit, &dmc_showtransmit, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "PEER", "PEER=address:port" ,&dmc_setpeer, &dmc_showpeer, NULL }, { MTAB_XTD | MTAB_VDV, 0, "SPEED", "SPEED" ,&dmc_setspeed, &dmc_showspeed, NULL }, +#ifdef DMP { MTAB_XTD | MTAB_VDV, 0, "TYPE", "TYPE" ,&dmc_settype, &dmc_showtype, NULL }, +#endif { MTAB_XTD | MTAB_VDV, 0, "LINEMODE", "LINEMODE" ,&dmc_setlinemode, &dmc_showlinemode, NULL }, { MTAB_XTD | MTAB_VDV | MTAB_NMO, 0, "STATS", "STATS" ,&dmc_setstats, &dmc_showstats, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "POLL", "POLL" ,&dmc_setpoll, &dmc_showpoll, NULL }, { MTAB_XTD | MTAB_VDV, 0, "CONNECTPOLL", "CONNECTPOLL" ,&dmc_setconnectpoll, &dmc_showconnectpoll, NULL }, { MTAB_XTD | MTAB_VDV, 006, "ADDRESS", "ADDRESS", &set_addr, &show_addr, NULL }, { MTAB_XTD |MTAB_VDV, 0, "VECTOR", "VECTOR", &set_vec, &show_vec, NULL }, @@ -411,12 +395,14 @@ DEVICE dmc_dev[] = &dmc_dib[3], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; +#ifdef DMP DEVICE dmp_dev[] = { { "DMP", &dmp_unit[0], dmp_reg, dmc_mod, DMP_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, &dmp_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; +#endif LINE dmc_line[DMC_NUMDEVICE] = { @@ -443,7 +429,9 @@ CTLR dmc_ctrls[] = { &dmc_csrs[1], &dmc_dev[1], Initialised, Idle, 0, 0, &dmc_line[1], &dmc_receive_queues[1], &dmc_transmit_queues[1], INVALID_SOCKET, -1, 30, DMC }, { &dmc_csrs[2], &dmc_dev[2], Initialised, Idle, 0, 0, &dmc_line[2], &dmc_receive_queues[2], &dmc_transmit_queues[2], INVALID_SOCKET, -1, 30, DMC }, { &dmc_csrs[3], &dmc_dev[3], Initialised, Idle, 0, 0, &dmc_line[3], &dmc_receive_queues[3], &dmc_transmit_queues[3], INVALID_SOCKET, -1, 30, DMC }, +#ifdef DMP { &dmp_csrs[0], &dmp_dev[0], Initialised, Idle, 0, 0, &dmp_line[0], &dmp_receive_queues[0], &dmp_transmit_queues[0], INVALID_SOCKET, -1, 30, DMP } +#endif }; extern int32 tmxr_poll; /* calibrated delay */ @@ -554,14 +542,17 @@ CTLR *dmc_get_controller_from_device(DEVICE *device) return ans; } -t_stat dmc_showtransmit (FILE* st, UNIT* uptr, int32 val, void* desc) +t_stat dmc_showpeer (FILE* st, UNIT* uptr, int32 val, void* desc) { CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "TRANSMIT=%s", controller->line->transmit_host); + if (controller->line->transmit_host[0]) + fprintf(st, "PEER=%s", controller->line->transmit_host); + else + fprintf(st, "PEER Unspecified"); return SCPE_OK; } -t_stat dmc_settransmit (UNIT* uptr, int32 val, char* cptr, void* desc) +t_stat dmc_setpeer (UNIT* uptr, int32 val, char* cptr, void* desc) { t_stat status = SCPE_OK; char host[CBUFSIZE], port[CBUFSIZE]; @@ -717,27 +708,6 @@ t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc) return status; } -t_stat dmc_showpoll (FILE* st, UNIT* uptr, int32 val, void* desc) -{ - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "POLL=%d", controller->svc_poll_interval); - return SCPE_OK; -} - -t_stat dmc_setpoll (UNIT* uptr, int32 val, char* cptr, void* desc) -{ - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); - - if (!cptr) return SCPE_IERR; - if (sscanf(cptr, "%d", &controller->svc_poll_interval) != 1) - { - status = SCPE_ARG; - } - - return status; -} - t_stat dmc_showconnectpoll (FILE* st, UNIT* uptr, int32 val, void* desc) { CTLR *controller = dmc_get_controller_from_unit(uptr); @@ -1195,14 +1165,12 @@ void dmc_process_master_clear(CTLR *controller) } dmc_buffer_queue_init(controller, controller->receive_queue, "receive"); dmc_buffer_queue_init(controller, controller->transmit_queue, "transmit"); - //dmc_close_receive(controller, "master clear", NULL); - //dmc_close_transmit(controller, "master clear"); controller->transfer_state = Idle; dmc_set_run(controller); sim_cancel (controller->device->units); /* stop poll */ - sim_activate_abs(controller->device->units, clk_cosched (controller->svc_poll_interval)); + sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } void dmc_start_input_transfer(CTLR *controller) @@ -1286,22 +1254,19 @@ t_stat dmc_svc(UNIT* uptr) controller = dmc_get_controller_from_unit(uptr); - dmc_line_update_speed_stats(controller->line); - - if (dmc_buffer_fill_receive_buffers(controller)) + if (dmc_isattached(controller)) { -// poll = 200; /* if we received data then lets poll quicker as there seems to be some activity */ - } - if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); + dmc_line_update_speed_stats(controller->line); - if (dmc_buffer_send_transmit_buffers(controller)) - { -// poll = 200; /* if we transmitted data then lets poll quicker as there seems to be some activity */ + dmc_buffer_fill_receive_buffers(controller); + if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); + + dmc_buffer_send_transmit_buffers(controller); + if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); } - if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); /* resubmit service timer */ - sim_activate(controller->device->units, poll/*controller->svc_poll_interval*/); + sim_activate(controller->device->units, poll); dmc_timer_stop(poll_timer); if (dmc_timer_started(between_polls_timer)) @@ -1366,14 +1331,10 @@ void dmc_buffer_trace_line(int tracelevel, CTLR *controller, uint8 *buf, int len { char hex[TRACE_BYTES_PER_LINE*3+1]; char ascii[TRACE_BYTES_PER_LINE+1]; - //char ts[9]; - //time_t t; int i; hex[0] = 0; ascii[TRACE_BYTES_PER_LINE] = 0; - //t = time(NULL); - //strftime(ts, 9, "%H:%M:%S", localtime(&t)); for (i = 0; i=length) @@ -1598,7 +1559,6 @@ t_stat dmc_close_master_socket(CTLR *controller) // Gets the bidirectional socket and handles arbitration of determining which socket to use. int dmc_get_socket(CTLR *controller, int forRead) { -// static int lastans = 0; int ans = 0; if (controller->line->isPrimary) { @@ -1608,13 +1568,6 @@ int dmc_get_socket(CTLR *controller, int forRead) { ans = dmc_get_receive_socket(controller, forRead); // TODO: After change to single socket, loopback may not work. } - -// if (lastans != ans) -// { -//sim_debug(DBG_SOK, controller->device, "Get Socket forread=%d, changed to %d\n", forRead, ans); -// } -// lastans = ans; -// return ans; } @@ -1683,7 +1636,8 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) if (controller->line->socket == INVALID_SOCKET && ((int32)(time(NULL) - controller->line->last_connect_attempt)) > controller->connect_poll_interval) { - char hostport[CBUFSIZE]; + char host_port_buf[CBUFSIZE]; + char *host_port = host_port_buf; controller->line->transmit_is_loopback = is_loopback; @@ -1691,18 +1645,25 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) if (is_loopback) { if (strrchr(controller->line->receive_port, ':')) - sprintf(hostport, "%s", controller->line->receive_port); + { + host_port = controller->line->receive_port; + } else - sprintf(hostport, "localhost:%s", controller->line->receive_port); + { + sprintf(host_port_buf, "localhost:%s", controller->line->receive_port); + } } else - sprintf(hostport, "%s", controller->line->transmit_host); - sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", hostport); + { + host_port = controller->line->transmit_host; + } + + sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", host_port); controller->line->last_connect_attempt = time(NULL); - controller->line->socket = sim_connect_sock(hostport, NULL, NULL); + controller->line->socket = sim_connect_sock(host_port, NULL, NULL); if (controller->line->socket != INVALID_SOCKET) { - sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %s\n", hostport); + sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %s\n", host_port); controller->line->transmit_writeable = FALSE; } } @@ -1736,7 +1697,7 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) void dmc_close_receive(CTLR *controller, char *reason, char *from) { -sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %s, reason: %s%s%s\n", controller->line->receive_port, reason, from ? " from " : "", from ? from : ""); + sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %s, reason: %s%s%s\n", controller->line->receive_port, reason, from ? " from " : "", from ? from : ""); sim_close_sock(controller->line->socket, FALSE); controller->line->socket = INVALID_SOCKET; @@ -1837,10 +1798,6 @@ int dmc_buffer_fill_receive_buffers(CTLR *controller) } } } - else - { -//printf("Socket error was when trying to read the header.\n"); - } } else { @@ -1888,10 +1845,6 @@ int dmc_buffer_fill_receive_buffers(CTLR *controller) ans = TRUE; } } - else - { -printf("Socket error was when trying to fill receive buffers when trying to read the body.\n"); - } } /* Only close the socket if there was an error or no more data */ @@ -2059,18 +2012,11 @@ void dmc_process_input_transfer_completion(CTLR *controller) uint16 sel4 = controller->csrs->sel4; uint16 sel6 = controller->csrs->sel6; dmc_clear_rdyi(controller); - //dmc_clrrxint(); if (controller->transfer_type == TYPE_BASEI) { - //int i; uint32 baseaddr = ((sel6 >> 14) << 16) | sel4; uint16 count = sel6 & 0x3FFF; sim_debug(DBG_INF, controller->device, "Completing Base In input transfer, base address=0x%08x count=%d\n", baseaddr, count); - //for (i = 0; i < count; i++) - //{ - // uint8 t = ((uint8)i + 1)*2; - // Map_WriteB(baseaddr + i, 1, &t); - //} } else if (controller->transfer_type == TYPE_BACCI) { @@ -2106,7 +2052,6 @@ void dmc_process_input_transfer_completion(CTLR *controller) { uint16 sel4 = controller->csrs->sel4; uint16 sel6 = controller->csrs->sel6; - //dmc_clrrxint(); if (controller->transfer_type == TYPE_DMP_MODE) { uint16 mode = sel6 & DMP_TYPE_INPUT_MASK; @@ -2258,22 +2203,11 @@ int32 dmc_txint (void) } return ans; - - //int32 ans = 0; /* no interrupt request active */ - //if (controller->txi != 0) - //{ - // DIB *dib = (DIB *)controller->device->ctxt; - // ans = dib->vec + 4; - // dmc_clrtxint(); - //} - - //return ans; } t_stat dmc_reset (DEVICE *dptr) { t_stat ans = SCPE_OK; - //int32 ndev; CTLR *controller = dmc_get_controller_from_device(dptr); sim_debug(DBG_TRC, dptr, "dmc_reset()\n"); @@ -2287,7 +2221,6 @@ t_stat dmc_reset (DEVICE *dptr) dmc_clrrxint(controller); dmc_clrtxint(controller); sim_cancel (controller->device->units); /* stop poll */ - if (controller->svc_poll_interval == -1) controller->svc_poll_interval = POLL; if (!(dptr->flags & DEV_DIS)) { @@ -2314,6 +2247,11 @@ t_stat dmc_attach (UNIT *uptr, char *cptr) return ans; } +int dmc_isattached(CTLR *controller) +{ + return controller->master_socket != INVALID_SOCKET; +} + t_stat dmc_detach (UNIT *uptr) { CTLR *controller = dmc_get_controller_from_unit(uptr); @@ -2324,4 +2262,3 @@ t_stat dmc_detach (UNIT *uptr) return SCPE_OK; } - diff --git a/VAX/vax780_syslist.c b/VAX/vax780_syslist.c index 8d179231..5f0aa965 100644 --- a/VAX/vax780_syslist.c +++ b/VAX/vax780_syslist.c @@ -55,7 +55,6 @@ extern DEVICE dz_dev; extern DEVICE vh_dev; extern DEVICE xu_dev, xub_dev; extern DEVICE dmc_dev[]; -extern DEVICE dmp_dev[]; extern int32 sim_switches; extern UNIT cpu_unit; @@ -97,7 +96,6 @@ DEVICE *sim_devices[] = { &dmc_dev[1], &dmc_dev[2], &dmc_dev[3], - &dmp_dev[0], NULL }; diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index 1e278ca6..6554aaf6 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -52,7 +52,6 @@ extern DEVICE csi_dev, cso_dev; extern DEVICE xq_dev, xqb_dev; extern DEVICE vh_dev; extern DEVICE dmc_dev[]; -extern DEVICE dmp_dev[]; extern int32 sim_switches; extern void WriteB (uint32 pa, int32 val); @@ -89,7 +88,6 @@ DEVICE *sim_devices[] = { &dmc_dev[1], &dmc_dev[2], &dmc_dev[3], - &dmp_dev[0], NULL }; diff --git a/doc/vax780_doc.doc b/doc/vax780_doc.doc index f9bcb3ead2cd55417d7566f2d3b3be02493970c0..3b262b9a6d21595ec6260055a1260f467588ac2d 100644 GIT binary patch delta 10727 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 C&{ui@ diff --git a/doc/vax_doc.doc b/doc/vax_doc.doc index 0a1ab6d2f5b8e920989564b9b3a6a3bd3ff416c9..c40ca983646fc5b2d1d1fa74df8353ce769f9b69 100644 GIT binary patch delta 16757 zcmciJ37k#k|G@F*xw8+$7-KMF--a^Go$cN`)X!k7VXS2-BtMGmvP2g@;YX-0PCq1T zmTXzNmBLgMDZ8?Sl71BpN`)-{&vVZ?bMHO$*Z=kUYv%Qyvpwgz&-p&z^PFX7#x0E; zw=nX>)auuT@f9nClwk4Zty{O$+H3ej&1mwVtp4VpN%Cb|Il0PH-d5MP>Yyh-tb(V% z?R8sJ8&7;lTF;YFLiD*$h(k6Z>ZJ(LpQ@&`7J@}Fm8tsrE7NL}OK&U026jB#UWm~w zuVw#Ip0>7<(e=x!dW2YBhs6ZXv5?rf<#o(e`gCn;&-IY38XvMx0&8AP(^p%kYPTnZ z=aJAVajKbtU$3Tda9MTCif`ZSuQ8FMY|&DPJgM1x$QJH`R{FNJ74<2h^u@B$w%!9a z@Bd7N*Y{Cr$U67`;ZWc=0>K&Xi_}WqfAqoMzzs5ZlYW^wRG>GFAwMFYBH;q zGlU2c1+7#=nzT?2sbOr;i|Rkk0LD{s4_286X->^Bnacz^KdeR-|Ds-vxvY9deGznu z*?f_!k!^0ZPR*mRuJ+tlBt!B>7G}k&kZ^fqSYn`6+v6b)l)!?d9NyewuvDdLjHOlK4RkBiE zPSf0WxlJl{?=Y}edPbUFNR{{P>PYo;FOdUZ5uN^*(K}hAD`(NSkh=_mS;{$ z{a_tgo;@Y2=mi{}%jQ~#f34HgF5a#eaQfG}Ja5Kl=xbe`bMbl&&QwpyQhHftS?dd; z)2;_GBdYO}L;DTAa}b?&&)5W`mNd_{QvdMP?M(BpP50DJXsNGF_piR3$z|&4WnG19U8$an##(0WW%U|dc2DQB?S0+jGI~ADV~AZ>m(jy~gq(PpR|2 zMC5qADLH3Km9sQeB$raHG}=1#Y`LNp13x&EvOElDT`rEh) zx3|PnXNUSok(p_Ht@(TO|EWf!Je~4Lui4AqxDUHIeYZ(ElQ00o{P!tf&YJP zT6DbG6~eRqY#CqcKK*ZHHQjjOzZ-3TniMC(?$oxsCdH3`TT+}0?9ub*ZcB>ucTb9+ z0;{<9N%7NPN{Zc)cMANyPl^k^r0`t0u<=iGVr%rBns(QmxcIl_#HGLvJ%8!8ocQ_f zIq^$i756?Te)&r|u{!2Xfxq`T@vD&&zy5hnEG&Mfrrk9se*4>U;`hJ~J^%Y{IdSFg zIdL_xihG|ESN~E@%!s>F;O~7-{9)w8AAg<`6L=cB{knG7oVfnC<;0D^4n2S4ww$=}QXjf|P%r6;JRw;QyQz+D)7Mo64wZMy3@tV+uolm~P7UpsF!`5qqg}Z>h5z2?MueUl-U|`3xy?PPiV%~r zqpA?QFp5`5V=)hJp?Gy6UgllM5rif4t^^-pGHkF|6JMjzJK0rfZdysiNg$fOLL09k%-%-~JuAL}gexKH`h;)Up=zX?`d_Od6 z5kXmuQ#g%Vs7io3;RU>c?a0SmBVZeT3j{mbi) zljEgZt*uK>rlJ*E;{&MPJ%Mf?L@F&wk81=mo`E<{H> zkGF9iDnr!MuJPq{$E#MTwMm!>l|Rd|0w3T6E~98VHKIBC;{~k4L0m#fUg){d6VKsQ zyo;l_ilj^-TH-0p#3mT=@E%K$rKJ`dCA(^;qhz#O78jztD)0qDN#-i(im_11Js-Wu z+b6IZhj9dF$=~nrtdX}%neM_>R3vv*9(RG6%PW~5K@O{&ejX~XZwT+<1X)gM>nqC~ z)u=?(sBpIo;f1qmm?|_M<_Yi}^Yuu4bs{_sbuui*4ycpjXQ&e+kCQ^398;lA5Xp(5 zPLgb>6Qv!VggRlyV*=j5KG3LV66I9sRtwiq^&djyVg%-48_po2fqu4CWV#ExaTV8a zIY)?Jk=T$1qa!+@L}MZ1&;^4q7+Z3Mcn=402sec9ON)+@J-w$Z$V$>(fhym|Hkcoy zs#n#TRjDc#Hy5HYZ=Jg!gEzwU(HpB<2~oO@5cgvYW};JDnt=DPAJOe-E~aBKmSYQK zdq%R9_5=x!bP&SZQHX{Q3-LN^orSo9Ze6Ju<+{;pXn}T*3Nf@N>4|=i^TNKD5Y?X$ zqBc_DL>D}U7t!ROLi`hXeK@)L3SobeI?%QsAG)nSJ&fHrfIn~x4?ay}&>BMq2(bkH zhcLDbrE$afP;?(Igd3L&0=~b|dZx?r)sO5u61bN6-Iitc(PovG&9u~xvZ(fbx-9L^ zQ{D6%Dm0-5=#E+V5I>-JQz0_Z8B?(d-y)%z5KS={i*OLvQH6eMiNR2PxCCZDcBL<$ zcu4O@JvF>X6J#0RNt~>a9~s6;V>3<~)!`m|fNMyn^9MpD!5SQI%}|5mbovPlqmzg0 z9WBbx$EvUEU_4Zxuf`gjMl@YfA1V(zV=#uGQ%6lE%N^QSb#?eDL9TSu7*acfOa}T&R3C&p;hXuaC}ke8-iWfjo+ctxp)^LVv&wc7=bz1f-{IF)$2p0{iApm zD*YE@33lToP9dCA!8|QwbMN39a;6;6+&D*iGJPD+<8^$F3n<08V~0A2+G8*F;VQa! z*Uzg_#<{h?IKTRHj?KYN{1=g&Zw)cJmv*tH%+hYvl*z$AVzgEz7;_uclH1+t?0gn| zITN46OyjIv&U6Jn#0mV4YP|^yMqm!M;0z-F$?uk+&g7=(4RuDpfa%zT-S`w&a1}T7 zF1hoCNfoHnM;{W}GM&{|9~!nXy@1#!{lmmi=4W9uj^KBc;RUe^UGOaC<9+;qq<(5> zA;ehGUx<~6dYZn)4WS*bAg8Ou`O$JoQkz>r4LAd_5TD>O5*U0MLk&bju^4JVdKX*p z6~sUxlFt50_DH5JL*OVI*c_%^>go1X<~}>-HM9eTMTWGnn2+KTO8EID`lW z!%V0_@o79Tl={&PYLFa>QJ4b_`S<|eK@FfG7zH(uF2y0-^}4MJiQ$~pP@``TOvemt z!e;EjXE=>NP~sUOYM~)IV+dZrO6*;tOls5^mM1MI~?oI=Dz z3OgopFjI&glK)L3a2!3R5}av5{2NPf5g{*dONRj{I-UCj)WcI~`69iA{uqw=$bE@q z!dwqoGm8NU4PW74@X%atXx#iLJCEBjG{Xpl&!=TbMmJ2r2l(byA=)gU0k08xjK@^) z&|rL@{_=F;{I!D9Uj{6gMJ&@eqsX3uJv;a4^V-yO*-o1fF3YIPX%Tm8)gwhv3#w=G z&=w=1dTAz9PhE!Ut$6f;>a}Swd#)J0qcwwx2DhLOJ6cqf9O%0; z6kfT0bX%@ms&u7i2`L6(0e0ehM33Q~5`8cW`6xirSh@#;FdJKN4zc7=D!O3`=0fGx zI(!C|W8vTOI+K zumvY@9aW#Fy?6psupS3+5k)7F8puIUjKgXi!L3Pmj?pc)-8Y$g6b!?1G{XR>p=J^$<9(b%<(Ekhyo8;&f*K4*9WerGXqpFe zczS>#>V{BX-q8)^BY2*QNUeU*~u}sxi_6}Ok)yK4vOy9t2G@a)k)NJ2tmWS2-f7QId!B(cq3?el>!Y1$!-b+|bGb=7kuIycGgRQBIb?PCr7@br zRfoR_>d-gi84g{A;AJBWOPJ0g3@RL(jgWlAbX!13_Ay_ZkfdM)Wq8+;7DU8LdSb(*-cIo8jCwJ#>$=`kQ zjaN?2@J&89rqAV%RNwl9ztO4~t#`P{YZ0PdYc0p9Ge+VXV&9|DAMkDnrFQZ_ zhf1H&kX?-byBPp6^i$3&tl7ime2-`$KK_j10#|Syi$CY+_wmXSMfX!V!VYlNLd}EZ zJ7T^dd+`yTILZsEQ)X4X_W@E}Wu8bJCoiPyUG*mVCF-(JM z`1`2#5w8aj&jFYR(v>*q$>}Y0w7G8HJH7ctutuPr=upBFJ49B5D zQVNp@i3*Kogl84gA%w>a(`@Ef6DlKI;yvbf5+yTghnXKj#D-!KjO)XlpNmxi72bF7 zJtFsV_~?P>u@-x935kT?g)SI{Mc9SFu8E;*Mi^bBG2Mdipt>s@-HmQj4}O)@3tRIA zGVf|7H#o%^`Bb;QjC@=`3A$Hxb1kgLn>Y#8?GcA)GcwT|V=x{7#lp{bS|ew!@b4cKE2mnDF#25^ z)Jr}SwBX-M3yPZ4w^&&8>)rwTsfB?3g7VB694)6c&&(BtHSg^kP_tSHI8sZboJQyh zKid@?DSff9<_7%&YE}#W{emLo3X0I1PY3L!7W{h!N66({ENrbySn^7(;4j&|Z;g|k zim1OW)H+X-O(WDFWu}Ig&>o#8%X+s@ljCCKDlO+fvU{lt4fNOl>i$~YJ*f-jDsA(B zWc#ogjP(D}V&=+Z-!CcEuL#vI=r(2YR8o(7r3bm9&9(oFa6!6 zdKakP!Kv3>>P3cnRiK{G)zh$g3RTZ~>Jdvl<)~*2b^EIB9)F@0>b^l;;neko;XK-R zSybcJD((HbvaXhTQ-*36=gMmG6|Lt@nY_IIJQ*Tac^_CHTiaw8?S+N1c}$w{4?J1g zjD<2u`+A|Q9kkw|-CQV}2CZ`HMcXd26m@9>76lb`h*Y&INy`r|sz#NQ)}m>8QTyVc zS{))?YrWV~YldEQk+o>1w$)lROD|etiKSMDR%eN&R;ONcytSxHTM%5-$zic7NxKwW zRGsq0mIl@86lr?Vo=bxo;N-BLvlh+Ji|)4;&D094MYHsxIm;}yI<&`@SsLKfi@s?s z>e4p``;I4ob$m#jt8wYAow8G2ED(3@BAnbI80uy7hQiRLJ`bt< z@M+wLCnHaylDe#qk$vLU5^LoYSUJ%$q88=g!dZT|aJzeB9iZ zaKf7|GjGZs!O3p8IF9=(L&SKF#!&7BUL+Vkn#*mkVZ#cdVz|cOV7kQMU|PMGdlz-1 z=bO=DSIA$q^Vj7__iKdQG=-3x-Xzqf&CHwBpB$LJCFG{^gxu7Dkedb)aZ_g^ZYoWr z;Z{FH?EpE1+$7u5HHIWYZW>9bP4k&IwISpt*`Iw4zYu9t++bdg8@i03OS%wtC7dvu zYA|oAN61Zo5OUK=LT)O)iDzL$5$@+r9};oX>VsS_`0|GFMydp3H(IM7lM@L$R3ARP ziVFbVUCoZ@L#2apfWf}=KDv)eLPSK6axD936V}O=?u8Y(y+`LNJX)h$HKwRhi`!vz z#S@r@S=fq?@iYFwOI*ih<3oIc>9q+kcHv9dQn=1R{V9wKQ!oSS&tH=3(4#$>>5a*F z5l`3U;RIW;1EWZrv6zIZ=#W7NU@~T4F_s}ai(gBiEmUl_uGV8xZ#}O_@CshV^$qm& zMjq9+(txe>X!dsg*apKf8jJ8c^05=Pd`>E)e#l!>xG^3}c(z-PD~RCvZVV=38P=c? zCzQJ4cEw|ufN2=Lix)}gxtjxb^TPx6D0dOp5cerB*KrDGF?$c&aT?zs<}=a<>BvM! zJdAg+1*h;e#_F)+*Wu~{$5&rI_RzkU=$s6i&SlJTJLXP z$j&k$E>(S`|7+r2V!l`X=Uq`-;o71tv~@@2iqKsTbZ~pS9+S(Y)}V)+@YV_0fKS$P zzLGUV%N<@6qCNeUtW-X zbY6Zb`6I1z+9w6FUXpoJq%KPOUTpI1y-NGMKxPIMAW3~2%mPcT1=1}A7FY`~ng-SI zinV~$o zsAMhRkEC88(OSSC$&$WE#s?S33W%g$pqRCQKazTZNNWLqB=rI|UxC60zbsz0RJbDB z$J>4XL7SFkPs>W>e`Z~FSGq&%eMQ#vuDK$A5AUY_E&UuJJCC1GfD5>YOHkW?VR{+A z;y3(`E4T`^{f0>`;}*gtFHdc@{>Ab#{^|Q4Z5t~@q&C`SyJ_=u&_;*YS`>|C72}~` z|62@sHMJ`twlVzC$na2`TmG#58fqKZv_bQ3zWuHL>&O-_)I(`jxv`k zj)^WT<%_oBgxDpviyTTkBDQO9gxShQ#jsN}BKbe}(#6cGV_#AKMy~xFW}76x)JBEd zCf|R6{d2{~)W1vY6&=N4mYRw$nBOhh^BGO~v_s+}-srd0?vJp!3hUCF=^YYbD<nD5neYALOZM3{PSxx=8R_YnIgL}AxEiOWWaOqcN^!XwW~JCO(i`PurKZ|5 zGjqM8V{F}Q)iQF^9I5t3u9U_Zu7)WY_Qn}04IK@0Q*tsI=GYsudqzg4Q8dS%)yUz@ z$Vf@IJF`+Ua&psCoQ-mtq+~Xi8tfCono^18>a0uIZK{u>mG{#@QccgF zQi+^gTsf=YhqE(FEWp_wX{=Nu?O1cFj(tEgGizlLb4g3OnzB*vb?bgQuuodo^<%9c zQ(mbi{z{c-s#F0hljSYS31-=bnnkc2=dNKDwyQuXKhZGq^L>I+^;pXL7}{M8XhuD1 z){%OYbg!4~tRJiSJ|w>tE3H$smR2KK?`h_*d`do@`PMARdN2JVKQuX;*<9^bvVxVH zb!nYM*7ce19bwr%jIz!xbG3Ppzkbibt2`72f0RkB;LEmO^kO832~Q_;MkP+d9&<<%(aP*=R)e5YZI-t zQ4tZ2MIrHWf+Wp`h>Wq?Fe)O_kv(4#*+-J)^SR28iimQw%vZr&8+Oa8LC39`G zL+5vI8{;UG-_<5j5iyPq*4kLdd-*Gx+s0Ef<F@Amhv}XzI zQ#iM)u)jRWy`P^h_Hc=Xyn4uNklSy#S(T(;@`h!psw$ONYU!@)*t1~)MLZ83csAIv z@)!RHPN2BQyNkaZ_jpG|9jDI(6@IuTSqk+mf}JY-zt2uZ)Cu)G^DI?6sXOCX|?V+H!`1qi>0vmDInCiH+GG zRkg>)#MS>SCa!sQ=*4Rf#l-c;$HWcKBA$Fq-1u8Du{`Ia8ve=0#7%ch-2Cg9nETYD zs`l8Jxb>gK#2=m=dhw5kV&eAWW8zQGBA$Fq{Q0+HVq(yv8ve=0#2t4`-1+O67{N!Q ze{e%__dkn?bk7dGnEp^q+gmezmAHR zc{K3<9TmnsoBof&!r1JkJv!C6=%up+hH=_kKQ1ziKp)Ri98Wqlj2k}sZ^cHFutzoj zlaGyTW^6dGWYe{6_F+#eH4^V(G{#^@aiw-6nMX@Qkpd?IpHa%eQu6-_fKp6@^z7rP40{%)fxN%V{Ss zlRn5lBPoXtGuq_Pg`9(O=r6tF=F=Dpa2h{B(I_R*5)<$NzQPvFayL|J3FB%Y#oQ0n zIsfj9lZ~~ur@GtuQTJy>cXYr`-Z5;sfn5w_wKZX#zi zC87>`VFFg;2(BZTCwvvq8FqY#FK_~B2#e)mAYQ{{tb;tm<;QsQoeTW#RF)mm~1o~R^Xo}U5S8~0ni&V2o_)m zWH8)-42Z@I1{oCNAOpk3z>vXF5lzq(J@6Vv;2kW-AyBEe3h1%gE<4D^vQd#2=vZvV z9;D$`5}jU^v#idj#g{dxOl_rV)MXuFc_3RE-LRs*Qu!My^&Ey^GFmofKYWRAkfRAf zgNazsgehbxi4CwdRjM4`!As4Q`n0)H)mkdG1YR#G^(Wf3p7d(y<%gTuHB)k~@8 zQ4I~zzqe8g(W@VWyFZnCgO*|z^89DcM#V25J9x}7v>$YyUuznw&d2Vj8yL0s>!DDh{nN4(o6h`D!Uu3;i%3N05%< zL`*&OgGA3lSP|5gDC%0zj3Bcn9s{_PL4{)61IFeaFcNF;V=L|;roK{rA@R2oCmS%$ z;3V;O3U3l#Z@EJ()E#E!S&o2&+X}42Psl;&RfdFMYxF~Zv}|tZQhK{FM6L{%Li9&= zDkCG(YM=+E z;#2ru;Kl1Dsns{e=@6YFEtQj6$xp`IA|uBeyRiqiAtNcUHIEe$gO(To0~>G#IT&S? zAtSCm217>P0xZNH{D{-Y#wfH#q^{$9y`-L`d)ILf&(18nU=)_%0Inj0VH*V*zRhqD zhmeMj9n2w}>>k#0+(WxpXDW%W@hkip>eVo)i*dEIjx+9;)}h@S4p(NV9drwTtFBT znoMd<@lj8umLYpD`WETRI2xuWNZ?$^aygRh29UX~FXmwvZXzG^UJb|`_y!h0=E5(q z0Y5If_4~)=~&s5|edwCKlDz%6gwWUNZS=%we1W6z zV;+u!%*VY^r9b7P9b|qUh-4U;fi2jI^N_jQ8_5`iML3GbUbAIK*`ec`N)5wEtVfOk zN-YVk-7x)lh~8+A@F(4&%x;oQB0x97DtiE(IgVJV@dQ zPQ!1cQVD21n#!Q`7%G92=roooXPi=Fu@KkbJ)YYs^g+%ETo+IYuc6*#S_{4K7G|U7 z6e0k#9Q4}zObB*fs?FeRP=6+O6DTl?3leH$0J5b}F_cC-yo0UyWj5a%e@F%9aQAZA zA)V6+6EO+vAf2=i z`|%U*BIqrp%Ay)tqdz8K8TQ};0^g>s(GDZ95Ib-V(&^?XcYYV5^FI{Dk{^Jwkl<*H zCKw0_l*y1_xd{oFym%QBIOAaj&r<}71W+wlL6kyzHugXQ=@*=V8sr+}KK{DD>%x$6 z;krN&J#gWYEsLQ(`d|*e#{ZCGFt?NFj%nC}D+n7xbl`PN#|B(PZbCQ`?Jx$jAfde) z`ynCjdzP1TLmxfh&ynXv4ZTqiVW*|MOdIJI%7Ci;5gKKk8UIN9$|!+@FtdG3vQw~(|}9|ZO|6U zkf~uh419uhID~I-4Sq})GIf-}I#^T4DbfX*M#9h$a?J?QHy;eA?sUon;Urti3XsyK-m z4#Swuh9kv2v+ZMOhtgB z%vrT9OKWBwNqP%phW&ZAIm?4Z^0^=Y@Zsk6blqjX_ zgOpT|5{kP^%D0dy6R%_NA}->Xi**>Vgqsjd|A-qn^j${0<0~A5@iAi^3CsDY*=jkL zrjb1r#*iF1jQD9`*cPB+xSM(Nu66Jvz0&Tm9C*E#Gl(tu7{s~C zxzBf>_j;CZbKY|P4tE!0@bVwWR$DbLMat^Jd zN9f+NQX20koLs?#24C7w+ORN+APHUYE|y>yenSXtTm#)P4$|f;Anh*gYPj3eYRk*1 zGJ^AH$B_T!G$z*9{p`}Z-{T@K;WDlu4PKv68dhQ#cBA<^#wA)}BR1hEjv;70cRL71 z4}5}k*p3~zB#megXL2`nw2C`12xeCEzt>mFaqr1y>R91$Xzj<(T(tsFBiyPi&Lq zWo}bGYxm^Ed9aC&;1Mgwk>d?#AFIrnq_dWLnRQvqE=u|BF$DLKcLR0a!bE`rJGdm_ znVr;Q7niNwL>30@;VCiJ?qv||Rdv+feGGb}L+>Zxaq}P*NA5!uj_luXrAPQ-CJzK1 zXP(6_y!st?Bi~D3>}satd0IU&fugh~zhlE;#mu!$R2ys??9JQAp=RJaQ!Ln^)n zWwvn#flyAsI+1#$pZ%H#aVWt_$%!>aTE++`ah+$zEo5GnoF*8L30RI5_z|ZeO;P~k zXcB3f6nFEiV)-`BV>Q!E(raiccXO$)NbjMgtX4Zg`fXZl02af2g?RJ_W7$BOcOxz# z=K)S1T`?A^ID}g$Li1Na2Monx?1yL91kp8v-CdNzax;E|bXN|%4Cyxc==G zc~GnA?WedxO1^;|_#Gj1uXJ-ctiyWz0_paEBh(oc&;!FU6C1D_XK@3$j?%Sgjfwai zXW)B`ebMb$);pVOuDWz1Z!*^693;&0U^T38+fBMVA!mhMB%!xb!tZ-S`|EbDskV^6 zF6BJXUeEP1o|>n#8{c&21H%KU03&aI{kp8nOl3C?4Y9V%OpScgT9=v9Z&~YHsSfig z<$4#&%S^eB)^C8dT}DbL8rQn$ey-YB=~WA;tdIGaqFtjkQf&&9Q!>#SU< zW>W7gDc2de*11ym7g}}9Ou2GhXOJazwTo3=X3BL2uI*f@hKsH8GE;MwSm*IzN=KUK zENeZ}X1}<$b)5?-cRN0ia`%gCJJ-2LO2>MX>5(>E=i}PemAbOjDl;?X%5|N^gDI;& zT;;p_>G@^WIX#ea*OPSthOL8MzkZl*kwboE&Uk5@eleT;u3?04Zlm2e9qQaXP7lke zR~bnk=ni@1s|k6|BKM7QGa%FdDr4OTx~b0u=C2t>&Y8ND>w7o()=R!~lCOB=+Z1__ zE|0L~L9slSm8YQcKvEt7$`dzv#3hfGZwBQHxT&C*_am9z4Px`9nsGRDu< zwT;B9EOxtX;vIIk%sj1EJpn|xs?4o92(68LzEN)=3P zD)9jYHL96xb@}25p>E*~nUQg!kttgDsS72hTT zaBY~$Z#We}q4B2eGr4(0>Qd8vB17CFD#V%tZik5|ez=4vn=(#)tk2o!&;VjIjUd)? z@?yQ4d|N8c(g>n34IrA+2%;|yAX?K1B0ncD!riLU0K(ST6h;Gxft)w&YBmYch(-{$ zo~GY9d6DOJQyUsUWaGp|DYr^Ag1Acqh#zSL5&VfMkedaulSUA0+>Kxl;=V1&&W8mO zV=)0UF&j&;44=S>E!d9zID`{8h4Z+8-|+`*d3ch8rx1jED1cHZix|YCDr%sCotMUF zgZAi-*YFkw;vKw;(HMjAn1~seg{AlypTLPN*pB`90q1c6*Krf~po5uckPG$#yc9x7 zltB#QQ4KZG6wT2JwTO?psE39kgnV=_!h>+cmF8hLlAh&R0UA8V3R5Ti+1KJX39Z{~P`HkQ!EPLQ0(h*dPG7*j{ zScNZf7-#T8ZEkfjxHkPifkaXr?mE%EIZcn6Et#XS8QW0075A{n+nUxwKfH+)%)wq9 zz$IKot~T6*qZaC7R!6=Q#&+z)P25I^y%X~V;!y#u&;|oB7&9>&Utl9n;zy)Ib!I4{ z7@kK}bVL^n$4Jb_B5cJDT)}me=t7Ib-n=UZMcr=n7p~(LHuNBvunl{#4+qhwC-=-4 zhIb&}SdRT)JClD_0sFtxjQ{N596P|HAH59kRl2Ty z9y7@Tw0@eY5ba8^M5!{&PH2m+7>{Y#gq^s7yO>&*CrQ|bU6}YBLkPR^9lXN1KZE>M zQU#2`B*$?LGgupp#w0AjVpL@2s*IlK zi!C^a@$pm~tMM6*;1q5{Com&ztjxyv0he$Wg}ICDgjX=)d4>pX!uJKP*Vu~wNmLHL z)fs~rS(i%TJZ|8#`b>kki@XgOlPH4(RK!S3u=C>EkQ)pv#d7=x??znKkRPQ`7X2|8 zXh)jJUXEV24XO_V?XLP<)VS1kl%G!gr%t0jB7u7!u~EVlkovo<1>up24M`Q zwxw@TwjEa+bV3gd#9(a4e#Ext13J2+7bamUKF4P4!$C~zz@-!wnG&nuMrZmzjYMhY z#`0LiRQM6L;S?@+XCoANl~4Mpj@sCQorv$j)Q1kQ@hKjIFccpk1Ng13R%F10A#qu1sS@ zpxAV}52-U~Zv23sQSt+>;pmE2@iWe%#7xRZS(KYe|9?M=ObnS#Q)A#9E_X2IaS_LW z1q?I%gmds)%o7%r;gNSZrr|?WxKKdpow=!wag zinaIztqx{h+l{7c^jPE48a+DeORqJ$@AHbEy17laLb+GLm;$EHmJ*7PTLrQ5uz9=S zrM#7!bMjg}vS9H*O7Vst&O&~2KtBIBeXW>!ztJ;B#r-inXfGuNfKwTsJuwLqYuCi+YUn(mDOD_KH&Z zjGe#giiSKFdCDw^b*=)J8T)_bp^ZF6$t{(a!lP7(Yq`+OljknE6SL%f=#iI@C2xkA zCr@@Vj%JoP)nl)?EPIXj$cxRAH_9U~CQIJ1jJ&KzOU}s2o;xbbUT=8hMP|wC?U84- zNu(;`YLo6}o;+Q1pPQA_+02n=ak;G)vGUq_S&ml6 zV=t>kti7sx7BTaJJ@Tw5v5uC@BQLW}%>Dc_^0FSymXVWPM;V2$>!!w( z>pCodep)UvDlRG_F)|@O0trzO(b2I9&PCVteP8AZ;u@~w27ZU+ z-(vX(ZsSj+;STOX^3y%Yw*WSHLGpwz>1^)zymgkc*}l_L`g%`K(>-(b-C+I|3?DWa z=3^wM>3g=kZH(kQx=uh&4!|^}*y%nqQEB7$9X(iIGTywa?fizt&AYnKi*tJ|cl{NO ztba{|-P9?*o;;$GR0H*m+NO4>?^JVDO+~62>Zq!(wyHhk>`=SZZk1$woUTLtv%3%G z#~%{Om&+>pg%_oY#`Sc5RpEp&@Sc9}*=Fq5nDUORCj2dq@A*3$M^sZv{(-N*PEcMe zbyDqP-4;rI_P$QcD9fy-v)_H4OHa>bd&4J~L-ynEbJR7q<+5# Date: Sat, 8 Dec 2012 07:13:05 -0800 Subject: [PATCH 43/63] Fixed bug in pdp11_xu which inhibited it from being disabled after it was ever enabled (reported by Rob Jarratt) --- PDP11/pdp11_xu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PDP11/pdp11_xu.c b/PDP11/pdp11_xu.c index 8ef1cd7b..7665ca74 100644 --- a/PDP11/pdp11_xu.c +++ b/PDP11/pdp11_xu.c @@ -674,18 +674,16 @@ t_stat xu_sw_reset (CTLR* xu) for (i=0; i<6; i++) xu->var->setup.macs[1][i] = 0xff; /* Broadcast Address */ xu->var->setup.mac_count = 2; - if (xu->var->etherface) + if (xu->var->etherface) { eth_filter (xu->var->etherface, xu->var->setup.mac_count, xu->var->setup.macs, xu->var->setup.multicast, xu->var->setup.promiscuous); - /* activate device if not disabled */ - if ((xu->dev->flags & DEV_DIS) == 0) { + /* activate device */ sim_activate_abs(&xu->unit[0], clk_cosched (tmxr_poll)); /* start service timer */ - if (xu->var->etherface) - sim_activate_abs(&xu->unit[1], tmr_poll * clk_tps); + sim_activate_abs(&xu->unit[1], tmr_poll * clk_tps); } /* clear load_server address */ @@ -1622,6 +1620,8 @@ t_stat xu_detach(UNIT* uptr) sim_debug(DBG_TRC, xu->dev, "xu_detach()\n"); if (uptr->flags & UNIT_ATT) { + sim_cancel (uptr); /* stop the receiver */ + sim_cancel (uptr+1); /* stop the timer services */ eth_close (xu->var->etherface); free(xu->var->etherface); xu->var->etherface = 0; From 2f3782a8967108606e863daa59b34fcd4d966626 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 8 Dec 2012 07:21:28 -0800 Subject: [PATCH 44/63] Update fixing dangling connections after detach and trying to adjust some polling behaviors (from Rob Jarratt) --- PDP11/pdp11_dmc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 4b19760d..400579f6 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -546,9 +546,14 @@ t_stat dmc_showpeer (FILE* st, UNIT* uptr, int32 val, void* desc) { CTLR *controller = dmc_get_controller_from_unit(uptr); if (controller->line->transmit_host[0]) + { fprintf(st, "PEER=%s", controller->line->transmit_host); + } else + { fprintf(st, "PEER Unspecified"); + } + return SCPE_OK; } @@ -1169,8 +1174,8 @@ void dmc_process_master_clear(CTLR *controller) controller->transfer_state = Idle; dmc_set_run(controller); - sim_cancel (controller->device->units); /* stop poll */ - sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); + //sim_cancel (controller->device->units); /* stop poll */ + //sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } void dmc_start_input_transfer(CTLR *controller) @@ -2225,6 +2230,7 @@ t_stat dmc_reset (DEVICE *dptr) if (!(dptr->flags & DEV_DIS)) { ans = auto_config (dptr->name, DMC_UNITSPERDEVICE); + sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } return ans; } @@ -2255,6 +2261,7 @@ int dmc_isattached(CTLR *controller) t_stat dmc_detach (UNIT *uptr) { CTLR *controller = dmc_get_controller_from_unit(uptr); + dmc_error_and_close_receive(controller, "Detach"); dmc_close_master_socket(controller); uptr->flags = uptr->flags & ~UNIT_ATT; /* clear unit attached flag */ free(uptr->filename); From 822fedf8ce113cbc53020ad6b2956257201798e1 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 8 Dec 2012 11:13:03 -0800 Subject: [PATCH 45/63] Fixed polling to start on receiving a master clear and stop on Detach (Rob Jarratt) --- PDP11/pdp11_dmc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 400579f6..27edbf6b 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -1174,8 +1174,8 @@ void dmc_process_master_clear(CTLR *controller) controller->transfer_state = Idle; dmc_set_run(controller); - //sim_cancel (controller->device->units); /* stop poll */ - //sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); + sim_cancel (controller->device->units); /* stop poll */ + sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } void dmc_start_input_transfer(CTLR *controller) @@ -2230,7 +2230,6 @@ t_stat dmc_reset (DEVICE *dptr) if (!(dptr->flags & DEV_DIS)) { ans = auto_config (dptr->name, DMC_UNITSPERDEVICE); - sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } return ans; } @@ -2248,6 +2247,7 @@ t_stat dmc_attach (UNIT *uptr, char *cptr) uptr->filename = (char *)malloc(strlen(cptr)+1); strcpy(uptr->filename, cptr); controller->line->receive_port = uptr->filename; + //sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } return ans; @@ -2266,6 +2266,7 @@ t_stat dmc_detach (UNIT *uptr) uptr->flags = uptr->flags & ~UNIT_ATT; /* clear unit attached flag */ free(uptr->filename); uptr->filename = NULL; + sim_cancel(uptr); return SCPE_OK; } From 7f6a1af5bf1439fd00c665f7dba85f90cbfd2fea Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 9 Dec 2012 12:12:09 -0800 Subject: [PATCH 46/63] Added an optional validation argument to sim_parse_addr for callers which need to confirm incoming connections come from expected sources --- AltairZ80/altairz80_net.c | 2 +- HP2100/hp2100_ipl.c | 4 +- Ibm1130/ibm1130_sca.c | 4 +- PDP11/pdp11_dmc.c | 5 +- sim_console.c | 2 +- sim_sock.c | 215 ++++++++++++++++++++++---------------- sim_sock.h | 2 +- sim_tmxr.c | 5 +- 8 files changed, 135 insertions(+), 104 deletions(-) diff --git a/AltairZ80/altairz80_net.c b/AltairZ80/altairz80_net.c index 1a815486..f6d71ffe 100644 --- a/AltairZ80/altairz80_net.c +++ b/AltairZ80/altairz80_net.c @@ -154,7 +154,7 @@ static t_stat net_attach(UNIT *uptr, char *cptr) { char host[CBUFSIZE], port[CBUFSIZE]; t_stat r; - r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), "3000"); + r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), "3000", NULL); if (r != SCPE_OK) return SCPE_ARG; net_reset(&net_dev); diff --git a/HP2100/hp2100_ipl.c b/HP2100/hp2100_ipl.c index 6622e258..5a5c8cad 100644 --- a/HP2100/hp2100_ipl.c +++ b/HP2100/hp2100_ipl.c @@ -581,7 +581,7 @@ if (oldf & UNIT_ATT) ipl_detach (uptr); if ((sim_switches & SWMASK ('C')) || ((sim_switches & SIM_SW_REST) && (oldf & UNIT_ACTV))) { - r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), NULL); + r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), NULL, NULL); if ((r != SCPE_OK) || (port[0] == '\0')) return SCPE_ARG; sprintf(hostport, "%s%s%s%s%s", strchr(host, ':') ? "[" : "", host, strchr(host, ':') ? "]" : "", host[0] ? ":" : "", port); @@ -597,7 +597,7 @@ if ((sim_switches & SWMASK ('C')) || uptr->DSOCKET = newsock; } else { - r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL); + r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL, NULL); if (r != SCPE_OK) return SCPE_ARG; sprintf(hostport, "%s%s%s%s%s", strchr(host, ':') ? "[" : "", host, strchr(host, ':') ? "]" : "", host[0] ? ":" : "", port); diff --git a/Ibm1130/ibm1130_sca.c b/Ibm1130/ibm1130_sca.c index 60e850a6..8310ac40 100644 --- a/Ibm1130/ibm1130_sca.c +++ b/Ibm1130/ibm1130_sca.c @@ -462,7 +462,7 @@ static t_stat sca_attach (UNIT *uptr, char *cptr) detach_unit(&sca_unit); if (do_listen) { /* if listen mode, string specifies port number (only; otherwise it's a dummy argument) */ - r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), SCA_DEFAULT_PORT); + r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), SCA_DEFAULT_PORT, NULL); if (r != SCPE_OK) return r; if ((0 == strcmp(port, cptr)) && (0 == strcmp(port, "dummy"))) @@ -493,7 +493,7 @@ static t_stat sca_attach (UNIT *uptr, char *cptr) if (! *cptr) return SCPE_2FARG; - r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), SCA_DEFAULT_PORT); + r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), SCA_DEFAULT_PORT, NULL); if (r != SCPE_OK) return r; if ((0 == strcmp(cptr, port)) && (0 == strcmp(host, ""))) { diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 27edbf6b..8e809147 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -565,7 +565,7 @@ t_stat dmc_setpeer (UNIT* uptr, int32 val, char* cptr, void* desc) if (!cptr) return SCPE_IERR; if (uptr->flags & UNIT_ATT) return SCPE_ALATT; - status = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL); + status = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL, NULL); if (status != SCPE_OK) return status; if (host[0] == '\0') @@ -1588,8 +1588,7 @@ int dmc_get_receive_socket(CTLR *controller, int forRead) { char host[sizeof(controller->line->transmit_host)]; - sim_parse_addr (controller->line->transmit_host, host, sizeof(host), NULL, NULL, 0, NULL); - if (strcmp(ipaddr, host)) + if (sim_parse_addr (controller->line->transmit_host, host, sizeof(host), NULL, NULL, 0, NULL, ipaddr)) { sim_debug(DBG_WRN, controller->device, "Received connection from unexpected source IP %s. Closing the connection.\n", ipaddr); dmc_close_receive(controller, "Unathorized connection", ipaddr); diff --git a/sim_console.c b/sim_console.c index 18173aa6..649d4e2e 100644 --- a/sim_console.c +++ b/sim_console.c @@ -498,7 +498,7 @@ while (*cptr != 0) { /* do all mods */ return r; } else { - r = sim_parse_addr (gbuf, NULL, 0, NULL, NULL, 0, NULL); + r = sim_parse_addr (gbuf, NULL, 0, NULL, NULL, 0, NULL, NULL); if (r == SCPE_OK) { if (sim_con_tmxr.master) /* already open? */ sim_set_notelnet (0, NULL); /* close first */ diff --git a/sim_sock.c b/sim_sock.c index fab7f64d..9c5e11bc 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -75,95 +75,6 @@ extern FILE *sim_log; sim_msg_sock send message to socket */ -/* OS independent routines - - sim_parse_addr parse a hostname/ipaddress from port and apply defaults -*/ - -/* sim_parse_addr host:port - - Presumption is that the input, if it doesn't contain a ':' character is a port specifier. - If the host field contains one or more colon characters (i.e. it is an IPv6 address), - the IPv6 address MUST be enclosed in square bracket characters (i.e. Domain Literal format) - - Inputs: - cptr = pointer to input string - default_host - = optional pointer to default host if none specified - host_len = length of host buffer - default_port - = optional pointer to default host if none specified - port_len = length of port buffer - Outputs: - host = pointer to buffer for IP address (may be NULL), 0 = none - port = pointer to buffer for IP port (may be NULL), 0 = none - result = status -*/ - -t_stat sim_parse_addr (const char *cptr, char *host, size_t host_len, const char *default_host, char *port, size_t port_len, const char *default_port) -{ -char gbuf[CBUFSIZE]; -char *hostp, *portp; -char *endc; -unsigned long portval; - -if ((cptr == NULL) || (*cptr == 0)) - return SCPE_ARG; -if ((host != NULL) && (host_len != 0)) - memset (host, 0, host_len); -if ((port != NULL) && (port_len != 0)) - memset (port, 0, port_len); -strncpy (gbuf, cptr, CBUFSIZE); -hostp = gbuf; /* default addr */ -portp = NULL; -if ((portp = strrchr (gbuf, ':')) && /* x:y? split */ - (NULL == strchr (portp, ']'))) { - *portp++ = 0; - if (*portp == '\0') - portp = (char *)default_port; - } -else - if (default_port) - portp = (char *)default_port; - else { - portp = gbuf; - hostp = NULL; - } -if (portp != NULL) { - portval = strtoul(portp, &endc, 10); - if ((*endc == '\0') && ((portval == 0) || (portval > 65535))) - return SCPE_ARG; /* value too big */ - if (*endc != '\0') { - struct servent *se = getservbyname(portp, "tcp"); - - if (se == NULL) - return SCPE_ARG; /* invalid service name */ - } - } -if (port) /* port wanted? */ - if (portp != NULL) { - if (strlen(portp) >= port_len) - return SCPE_ARG; /* no room */ - else - strcpy (port, portp); - } -if (hostp != NULL) { - if (']' == hostp[strlen(hostp)-1]) { - if ('[' != hostp[0]) - return SCPE_ARG; /* invalid domain literal */ - strcpy(hostp, hostp+1); /* remove brackets from domain literal host */ - hostp[strlen(hostp)-1] = '\0'; - } - } -if (host) /* host wanted? */ - if (hostp != NULL) - if (strlen(hostp) >= host_len) - return SCPE_ARG; /* no room */ - else - strcpy (host, hostp); -return SCPE_OK; -} - /* First, all the non-implemented versions */ #if defined (__OS2__) && !defined (__EMX__) @@ -525,6 +436,128 @@ int load_ws2(void) { } #endif +/* OS independent routines + + sim_parse_addr parse a hostname/ipaddress from port and apply defaults and + optionally validate an address match +*/ + +/* sim_parse_addr host:port + + Presumption is that the input, if it doesn't contain a ':' character is a port specifier. + If the host field contains one or more colon characters (i.e. it is an IPv6 address), + the IPv6 address MUST be enclosed in square bracket characters (i.e. Domain Literal format) + + Inputs: + cptr = pointer to input string + default_host + = optional pointer to default host if none specified + host_len = length of host buffer + default_port + = optional pointer to default host if none specified + port_len = length of port buffer + validate_addr = optional name/addr which is checked to be equivalent + to the host result of parsing the other input. This + address would usually be returned by sim_accept_conn. + Outputs: + host = pointer to buffer for IP address (may be NULL), 0 = none + port = pointer to buffer for IP port (may be NULL), 0 = none + result = status (SCPE_OK on complete success or SCPE_ARG if + parsing can't happen due to bad syntax, a value is + out of range, a result can't fit into a result buffer, + a service name doesn't exist, or a validation name + doesn't match the parsed host) +*/ + +t_stat sim_parse_addr (const char *cptr, char *host, size_t host_len, const char *default_host, char *port, size_t port_len, const char *default_port, const char *validate_addr) +{ +char gbuf[CBUFSIZE]; +char *hostp, *portp; +char *endc; +unsigned long portval; + +if ((cptr == NULL) || (*cptr == 0)) + return SCPE_ARG; +if ((host != NULL) && (host_len != 0)) + memset (host, 0, host_len); +if ((port != NULL) && (port_len != 0)) + memset (port, 0, port_len); +strncpy (gbuf, cptr, CBUFSIZE); +hostp = gbuf; /* default addr */ +portp = NULL; +if ((portp = strrchr (gbuf, ':')) && /* x:y? split */ + (NULL == strchr (portp, ']'))) { + *portp++ = 0; + if (*portp == '\0') + portp = (char *)default_port; + } +else + if (default_port) + portp = (char *)default_port; + else { + portp = gbuf; + hostp = NULL; + } +if (portp != NULL) { + portval = strtoul(portp, &endc, 10); + if ((*endc == '\0') && ((portval == 0) || (portval > 65535))) + return SCPE_ARG; /* numeric value too big */ + if (*endc != '\0') { + struct servent *se = getservbyname(portp, "tcp"); + + if (se == NULL) + return SCPE_ARG; /* invalid service name */ + } + } +if (port) /* port wanted? */ + if (portp != NULL) { + if (strlen(portp) >= port_len) + return SCPE_ARG; /* no room */ + else + strcpy (port, portp); + } +if (hostp != NULL) { + if (']' == hostp[strlen(hostp)-1]) { + if ('[' != hostp[0]) + return SCPE_ARG; /* invalid domain literal */ + strcpy(hostp, hostp+1); /* remove brackets from domain literal host */ + hostp[strlen(hostp)-1] = '\0'; + } + } +if (host) /* host wanted? */ + if (hostp != NULL) + if (strlen(hostp) >= host_len) + return SCPE_ARG; /* no room */ + else + strcpy (host, hostp); +if (validate_addr) { + struct addrinfo *ai_host, *ai_validate, *ai; + t_stat status; + + if (hostp == NULL) + return SCPE_ARG; + if (p_getaddrinfo(hostp, NULL, NULL, &ai_host)) + return SCPE_ARG; + if (p_getaddrinfo(validate_addr, NULL, NULL, &ai_validate)) { + p_freeaddrinfo (ai_host); + return SCPE_ARG; + } + status = SCPE_ARG; + for (ai = ai_host; ai != NULL; ai = ai->ai_next) { + if ((ai->ai_addrlen == ai_validate->ai_addrlen) && + (ai->ai_family == ai_validate->ai_family) && + (0 == memcmp (ai->ai_addr, ai_validate->ai_addr, ai->ai_addrlen))) { + status = SCPE_OK; + break; + } + } + p_freeaddrinfo (ai_host); + p_freeaddrinfo (ai_validate); + return status; + } +return SCPE_OK; +} + void sim_init_sock (void) { #if defined (_WIN32) @@ -624,7 +657,7 @@ t_stat r; struct addrinfo hints; struct addrinfo *result = NULL; -r = sim_parse_addr (hostport, host, sizeof(host), NULL, port, sizeof(port), NULL); +r = sim_parse_addr (hostport, host, sizeof(host), NULL, port, sizeof(port), NULL, NULL); if (parse_status) *parse_status = r; if (r != SCPE_OK) @@ -671,7 +704,7 @@ t_stat r; struct addrinfo hints; struct addrinfo *result = NULL; -r = sim_parse_addr (hostport, host, sizeof(host), default_host, port, sizeof(port), default_port); +r = sim_parse_addr (hostport, host, sizeof(host), default_host, port, sizeof(port), default_port, NULL); if (r != SCPE_OK) return newsock; diff --git a/sim_sock.h b/sim_sock.h index c4b8e25e..039ed019 100644 --- a/sim_sock.h +++ b/sim_sock.h @@ -83,7 +83,7 @@ #endif #endif -t_stat sim_parse_addr (const char *cptr, char *host, size_t hostlen, const char *default_host, char *port, size_t port_len, const char *default_port); +t_stat sim_parse_addr (const char *cptr, char *host, size_t hostlen, const char *default_host, char *port, size_t port_len, const char *default_port, const char *validate_addr); SOCKET sim_master_sock (const char *hostport, t_stat *parse_status); SOCKET sim_connect_sock (const char *hostport, const char *default_host, const char *default_port); SOCKET sim_accept_conn (SOCKET master, char **connectaddr); diff --git a/sim_tmxr.c b/sim_tmxr.c index 97298f95..6909dc31 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -791,8 +791,7 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se if (lp->destination) { /* Virtual Null Modem Cable? */ char host[CBUFSIZE]; - sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL); - if (strcmp(address, host)) { + if (sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL, address)) { tmxr_msg (newsock, "Rejecting connection from unexpected source\r\n"); sprintf (msg, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host); tmxr_debug_trace_line (lp, msg); @@ -1459,7 +1458,7 @@ while (*tptr) { continue; } cptr = get_glyph (gbuf, port, ';'); - if (SCPE_OK != sim_parse_addr (port, NULL, 0, NULL, NULL, 0, NULL)) + if (SCPE_OK != sim_parse_addr (port, NULL, 0, NULL, NULL, 0, NULL, NULL)) return SCPE_ARG; if (cptr) get_glyph (cptr, cptr, 0); /* upcase this string */ From b466bdc9c66c4d4f8e703f3a8d409372d92c245d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 13 Dec 2012 13:41:57 -0800 Subject: [PATCH 47/63] Compiler warning cleanup --- I1401/i1401_cd.c | 2 +- I1620/i1620_pt.c | 4 ++-- I7094/i7094_com.c | 6 +++--- Interdata/id32_cpu.c | 2 +- Interdata/id_fd.c | 2 +- Interdata/id_pas.c | 2 +- Interdata/id_ttp.c | 3 +-- PDP1/pdp1_dcs.c | 2 +- PDP10/pdp10_rp.c | 2 +- PDP10/pdp10_tu.c | 2 +- PDP18B/pdp18b_drm.c | 2 +- PDP18B/pdp18b_stddev.c | 4 ++-- PDP18B/pdp18b_tt1.c | 2 +- PDP8/pdp8_df.c | 2 +- PDP8/pdp8_dt.c | 2 +- PDP8/pdp8_pt.c | 2 +- PDP8/pdp8_rf.c | 2 +- PDP8/pdp8_rk.c | 2 +- PDP8/pdp8_rl.c | 2 +- PDP8/pdp8_rx.c | 2 +- PDP8/pdp8_td.c | 2 +- PDP8/pdp8_ttx.c | 2 +- S3/s3_sys.c | 3 +-- SDS/sds_io.c | 2 +- SDS/sds_mux.c | 2 +- VAX/vax780_mem.c | 4 ++-- VAX/vax_cis.c | 4 ++-- scp.c | 12 +++++++----- sim_BuildROMs.c | 4 ++-- sim_defs.h | 2 +- sim_disk.c | 10 ++++++---- sim_ether.c | 12 ++++++------ sim_serial.c | 23 +++++++++-------------- sim_sock.c | 41 ++++++++++++++++++++++++++--------------- 34 files changed, 90 insertions(+), 82 deletions(-) diff --git a/I1401/i1401_cd.c b/I1401/i1401_cd.c index 7bd64b70..255dccd5 100644 --- a/I1401/i1401_cd.c +++ b/I1401/i1401_cd.c @@ -398,7 +398,7 @@ static const unsigned char boot_rom[] = { t_stat cdr_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_IS; for (i = 0; i < CDR_WIDTH; i++) /* clear buffer */ diff --git a/I1620/i1620_pt.c b/I1620/i1620_pt.c index 42a1ac63..88323ade 100644 --- a/I1620/i1620_pt.c +++ b/I1620/i1620_pt.c @@ -348,7 +348,7 @@ return SCPE_OK; /* Bootstrap routine */ -const static uint8 boot_rom[] = { +static const uint8 boot_rom[] = { 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* NOP */ 3, 6, 0, 0, 0, 3, 1, 0, 0, 3, 0, 0, /* RNPT 31 */ 2, 5, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, /* TD 71,loc */ @@ -363,7 +363,7 @@ const static uint8 boot_rom[] = { t_stat ptr_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern uint32 saved_PC; for (i = 0; i < BOOT_LEN; i++) diff --git a/I7094/i7094_com.c b/I7094/i7094_com.c index 8f0d4e7c..c6e2c7e6 100644 --- a/I7094/i7094_com.c +++ b/I7094/i7094_com.c @@ -183,10 +183,10 @@ uint32 com_chob_v = 0; /* valid flag */ t_uint64 com_buf[COM_BUFSIZ]; /* channel buffer */ LISTHD com_free; /* free list */ uint32 com_not_ret[COM_TLINES] = { 0 }; /* chars not returned */ -LISTHD com_inpq[COM_TLINES] = { 0 }; /* input queues */ -LISTHD com_outq[COM_TLINES] = { 0 }; /* output queues */ +LISTHD com_inpq[COM_TLINES] = { {0} }; /* input queues */ +LISTHD com_outq[COM_TLINES] = { {0} }; /* output queues */ LISTENT com_pkt[COM_PKTSIZ]; /* character packets */ -TMLN com_ldsc[COM_MLINES] = { 0 }; /* line descriptors */ +TMLN com_ldsc[COM_MLINES] = { {0} }; /* line descriptors */ TMXR com_desc = { COM_MLINES, 0, 0, com_ldsc }; /* mux descriptor */ /* Even parity truth table */ diff --git a/Interdata/id32_cpu.c b/Interdata/id32_cpu.c index 6b874df3..ed5a0ad6 100644 --- a/Interdata/id32_cpu.c +++ b/Interdata/id32_cpu.c @@ -222,7 +222,7 @@ uint32 GREG[16 * NRSETS] = { 0 }; /* general registers */ uint32 *M = NULL; /* memory */ uint32 *R = &GREG[0]; /* working reg set */ uint32 F[8] = { 0 }; /* sp fp registers */ -dpr_t D[8] = { 0 }; /* dp fp registers */ +dpr_t D[8] = { {0} }; /* dp fp registers */ uint32 PSW = 0; /* processor status word */ uint32 PC = 0; /* program counter */ uint32 oPC = 0; /* PC at inst start */ diff --git a/Interdata/id_fd.c b/Interdata/id_fd.c index a016436c..079d05ef 100644 --- a/Interdata/id_fd.c +++ b/Interdata/id_fd.c @@ -115,7 +115,7 @@ uint32 fd_cmd = 0; /* command */ uint32 fd_db = 0; /* data buffer */ uint32 fd_bptr = 0; /* buffer pointer */ uint8 fdxb[FD_NUMBY] = { 0 }; /* sector buffer */ -uint8 fd_es[FD_NUMDR][ES_SIZE] = { 0 }; /* ext status */ +uint8 fd_es[FD_NUMDR][ES_SIZE] = { {0} }; /* ext status */ uint32 fd_lrn = 0; /* log rec # */ uint32 fd_wdv = 0; /* wd valid */ uint32 fd_stopioe = 1; /* stop on error */ diff --git a/Interdata/id_pas.c b/Interdata/id_pas.c index 3e2d105a..ea0b4bd4 100644 --- a/Interdata/id_pas.c +++ b/Interdata/id_pas.c @@ -103,7 +103,7 @@ uint8 pas_xarm[PAS_LINES]; /* xmt int armed */ uint8 pas_rchp[PAS_LINES]; /* rcvr chr pend */ uint8 pas_tplte[PAS_LINES * 2 + 1]; /* template */ -TMLN pas_ldsc[PAS_LINES] = { 0 }; /* line descriptors */ +TMLN pas_ldsc[PAS_LINES] = { {0} }; /* line descriptors */ TMXR pas_desc = { 8, 0, 0, pas_ldsc }; /* mux descriptor */ #define PAS_ENAB pas_desc.lines diff --git a/Interdata/id_ttp.c b/Interdata/id_ttp.c index 660fd469..eb9fd393 100644 --- a/Interdata/id_ttp.c +++ b/Interdata/id_ttp.c @@ -130,7 +130,7 @@ DEVICE ttp_dev = { uint32 ttp (uint32 dev, uint32 op, uint32 dat) { int32 xmt = dev & 1; -int32 t, old_cmd; +int32 t; switch (op) { /* case IO op */ @@ -160,7 +160,6 @@ switch (op) { /* case IO op */ return t; case IO_OC: /* command */ - old_cmd = ttp_cmd; /* old cmd */ if (dat & CMD_TYP) { /* type 1? */ ttp_cmd = (ttp_cmd & 0xFF) | (dat << 8); if (ttp_cmd & CMD_WRT) /* write? */ diff --git a/PDP1/pdp1_dcs.c b/PDP1/pdp1_dcs.c index 93c9eefc..99896110 100644 --- a/PDP1/pdp1_dcs.c +++ b/PDP1/pdp1_dcs.c @@ -48,7 +48,7 @@ uint8 dcs_buf[DCS_LINES]; /* line bufffers */ extern int32 iosta, stop_inst; extern int32 tmxr_poll; -TMLN dcs_ldsc[DCS_LINES] = { 0 }; /* line descriptors */ +TMLN dcs_ldsc[DCS_LINES] = { {0} }; /* line descriptors */ TMXR dcs_desc = { DCS_LINES, 0, 0, dcs_ldsc }; /* mux descriptor */ t_stat dcsi_svc (UNIT *uptr); diff --git a/PDP10/pdp10_rp.c b/PDP10/pdp10_rp.c index a5997728..83d49bb8 100644 --- a/PDP10/pdp10_rp.c +++ b/PDP10/pdp10_rp.c @@ -1284,7 +1284,7 @@ static const d10 boot_rom_its[] = { t_stat rp_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern a10 saved_PC; M[FE_UNIT] = unitno & CS2_M_UNIT; diff --git a/PDP10/pdp10_tu.c b/PDP10/pdp10_tu.c index 6be277b8..eaf01e2e 100644 --- a/PDP10/pdp10_tu.c +++ b/PDP10/pdp10_tu.c @@ -1273,7 +1273,7 @@ static const d10 boot_rom_its[] = { t_stat tu_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern a10 saved_PC; M[FE_UNIT] = 0; diff --git a/PDP18B/pdp18b_drm.c b/PDP18B/pdp18b_drm.c index c65990b1..4141e465 100644 --- a/PDP18B/pdp18b_drm.c +++ b/PDP18B/pdp18b_drm.c @@ -244,7 +244,7 @@ static const int32 boot_rom[] = { t_stat drm_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 PC; if (drm_dib.dev != DEV_DRM) /* non-std addr? */ diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index 9e5ed3a6..60e9e528 100644 --- a/PDP18B/pdp18b_stddev.c +++ b/PDP18B/pdp18b_stddev.c @@ -453,7 +453,6 @@ int32 clk_task_upd (t_bool clr) { uint32 delta, val, iusec10; uint32 cur = sim_grtime (); -uint32 old = clk_task_timer; double usec10; if (cur > clk_task_last) @@ -861,7 +860,8 @@ static const int32 boot_rom[] = { t_stat ptr_boot (int32 unitno, DEVICE *dptr) { -int32 i, mask, wd; +size_t i; +int32 mask, wd; extern int32 sim_switches; #if defined (PDP7) diff --git a/PDP18B/pdp18b_tt1.c b/PDP18B/pdp18b_tt1.c index d29bde0e..6a73f977 100644 --- a/PDP18B/pdp18b_tt1.c +++ b/PDP18B/pdp18b_tt1.c @@ -57,7 +57,7 @@ uint32 ttix_done = 0; /* input flags */ uint32 ttox_done = 0; /* output flags */ uint8 ttix_buf[TTX_MAXL] = { 0 }; /* input buffers */ uint8 ttox_buf[TTX_MAXL] = { 0 }; /* output buffers */ -TMLN ttx_ldsc[TTX_MAXL] = { 0 }; /* line descriptors */ +TMLN ttx_ldsc[TTX_MAXL] = { {0} }; /* line descriptors */ TMXR ttx_desc = { 1, 0, 0, ttx_ldsc }; /* mux descriptor */ #define ttx_lines ttx_desc.lines /* current number of lines */ diff --git a/PDP8/pdp8_df.c b/PDP8/pdp8_df.c index a802e6e0..9ccfba64 100644 --- a/PDP8/pdp8_df.c +++ b/PDP8/pdp8_df.c @@ -334,7 +334,7 @@ static const uint16 dm4_rom[] = { t_stat df_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 sim_switches, saved_PC; if (sim_switches & SWMASK ('D')) { diff --git a/PDP8/pdp8_dt.c b/PDP8/pdp8_dt.c index 2b0ffe9b..987bb969 100644 --- a/PDP8/pdp8_dt.c +++ b/PDP8/pdp8_dt.c @@ -1178,7 +1178,7 @@ static const uint16 boot_rom[] = { t_stat dt_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; if (unitno) /* only unit 0 */ diff --git a/PDP8/pdp8_pt.c b/PDP8/pdp8_pt.c index f2b1352a..f7102012 100644 --- a/PDP8/pdp8_pt.c +++ b/PDP8/pdp8_pt.c @@ -278,7 +278,7 @@ static const uint16 boot_rom[] = { t_stat ptr_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; extern uint16 M[]; diff --git a/PDP8/pdp8_rf.c b/PDP8/pdp8_rf.c index aef1c76d..ce5ed632 100644 --- a/PDP8/pdp8_rf.c +++ b/PDP8/pdp8_rf.c @@ -398,7 +398,7 @@ static const uint16 dm4_rom[] = { t_stat rf_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 sim_switches, saved_PC; if (rf_dib.dev != DEV_RF) /* only std devno */ diff --git a/PDP8/pdp8_rk.c b/PDP8/pdp8_rk.c index 10b0e5ad..93293e49 100644 --- a/PDP8/pdp8_rk.c +++ b/PDP8/pdp8_rk.c @@ -450,7 +450,7 @@ static const uint16 boot_rom[] = { t_stat rk_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; if (rk_dib.dev != DEV_RK) /* only std devno */ diff --git a/PDP8/pdp8_rl.c b/PDP8/pdp8_rl.c index 22beb05a..de3cda88 100644 --- a/PDP8/pdp8_rl.c +++ b/PDP8/pdp8_rl.c @@ -689,7 +689,7 @@ static const uint16 boot_rom[] = { t_stat rl_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; if (unitno) /* only unit 0 */ diff --git a/PDP8/pdp8_rx.c b/PDP8/pdp8_rx.c index 7a51df0d..18b43c22 100644 --- a/PDP8/pdp8_rx.c +++ b/PDP8/pdp8_rx.c @@ -733,7 +733,7 @@ static const uint16 boot2_rom[] = { t_stat rx_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; extern uint16 M[]; diff --git a/PDP8/pdp8_td.c b/PDP8/pdp8_td.c index 46703def..d2699ba4 100644 --- a/PDP8/pdp8_td.c +++ b/PDP8/pdp8_td.c @@ -742,7 +742,7 @@ static const uint16 boot_rom[] = { t_stat td_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; if (unitno) diff --git a/PDP8/pdp8_ttx.c b/PDP8/pdp8_ttx.c index 5c335a48..fc1b320d 100644 --- a/PDP8/pdp8_ttx.c +++ b/PDP8/pdp8_ttx.c @@ -66,7 +66,7 @@ extern int32 tmxr_poll, sim_is_running; uint8 ttix_buf[TTX_LINES] = { 0 }; /* input buffers */ uint8 ttox_buf[TTX_LINES] = { 0 }; /* output buffers */ int32 ttx_tps = 100; /* polls per second */ -TMLN ttx_ldsc[TTX_LINES] = { 0 }; /* line descriptors */ +TMLN ttx_ldsc[TTX_LINES] = { {0} }; /* line descriptors */ TMXR ttx_desc = { TTX_LINES, 0, 0, ttx_ldsc }; /* mux descriptor */ DEVICE ttix_dev, ttox_dev; diff --git a/S3/s3_sys.c b/S3/s3_sys.c index 39cec895..bb9911c9 100644 --- a/S3/s3_sys.c +++ b/S3/s3_sys.c @@ -270,13 +270,12 @@ int32 fprint_sym (FILE *of, int32 addr, uint32 *val, int32 printf_sym (FILE *of, char *strg, int32 addr, uint32 *val, UNIT *uptr, int32 sw) { -int32 cflag, c1, c2, group, len1, len2, inst, aaddr, baddr; +int32 c1, c2, group, len1, len2, inst, aaddr, baddr; int32 oplen, groupno, i, j, vpos, qbyte, da, m, n; char bld[128], bldaddr[32], boperand[32], aoperand[32]; int32 blk[16], blt[16]; int32 blkadd; -cflag = (uptr == NULL) || (uptr == &cpu_unit); c1 = val[0] & 0xff; if (sw & SWMASK ('A')) { for (i = 0; i < 16; i++) { diff --git a/SDS/sds_io.c b/SDS/sds_io.c index bd0b01f4..ae402e86 100644 --- a/SDS/sds_io.c +++ b/SDS/sds_io.c @@ -224,7 +224,7 @@ uint32 dev_map[64][NUM_CHAN]; /* dev_dsp maps device and channel numbers to dispatch routines */ -t_stat (*dev_dsp[64][NUM_CHAN])() = { NULL }; +t_stat (*dev_dsp[64][NUM_CHAN])() = { {NULL} }; /* dev3_dsp maps system device numbers to dispatch routines */ diff --git a/SDS/sds_mux.c b/SDS/sds_mux.c index 8cc7023a..3cdf9b25 100644 --- a/SDS/sds_mux.c +++ b/SDS/sds_mux.c @@ -112,7 +112,7 @@ uint32 mux_tps = 100; /* polls/second */ uint32 mux_scan = 0; /* scanner */ uint32 mux_slck = 0; /* scanner locked */ -TMLN mux_ldsc[MUX_LINES] = { 0 }; /* line descriptors */ +TMLN mux_ldsc[MUX_LINES] = { {0} }; /* line descriptors */ TMXR mux_desc = { MUX_LINES, 0, 0, mux_ldsc }; /* mux descriptor */ t_stat mux (uint32 fnc, uint32 inst, uint32 *dat); diff --git a/VAX/vax780_mem.c b/VAX/vax780_mem.c index 2183b832..32996679 100644 --- a/VAX/vax780_mem.c +++ b/VAX/vax780_mem.c @@ -98,7 +98,7 @@ t_stat mctl_wrreg (int32 val, int32 pa, int32 mode); mctlx_reg MCTLx register list */ -DIB mctl0_dib[] = { TR_MCTL0, 0, &mctl_rdreg, &mctl_wrreg, 0 }; +DIB mctl0_dib = { TR_MCTL0, 0, &mctl_rdreg, &mctl_wrreg, 0 }; UNIT mctl0_unit = { UDATA (NULL, 0, 0) }; @@ -117,7 +117,7 @@ MTAB mctl0_mod[] = { { 0 } }; -DIB mctl1_dib[] = { TR_MCTL1, 0, &mctl_rdreg, &mctl_wrreg, 0 }; +DIB mctl1_dib = { TR_MCTL1, 0, &mctl_rdreg, &mctl_wrreg, 0 }; UNIT mctl1_unit = { UDATA (NULL, 0, 0) }; diff --git a/VAX/vax_cis.c b/VAX/vax_cis.c index 3eec163e..8a5465a5 100644 --- a/VAX/vax_cis.c +++ b/VAX/vax_cis.c @@ -71,8 +71,8 @@ typedef struct { uint32 val[DSTRLNT]; } DSTR; -static DSTR Dstr_zero = { 0, 0, 0, 0, 0 }; -static DSTR Dstr_one = { 0, 0x10, 0, 0, 0 }; +static DSTR Dstr_zero = { 0, {0, 0, 0, 0} }; +static DSTR Dstr_one = { 0, {0x10, 0, 0, 0} }; extern int32 R[16]; extern int32 PSL; diff --git a/scp.c b/scp.c index 5141bff4..82ab5e92 100644 --- a/scp.c +++ b/scp.c @@ -718,6 +718,7 @@ static CTAB cmd_table[] = { "sh{ow} {arg,...} show unit parameters\n" "sh{ow} ethernet show ethernet devices\n" "sh{ow} serial show serial devices\n" + "sh{ow} multiplexer show open multiplexer devices\n" "sh{ow} on show on condition actions\n" }, { "DO", &do_cmd, 1, "do {-V} {-O} {-E} {-Q} {arg,arg...}\b" @@ -2072,7 +2073,6 @@ static SHTAB show_glob_tab[] = { { "ETHERNET", ð_show_devices, 0 }, { "SERIAL", &sim_show_serial, 0 }, { "MULTIPLEXER", &tmxr_show_open_devices, 0 }, - { "MUX", &tmxr_show_open_devices, 0 }, { "ON", &show_on, 0 }, { NULL, NULL, 0 } }; @@ -4429,8 +4429,10 @@ char *read_line_p (char *prompt, char *cptr, int32 size, FILE *stream) char *tptr; #if defined(HAVE_DLOPEN) static int initialized = 0; -static char *(*p_readline)(const char *) = NULL; -static void (*p_add_history)(const char *) = NULL; +typedef char *(*readline_func)(const char *); +static readline_func p_readline = NULL; +typedef void (*add_history_func)(const char *); +static add_history_func p_add_history = NULL; if (!initialized) { initialized = 1; @@ -4446,8 +4448,8 @@ if (!initialized) { if (!handle) handle = dlopen("libreadline." __STR(HAVE_DLOPEN) ".5", RTLD_NOW|RTLD_GLOBAL); if (handle) { - p_readline = dlsym(handle, "readline"); - p_add_history = dlsym(handle, "add_history"); + p_readline = (readline_func)((size_t)dlsym(handle, "readline")); + p_add_history = (add_history_func)((size_t)dlsym(handle, "add_history")); } } if (prompt) { /* interactive? */ diff --git a/sim_BuildROMs.c b/sim_BuildROMs.c index bb7637b1..03475e65 100644 --- a/sim_BuildROMs.c +++ b/sim_BuildROMs.c @@ -293,7 +293,7 @@ return 0; void Usage(void) { -int i; +size_t i; printf ("sim_BuildROMs Usage:\n"); printf ("sim_BuildROMs\n"); @@ -324,7 +324,7 @@ exit(2); int main(int argc, char **argv) { -int i; +size_t i; int status = 0; if (argc == 1) { /* invoked without any arguments */ diff --git a/sim_defs.h b/sim_defs.h index 558573ea..02fa766f 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -277,7 +277,7 @@ typedef uint32 t_addr; /* String match - at least one character required */ -#define MATCH_CMD(ptr,cmd) ((!(ptr)) || (!*(ptr)) || strncmp ((ptr), (cmd), strlen (ptr))) +#define MATCH_CMD(ptr,cmd) ((NULL == (ptr)) || (!*(ptr)) || strncmp ((ptr), (cmd), strlen (ptr))) /* End of Linked List/Queue value */ /* Chosen for 2 reasons: */ diff --git a/sim_disk.c b/sim_disk.c index ad8fa5b5..b5f81539 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -887,7 +887,7 @@ if (sim_switches & SWMASK ('C')) { /* create vhd disk & cop } } else if (sim_switches & SWMASK ('M')) { /* merge difference disk? */ - char gbuf[CBUFSIZE], *Parent; + char gbuf[CBUFSIZE], *Parent = NULL; FILE *vhd; sim_switches = sim_switches & ~(SWMASK ('M')); @@ -1672,7 +1672,6 @@ return SCPE_OK; static FILE *sim_os_disk_open_raw (const char *rawdevicename, const char *openmode) { -int fd; int mode = 0; if (strchr (openmode, 'r') && (strchr (openmode, '+') || strchr (openmode, 'w'))) @@ -2835,7 +2834,7 @@ void *handle; #define __STR(tok) __STR_QUOTE(tok) handle = dlopen("libuuid." __STR(HAVE_DLOPEN), RTLD_NOW|RTLD_GLOBAL); if (handle) - uuid_generate_c = (void (*)(void *)) dlsym(handle, "uuid_generate"); + uuid_generate_c = (void (*)(void *))((size_t)dlsym(handle, "uuid_generate")); if (uuid_generate_c) uuid_generate_c(uuidaddr); else @@ -3023,6 +3022,9 @@ errno = Status; return hVHD; } +#if defined(__CYGWIN__) +#include +#endif static void ExpandToFullPath (const char *szFileSpec, char *szFullFileSpecBuffer, @@ -3109,7 +3111,7 @@ if (d) { else return NULL; #else -while ((c = strchr (szHostPath, '\\'))) +while ((c = strchr (d, '\\'))) *c = '/'; #endif memset (szHostPath + strlen (szHostPath), 0, HostPathSize - strlen (szHostPath)); diff --git a/sim_ether.c b/sim_ether.c index 5504cba2..1e3a11e9 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -957,9 +957,9 @@ typedef int (*_func)(); static void load_function(char* function, _func* func_ptr) { #ifdef _WIN32 - *func_ptr = (_func)GetProcAddress(hLib, function); + *func_ptr = (_func)((size_t)GetProcAddress(hLib, function)); #else - *func_ptr = (_func)dlsym(hLib, function); + *func_ptr = (_func)((size_t)dlsym(hLib, function)); #endif if (*func_ptr == 0) { char* msg = "Eth: Failed to find function '%s' in %s\r\n"; @@ -1416,7 +1416,7 @@ static void eth_get_nic_hw_addr(ETH_DEV* dev, char *devname) while (p1) { p2 = strchr(p1+1, ':'); if (p2 <= p1+3) { - int mac_bytes[6]; + unsigned int mac_bytes[6]; if (6 == sscanf(p1-2, "%02x:%02x:%02x:%02x:%02x:%02x", &mac_bytes[0], &mac_bytes[1], &mac_bytes[2], &mac_bytes[3], &mac_bytes[4], &mac_bytes[5])) { dev->host_nic_phy_hw_addr[0] = mac_bytes[0]; dev->host_nic_phy_hw_addr[1] = mac_bytes[1]; @@ -1464,7 +1464,7 @@ HANDLE hWait = pcap_getevent ((pcap_t*)dev->handle); #else int sel_ret; int do_select = 0; -int select_fd; +int select_fd = 0; switch (dev->eth_api) { case ETH_API_PCAP: @@ -2111,13 +2111,13 @@ if ((packet->len >= ETH_MIN_PACKET) && (packet->len <= ETH_MAX_PACKET)) { break; #ifdef USE_TAP_NETWORK case ETH_API_TAP: - status = ((packet->len == write(dev->fd_handle, (void *)packet->msg, packet->len)) ? 0 : -1); + status = (((int)packet->len == write(dev->fd_handle, (void *)packet->msg, packet->len)) ? 0 : -1); break; #endif #ifdef USE_VDE_NETWORK case ETH_API_VDE: status = vde_send((VDECONN*)dev->handle, (void *)packet->msg, packet->len, 0); - if ((status == packet->len) || (status == 0)) + if ((status == (int)packet->len) || (status == 0)) status = 0; else if ((status == -1) && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) diff --git a/sim_serial.c b/sim_serial.c index 2ee5b7fc..bb15915c 100644 --- a/sim_serial.c +++ b/sim_serial.c @@ -131,6 +131,7 @@ #define SER_DEV_NAME_MAX 256 /* maximum device name size */ #define SER_DEV_DESC_MAX 256 /* maximum device description size */ +#define SER_DEV_CONFIG_MAX 64 /* maximum device config size */ #define SER_MAX_DEVICE 64 /* maximum serial devices */ typedef struct serial_list { @@ -155,7 +156,7 @@ static struct open_serial_device { SERHANDLE port; TMLN *line; char name[SER_DEV_NAME_MAX]; - char desc[SER_DEV_DESC_MAX]; + char config[SER_DEV_CONFIG_MAX]; } *serial_open_devices = NULL; static int serial_open_device_count = 0; @@ -169,15 +170,15 @@ for (i=0; i= max) break; strcpy(list[ports].name, serial_open_devices[i].name); - strcpy(list[ports].desc, serial_open_devices[i].desc); + strcpy(list[ports].desc, serial_open_devices[i].config); ++ports; } if (ports) /* Order the list returned alphabetically by the port name */ @@ -377,9 +378,8 @@ return SCPE_OK; SERHANDLE sim_open_serial (char *name, TMLN *lp, t_stat *stat) { -char temp1[1024], temp2[1024], devname [1024]; +char temp1[1024], devname [1024]; char *savname = name; -char *savdesc = NULL; SERHANDLE port = INVALID_HANDLE; char *config; t_stat status; @@ -407,7 +407,6 @@ if ((strlen(devname) <= 5) *stat = SCPE_OPENERR; return port; } - savdesc = sim_serial_getdesc_byname (savname, temp2); } else { /* are they trying to use device description? */ @@ -417,11 +416,7 @@ else { savname = sim_serial_getname_byname(devname, temp1); if (savname == NULL) /* didn't translate */ savname = devname; - else - savdesc = sim_serial_getdesc_byname(savname, temp2); } - else - savdesc = devname; } port = sim_open_os_serial (savname); @@ -525,7 +520,7 @@ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_ DWORD dwDataSize = sizeof(list[ports].name); /* Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM */ - while (RegEnumValueA(hSERIALCOMM, dwIndex, list[ports].desc, &dwValueNameSize, NULL, &dwType, list[ports].name, &dwDataSize) == ERROR_SUCCESS) { + while (RegEnumValueA(hSERIALCOMM, dwIndex, list[ports].desc, &dwValueNameSize, NULL, &dwType, (BYTE *)list[ports].name, &dwDataSize) == ERROR_SUCCESS) { /* String values with non-zero size are the interesting ones */ if ((dwType == REG_SZ) && (dwDataSize > 0)) if (ports < max) diff --git a/sim_sock.c b/sim_sock.c index 9c5e11bc..15813c89 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -52,6 +52,10 @@ extern FILE *sim_log; #include #endif +#ifdef HAVE_DLOPEN +#include +#endif + #ifndef WSAAPI #define WSAAPI #endif @@ -130,18 +134,17 @@ sim_close_sock (s, flg); return INVALID_SOCKET; } -static void (WSAAPI *p_freeaddrinfo) (struct addrinfo *ai); +typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo *ai); +static freeaddrinfo_func p_freeaddrinfo; -static int (WSAAPI *p_getaddrinfo) (const char *hostname, +typedef int (WSAAPI *getaddrinfo_func) (const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **res); +static getaddrinfo_func p_getaddrinfo; -static int (WSAAPI *p_getnameinfo) (const struct sockaddr *sa, socklen_t salen, - char *host, size_t hostlen, - char *serv, size_t servlen, - int flags); - +typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags); +static getnameinfo_func p_getnameinfo; static void WSAAPI s_freeaddrinfo (struct addrinfo *ai) { @@ -199,8 +202,6 @@ if (service) { char *c; port = strtoul(service, &c, 10); - if ((port == 0) && (*c != '\0') && (hints->ai_flags & AI_NUMERICSERV)) - return EAI_NONAME; if ((port == 0) || (*c != '\0')) { switch (hints->ai_socktype) { @@ -375,7 +376,11 @@ return 0; #if defined(_WIN32) || defined(__CYGWIN__) /* Dynamic DLL load variables */ +#ifdef _WIN32 static HINSTANCE hLib = 0; /* handle to DLL */ +#else +static void *hLib = NULL; /* handle to Library */ +#endif static int lib_loaded = 0; /* 0=not loaded, 1=loaded, 2=library load failed, 3=Func load failed */ static char* lib_name = "Ws2_32.dll"; @@ -383,7 +388,11 @@ static char* lib_name = "Ws2_32.dll"; typedef int (*_func)(); static void load_function(char* function, _func* func_ptr) { +#ifdef _WIN32 *func_ptr = (_func)GetProcAddress(hLib, function); +#else + *func_ptr = (_func)dlsym(hLib, function); +#endif if (*func_ptr == 0) { char* msg = "Sockets: Failed to find function '%s' in %s\r\n"; @@ -424,9 +433,9 @@ int load_ws2(void) { if (lib_loaded != 1) { /* unsuccessful load, connect stubs */ - p_getaddrinfo = s_getaddrinfo; - p_getnameinfo = s_getnameinfo; - p_freeaddrinfo = s_freeaddrinfo; + p_getaddrinfo = (getaddrinfo_func)s_getaddrinfo; + p_getnameinfo = (getnameinfo_func)s_getnameinfo; + p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; } break; default: /* loaded or failed */ @@ -574,9 +583,9 @@ if (err != 0) load_ws2 (); #endif /* endif AF_INET6 */ #else /* Use native addrinfo APIs */ - p_getaddrinfo = (void *)getaddrinfo; - p_getnameinfo = (void *)getnameinfo; - p_freeaddrinfo = (void *)freeaddrinfo; + p_getaddrinfo = (getaddrinfo_func)getaddrinfo; + p_getnameinfo = (getnameinfo_func)getnameinfo; + p_freeaddrinfo = (freeaddrinfo_func)freeaddrinfo; #endif /* endif _WIN32 */ #if defined (SIGPIPE) signal (SIGPIPE, SIG_IGN); /* no pipe signals */ @@ -678,10 +687,12 @@ if (newsock == INVALID_SOCKET) { /* socket error? */ p_freeaddrinfo(result); return newsock; } +#ifdef IPV6_V6ONLY if (result->ai_family == AF_INET6) { int off = FALSE; sta = setsockopt (newsock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&off, sizeof(off)); } +#endif sta = bind (newsock, result->ai_addr, result->ai_addrlen); p_freeaddrinfo(result); if (sta == SOCKET_ERROR) /* bind error? */ From 59afee3128ead9837cd18f0e4b5d97ff0d80a5e6 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 13 Dec 2012 13:46:43 -0800 Subject: [PATCH 48/63] Serial Multiplexer cleanup after review by Dave Bryan - Added functionality to return the lines with attached serial ports by calling tmxr_poll_conn one time after a serial port is attached. - Added the ability to close a serial port from the sim> prompt if a device implements a SET dev DISCONNECT=line command. A serial port is closed if the -C switch is specified on the DISCONNECT command line. - Cleaned up the multiplexer status display based on Dave's recommendations. --- sim_tmxr.c | 212 ++++++++++++++++++++++++++++++----------------------- sim_tmxr.h | 1 + 2 files changed, 123 insertions(+), 90 deletions(-) diff --git a/sim_tmxr.c b/sim_tmxr.c index 6909dc31..09543657 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -255,10 +255,18 @@ A device emulation may choose to implement a command interface to disconnect specific individual lines. This would usually be done via a Unit Modifier table entry (MTAB) which dispatches the command - "SET dev DISCONNECT[=line]" to tmxr_detach_line. + "SET dev DISCONNECT[=line]" to tmxr_dscln. This will cause a telnet + connection to be closed, but a serial port will normally have DTR + dropped for 500ms and raised again (thus hanging up a modem on that + serial port). sim> set MUX disconnect=2 + A line which is connected to a serial port can be manually closed by + adding the -C switch to a disconnect command. + + sim> set -C MUX disconnect=2 + Full Modem Control serial port support. This library supports devices which wish to emulate full modem @@ -717,49 +725,51 @@ mp->last_poll_time = poll_time; /* Check for a pending Telnet connection */ -newsock = sim_accept_conn (mp->master, &address); /* poll connect */ +if (mp->master) { + newsock = sim_accept_conn (mp->master, &address); /* poll connect */ -if (newsock != INVALID_SOCKET) { /* got a live one? */ - sprintf (msg, "tmxr_poll_conn() - Connection from %s", address); - tmxr_debug_trace (mp, msg); - op = mp->lnorder; /* get line connection order list pointer */ - i = mp->lines; /* play it safe in case lines == 0 */ - ++mp->sessions; /* count the new session */ + if (newsock != INVALID_SOCKET) { /* got a live one? */ + sprintf (msg, "tmxr_poll_conn() - Connection from %s", address); + tmxr_debug_trace (mp, msg); + op = mp->lnorder; /* get line connection order list pointer */ + i = mp->lines; /* play it safe in case lines == 0 */ + ++mp->sessions; /* count the new session */ - for (j = 0; j < mp->lines; j++, i++) { /* find next avail line */ - if (op && (*op >= 0) && (*op < mp->lines)) /* order list present and valid? */ - i = *op++; /* get next line in list to try */ - else /* no list or not used or range error */ - i = j; /* get next sequential line */ + for (j = 0; j < mp->lines; j++, i++) { /* find next avail line */ + if (op && (*op >= 0) && (*op < mp->lines)) /* order list present and valid? */ + i = *op++; /* get next line in list to try */ + else /* no list or not used or range error */ + i = j; /* get next sequential line */ - lp = mp->ldsc + i; /* get pointer to line descriptor */ - if ((lp->conn == 0) && /* is the line available? */ - (lp->destination == NULL) && - (lp->master == 0)) - break; /* yes, so stop search */ - } - - if (i >= mp->lines) { /* all busy? */ - tmxr_msg (newsock, "All connections busy\r\n"); - tmxr_debug_trace (mp, "tmxr_poll_conn() - All connections busy"); - sim_close_sock (newsock, 0); - free (address); - } - else { - lp = mp->ldsc + i; /* get line desc */ - tmxr_init_line (lp); /* init line */ - lp->conn = newsock; /* record connection */ - lp->ipad = address; /* ip address */ - lp->notelnet = mp->notelnet; /* apply mux default telnet setting */ - if (!lp->notelnet) { - sim_write_sock (newsock, mantra, sizeof(mantra)); - tmxr_debug (TMXR_DBG_XMT, lp, "Sending", mantra, sizeof(mantra)); + lp = mp->ldsc + i; /* get pointer to line descriptor */ + if ((lp->conn == 0) && /* is the line available? */ + (lp->destination == NULL) && + (lp->master == 0)) + break; /* yes, so stop search */ } - tmxr_report_connection (mp, lp); - lp->cnms = sim_os_msec (); /* time of conn */ - return i; - } - } /* end if newsock */ + + if (i >= mp->lines) { /* all busy? */ + tmxr_msg (newsock, "All connections busy\r\n"); + tmxr_debug_trace (mp, "tmxr_poll_conn() - All connections busy"); + sim_close_sock (newsock, 0); + free (address); + } + else { + lp = mp->ldsc + i; /* get line desc */ + tmxr_init_line (lp); /* init line */ + lp->conn = newsock; /* record connection */ + lp->ipad = address; /* ip address */ + lp->notelnet = mp->notelnet; /* apply mux default telnet setting */ + if (!lp->notelnet) { + sim_write_sock (newsock, mantra, sizeof(mantra)); + tmxr_debug (TMXR_DBG_XMT, lp, "Sending", mantra, sizeof(mantra)); + } + tmxr_report_connection (mp, lp); + lp->cnms = sim_os_msec (); /* time of conn */ + return i; + } + } /* end if newsock */ + } /* Look for per line listeners or outbound connecting sockets */ for (i = 0; i < mp->lines; i++) { /* check each line in sequence */ @@ -781,47 +791,57 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se /* Check for a pending Telnet connection */ - newsock = sim_accept_conn (lp->master, &address); /* poll connect */ + if (lp->master) { - if (newsock != INVALID_SOCKET) { /* got a live one? */ - sprintf (msg, "tmxr_poll_conn() - Line Connection from %s", address); - tmxr_debug_trace_line (lp, msg); - ++mp->sessions; /* count the new session */ + newsock = sim_accept_conn (lp->master, &address);/* poll connect */ - if (lp->destination) { /* Virtual Null Modem Cable? */ - char host[CBUFSIZE]; + if (newsock != INVALID_SOCKET) { /* got a live one? */ + sprintf (msg, "tmxr_poll_conn() - Line Connection from %s", address); + tmxr_debug_trace_line (lp, msg); + ++mp->sessions; /* count the new session */ - if (sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL, address)) { - tmxr_msg (newsock, "Rejecting connection from unexpected source\r\n"); - sprintf (msg, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host); - tmxr_debug_trace_line (lp, msg); + if (lp->destination) { /* Virtual Null Modem Cable? */ + char host[CBUFSIZE]; + + if (sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL, address)) { + tmxr_msg (newsock, "Rejecting connection from unexpected source\r\n"); + sprintf (msg, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host); + tmxr_debug_trace_line (lp, msg); + sim_close_sock (newsock, 0); + free (address); + continue; /* Move on to next line */ + } + if (lp->connecting) { + sim_close_sock (lp->connecting, 0); /* abort our as yet unconnnected socket */ + lp->connecting = 0; + } + } + if (lp->conn == 0) { /* is the line available? */ + tmxr_init_line (lp); /* init line */ + lp->conn = newsock; /* record connection */ + lp->ipad = address; /* ip address */ + if (!lp->notelnet) { + sim_write_sock (newsock, mantra, sizeof(mantra)); + tmxr_debug (TMXR_DBG_XMT, lp, "Sending", mantra, sizeof(mantra)); + } + tmxr_report_connection (mp, lp); + lp->cnms = sim_os_msec (); /* time of conn */ + return i; + } + else { + tmxr_msg (newsock, "Line connection busy\r\n"); + tmxr_debug_trace_line (lp, "tmxr_poll_conn() - Line connection busy"); sim_close_sock (newsock, 0); free (address); - continue; /* Move on to next line */ - } - if (lp->connecting) { - sim_close_sock (lp->connecting, 0); /* abort our as yet unconnnected socket */ - lp->connecting = 0; } } - if (lp->conn == 0) { /* is the line available? */ - tmxr_init_line (lp); /* init line */ - lp->conn = newsock; /* record connection */ - lp->ipad = address; /* ip address */ - if (!lp->notelnet) { - sim_write_sock (newsock, mantra, sizeof(mantra)); - tmxr_debug (TMXR_DBG_XMT, lp, "Sending", mantra, sizeof(mantra)); - } - tmxr_report_connection (mp, lp); - lp->cnms = sim_os_msec (); /* time of conn */ - return i; - } - else { - tmxr_msg (newsock, "Line connection busy\r\n"); - tmxr_debug_trace_line (lp, "tmxr_poll_conn() - Line connection busy"); - sim_close_sock (newsock, 0); - free (address); - } + } + + /* Check for pending serial port connection notification */ + + if (lp->ser_connect_pending) { + lp->ser_connect_pending = FALSE; + return i; } } @@ -832,8 +852,9 @@ return -1; /* no new connections ma The telnet/tcp or serial session associated with multiplexer descriptor "mp" and line descriptor "lp" is disconnected. An associated tcp socket is - deallocated; a serial port is not, although for non modem control serial lines - DTR is dropped and raised again after 500ms to signal the attached serial device. + closed; a serial port is closed if the closeserial parameter is true, otherwise + for non modem control serial lines DTR is dropped and raised again after 500ms + to signal the attached serial device. */ static t_stat tmxr_reset_ln_ex (TMLN *lp, t_bool closeserial) @@ -847,6 +868,9 @@ if (lp->serport) { if (closeserial) { sim_close_serial (lp->serport); lp->serport = 0; + lp->ser_connect_pending = FALSE; + free (lp->destination); + lp->destination = NULL; free (lp->serconfig); lp->serconfig = NULL; lp->cnms = 0; @@ -879,6 +903,11 @@ else { tmxr_init_line (lp); /* initialize line state */ lp->conn = 0; /* remove socket or connection flag */ } +/* Revise the unit's connect string to reflect the current attachments */ +lp->mp->uptr->filename = _mux_attach_string (lp->mp->uptr->filename, lp->mp); +/* No connections or listeners exist, then we're equivalent to being fully detached. We should reflect that */ +if (lp->mp->uptr->filename == NULL) + tmxr_detach (lp->mp, lp->mp->uptr); return SCPE_OK; } @@ -1572,6 +1601,7 @@ while (*tptr) { if (serport != INVALID_HANDLE) { lp->mp = mp; lp->serport = serport; + lp->ser_connect_pending = TRUE; lp->notelnet = TRUE; tmxr_init_line (lp); /* init the line state */ if (!lp->mp->modem_control) /* raise DTR and RTS for non modem control lines */ @@ -1677,6 +1707,7 @@ while (*tptr) { serport = sim_open_serial (lp->destination, lp, &r); if (serport != INVALID_HANDLE) { lp->serport = serport; + lp->ser_connect_pending = TRUE; lp->notelnet = TRUE; tmxr_init_line (lp); /* init the line state */ if (!lp->mp->modem_control) /* raise DTR and RTS for non modem control lines */ @@ -2016,12 +2047,11 @@ return SCPE_OK; } -/* Detach unit from master socket. +/* Detach unit from master socket and close all active network connections + and/or serial ports. Note that we return SCPE_OK, regardless of whether a listening socket was - attached. For single-line multiplexers that may be attached either to a - listening socket or to a serial port, call "tmxr_detach_line" first. If that - routine returns SCPE_UNATT, then call "tmxr_detach". + attached. */ t_stat tmxr_detach (TMXR *mp, UNIT *uptr) @@ -2119,17 +2149,19 @@ static const char *enab = "on"; static const char *dsab = "off"; if (ln >= 0) - fprintf (st, "line %d:\b", ln); + fprintf (st, "line %d:\n", ln); if ((!lp->conn) && (!lp->connecting) && (!lp->serport)) fprintf (st, "line disconnected\n"); -if (lp->rxcnt) - fprintf (st, " input (%s) queued/total = %d/%d\n", - (lp->rcve? enab: dsab), - tmxr_rqln (lp), lp->rxcnt); -if (lp->txcnt || lp->txbpi) - fprintf (st, " output (%s) queued/total = %d/%d\n", - (lp->xmte? enab: dsab), - tmxr_tqln (lp), lp->txcnt); +else { + if ((lp->rxcnt) || (!lp->rcve)) + fprintf (st, " input (%s) queued/total = %d/%d\n", + (lp->rcve? enab: dsab), + tmxr_rqln (lp), lp->rxcnt); + if (lp->txcnt || lp->txbpi || (!lp->xmte)) + fprintf (st, " output (%s) queued/total = %d/%d\n", + (lp->xmte? enab: dsab), + tmxr_tqln (lp), lp->txcnt); + } if (lp->txbfd) fprintf (st, " output buffer size = %d\n", lp->txbsz); if (lp->txcnt || lp->txbpi) @@ -2185,7 +2217,7 @@ if (lp == NULL) /* bad line numb if ((lp->conn) || (lp->serport)) { /* connection active? */ if (!lp->notelnet) tmxr_linemsg (lp, "\r\nOperator disconnected line\r\n\n");/* report closure */ - tmxr_reset_ln (lp); /* drop the line */ + tmxr_reset_ln_ex (lp, (sim_switches & SWMASK ('C'))); /* drop the line */ } return SCPE_OK; diff --git a/sim_tmxr.h b/sim_tmxr.h index 3d105768..18c00fd5 100644 --- a/sim_tmxr.h +++ b/sim_tmxr.h @@ -116,6 +116,7 @@ struct tmln { TMXR *mp; /* back pointer to mux */ char *serconfig; /* line config */ SERHANDLE serport; /* serial port handle */ + t_bool ser_connect_pending; /* serial connection notice pending */ SOCKET connecting; /* Outgoing socket while connecting */ char *destination; /* Outgoing destination address:port */ UNIT *uptr; /* input polling unit (default to mp->uptr) */ From c71e0c39dc72aaa03c0d9d5d72a62005d102f1f2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 13 Dec 2012 15:21:07 -0800 Subject: [PATCH 49/63] Compiler warning cleanup --- PDP11/pdp11_cis.c | 6 ++---- PDP11/pdp11_cpu.c | 6 +++--- PDP11/pdp11_cpumod.c | 2 +- PDP11/pdp11_dc.c | 2 +- PDP11/pdp11_dl.c | 2 +- PDP11/pdp11_rc.c | 2 +- PDP11/pdp11_rf.c | 4 ++-- PDP11/pdp11_rk.c | 2 +- PDP11/pdp11_rp.c | 2 +- PDP11/pdp11_tc.c | 4 ++-- PDP11/pdp11_tm.c | 2 +- PDP11/pdp11_tu.c | 4 ++-- 12 files changed, 18 insertions(+), 20 deletions(-) diff --git a/PDP11/pdp11_cis.c b/PDP11/pdp11_cis.c index 9f78f1bd..fd0ef208 100644 --- a/PDP11/pdp11_cis.c +++ b/PDP11/pdp11_cis.c @@ -170,7 +170,7 @@ typedef struct { uint32 val[DSTRLNT]; } DSTR; -static DSTR Dstr0 = { 0, 0, 0, 0, 0 }; +static DSTR Dstr0 = { 0, {0, 0, 0, 0} }; extern int32 isenable, dsenable; extern int32 N, Z, V, C, fpd, ipl; @@ -327,8 +327,6 @@ static int32 binover[2][16] = { '0', '0', '0', '0', '0', '0' }; -static unsigned char movbuf[65536]; - /* CIS emulator */ t_stat cis11 (int32 IR) @@ -342,7 +340,7 @@ uint32 nc, digit, result; t_stat st; static DSTR accum, src1, src2, dst; static DSTR mptable[10]; -static DSTR Dstr1 = { 0, 0x10, 0, 0, 0 }; +static DSTR Dstr1 = { 0, {0x10, 0, 0, 0} }; old_PC = (PC - 2) & 0177777; /* original PC */ op = IR & 0177; /* IR <6:0> */ diff --git a/PDP11/pdp11_cpu.c b/PDP11/pdp11_cpu.c index 7f8eac70..65f0ec5e 100644 --- a/PDP11/pdp11_cpu.c +++ b/PDP11/pdp11_cpu.c @@ -256,7 +256,7 @@ typedef struct { extern FILE *sim_log; uint16 *M = NULL; /* memory */ -int32 REGFILE[6][2] = { 0 }; /* R0-R5, two sets */ +int32 REGFILE[6][2] = { {0} }; /* R0-R5, two sets */ int32 STACKFILE[4] = { 0 }; /* SP, four modes */ int32 saved_PC = 0; /* program counter */ int32 R[8] = { 0 }; /* working registers */ @@ -273,7 +273,7 @@ int32 trap_req = 0; /* trap requests */ int32 int_req[IPL_HLVL] = { 0 }; /* interrupt requests */ int32 PIRQ = 0; /* programmed int req */ int32 STKLIM = 0; /* stack limit */ -fpac_t FR[6] = { 0 }; /* fp accumulators */ +fpac_t FR[6] = { {0} }; /* fp accumulators */ int32 FPS = 0; /* fp status */ int32 FEC = 0; /* fp exception code */ int32 FEA = 0; /* fp exception addr */ @@ -1246,7 +1246,7 @@ while (reason == 0) { else dst = R[dstspec]; } else { - i = ((cm == pm) && (cm == MD_USR))? calc_ds (pm): calc_is (pm); + i = ((cm == pm) && (cm == MD_USR))? (int32)calc_ds (pm): (int32)calc_is (pm); dst = ReadW ((GeteaW (dstspec) & 0177777) | i); } N = GET_SIGN_W (dst); diff --git a/PDP11/pdp11_cpumod.c b/PDP11/pdp11_cpumod.c index faf5a2b2..c74e96c9 100644 --- a/PDP11/pdp11_cpumod.c +++ b/PDP11/pdp11_cpumod.c @@ -1159,7 +1159,7 @@ if ((mc != 0) && !get_yn ("Really truncate memory [N]?", FALSE)) nM = (uint16 *) calloc (val >> 1, sizeof (uint16)); if (nM == NULL) return SCPE_MEM; -clim = (((t_addr) val) < MEMSIZE)? val: MEMSIZE; +clim = (((t_addr) val) < MEMSIZE)? (uint32)val: MEMSIZE; for (i = 0; i < clim; i = i + 2) nM[i >> 1] = M[i >> 1]; free (M); diff --git a/PDP11/pdp11_dc.c b/PDP11/pdp11_dc.c index 1c653fe8..99eecf2d 100644 --- a/PDP11/pdp11_dc.c +++ b/PDP11/pdp11_dc.c @@ -86,7 +86,7 @@ uint32 dci_ireq = 0; uint16 dco_csr[DCX_LINES] = { 0 }; /* control/status */ uint8 dco_buf[DCX_LINES] = { 0 }; uint32 dco_ireq = 0; -TMLN dcx_ldsc[DCX_LINES] = { 0 }; /* line descriptors */ +TMLN dcx_ldsc[DCX_LINES] = { {0} }; /* line descriptors */ TMXR dcx_desc = { DCX_LINES, 0, 0, dcx_ldsc }; /* mux descriptor */ static const uint8 odd_par[] = { diff --git a/PDP11/pdp11_dl.c b/PDP11/pdp11_dl.c index ec8cc9ab..9b264667 100644 --- a/PDP11/pdp11_dl.c +++ b/PDP11/pdp11_dl.c @@ -87,7 +87,7 @@ uint32 dli_ireq[2] = { 0, 0}; uint16 dlo_csr[DLX_LINES] = { 0 }; /* control/status */ uint8 dlo_buf[DLX_LINES] = { 0 }; uint32 dlo_ireq = 0; -TMLN dlx_ldsc[DLX_LINES] = { 0 }; /* line descriptors */ +TMLN dlx_ldsc[DLX_LINES] = { {0} }; /* line descriptors */ TMXR dlx_desc = { DLX_LINES, 0, 0, dlx_ldsc }; /* mux descriptor */ t_stat dlx_rd (int32 *data, int32 PA, int32 access); diff --git a/PDP11/pdp11_rc.c b/PDP11/pdp11_rc.c index 1f32ec59..f0bab9ba 100644 --- a/PDP11/pdp11_rc.c +++ b/PDP11/pdp11_rc.c @@ -437,7 +437,7 @@ static uint32 sectorCRC (const uint16 *data) static t_stat rc_svc (UNIT *uptr) { - uint32 ma, da, t, u_old, u_new, last_da; + uint32 ma, da, t, u_old, u_new, last_da = 0; uint16 dat; uint16 *fbuf = uptr->filebuf; diff --git a/PDP11/pdp11_rf.c b/PDP11/pdp11_rf.c index 439fa7b2..6af0f800 100644 --- a/PDP11/pdp11_rf.c +++ b/PDP11/pdp11_rf.c @@ -144,7 +144,7 @@ uint32 update_rfcs (uint32 newcs, uint32 newdae); DIB rf_dib = { IOBA_RF, IOLN_RF, &rf_rd, &rf_wr, - 1, IVCL (RF), VEC_RF, NULL + 1, IVCL (RF), VEC_RF, {NULL} }; @@ -461,7 +461,7 @@ static const uint16 boot_rom[] = { t_stat rf_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; for (i = 0; i < BOOT_LEN; i++) diff --git a/PDP11/pdp11_rk.c b/PDP11/pdp11_rk.c index d870ca8f..cb27b06d 100644 --- a/PDP11/pdp11_rk.c +++ b/PDP11/pdp11_rk.c @@ -746,7 +746,7 @@ static const uint16 boot_rom[] = { t_stat rk_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; for (i = 0; i < BOOT_LEN; i++) diff --git a/PDP11/pdp11_rp.c b/PDP11/pdp11_rp.c index 2b8cfef6..2faf61e6 100644 --- a/PDP11/pdp11_rp.c +++ b/PDP11/pdp11_rp.c @@ -1120,7 +1120,7 @@ static const uint16 boot_rom[] = { t_stat rp_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; extern uint16 *M; UNIT *uptr = rp_dev.units + unitno; diff --git a/PDP11/pdp11_tc.c b/PDP11/pdp11_tc.c index 1af3df29..4fc1fd19 100644 --- a/PDP11/pdp11_tc.c +++ b/PDP11/pdp11_tc.c @@ -749,7 +749,7 @@ t_bool dt_setpos (UNIT *uptr) { uint32 new_time, ut, ulin, udelt; int32 mot = DTS_GETMOT (uptr->STATE); -int32 unum, delta; +int32 unum, delta = 0; new_time = sim_grtime (); /* current time */ ut = new_time - uptr->LASTT; /* elapsed time */ @@ -1183,7 +1183,7 @@ static const uint16 boot_rom[] = { t_stat dt_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; dt_unit[unitno].pos = DT_EZLIN; diff --git a/PDP11/pdp11_tm.c b/PDP11/pdp11_tm.c index e8430b17..55a4ef3a 100644 --- a/PDP11/pdp11_tm.c +++ b/PDP11/pdp11_tm.c @@ -711,7 +711,7 @@ static const uint16 boot2_rom[] = { t_stat tm_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; extern int32 sim_switches; diff --git a/PDP11/pdp11_tu.c b/PDP11/pdp11_tu.c index d0ced0a9..87784801 100644 --- a/PDP11/pdp11_tu.c +++ b/PDP11/pdp11_tu.c @@ -793,7 +793,7 @@ if (DEBUG_PRS (tu_dev)) { fprintf (sim_deb, ">>TU%d DONE: fnc=%s, fc=%06o, fs=%06o, er=%06o, pos=", drv, tu_fname[fnc], tufc, tufs, tuer); fprint_val (sim_deb, uptr->pos, 10, T_ADDR_W, PV_LEFT); - fprintf (sim_deb, "\n"); + fprintf (sim_deb, ", r=%d\n", r); } return SCPE_OK; } @@ -1036,7 +1036,7 @@ static const uint16 boot_rom[] = { t_stat tu_boot (int32 unitno, DEVICE *dptr) { -int32 i; +size_t i; extern int32 saved_PC; extern uint16 *M; From 883ad6bf5c135b41d4d52a1c9699b0d3e5fef6f2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 14 Dec 2012 03:27:18 -0800 Subject: [PATCH 50/63] Fixed sim_write_serial to return 0 when the non blocking write fails with the expected errno of EAGAIN --- sim_serial.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sim_serial.c b/sim_serial.c index bb15915c..5ac80862 100644 --- a/sim_serial.c +++ b/sim_serial.c @@ -205,7 +205,11 @@ for (i=0; i Date: Fri, 14 Dec 2012 04:19:10 -0800 Subject: [PATCH 51/63] Cleaned up compiler warnings --- PDP11/pdp11_dmc.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 8e809147..d2c53fe8 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -1,12 +1,3 @@ -/* -Bits still to deal with: - -There is a line in vax780_defs.h which defines IOBA_DMC to (IOPAGEBASE + 0760060), Is this correct, or is it being masked by the autoconfigure fixups? - -*/ - - - /* pdp11_dmc.c: DMC11 Emulation ------------------------------------------------------------------------------ @@ -366,17 +357,24 @@ MTAB dmc_mod[] = { { 0 }, }; +#define IOLN_DMC 010 +#ifndef IOBA_FLOAT +#define IOBA_FLOAT 0 +#define VEC_FLOAT 0 +#endif DIB dmc_dib[] = { - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} }, - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } + { IOBA_FLOAT, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_FLOAT, {&dmc_rxint, &dmc_txint} }, + { IOBA_FLOAT, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_FLOAT, {&dmc_rxint, &dmc_txint} }, + { IOBA_FLOAT, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_FLOAT, {&dmc_rxint, &dmc_txint} }, + { IOBA_FLOAT, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_FLOAT, {&dmc_rxint, &dmc_txint} } }; +#define IOLN_DMP 010 + DIB dmp_dib[] = { - { IOBA_DMC, IOLN_DMC, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_DMCRX, {&dmc_rxint, &dmc_txint} } + { IOBA_FLOAT, IOLN_DMP, &dmc_rd, &dmc_wr, 2, IVCL (DMCRX), VEC_FLOAT, {&dmc_rxint, &dmc_txint} } }; DEVICE dmc_dev[] = @@ -1776,7 +1774,7 @@ int dmc_buffer_fill_receive_buffers(CTLR *controller) socket = controller->line->socket; /* read block length and allocate buffer */ - if (buffer->block_len_bytes_read < sizeof(buffer->actual_block_len)) + if ((size_t)buffer->block_len_bytes_read < sizeof(buffer->actual_block_len)) { char *start_addr = ((char *)&buffer->actual_block_len) + buffer->block_len_bytes_read; bytes_read = sim_read_sock(socket, start_addr, sizeof(buffer->actual_block_len) - buffer->block_len_bytes_read); @@ -2054,7 +2052,6 @@ void dmc_process_input_transfer_completion(CTLR *controller) { if (!dmc_is_rdyi_set(controller)) { - uint16 sel4 = controller->csrs->sel4; uint16 sel6 = controller->csrs->sel6; if (controller->transfer_type == TYPE_DMP_MODE) { @@ -2120,7 +2117,6 @@ void dmc_process_command(CTLR *controller) t_stat dmc_rd(int32 *data, int32 PA, int32 access) { CTLR *controller = dmc_get_controller_from_address(PA); - int reg = PA & 07; sim_debug(DBG_TRC, controller->device, "dmc_rd(), addr=0x%x access=%d\n", PA, access); *data = dmc_getreg(controller, PA, 1); From c046a29cba59250a0b977740f32de8170a656f49 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 14 Dec 2012 15:53:59 -0800 Subject: [PATCH 52/63] Fix reference to sim_deb --- sim_serial.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sim_serial.c b/sim_serial.c index 5ac80862..e63c8166 100644 --- a/sim_serial.c +++ b/sim_serial.c @@ -205,11 +205,9 @@ for (i=0; i Date: Sat, 15 Dec 2012 07:56:42 -0800 Subject: [PATCH 53/63] Compiler suggested cleanup --- scp.c | 14 +++++++---- sim_disk.c | 67 +++++++++++++--------------------------------------- sim_ether.c | 6 ++++- sim_serial.c | 3 ++- sim_sock.c | 11 +++++++-- sim_tape.c | 28 +++++++++++++--------- sim_timer.c | 2 +- 7 files changed, 60 insertions(+), 71 deletions(-) diff --git a/scp.c b/scp.c index 82ab5e92..434f7cc8 100644 --- a/scp.c +++ b/scp.c @@ -888,9 +888,10 @@ while (stat != SCPE_EXIT) { /* in case exit */ cptr = (*sim_vm_read) (cbuf, CBUFSIZE, stdin); } else cptr = read_line_p ("sim> ", cbuf, CBUFSIZE, stdin);/* read with prmopt*/ - if (cptr == NULL) /* EOF? */ + if (cptr == NULL) { /* EOF? */ if (sim_ttisatty()) continue; /* ignore tty EOF */ else break; /* otherwise exit */ + } if (*cptr == 0) /* ignore blank */ continue; sub_args (cbuf, gbuf, sizeof(gbuf), argv); @@ -1242,11 +1243,12 @@ do { if (staying && (sim_on_check[sim_do_depth]) && (stat != SCPE_OK) && - (stat != SCPE_STEP)) + (stat != SCPE_STEP)) { if ((stat <= SCPE_MAX_ERR) && sim_on_actions[sim_do_depth][stat]) sim_brk_act[sim_do_depth] = sim_on_actions[sim_do_depth][stat]; else sim_brk_act[sim_do_depth] = sim_on_actions[sim_do_depth][0]; + } if (sim_vm_post != NULL) (*sim_vm_post) (TRUE); } while (staying); @@ -2995,11 +2997,12 @@ if (uptr == NULL) return SCPE_IERR; if (!(uptr->flags & UNIT_ATTABLE)) /* attachable? */ return SCPE_NOATT; -if (!(uptr->flags & UNIT_ATT)) /* not attached? */ +if (!(uptr->flags & UNIT_ATT)) { /* not attached? */ if (sim_switches & SIM_SW_REST) /* restoring? */ return SCPE_OK; /* allow detach */ else - return SCPE_NOATT; /* complain */ + return SCPE_NOATT; /* complain */ + } if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_OK; if (uptr->flags & UNIT_BUF) { @@ -3672,13 +3675,14 @@ for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* flush attached files uptr = dptr->units + j; if ((uptr->flags & UNIT_ATT) && /* attached, */ !(uptr->flags & UNIT_BUF) && /* not buffered, */ - (uptr->fileref)) /* real file, */ + (uptr->fileref)) { /* real file, */ if (uptr->io_flush) /* unit specific flush routine */ uptr->io_flush (uptr); else if (!(uptr->flags & UNIT_RAW) && /* not raw, */ !(uptr->flags & UNIT_RO)) /* not read only? */ fflush (uptr->fileref); + } } } sim_cancel (&sim_step_unit); /* cancel step timer */ diff --git a/sim_disk.c b/sim_disk.c index b5f81539..16623482 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -1028,7 +1028,7 @@ if (created) { } capac = size_function (uptr->fileref); -if (capac && (capac != (t_addr)-1)) +if (capac && (capac != (t_addr)-1)) { if (dontautosize) { if ((capac < (uptr->capac*ctx->capac_factor)) && (DKUF_F_STD != DK_GET_FMT (uptr))) { if (!sim_quiet) { @@ -1043,6 +1043,7 @@ if (capac && (capac != (t_addr)-1)) else if ((capac > (uptr->capac*ctx->capac_factor)) || (DKUF_F_STD != DK_GET_FMT (uptr))) uptr->capac = capac/ctx->capac_factor; + } #if defined (SIM_ASYNCH_IO) sim_disk_set_async (uptr, completion_delay); @@ -1182,11 +1183,11 @@ if (ctx->dptr->dctrl & reason) { if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) { ++same; continue; - } + } if (same > 0) { sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), i-1); same = 0; - } + } group = (((len - i) > 16) ? 16 : (len - i)); for (sidx=oidx=0; sidxdptr->dctrl & reason) { strbuf[sidx] = data[i+sidx]; else strbuf[sidx] = '.'; - } + } outbuf[oidx] = '\0'; strbuf[sidx] = '\0'; sim_debug (reason, ctx->dptr, "%04X%-48s %s\n", i, outbuf, strbuf); - } - if (same > 0) - sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1); + } + if (same > 0) { + sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1); + } } } } @@ -1524,7 +1526,7 @@ return TRUE; static t_stat sim_os_disk_info_raw (FILE *Disk, uint32 *sector_size, uint32 *removable) { DWORD IoctlReturnSize; -#ifndef __GNUC__ +#ifdef IOCTL_STORAGE_GET_DEVICE_NUMBER STORAGE_DEVICE_NUMBER Device; ZeroMemory (&Device, sizeof (Device)); @@ -2192,19 +2194,9 @@ typedef struct _VHD_DynamicDiskHeader { #define VHD_BAT_FREE_ENTRY (0xFFFFFFFF) #define VHD_DATA_BLOCK_ALIGNMENT ((uint64)4096) /* Optimum when underlying storage has 4k sectors */ -static char *VHD_DiskTypes[] = - { - "None", /* 0 */ - "Reserved (deprecated)", /* 1 */ - "Fixed hard disk", /* 2 */ -#define VHD_DT_Fixed 2 - "Dynamic hard disk", /* 3 */ -#define VHD_DT_Dynamic 3 - "Differencing hard disk", /* 4 */ -#define VHD_DT_Differencing 4 - "Reserved (deprecated)", /* 5 */ - "Reserved (deprecated)", /* 6 */ - }; +#define VHD_DT_Fixed 2 /* Fixed hard disk */ +#define VHD_DT_Dynamic 3 /* Dynamic hard disk */ +#define VHD_DT_Differencing 4 /* Differencing hard disk */ static uint32 NtoHl(uint32 value); @@ -2345,13 +2337,14 @@ if (!File) { Return = errno; goto Return_Cleanup; } -if (ModifiedTimeStamp) +if (ModifiedTimeStamp) { if (stat (szVHDPath, &statb)) { Return = errno; goto Return_Cleanup; } else *ModifiedTimeStamp = NtoHl ((uint32)(statb.st_mtime-946684800)); + } position = sim_fsize_ex (File); if (((int64)position) == -1) { Return = errno; @@ -3168,11 +3161,12 @@ for (i=0; i < strlen (FullParentVHDPath); i++) ExpandToFullPath (szVHDPath, FullVHDPath, BytesPerSector); HostPathToVhdPath (FullVHDPath, FullVHDPath, BytesPerSector); for (i=0, RelativeMatch=UpDirectories=0; i 0) && (0 == memcmp(&msg[i], &msg[i-16], 16))) { ++same; @@ -551,8 +552,9 @@ void eth_packet_trace_ex(ETH_DEV* dev, const uint8 *msg, int len, char* txt, int strbuf[sidx] = '\0'; sim_debug(reason, dev->dptr, "%04X%-48s %s\n", i, outbuf, strbuf); } - if (same > 0) + if (same > 0) { sim_debug(reason, dev->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1); + } } } } @@ -666,6 +668,7 @@ void eth_zero(ETH_DEV* dev) static ETH_DEV **eth_open_devices = NULL; static int eth_open_device_count = 0; +#if defined (USE_NETWORK) || defined (USE_SHARED) static void _eth_add_to_open_list (ETH_DEV* dev) { eth_open_devices = realloc(eth_open_devices, (eth_open_device_count+1)*sizeof(*eth_open_devices)); @@ -684,6 +687,7 @@ for (i=0; i= host_len) return SCPE_ARG; /* no room */ else strcpy (host, hostp); + } if (validate_addr) { struct addrinfo *ai_host, *ai_validate, *ai; t_stat status; @@ -575,7 +576,6 @@ WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD (2, 2); - err = WSAStartup (wVersionRequested, &wsaData); /* start Winsock */ if (err != 0) printf ("Winsock: startup error %d\n", err); @@ -583,9 +583,16 @@ if (err != 0) load_ws2 (); #endif /* endif AF_INET6 */ #else /* Use native addrinfo APIs */ +#if defined(AF_INET6) p_getaddrinfo = (getaddrinfo_func)getaddrinfo; p_getnameinfo = (getnameinfo_func)getnameinfo; p_freeaddrinfo = (freeaddrinfo_func)freeaddrinfo; +#else + /* Native APIs not available, connect stubs */ + p_getaddrinfo = (getaddrinfo_func)s_getaddrinfo; + p_getnameinfo = (getnameinfo_func)s_getnameinfo; + p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; +#endif /* endif AF_INET6 */ #endif /* endif _WIN32 */ #if defined (SIGPIPE) signal (SIGPIPE, SIG_IGN); /* no pipe signals */ diff --git a/sim_tape.c b/sim_tape.c index 91cf3032..3b186b95 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -496,11 +496,11 @@ if (ctx->dptr->dctrl & reason) { if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) { ++same; continue; - } + } if (same > 0) { sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), i-1); same = 0; - } + } group = (((len - i) > 16) ? 16 : (len - i)); for (sidx=oidx=0; sidxdptr->dctrl & reason) { strbuf[sidx] = data[i+sidx]; else strbuf[sidx] = '.'; - } + } outbuf[oidx] = '\0'; strbuf[sidx] = '\0'; sim_debug (reason, ctx->dptr, "%04X%-48s %s\n", i, outbuf, strbuf); - } - if (same > 0) - sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1); + } + if (same > 0) { + sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1); + } } } } @@ -1640,8 +1641,9 @@ t_stat sim_tape_rewind (UNIT *uptr) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; -if (uptr->flags & UNIT_ATT) +if (uptr->flags & UNIT_ATT) { sim_debug (ctx->dbit, ctx->dptr, "sim_tape_rewind(unit=%d)\n", uptr-ctx->dptr->units); + } uptr->pos = 0; MT_CLR_PNU (uptr); return MTSE_OK; @@ -1868,10 +1870,14 @@ t_stat sim_tape_show_capac (FILE *st, UNIT *uptr, int32 val, void *desc) if (uptr->capac) { if (uptr->capac >= (t_addr) 1000000) fprintf (st, "capacity=%dMB", (uint32) (uptr->capac / ((t_addr) 1000000))); - else if (uptr->capac >= (t_addr) 1000) - fprintf (st, "capacity=%dKB", (uint32) (uptr->capac / ((t_addr) 1000))); - else fprintf (st, "capacity=%dB", (uint32) uptr->capac); + else { + if (uptr->capac >= (t_addr) 1000) + fprintf (st, "capacity=%dKB", (uint32) (uptr->capac / ((t_addr) 1000))); + else + fprintf (st, "capacity=%dB", (uint32) uptr->capac); + } } -else fprintf (st, "unlimited capacity"); +else + fprintf (st, "unlimited capacity"); return SCPE_OK; } diff --git a/sim_timer.c b/sim_timer.c index b98ce47b..5bea3eff 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -896,7 +896,7 @@ if (sim_is_active_bool (uptr)) /* already active? */ inst_per_sec = sim_timer_inst_per_sec (); inst_delay = (int32)((inst_per_sec*usec_delay)/1000000.0); #if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_CLOCKS) -if ((sim_calb_tmr == -1) || /* if No timer initialized +if ((sim_calb_tmr == -1) || /* if No timer initialized */ (inst_delay < rtc_currd[sim_calb_tmr]) || /* or sooner than next clock tick? */ (rtc_elapsed[sim_calb_tmr] < sim_idle_stable) || /* or not idle stable yet */ (!(sim_asynch_enabled && sim_asynch_timer))) { /* or asynch disabled */ From 60a0881c710810d50cc1f8cbc9b62edfa543a62c Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 15 Dec 2012 07:58:11 -0800 Subject: [PATCH 54/63] Fixes after Dave Bryan's testing. --- sim_console.c | 2 +- sim_tmxr.c | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/sim_console.c b/sim_console.c index 649d4e2e..40813bab 100644 --- a/sim_console.c +++ b/sim_console.c @@ -665,7 +665,7 @@ while (*cptr != 0) { /* do all mods */ return r; } } - return SCPE_NOPARAM; + return SCPE_ARG; } } return SCPE_OK; diff --git a/sim_tmxr.c b/sim_tmxr.c index 09543657..70041bc2 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1133,7 +1133,7 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ /* Examine new data, remove TELNET cruft before making input available */ - if (!lp->notelnet) /* Are we looking for telnet interpretation? */ + if (!lp->notelnet) { /* Are we looking for telnet interpretation? */ for (; j < lp->rxbpi; ) { /* loop thru char */ signed char tmp = lp->rxb[j]; /* get char */ switch (lp->tsta) { /* case tlnt state */ @@ -1228,8 +1228,10 @@ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ break; } /* end case state */ } /* end for char */ - if (nbytes != (lp->rxbpi-lp->rxbpr)) + if (nbytes != (lp->rxbpi-lp->rxbpr)) { tmxr_debug (TMXR_DBG_RCV, lp, "Remaining", &(lp->rxb[lp->rxbpi]), lp->rxbpi-lp->rxbpr); + } + } } /* end else nbytes */ } /* end for lines */ for (i = 0; i < mp->lines; i++) { /* loop thru lines */ @@ -1898,9 +1900,9 @@ pthread_mutex_lock (&sim_tmxr_poll_lock); #endif for (i=0; i= 0) fprintf (st, "line %d: ", ln); -if ((lp->conn) || (lp->connecting)) /* tcp connection? */ +if ((lp->conn) || (lp->connecting)) { /* tcp connection? */ if (lp->destination) /* remote connection? */ fprintf (st, "Remote port %s\n", lp->destination);/* print port name */ else /* incoming connection */ fprintf (st, "IP address %s\n", lp->ipad); + } if (lp->port) fprintf (st, "Listening on port %s\n", lp->port); /* print port name */ @@ -2149,18 +2152,20 @@ static const char *enab = "on"; static const char *dsab = "off"; if (ln >= 0) - fprintf (st, "line %d:\n", ln); + fprintf (st, "line %d:", ln); if ((!lp->conn) && (!lp->connecting) && (!lp->serport)) - fprintf (st, "line disconnected\n"); + fprintf (st, " not connected\n"); else { - if ((lp->rxcnt) || (!lp->rcve)) - fprintf (st, " input (%s) queued/total = %d/%d\n", - (lp->rcve? enab: dsab), + fprintf (st, "\n"); + fprintf (st, " input (%s)", (lp->rcve? enab: dsab)); + if (lp->rxcnt) + fprintf (st, " queued/total = %d/%d", tmxr_rqln (lp), lp->rxcnt); - if (lp->txcnt || lp->txbpi || (!lp->xmte)) - fprintf (st, " output (%s) queued/total = %d/%d\n", - (lp->xmte? enab: dsab), + fprintf (st, "\n output (%s)", (lp->xmte? enab: dsab)); + if (lp->txcnt || lp->txbpi) + fprintf (st, " queued/total = %d/%d", tmxr_tqln (lp), lp->txcnt); + fprintf (st, "\n"); } if (lp->txbfd) fprintf (st, " output buffer size = %d\n", lp->txbsz); From 06b80cf53ca4a9c1fb6ddfd78e7f8386062759f2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 15 Dec 2012 09:40:30 -0800 Subject: [PATCH 55/63] Fixed makefile to not always include network components when compiling with MinGW and added ability to pass arbitrary arguments when invoking gcc with the batch files --- build_mingw.bat | 2 +- build_mingw_ether.bat | 2 +- build_mingw_noasync.bat | 2 +- makefile | 13 ++++++------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/build_mingw.bat b/build_mingw.bat index ff738d41..a87e8c0d 100644 --- a/build_mingw.bat +++ b/build_mingw.bat @@ -17,4 +17,4 @@ if ERRORLEVEL 1 path C:\MinGW\bin;%path% if not exist BIN mkdir BIN gcc -v 1>NUL 2>NUL if ERRORLEVEL 1 echo "MinGW Environment Unavailable" -mingw32-make WIN32=1 -f makefile %1 %2 %3 %4 +mingw32-make WIN32=1 -f makefile %* diff --git a/build_mingw_ether.bat b/build_mingw_ether.bat index 51ec0bfd..e50f29fd 100644 --- a/build_mingw_ether.bat +++ b/build_mingw_ether.bat @@ -13,4 +13,4 @@ if ERRORLEVEL 1 path C:\MinGW\bin;%path% if not exist BIN mkdir BIN gcc -v 1>NUL 2>NUL if ERRORLEVEL 1 echo "MinGW Environment Unavailable" -mingw32-make WIN32=1 USE_NETWORK=1 -f makefile %1 %2 %3 %4 +mingw32-make WIN32=1 USE_NETWORK=1 -f makefile %* diff --git a/build_mingw_noasync.bat b/build_mingw_noasync.bat index 04f4a19f..a53eab53 100644 --- a/build_mingw_noasync.bat +++ b/build_mingw_noasync.bat @@ -12,4 +12,4 @@ if ERRORLEVEL 1 path C:\MinGW\bin;%path% if not exist BIN mkdir BIN gcc -v 1>NUL 2>NUL if ERRORLEVEL 1 echo "MinGW Environment Unavailable" -mingw32-make WIN32=1 NOASYNCH=1 -f makefile %1 %2 %3 %4 +mingw32-make WIN32=1 NOASYNCH=1 -f makefile %* diff --git a/makefile b/makefile index 3f8a5703..74edb538 100644 --- a/makefile +++ b/makefile @@ -239,7 +239,7 @@ ifeq ($(WIN32),) #*nix Environments (&& cygwin) # Given we have libpcap components, consider other network connections as well ifneq (,$(call find_lib,vdeplug)) # libvdeplug requires the use of the OS provided libpcap - ifeq (,$(findstring usr/local,$(NETWORK_CCDEFS))) + ifeq (,$(findstring usr/local,$(NETWORK_CCDEFS))) ifneq (,$(call find_include,libvdeplug)) # Provide support for vde networking NETWORK_CCDEFS += -DUSE_VDE_NETWORK @@ -293,19 +293,17 @@ else endif endif ifeq (pcap,$(shell if exist ..\windows-build\winpcap\Wpdpack\include\pcap.h echo pcap)) - PCAP_CCDEFS = -I../windows-build/winpcap/Wpdpack/include -I$(GCC_Path)..\include\ddk -DUSE_SHARED NETWORK_LDFLAGS = - NETWORK_OPT = -DUSE_SHARED + NETWORK_OPT = -DUSE_SHARED -I../windows-build/winpcap/Wpdpack/include -I$(GCC_Path)..\include\ddk NETWORK_FEATURES = - dynamic networking support using windows-build provided libpcap components else ifeq (pcap,$(shell if exist $(dir $(GCC_Path))..\include\pcap.h echo pcap)) - PCAP_CCDEFS = -DUSE_SHARED -I$(GCC_Path)..\include\ddk NETWORK_LDFLAGS = - NETWORK_OPT = -DUSE_SHARED + NETWORK_OPT = -DUSE_SHARED -I$(GCC_Path)..\include\ddk NETWORK_FEATURES = - dynamic networking support using libpcap components found in the MinGW directories endif endif - OS_CCDEFS = -fms-extensions $(PTHREADS_CCDEFS) $(PCAP_CCDEFS) + OS_CCDEFS = -fms-extensions $(PTHREADS_CCDEFS) OS_LDFLAGS = -lm -lwsock32 -lwinmm $(PTHREADS_LDFLAGS) EXE = .exe ifneq (binexists,$(shell if exist BIN echo binexists)) @@ -454,7 +452,8 @@ PDP11 = ${PDP11D}/pdp11_fp.c ${PDP11D}/pdp11_cpu.c ${PDP11D}/pdp11_dz.c \ ${PDP11D}/pdp11_rh.c ${PDP11D}/pdp11_tu.c ${PDP11D}/pdp11_cpumod.c \ ${PDP11D}/pdp11_cr.c ${PDP11D}/pdp11_rf.c ${PDP11D}/pdp11_dl.c \ ${PDP11D}/pdp11_ta.c ${PDP11D}/pdp11_rc.c ${PDP11D}/pdp11_kg.c \ - ${PDP11D}/pdp11_ke.c ${PDP11D}/pdp11_dc.c ${PDP11D}/pdp11_io_lib.c + ${PDP11D}/pdp11_ke.c ${PDP11D}/pdp11_dc.c ${PDP11D}/pdp11_dmc.c \ + ${PDP11D}/pdp11_io_lib.c PDP11_OPT = -DVM_PDP11 -I ${PDP11D} ${NETWORK_OPT} From d955c383e9334e2ed35b9144cbd7020acdc63e74 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 15 Dec 2012 09:41:13 -0800 Subject: [PATCH 56/63] Fixed compiler warnings and errors when compiling with MinGW --- sim_disk.c | 4 +++- sim_sock.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 16623482..f9a35007 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -1286,6 +1286,7 @@ if ((dwStatus >= ERROR_INVALID_STARTING_CODESEG) && (dwStatus <= ERROR_INFLOOP_I errno = EINVAL; } #include +#if !defined(__GNUC__) struct _device_type { int32 Type; char *desc; @@ -1376,6 +1377,7 @@ for (i=0; DeviceTypes[i].desc; i++) return DeviceTypes[i].desc; return "Unknown"; } +#endif static t_stat sim_os_disk_implemented_raw (void) { @@ -1526,7 +1528,7 @@ return TRUE; static t_stat sim_os_disk_info_raw (FILE *Disk, uint32 *sector_size, uint32 *removable) { DWORD IoctlReturnSize; -#ifdef IOCTL_STORAGE_GET_DEVICE_NUMBER +#if !defined(__GNUC__) STORAGE_DEVICE_NUMBER Device; ZeroMemory (&Device, sizeof (Device)); diff --git a/sim_sock.c b/sim_sock.c index c1c2d511..f2648616 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -164,14 +164,14 @@ static int WSAAPI s_getaddrinfo (const char *hostname, struct addrinfo **res) { struct hostent *he; -struct servent *se; +struct servent *se = NULL; struct sockaddr_in *sin; struct addrinfo *result = NULL; struct addrinfo *ai, *lai; struct addrinfo dhints; struct in_addr ipaddr; struct in_addr *fixed[2]; -struct in_addr **ips; +struct in_addr **ips = NULL; struct in_addr **ip; const char *cname = NULL; int port = 0; From 6cabdb9f9f0ae781516f85e6909876faff470d6f Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 15 Dec 2012 11:40:20 -0800 Subject: [PATCH 57/63] Fixed duplicate logging output when output buffers are full and potential pauses in console output (reported by Mark Benson) --- sim_console.c | 3 +-- sim_tmxr.c | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sim_console.c b/sim_console.c index 40813bab..edce24d6 100644 --- a/sim_console.c +++ b/sim_console.c @@ -185,8 +185,7 @@ if (sim_con_tmxr.master == 0) /* not Telnet? done */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ sim_activate_after(uptr, 1000000); /* check again in 1 second */ -if (sim_con_ldsc.xmte == 0) /* xmt disabled? */ - tmxr_send_buffered_data (&sim_con_ldsc); /* try to flush buffered data */ +tmxr_send_buffered_data (&sim_con_ldsc); /* try to flush any buffered data */ return SCPE_OK; } diff --git a/sim_tmxr.c b/sim_tmxr.c index 70041bc2..4b5f8c69 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1272,8 +1272,6 @@ if ((lp->conn == 0) && /* no conn & not buffere ++lp->txdrp; /* lost */ return SCPE_LOST; } -if (lp->txlog) /* log if available */ - fputc (chr, lp->txlog); tmxr_debug_trace_line (lp, "tmxr_putc_ln()"); #define TXBUF_AVAIL(lp) (lp->txbsz - tmxr_tqln (lp)) #define TXBUF_CHAR(lp, c) { \ @@ -1288,6 +1286,8 @@ if ((lp->txbfd) || (TXBUF_AVAIL(lp) > 1)) { /* room for char (+ IAC) TXBUF_CHAR (lp, chr); /* buffer char & adv pointer */ if ((!lp->txbfd) && (TXBUF_AVAIL (lp) <= TMXR_GUARD))/* near full? */ lp->xmte = 0; /* disable line */ + if (lp->txlog) /* log if available */ + fputc (chr, lp->txlog); return SCPE_OK; /* char sent */ } ++lp->txdrp; lp->xmte = 0; /* no room, dsbl line */ From beeb5ae09e051de0580c3c3030f8bff2d98ea2ff Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 16 Dec 2012 06:23:18 -0800 Subject: [PATCH 58/63] Cleaned up the formatting of SHOW MULTIPLEXER output based on input from Dave Bryan --- sim_tmxr.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/sim_tmxr.c b/sim_tmxr.c index 4b5f8c69..f19d7950 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1976,14 +1976,16 @@ else { fprintf(st, ", sessions=%d\n", mp->sessions); for (j = 0; j < mp->lines; j++) { lp = mp->ldsc + j; - fprintf (st, "Line: %d", j); - if (lp->uptr && (lp->uptr != lp->mp->uptr)) - fprintf (st, " - Unit: %s\n", sim_uname (lp->uptr)); - else - fprintf (st, "\n"); + if (mp->lines > 1) { + fprintf (st, "Line: %d", j); + if (lp->uptr && (lp->uptr != lp->mp->uptr)) + fprintf (st, " - Unit: %s\n", sim_uname (lp->uptr)); + else + fprintf (st, "\n"); + } if ((!lp->conn) && (!lp->connecting) && (!lp->serport) && (!lp->master)) continue; - tmxr_fconns (st, lp, j); + tmxr_fconns (st, lp, -1); tmxr_fstats (st, lp, -1); } } @@ -2114,16 +2116,16 @@ if (ln >= 0) if ((lp->conn) || (lp->connecting)) { /* tcp connection? */ if (lp->destination) /* remote connection? */ - fprintf (st, "Remote port %s\n", lp->destination);/* print port name */ + fprintf (st, "Connection to remote port %s\n", lp->destination);/* print port name */ else /* incoming connection */ - fprintf (st, "IP address %s\n", lp->ipad); + fprintf (st, "Connection from IP address %s\n", lp->ipad); } if (lp->port) fprintf (st, "Listening on port %s\n", lp->port); /* print port name */ if (lp->serport) /* serial connection? */ - fprintf (st, "Serial port %s\n", lp->destination); /* print port name */ + fprintf (st, "Connected to serial port %s\n", lp->destination); /* print port name */ if (lp->cnms) { ctime = (sim_os_msec () - lp->cnms) / 1000; @@ -2152,11 +2154,12 @@ static const char *enab = "on"; static const char *dsab = "off"; if (ln >= 0) - fprintf (st, "line %d:", ln); + fprintf (st, "Line %d:", ln); if ((!lp->conn) && (!lp->connecting) && (!lp->serport)) fprintf (st, " not connected\n"); else { - fprintf (st, "\n"); + if (ln >= 0) + fprintf (st, "\n"); fprintf (st, " input (%s)", (lp->rcve? enab: dsab)); if (lp->rxcnt) fprintf (st, " queued/total = %d/%d", From c87c747ed7bb4366253726725003c358cdf5e0b6 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 16 Dec 2012 06:24:36 -0800 Subject: [PATCH 59/63] Compiler warning cleanup --- VAX/vax_cpu.c | 5 +++-- VAX/vax_mmu.c | 14 ++++++++++---- sim_ether.c | 8 ++++++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index b751e352..23d239fb 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -1946,7 +1946,8 @@ for ( ;; ) { temp = CC_V; SET_TRAP (TRAP_DIVZRO); } - else if ((op0 == LMASK) && (op1 == LSIGN)) { /* overflow? */ + else if ((((uint32)op0) == LMASK) && + (((uint32)op1) == LSIGN)) { /* overflow? */ r = op1; temp = CC_V; INTOV; @@ -3222,7 +3223,7 @@ if ((mc != 0) && !get_yn ("Really truncate memory [N]?", FALSE)) nM = (uint32 *) calloc (val >> 2, sizeof (uint32)); if (nM == NULL) return SCPE_MEM; -clim = (uint32) ((((uint32) val) < MEMSIZE)? val: MEMSIZE); +clim = (((uint32) val) < MEMSIZE)? (uint32)val: MEMSIZE; for (i = 0; i < clim; i = i + 4) nM[i >> 2] = M[i >> 2]; free (M); diff --git a/VAX/vax_mmu.c b/VAX/vax_mmu.c index 79175c41..d86ba825 100644 --- a/VAX/vax_mmu.c +++ b/VAX/vax_mmu.c @@ -177,7 +177,10 @@ if (mapen) { /* mapping on? */ xpte = fill (va, lnt, acc, NULL); /* fill if needed */ pa = (xpte.pte & TLB_PFN) | off; /* get phys addr */ } -else pa = va & PAMASK; +else { + pa = va & PAMASK; + off = 0; + } if ((pa & (lnt - 1)) == 0) { /* aligned? */ if (lnt >= L_LONG) /* long, quad? */ return ReadL (pa); @@ -185,7 +188,7 @@ if ((pa & (lnt - 1)) == 0) { /* aligned? */ return ReadW (pa); return ReadB (pa); /* byte */ } -if (mapen && ((off + lnt) > VA_PAGSIZE)) { /* cross page? */ +if (mapen && ((uint32)(off + lnt) > VA_PAGSIZE)) { /* cross page? */ vpn = VA_GETVPN (va + lnt); /* vpn 2nd page */ tbi = VA_GETTBI (vpn); xpte = (va & VA_S0)? stlb[tbi]: ptlb[tbi]; /* access tlb */ @@ -239,7 +242,10 @@ if (mapen) { xpte = fill (va, lnt, acc, NULL); pa = (xpte.pte & TLB_PFN) | off; } -else pa = va & PAMASK; +else { + pa = va & PAMASK; + off = 0; + } if ((pa & (lnt - 1)) == 0) { /* aligned? */ if (lnt >= L_LONG) /* long, quad? */ WriteL (pa, val); @@ -248,7 +254,7 @@ if ((pa & (lnt - 1)) == 0) { /* aligned? */ else WriteB (pa, val); /* byte */ return; } -if (mapen && ((off + lnt) > VA_PAGSIZE)) { +if (mapen && ((uint32)(off + lnt) > VA_PAGSIZE)) { vpn = VA_GETVPN (va + 4); tbi = VA_GETTBI (vpn); xpte = (va & VA_S0)? stlb[tbi]: ptlb[tbi]; /* access tlb */ diff --git a/sim_ether.c b/sim_ether.c index 4cdcc58b..445b172c 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -2217,6 +2217,7 @@ key ^= 0x3f; return (hash[key>>3] & (1 << (key&0x7))); } +#if 0 static int _eth_hash_validate(ETH_MAC *MultiCastList, int count, ETH_MULTIHASH hash) { @@ -2268,6 +2269,7 @@ ETH_MULTIHASH thash = {0x01, 0x40, 0x00, 0x00, 0x48, 0x88, 0x40, 0x00}; _eth_hash_validate(tMacs, sizeof(tMacs)/sizeof(tMacs[0]), thash); } +#endif /* The IP header */ struct IPHeader { @@ -2935,10 +2937,12 @@ if (dev->dptr->dctrl & dev->dbit) { eth_mac_fmt(&dev->filter_address[i], mac); sim_debug(dev->dbit, dev->dptr, " Addr[%d]: %s\n", i, mac); } - if (dev->all_multicast) + if (dev->all_multicast) { sim_debug(dev->dbit, dev->dptr, "All Multicast\n"); - if (dev->promiscuous) + } + if (dev->promiscuous) { sim_debug(dev->dbit, dev->dptr, "Promiscuous\n"); + } } /* setup BPF filters and other fields to minimize packet delivery */ From 4a3bf9ee1775b60816f300ba9f501e6be845b3bb Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 16 Dec 2012 06:42:51 -0800 Subject: [PATCH 60/63] Compiler warning cleanup --- sim_disk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim_disk.c b/sim_disk.c index f9a35007..6986332c 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -1540,7 +1540,7 @@ if (DeviceIoControl((HANDLE)Disk, /* handle to volume */ (DWORD) sizeof(Device), /* size of output buffer */ (LPDWORD) &IoctlReturnSize, /* number of bytes returned */ (LPOVERLAPPED) NULL)) /* OVERLAPPED structure */ - printf ("Device OK - Type: %s, Number: %d\n", _device_type_name (Device.DeviceType), Device.DeviceNumber); + printf ("Device OK - Type: %s, Number: %d\n", _device_type_name (Device.DeviceType), (int)Device.DeviceNumber); #endif if (sector_size) From cd0ef35bbf303625236b6922b08f9abf86135099 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 16 Dec 2012 07:03:19 -0800 Subject: [PATCH 61/63] Added command alias SHOW MUX for SHOW MULTIPLEXOR. To avoid collision with simulators which may have devices named MUX, the device names/units are examined prior to the standard SHOW arguments. Simulators which have a device named MUX can't use the SHOW MUX alias. --- scp.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scp.c b/scp.c index 434f7cc8..4c33082f 100644 --- a/scp.c +++ b/scp.c @@ -2075,6 +2075,7 @@ static SHTAB show_glob_tab[] = { { "ETHERNET", ð_show_devices, 0 }, { "SERIAL", &sim_show_serial, 0 }, { "MULTIPLEXER", &tmxr_show_open_devices, 0 }, + { "MUX", &tmxr_show_open_devices, 0 }, { "ON", &show_on, 0 }, { NULL, NULL, 0 } }; @@ -2096,8 +2097,6 @@ GET_SWITCHES (cptr); /* get switches */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ -if ((shptr = find_shtab (show_glob_tab, gbuf))) /* global? */ - return shptr->action (ofile, NULL, NULL, shptr->arg, cptr); if ((dptr = find_dev (gbuf))) { /* device match? */ uptr = dptr->units; /* first unit */ @@ -2112,7 +2111,10 @@ else if ((dptr = find_unit (gbuf, &uptr))) { /* unit match? */ shtb = show_unit_tab; /* global table */ lvl = MTAB_VUN; /* unit match */ } -else return SCPE_NXDEV; /* no match */ +else if ((shptr = find_shtab (show_glob_tab, gbuf))) /* global? */ + return shptr->action (ofile, NULL, NULL, shptr->arg, cptr); +else + return SCPE_NXDEV; /* no match */ if (*cptr == 0) { /* now eol? */ return (lvl == MTAB_VDV)? From 18b6ab89d04f8f1fd1ef3cabca5366e62193f2e4 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 16 Dec 2012 20:18:54 -0800 Subject: [PATCH 62/63] Fixing compiler complaints with MinGW and adding support for RAW disk access when compiling with MinGW on windows. --- sim_disk.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 6986332c..0066cad2 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -1285,8 +1285,12 @@ if ((dwStatus >= ERROR_INVALID_STARTING_CODESEG) && (dwStatus <= ERROR_INFLOOP_I } errno = EINVAL; } +#if defined(__GNUC__) +#include +#include +#else #include -#if !defined(__GNUC__) +#endif struct _device_type { int32 Type; char *desc; @@ -1377,7 +1381,6 @@ for (i=0; DeviceTypes[i].desc; i++) return DeviceTypes[i].desc; return "Unknown"; } -#endif static t_stat sim_os_disk_implemented_raw (void) { @@ -1528,7 +1531,6 @@ return TRUE; static t_stat sim_os_disk_info_raw (FILE *Disk, uint32 *sector_size, uint32 *removable) { DWORD IoctlReturnSize; -#if !defined(__GNUC__) STORAGE_DEVICE_NUMBER Device; ZeroMemory (&Device, sizeof (Device)); @@ -1541,7 +1543,6 @@ if (DeviceIoControl((HANDLE)Disk, /* handle to volume */ (LPDWORD) &IoctlReturnSize, /* number of bytes returned */ (LPOVERLAPPED) NULL)) /* OVERLAPPED structure */ printf ("Device OK - Type: %s, Number: %d\n", _device_type_name (Device.DeviceType), (int)Device.DeviceNumber); -#endif if (sector_size) *sector_size = 512; From 78b8d62942efe5484d2eeab49ddd0e374e370f04 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 17 Dec 2012 14:18:28 -0800 Subject: [PATCH 63/63] Added DMC11 to PDP11 simulator (from Rob Jarratt) --- PDP11/pdp11_defs.h | 6 ++++++ PDP11/pdp11_sys.c | 5 +++++ Visual Studio Projects/PDP11.vcproj | 8 ++++++++ descrip.mms | 3 ++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/PDP11/pdp11_defs.h b/PDP11/pdp11_defs.h index 8f2d07ab..bf79a4f7 100644 --- a/PDP11/pdp11_defs.h +++ b/PDP11/pdp11_defs.h @@ -662,6 +662,8 @@ typedef struct pdp_dib DIB; #define INT_V_TU 15 #define INT_V_RF 16 #define INT_V_RC 17 +#define INT_V_DMCRX 18 +#define INT_V_DMCTX 19 #define INT_V_PIR4 0 /* BR4 */ #define INT_V_TTI 1 @@ -705,6 +707,8 @@ typedef struct pdp_dib DIB; #define INT_TU (1u << INT_V_TU) #define INT_RF (1u << INT_V_RF) #define INT_RC (1u << INT_V_RC) +#define INT_DMCRX (1u << INT_V_DMCRX) +#define INT_DMCTX (1u << INT_V_DMCTX) #define INT_PIR4 (1u << INT_V_PIR4) #define INT_TTI (1u << INT_V_TTI) #define INT_TTO (1u << INT_V_TTO) @@ -751,6 +755,8 @@ typedef struct pdp_dib DIB; #define IPL_TU 5 #define IPL_RF 5 #define IPL_RC 5 +#define IPL_DMCRX 5 +#define IPL_DMCTX 5 #define IPL_PTR 4 #define IPL_PTP 4 #define IPL_TTI 4 diff --git a/PDP11/pdp11_sys.c b/PDP11/pdp11_sys.c index b0b358cf..265b011c 100644 --- a/PDP11/pdp11_sys.c +++ b/PDP11/pdp11_sys.c @@ -102,6 +102,7 @@ extern DEVICE xq_dev, xqb_dev; extern DEVICE xu_dev, xub_dev; extern DEVICE ke_dev; extern DEVICE kg_dev; +extern DEVICE dmc_dev[]; extern UNIT cpu_unit; extern REG cpu_reg[]; extern uint16 *M; @@ -166,6 +167,10 @@ DEVICE *sim_devices[] = { &xub_dev, &ke_dev, &kg_dev, + &dmc_dev[0], + &dmc_dev[1], + &dmc_dev[2], + &dmc_dev[3], NULL }; diff --git a/Visual Studio Projects/PDP11.vcproj b/Visual Studio Projects/PDP11.vcproj index 811accda..030a8c27 100644 --- a/Visual Studio Projects/PDP11.vcproj +++ b/Visual Studio Projects/PDP11.vcproj @@ -215,6 +215,10 @@ RelativePath="..\PDP11\pdp11_dl.c" > + + @@ -412,6 +416,10 @@ RelativePath="..\PDP11\pdp11_defs.h" > + + diff --git a/descrip.mms b/descrip.mms index ca932e0b..e38a742a 100644 --- a/descrip.mms +++ b/descrip.mms @@ -523,7 +523,8 @@ PDP11_SOURCE1 = $(PDP11_DIR)PDP11_FP.C,$(PDP11_DIR)PDP11_CPU.C,\ $(PDP11_DIR)PDP11_RX.C,$(PDP11_DIR)PDP11_STDDEV.C,\ $(PDP11_DIR)PDP11_SYS.C,$(PDP11_DIR)PDP11_TC.C, \ $(PDP11_DIR)PDP11_CPUMOD.C,$(PDP11_DIR)PDP11_CR.C,\ - $(PDP11_DIR)PDP11_TA.C,$(PDP11_DIR)PDP11_IO_LIB.C + $(PDP11_DIR)PDP11_TA.C,$(PDP11_DIR)PDP11_DMC.C + $(PDP11_DIR)PDP11_IO_LIB.C PDP11_LIB2 = $(LIB_DIR)PDP11L2-$(ARCH).OLB PDP11_SOURCE2 = $(PDP11_DIR)PDP11_TM.C,$(PDP11_DIR)PDP11_TS.C,\ $(PDP11_DIR)PDP11_IO.C,$(PDP11_DIR)PDP11_RQ.C,\