werner@rascal.ics.utexas.edu (Werner Uhrig) (06/01/90)
[MacLayers 1.00 - part 1 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # README # layers.1 # macbput.1 # MacLayers.doc # # This archive created: Thu May 31 21:58:05 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'README'" '(2241 characters)' if test -f 'README' then echo shar: will not over-write existing file "'README'" else sed 's/^X//' << \SHAR_EOF > 'README' X Layers 1.0 Release X X *** CONTENTS *** X XThe following files are provided with the MacLayers package: X X README - this file X layers.1 - the layers command manual page X makefile - the layers makefile X layers.h - Unix source for the layers command X layers.c - ditto X protocol.c - ditto X layersize.c - Unix source for the layersize command X layertitle.c - Unix source for the layertitle command X MacLayers.sit.Hqx - the MacLayers Application download file X MacLayers.doc - the MacLayers User's Manual X macbput.c - a downloading utility X macbput.1 - the macbput command manual page X XThe MacLayers.sit.Hqx file is in hexbin format. After downloading it must be Xprocessed with a Stuffit compatible utility to produce the MacLayers Xapplication. X XMacbput is a public domain download utility for downloading macbinary files. XMacbinary files allow downloading to correctly set the Macintosh file creation Xdate and file last used date. The version with this package has an important Xbug fixed. X X X *** SUPPORTED SYSTEMS *** X XMacLayers has been successfully installed on the following systems: X X SunOS 4.0.3 X SunOS 3.2 X Sequent DYNIX 3.0.12 (#DEFINE SEQUENT) X Sequent DYNIX 3.0.4 (#DEFINE SEQUENT) X XMacLayers has failed to install on these systems: X X AIX 2.2.1 on IBM RT Unsupported ioctls X X X *** INSTALLATION *** X XThere are two ways to install the layers system: X X make install X X or X make installnopriv X XThe default is to install the 'layers' command set-uid which allows it to Xupdate /etc/utmp and perform chown/chmod on its allocated pseudo-ttys. XThis enables commands like 'who' to know about the presence of layers users Xand commands like 'write' and 'talk' to communicate with them. This is not Xa mandatory requirement however and the layers system will otherwise function. X XFor set-uid installers (especially Sequent users) there are a few customizing Xparameters which may be of interest at the front of layers.c. X X *end of document* SHAR_EOF if test 2241 -ne "`wc -c < 'README'`" then echo shar: error transmitting "'README'" '(should have been 2241 characters)' fi fi # end of overwriting check echo shar: extracting "'layers.1'" '(4858 characters)' if test -f 'layers.1' then echo shar: will not over-write existing file "'layers.1'" else sed 's/^X//' << \SHAR_EOF > 'layers.1' X.TH LAYERS l "17 March 1990" X.SH NAME X.PP Xlayers, layertitle \- Protocol for MacLayers Multiwindow Terminal Emulator for Unix X.SH SYNOPSIS Xlayers - start window protocol X.LP Xlayers [-l] [command] - create new window X.LP Xlayertitle string - retitle current layers window X.IX "layers" "start layers protocol, create new window" X.IX "layertitle" "rename current layers window" X.SH DESCRIPTION X.PP XMacLayers provides multi-window capability for a Macintosh (greater than 128K) Xconnected to a host UNIX(TM) system with sockets support. Each window may be Xassociated with a shell, login to a different host, or an individual Xcommand. Complete facilities are available for controlling the window Xand the associated host processes attached thereto. X.PP XTo use MacLayers, you must have the MacLayers vt-100 terminal emulation Xprogram on a Macintosh and the layers protocol program installed on your XUnix host. X.SH MACLAYERS OPERATION X.PP XThe Maclayers Application on the Mac starts up as a garden variety Xhost-to-terminal vt-100 emulator. (As such you can run it with any Xhost, not just a Unix machine.) Baud rate and other configurations are set Xby selections in the Control Menu. X.PP XEnter the X.I layers Xcommand to the Unix host using no options or parameters Xto start the layers protocol. The initial terminal window will be closed Xand replaced with a layers protocol window. A shell is run in this Xwindow, either /bin/sh or the shell indicated by your $SHELL variable. X.PP XYou can start a new shell layer by picking "New" on the Layers menu. You can Xalso start a new layer window by issuing the X.I layers Xcommand to a Xshell layer window. If you use no operands then the new layer window Xwill be a shell. However, you can specify any command you wish by Xsimply adding it as a parameter. Examples: "layers vi testfile.c", X"layers telnet earth." X.PP XIf you are specifying a shell then you can also elect to have it be a Xlogin shell by adding a -l option. This allows broadcast/write/talk Xcapabilities for that window. The initial layer window shell defaults Xto a login shell. X.PP XWhen a layer process group terminates its window is automatically closed. XMacLayers exits layers mode when the last (or only) layer window is closed. XYou may also use the Layers Menu "Shutdown" to terminate layers mode. XYou cannot quit the MacLayers application while in layers mode but must XShutdown the multi-window mode first. X.PP XYou can abort host X.I layers Xby using the Control Menu "Abort Host Layers" Xitem which is always available. This may be necessary if your Mac Xloses contact with the host and you restart the MacLayers application at Xwhich time the host would still be in multi-window layers mode while Xthe application would not. If the MacLayers application terminates due Xto a non-recoverable problem it will always issue an order to terminate Xlayers mode on the host before returning to the Finder. X.SH XMODEM DOWNLOADING X.PP XMacLayers has a download facility for downloading XMODEM MacTerminal X('macput' command) and MacBinary ('macbput' command) files. Straight Xvanilla XMODEM is not supported. XOnly one window can be doing a XMODEM download at any one time. XDownloading does not effect any other MacLayers operations so you can Xfreely use any other windows or applications (with MultiFinder) while Xa download is in progress. Remember though that the topmost window Xreceives the highest priority data transfer from the host. So for the Xfastest downloading keep the XMODEM layer window the active window. X.SH FILES X.PP X /usr/tmp/layers/<login> Directory created by X.I layers X /usr/tmp/layers/<login>/host.ttySocket Created by X.I layers X.SH AUTHOR XDave Trissel X.SH BUGS AND CAVEATS X.PP X *) The shell TERM variable must have the same value in your Xlayer shells as it does when you initially start X.I layers Xup. X.PP X *) If you set the BSD shell TERMCAP variable then that variable must Xbe set in your .login file. It may not be changed to something Xdifferent in .cshrc. X.PP X *) The X.I layers Xcommand will not properly work when being issued from a Xremote login into the same machine which is already running the Xinitial X.I layers Xstartup command. X.PP X *) There is no file upload facility. X.PP X *) MacLayers will access the disk less often if you have RAM Cache Xenabled on the Macintosh. X.PP X *)Layers must be installed as set-uid with owner root in order Xto be able to correctly change the owner of the tty device Xfile for each window. Special permission may also be Xrequired to write the file "/etc/utmp". X.SH SEE ALSO X.PP XThe MacLayers program is Xcompletely described in the manual that accompanies it. X.PP XManual page courtesy of Peter Newton. X.PP XUNIX(TM) is a registered trademark of American Telephone and Telegraph. XMacintosh is a trademark of McIntosh Laboratories and is licensed to Apple XComputer. SHAR_EOF if test 4858 -ne "`wc -c < 'layers.1'`" then echo shar: error transmitting "'layers.1'" '(should have been 4858 characters)' fi fi # end of overwriting check echo shar: extracting "'macbput.1'" '(2849 characters)' if test -f 'macbput.1' then echo shar: will not over-write existing file "'macbput.1'" else sed 's/^X//' << \SHAR_EOF > 'macbput.1' X.TH MACBPUT local "17 Mar 1990" X.UC 4 X.SH NAME Xmacbput \- send file to macintosh via macbinary protocol X.SH SYNOPSIS X.B macbput Xfile X.br X.B macbput X[ X.B \-rdu X] file X[ X.B \-t Xtype X] X[ X.B \-a Xowner X] X[ X.B \-n Xname X] X.SH DESCRIPTION X.I Macbput Xsends a file to a Macintosh running MacTerminal. XThe File Transfer Protocol settings should specify the "MacBinary" Xtransfer method. XMacbput will also work with other communications programs for the Mac X(e.g. MacLayers); Xconsult the user's manual for your macbinary-compatable communications Xprogram for more information. XThis manual page will only address the use of macbput with MacTerminal. X.PP XTo use this program, log into the unix system using MacTerminal, Xand run macbput specifying the desired options and one file to be sent. XIf MacTerminal is properly configured, it will recognize that a file Xis arriving on the serial line and put up an indicator showing how Xmuch of the file has been sent. XSeveral Control-X's may be used to force macbput Xto give up if the transfer fails. X.PP XIf none of the X.B \-rdu Xflags are specified, X.I macbput Xsends three unix files to the Mac: X.IB file .info , X.IB file .data , Xand X.IB file .rsrc . XThese specify the three parts of one Mac file: the .data file Xbecomes the data fork, the .rsrc file becomes the resource fork, Xand the .info file specifies the sizes of the two forks, as well Xas the file name, file type, creation date, and other information. XThis is useful for returning files to the Mac which were stored Xusing macget or macbget. X.PP XThe X.B \-r Xflag specifies X.I resource Xmode. XEither X.IB file .rsrc Xor X.I file Xwill be sent to the Mac, along with a forged X.B .info Xfile and an empty X.B .data Xfile. XThe file sent becomes the resource fork of the Mac file. X.PP XThe X.B \-d Xflag specifies X.I data Xmode. XEither X.IB file .data X, X.IB file .text Xor X.I file Xwill be sent to the Mac, along with a forged X.B .info Xfile and an empty X.B .rsrc Xfile. XThe file sent becomes the data fork of the Mac file. X.PP XThe X.B \-u Xflag requests X.I unix Xmode, which is the same as X.I data Xmode except unix newline characters are converted Xinto carriage returns. XHuman-readable unix text files sent to the Mac using this option Xwill be compatible with applications which expect "text only" files. X.PP XThe remaining options serve to override the default Xfile type, owner, and file name to be used on the Mac. XThe default type and owner for X.I resource Xand X.I data Xmode defaults are "????", "????", and X.I unix Xmode defaults are "TEXT" and "MACA". X.SH SEE ALSO Xmacput(local), macget(local), xbin(local), macbin(local), mcvert(local) X.SH BUGS XThe macbinary protocol may not work over flow controlled communication lines, Xsome terminal concentrators, or when using rlogin. X.SH FEATURES XProperly initializes the Creation Date. X.SH AUTHOR XOriginal base code: Dave Johnson, Brown 7/31/84 SHAR_EOF if test 2849 -ne "`wc -c < 'macbput.1'`" then echo shar: error transmitting "'macbput.1'" '(should have been 2849 characters)' fi fi # end of overwriting check echo shar: extracting "'MacLayers.doc'" '(30876 characters)' if test -f 'MacLayers.doc' then echo shar: will not over-write existing file "'MacLayers.doc'" else sed 's/^X//' << \SHAR_EOF > 'MacLayers.doc' X X MacLayers Document X X Version 1.00 March 17, 1990 X XMacLayers provides multi-window capability for a Macintosh connected Xto a host UNIX(TM) system with sockets support. Each window may be Xassociated with a shell, login to a different host, or an individual Xcommand. Complete facilities are available for controlling the window Xand the associated host processes attached thereto. X X X What You Need To Run MacLayers X X1) A Unix host which supports the sockets protocol. X X2) A Macintosh with more than 128k of RAM and connected to the host. X X3) The MacLayers Macintosh Application provided with this package. X X4) The Unix host server command 'layers' provided with this package. X X5) If you want to resize windows which are logged into a second BSD X machine or resize windows on a BSD machine running in non-layers X mode then you need the 'layersize' command provided with this package. X X6) If you want to specify window titles on your own (such as to indicate X your current directory or other such information) you need the Unix X 'layertitle' command provided with this package. X X X X MacLayers Operation X XThe MacLayers Application on the Macintosh starts up as a garden variety Xhost-to-terminal vt-100 emulator. (As such you can run it with any Xhost, not just a BSD machine.) Baud rate and other configurations Xare set by selections in the Control menu. MultiFinder is fully Xsupported so you can use other applications while MacLayers is Xexecuting and downloading. X XThe initial or any document window may be saved via the "Save As" File Xmenu option. When this happens the file is designated as a MacLayers Xapplication document and contains not only logged text from the host Xcommunications in that window but also the current Control menu settings. X XOnce the initial 'layers' command is executed on the host (use no options Xor parameters) MacLayers and the host start operating in MacLayers Xprotocol mode. Automatically the document file window is closed and Xreopened as layer number 1 running with a new shell. The shell is either X/bin/sh or the shell indicated by your $SHELL environment variable. XThe term 'layer' refers to a process group running on the Unix host Xand the associated MacLayers window to which the group is attached. X XThe Macintosh Layer menu list shows the status of currently opened layers Xand read-only text files (described later). Selecting the menu item Xbrings the associated window up front. X XLayer number 1 is always associated with your startup document. Its Xshell identifies itself to the host as your login shell so that broadcast Xmessages and commands like 'talk' and 'write' will be properly redirected Xto that window. (The current mesg(1) state remains unchanged.) X XYou can start a new shell layer via the New menu item from the Layers Xmenu. You can also start a new layer window by issuing the 'layers' Xcommand in a shell layer window. If you use no operands then the new Xlayer window will be a shell. However, instead of a shell you can specify Xany command you wish by simply adding it as a parameter. Examples: X X layers vi testfile.c X X layers telnet earth X XIf you are specifying a shell then you can also elect to have it be a Xlogin shell by adding a -l option. This allows broadcast/write/talk Xcapabilities for that window. By default only the document layer X(number 1) always starts out as a login shell. X XThe host is always kept informed of your current window size and programs Xusing curses(3) like 'vi' and 'more' will properly adapt. However, most Xutilities only size the window once when they start up so changing Xthe window size is verboten after they are running. MacLayers normally Xdisallows window resizing when it recognizes that you are running such Xa program. This can be overridden by holding down the shift key when Xresizing the window. A 'vi' symbol appears in the lower right window X'growbox' area when MacLayers detects you are running a cursor moving Xtype of program. Zooming also is disallowed at this time unless both the Xzoomed and non-zoomed state have exactly the same character line width Xand height. X XSee the section "Logging Into Another Host" below for information on Xproper window sizing when your window is being used to do a login command Xinto another host. X X Note: You may have to hit return once after some programs terminate X to get MacLayers to recognize you are out of 'vi' mode. X XThe "enter" key is typically used to send a break (SIGINT) to all Xprocesses associated with that layer window. The method can be configured Xin the Control menu Terminal item. X XYou may terminate the window's processes with the Layers menu X"SIGTERM/SIGHUP Layer" item. The layer may also be killed by closing its Xwindow (SIGHUP). When a layer process group terminates on the host Xits window is automatically closed. X XMacLayers exits layers mode when the last (or only) layer window is closed. XYou may also use the Layers menu "Shutdown" to terminate layers mode. XYou cannot quit the MacLayers application while in layers mode but must XShutdown the multi-window mode first. X XYou can abort host layers by using the Control menu "Abort Host Layers" Xitem which is always available. This may be necessary if your Macintosh Xloses contact with the host and you restart the MacLayers application at Xwhich time the application would not be in layers mode but the host would. XIf the MacLayers application aborts due to a non-recoverable problem Xit will inform the host to terminate layers mode before returning to the XFinder. X X More About Window Sizing X XEach MacLayers window has two complete window size environments, a zoomed Xstate size and a non-zoomed state size. Each state may have its own Xassociated font size and screen location. When you change the window size Xby dragging the grow corner (bottom right) you convert the window into Xits zoomed state. Clicking the zoom box in the title bar switches between Xthe two states. Simply moving a window doesn't change its state. Both the Xfont and size for the two states can be set by the Control menu "Default XWindow Settings" and "Current Window Settings" items. The default item Xsettings are used when any new windows are created. X X Logging Into A Secondary Host X XIf you log onto another system from within a layer window then that system Xwill not know of your current window's size. MacLayers provides you with Xa way to inform that system of this information if the system is a BSD Xor System V Unix. X XFor remote BSD systems you can execute the 'layersize' command provided Xwith this package. (The command must be copied or built on the remote Xsystem and be accessible by your shell there.) When at the shell command Xprompt select the Control menu item "Inform BSD of Window Size" and a Xstring will be sent invoking the 'layersize' command. This informs the Xremote kernel of the current process window size. If your BSD .login or X.profile uses the 'tset' command to set the terminal type then you must Xadd the -I option to keep 'tset' from forcing each login window to be Xtreated as always having 24 lines (the vt-100 default.) X XSystem V allows window (actually screen) sizes to be specified with Xthe environment variables "COLUMNS" and "LINES". You can automatically Xset these shell variables when at a shell command prompt by selecting Xthe Control menu "Inform System V of Window Size" item. X XIt is up to you to inform the indirect login host of any window size Xchanges by using the menu items. Your terminal type on such hosts Xshould be specified as vt100 if you wish to execute screen oriented Xcommands such as 'vi' or 'more'. X X Other Capabilities X X Cursor Positioning In 'vi' Mode X XWhen in 'vi' mode MacLayers provides a useful cursor moving feature. XDouble-clicking in the window causes a series of vi commands to be Xissued which cause the insertion cursor to move to that location. XYou must not be in vi insert mode or the commands will simply be taken Xto be text that you have typed. (You can do that just for fun to see Xwhat MacLayers sends on a double-click.) X X Read-only Text Files X XMacLayers can open up text files as read-only windows by using the X"Open Text" File menu. Such windows can have their contents copied to Xthe clipboard but may never be altered in any way. Text window titles show Xthe circle-r (registered trademark) to let you know they are read-only Xand a "no-write" symbol appears at the bottom right portion of the Xwindow (the "grow" area.) X X Window Aliasing X XAt times you may wish to view two portions of a communication window's Xcontents at one time. The File menu "Open Window Alias" will create a Xnew read-only window for any communications window and this can be Xscrolled to any independent position desired just like a text-only window. X XSince in-coming text from the computer always forces a window to the Xbottom for proper capturing, the window aliasing feature can be used Xto open a surrogate window that is immune to this action. X X XMODEM Downloading X XMacLayers has a download facility for accepting downloaded XMODEM XMacTerminal ('macput' command) and macbinary ('macbput' command) files. XStraight vanilla XMODEM is not supported. A copy of the public domain Xmacbinary downloading program 'macbput' is provided with this package. X XOnly one window can be doing a XMODEM download at any one time. XDownloading does not effect any other MacLayers operations so you can Xfreely use any other windows or applications (with MultiFinder) while Xa download is in progress. Remember though that the topmost window Xreceives the highest priority data transfer from the host so for the Xfastest downloading keep the XMODEM layer window the active window. X XThe File menu "Download Site" can be used to preselect the location Xwhere downloads are to occur. By default files are placed where the Xstartup document resides. This setting is forgotten each time the XMacLayers application terminates. X XIf you have an error-free line then setting the "Fast" mode in the XControl menu "File Transfer" selection will speed up download by about X28%. X X Downloading Examples X XThe macbput utility provided with this package can be run on the host XUnix system and is used to ship files to a Macintosh running MacLayers. X(Some Unix systems already have a utility called macput which is used in Xexactly the same way. But macbput properly updates Macintosh file dates Xconcerning the time of original creation and last use.) X XTo download a standard Unix text file, for example one created by a Xeditor such as vi or emacs, enter the following command: X X macbput -u filename X XThe transfer will start automatically and will create a Macintosh file Xof type TEXT on the Macintosh which can be opened by applications such as XMacWrite and Word. X XOther types of Macintosh files and applications may also be downloaded. XOn the host Unix system they may take on one of many forms. If you have Xa single file which ends in the name "hqx" then it must first be converted Xinto three files with names ending in .info, .data and .rsrc with a Xutility such as xbin (not provided.) X X xbin filename.sit.hqx X XIf you have the .info, .data and .rsrc files then you are ready to Xdownload with the macbput (or macput) command. Specify only the front Xpart of the file name, the part before the .info, .data and .rsrc. X X macbput filename.sit X XThe transfer will start automatically and upon completion a copy of the Xfile will be available on the Macintosh. X XSometimes the host version of the file will not be in three pieces but Xinstead exist as a single binary (non-text) file. These are called Xmacbinary files and almost always end in the suffix ".bin". Macbinary Xfiles may be converted to the three file info, data and rsrc format with Xutilities such as "mcvert" (not provided) and then downloaded with macbput Xas above. It is also possible to directly download a macbinary file if Xyou have a so-called XMODEM download utility. (One such utility is Xcalled "xmodem".) To accomplish this, issue the download command on the Xhost: X X xmodem -sb filename.bin X Xand then select the File menu "Download File" item. The download Xshould start at that time. But if it doesn't you may have to invert the XControl menu "File Transfer ..." CRC/Checksum selection and try again. XNote that downloading via XMODEM utilities will not auto-start the Xprocess on the Macintosh. You must use the "Download File" menu item Xto start the Macintosh side of the operation. X X Paste Speed X XUnix is known for the ease with which its tty device drivers can be Xoverrun by input. (This causes data to be lost.) MacLayers provides Xtime delay options which can be set for pasting text into a window. X(Data pasted into a window is sent on to the host.) The options are Xin the Control menu "File Transfer" selections. X X Preferences Menu Item X XThe Control menu Preferences item provides user selectable options for Xhighlighted text format and cursor display among other things. X X Window or Selection Printing X XThe entire window or the current selection may be printed by activating Xthe File menu "Print" entry. If you have an early Macintosh model with Xonly 64K of ROM then printing will refuse to work due to Apple's lack of Xsupport for that machine in the MPW programming environment. X X Vertical Window Scrolling With Keyboard Keys X XYou can scroll the active window up or down via the key sequences given Xbelow. The second sequence for each option is an alternate provided only Xfor keyboards not having arrow keys: X X COMMAND+UPARROW scroll back one page X or COMMAND+"'" X X COMMAND+DOWNARROW scroll forward one page X or COMMAND+'/' X X COMMAND+OPTION+UPARROW scroll back one line X or COMMAND+OPTION+"'" X X COMMAND+OPTION+DOWNARROW scroll forward one line X or COMMAND+OPTION+'/' X X COMMAND+SHIFT+UPARROW scroll to the top of the file X or COMMAND+SHIFT+"'" X X COMMAND+SHIFT+DOWNARROW scroll to the bottom of the file X or COMMAND+SHIFT+'/' X X Horizontal Window Movement With Keyboard Keys X XMacLayers does not directly support horizontal scrolling of window contents. XHowever, the entire window can be easily moved right or left with keyboard Xsequences. Requesting a movement right or left will bring the opposite Xedge of the window into view on the screen. If the opposite edge is Xalready in view then the window is moved still further in the indicated Xdirection. X XThis capability when used with the vertical scrolling key sequences allows Xsmall screen Macintosh users to comfortably manipulate windows that are Xwider than the screen. X XHere are the key sequences provided. The second sequence for each option Xis an alternate provided only for keyboards not having arrow keys: X X COMMAND+LEFTARROW X or COMMAND+'<' move window left X X COMMAND+RIGHTARROW X or COMMAND+'<' move window right X X X Tandem Scrolling X XHolding the shift key down while selecting a vertical line or page Xscroll with the mouse will automatically cause the same scroll to be Xattempted on the next lower MacLayers window (if any.) This is handy Xwhen eyeballing two long similar sections of text for differences. X X Special Keyboard Sequences X XFor emacs users MacLayers allows a metakey sequence to cause bit 7 (the Xhigh bit in a character) to be set. Combining both the command and Xoption keys with any other key sequence will cause bit 7 to be forced Xon. Thus, keyboards having a built-in control key can generate all 256 Xpossible 8-bit characters. Macintoshes with old non-ADB keyboards will Xignore this treatment for the "'" or "/" characters since they are Xrequired for the window scrolling movements indicated earlier. X XFor users requiring the generation of ASCII NUL (a zero byte, sometimes Xcalled the IDLE character) an alternative to CONTROL-@ (also CONTROL-2) Xis to issue CONTROL-space (also OPTION-space.) This follows vt-100 Xterminal convention. X X Find Capabilities X XThe Find menu items allow searching windows for specific contents or Xgoing to the current selection. X X Iconed Window Capability X XA unique feature of MacLayers is the ability to shrink a window to an Xicon. While iconed the window will still actively display its contents Xand scroll just like a standard sized window. X XTo iconize a window simply double-click its title bar or select the XIconize menu item from the Layers menu. While iconed the window may be Xmoved around just like a Finder Icon and the miniaturized window retains Xits own independent location. X XA window is deiconized when you double click it, type input to it as the Xtop window, select it with a Layers menu item, or select the Deiconize XLayers menu item. X XJust for fun MacLayers allows you to scroll a iconed window with the Xvertical scroll keys (defined earlier) without causing it to deiconize. X XFor users running under MultiFinder standard windows can be auto-iconed Xtemporarily while MacLayers is not the front most application. A check Xbox in the Preferences menu dialog box enables this action. If checked Xthen holding the shift key down while switching to another application Xwill temporarily inhibit the auto-iconing. X X Icons to Default Positions X XThis menu selection from the Control menu item resets the positions of Xall iconed windows such that when iconed they appear along the top, right, Xleft or bottom of the screen. There is also an option for the bottom where Xonly the titles show. This allows the user to treat the titles of iconed Xwindows as though they are buttons at the bottom of the screen. By double Xclicking the button (which is really the title of the iconed window) Xthe window returns to its full size. X XThe menu item simply resets the position for all icon windows to the Xdesignated choice selected in the Preferences dialog. They may then be Xmoved again by you to other areas of the screen. X X Shrink Window To Title X XAt times the desktop becomes too cluttered so MacLayers provides yet Xanother feature to ease the busy desktop problem. Any MacLayers window Xcan be shrunk to just its title bar by shift-double-clicking the title bar Xor selecting the Titleize item from the Layers menu item. In effect the Xwindow is still there but only the title bar remains visible. The window Xremains titled even if output is being sent to it. Moving the title bar Xhas the same effect as moving the window. X XThe window may be detitleized by double-clicking the title bar or selecting Xthe Detitleize item from the Layers menu. X X Hide Window Capability X XYou may also completely hide any MacLayers window at any time by selecting Xthe Hide item from the Layers menu. The window will stay hidden until Xoutput is sent to it from the host or you reactivate it from the Layers Xmenu. X X Cycling Through Windows X XAll active MacLayers windows may be displayed one after the other in Xnumerical order by selecting the Layers menu Cycle item. Hidden windows Xdo not appear in the cycle list. X X Specifying a Layer Window Title X XThe 'layertitle' command provided with this package allows a single Xargument (which may be a string) to specify a title to be displayed Xfor the controlling window of the process. The source for this command Xshould compile and execute on any Unix system and so can be used even for Xwindows which are logged into remote hosts. X XAn example use of this feature is to create your own "cd" directory Xchange shell command and have it always display the current directory Xname in the title bar. X XExpert users can examine the 'layertitle' source code to discover Xthe control sequence needed to send the ANSI Private Message string which Xactually causes the new title to be recognized. Knowing this sequence Xstandard shell echo facilities can be used in place of the 'layersize' Xcommand. X X Sending an Interrupt to a Window Process X XThe Send Interrupt To Layer item of the Layers menu causes a internal Xpacket to be sent to the host indicating that a SIGINT signal be sent to Xthe UNIX process group attached to the window. This is only available in Xlayers mode. X XAt times the UNIX tty mode settings for a process may become garbled Xand if the Enter key is sending DEL or CONTROL-C this may not be enough Xto interrupt the process. Selecting this menu item bypasses the tty Xdriver and so ensures that an interrupt signal is received. X X Reset Terminal X XOccasionally you may have bad data transmitted to the Macintosh which can Xcause the vt-100 emulation to enter a special graphics mode or setup Xa vt-100 screen scrolling area smaller than your full window size. If this Xoccurs the Control menu item "Reset Terminal" will reinstate normal Xoperation. This in no way affects layers mode operation. X X Sending Break in Layers Mode X XA hardware 'break' can be placed on the host serial line with the Control Xmenu Send Hardware Break item. However, when in layers mode this is only Xallowed if the line is idle to guarantee that no internal control packets Xbecome garbled or lost. A beep occurs when the line is busy. X X Aborting Current Activity X XPaste and XMODEM operations may be aborted by entering COMMAND-period X(cmd-.). X X Use of the Macintosh RAM Cache X XFor the last few years versions of the Macintosh operating system have Xprovided a RAM cache feature configurable in the control panel to speed Xup data transfers to floppy and hard disks. There are two types of Xenvironments where this option is especially useful with MacLayers. X XThe first situation is for users running off of floppy disks. In this case Xrunning with at least the minimal RAM cache size of 32K will inhibit the Xconstant whirring of your diskettes and improve screen text display speed. X XUsers using high-speed communication connections (9600 and above) make up Xthe second group that may need to run with the RAM cache turned on. This Xis necessary to avoid data loss when receiving large amounts of Xuninterrupted data. An example of this would be the listing of a large Xsource file directly to your window. Once the RAM cache is filled it Xpurges itself by writing the cached data to an output file. The Macintosh Xserial driver can lose high speed data coming in if diskette or hard disk Xaccesses are being done at the same time. (This is called data overrun.) XUsers with this potential situation need to guarantee that the size of Xtheir ram cache is at least as big as the largest amount of data they Xwant to capture. (This does not concern XMODEM transfers. They do not Xrequire RAM cache although cache of at least minimum size can speed Xthese up as well.) X X Disk Full Processing X XMacLayers will put up a warning box and delete all data in the scroll Xfile up to the current output position if the disk where the file resides Xbecomes completely filled. X X Minimal Memory Environment X XFor users with extremely tight memory requirements MacLayers can be forced Xto run in a memory partition approximately 95k bytes smaller than normal. XWhen run in this manner MacLayers will beep at startup and issue a warning Xthat only a single window is allowed. No more than one window can be open Xat a time and no read-only text windows are available in this mode. Also, Xthe maximum size of data handled by cut and paste operations is more Xrestrictive. X X Enhanced Terminal Capabilities X XMacLayers supports standard vt-100 terminal protocol as described in BSD XTermcap(5) and System V Terminfo(4). But there are also two extra Xcapabilities which can speed up screen updating particularly with screen Xeditors. UNIX users who specify vt100 terminal type only for the sake Xof running MacLayers can include these extra capabilities by using the Xreplacement terminal descriptions below. These not only include the extra XMacLayers terminal capabilities but also remove timing waits required Xby real vt-100's thus providing even further speed improvements. X XFor BSD Termcap the following description can be used: X X # MacLayers vt-100 Termcap X d0|vt100|vt100-am|MacLayers dec vt100:\ X :cr=^M:do=^J:nl=^J:bl=^G:co#80:li#44:cl=\E[;H\E[2J:\ X :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\ X :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ X :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;24r\E[24;1H:\ X :rf=/usr/lib/tabset/vt100:\ X :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\ X :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\ X :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:ta=^I:pt:sr=\EM:vt#3:xn:\ X :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:\ X :dc=\ED:ic=\EI: X XThe System V Terminfo specialized definition is: X X # Special System V Terminfo definition for MacLayers vt100 X vt100|vt100-am|dec vt100 without tabs and with MacLayers extras, X am, mir, msgr, xenl, xon, cols#80, lines#24, vt#3, X acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, X bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r, X csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b, X cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, X cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, X dch1=\ED, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, X home=\E[H, ich1=\EI, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, X kbs=\b, kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, X kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP, kf10=\EOx, kf2=\EOQ, X kf3=\EOR, kf4=\EOS, kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl, X kf9=\EOw, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E[?1l\E>, X rmso=\E[m, rmul=\E[m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, X sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;, X sgr0=\E[m^O, smacs=^N, smkx=\E[?1h\E=, X smso=\E[1;7m, smul=\E[4m, tbc=\E[3g, X X X X Hints X X *) MacLayers must internally handle your window display differently X whenever the cursor is being positioned above the bottom line such X as occurs during the execution of a screen editor on the host. The X "vi" symbol is displayed in the grow box during this time to indicate X this special mode. During so-called "vi" mode you are not allowed X to change the window size. Holding the shift key down will override X this restriction and allow you to resize the window. But remember X that if you are running a utility then the utility may not be able X to dynamically adjust to a new window size. If it can then you must X do whatever is required of the utility to inform it of the change. X X At times MacLayers may think the window is still in "vi" mode even X after an editor or cursor controlling utility has finished. One X instance of this is immediately after a "clear screen" command. X MacLayers does not know to go out of "vi" mode until a new line is X added to the very bottom of the screen causing the screen to scroll X up a line. If the window has stayed in "vi" mode and you want to X resize it simply hold the shift key down or type empty lines to the X shell until the window begins to scroll again. (The "vi" will then X disappear from the grow box.) X X *) When running in layers mode the host/MacLayers interface always X uses vt-100 protocol regardless of your TERM terminal type setting. X Thus if you only set your TERM variable to vt100 to run MacLayers X and you always run in layers mode then you need not bother actually X setting vt100 as your Unix terminal type. X X *) As mentioned at the start of this document MacLayers can be used X as a normal vt-100 terminal emulator when connected to any host X computer. On BSD and System V systems you can also use the variable X sized window feature in non-layers mode by following the same X instructions given for logging into a remote host as described X in the "Logging Into A Secondary Host" section above. (This also X holds true for a layers host before the layers command is entered.) On X systems other than BSD and System V changing the current window X size may garble output unless there is a means for you to notify X your connection of the new window size. X X X Problems/Caveats X X *) The current version does not do data validation with packet retry for X MacLayers/host internal communication. Thus poor line conditions may X cause a host internal message to be missed. This is usually not X catastrophic but means something won't work correctly. For instance X a window might not auto-close when a host process death occurs or X output might be sent to the wrong window. X X *) The shell TERM variable must have the same value in your X layer shells as it does when you initially start layers up. X X *) If you set the BSD shell TERMCAP variable then that variable must X be set in your .login file. It may not be changed to something X different in .cshrc. X X *) The host/MacLayers system attempts to give highest data communication X priority to the topmost MacLayers window at all times by throttling X down output to other windows. However due to internal UNIX kernel I/O X buffering the attempts may not always succeed. X X *) The "Download Site" folder is always kept open which means if you X want to trash the folder you must first choose a new download site or X quit MacLayers. X X *) MacLayers has U.S. keyboard dependencies. X X *) The layers command will not properly work when being issued from a X remote login into the same machine which is already running the initial X layers startup command. X X *) If a layers window text file is read as a file of type TEXT by another X application and that file has highlighted characters (as sent by the X host) embedded within it then those characters will appear as garbage X in that application. (Specifically such characters have the high bit X [bit 7] on.) X X X Bugs X X *) Occasionally during or after a cursor moving utility has executed if X the window is scrolled backwards then when it is eventually scrolled X forward to the bottom (last) line of the file the bottom line will X be missing from the display. If you can reproduce this problem then X please send a complete description of how to do so to X X uunet!rascal.ics.utexas.edu!layers-reply X X X X Acknowledgement X X The author owes a big thanks to Werner Uhrig and his band of testers at the X University of Texas for the many bug reports and suggestions delivered X during the intensive beta testing phase of this product. MacLayers is a X substantially improved application as a result. X X Dave Trissel X Austin X X X XUNIX(TM) is a registered trademark of American Telephone and Telegraph. X XMacintosh is a trademark of McIntosh Laboratories and is licensed to Apple XComputer. X X **** end of document **** SHAR_EOF if test 30876 -ne "`wc -c < 'MacLayers.doc'`" then echo shar: error transmitting "'MacLayers.doc'" '(should have been 30876 characters)' fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 1 ---
werner@rascal.ics.utexas.edu (Werner Uhrig) (06/02/90)
[MacLayers 1.00 - part 2 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # layers.h # layersize.c # layertitle.c # macbput.c # makefile # protocol.c # # This archive created: Thu May 31 21:58:11 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'layers.h'" '(2049 characters)' if test -f 'layers.h' then echo shar: will not over-write existing file "'layers.h'" else sed 's/^X//' << \SHAR_EOF > 'layers.h' X/* Copyright (C) 1989 by David W. Trissel X * X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X */ X X#define MAXPCHAN 7 /* maximum layers supported */ X X#define MAXSTR 200 X#define MAXARGS 64 X#define MAXLINE 1024 X#define IOSIZE 800 /* data gulp handling size */ X X/* WARNING - packet sizes must be insured to never match the ESCAPE char */ X#define ESCAPE '}' /* datalink escape character */ X X#define DO if (Dflag) /* for debugging */ X X/* miscelaneous common data */ Xextern int Dflag; /* debug dump indicator flag */ X X/* Shape structure passed between MacLayers and ourselves */ Xstruct Shape X{ short worigv; /* verical window bit origin */ X short worigh; /* horizontal window bit origin */ X short wlines; /* window height */ X short wchars; /* window width */ X short wfont; /* window font size */ X short wattr; /* window attributes */ X}; X X#define Wa_shell 0x01 /* window is a shell */ X X X /* The following modules define the complete protocol/server interface */ X X /* layers.c */ X Xextern void FQuit(/* exitcode */); Xextern void ReceiveQuit(); Xextern void ReceiveNew(/* chanid, shape */); Xextern void ReceiveDelete(/* chanid */); Xextern void ReceiveSignal(/* chanid, signal */); Xextern void ReceiveData(/* chanid, buff, cnt */); Xextern void ReceiveReshape(/*chanid, shape */); Xextern void DEBUG(/* format, arg1, arg2, arg3, arg4 */); X X /* protocol.c */ X Xextern int InitLink(); Xextern int TopChannel(); Xextern int SendNew(/* shape */); Xextern void SendTitle(/* chan, buff, cnt */); Xextern void SendDelete(/* chan */); Xextern void SendQuit(); Xextern void SendReshape(/* chan, shape */); Xextern void SendData(/* chan, buff, cnt */); Xextern void ProcessStreamin(); SHAR_EOF if test 2049 -ne "`wc -c < 'layers.h'`" then echo shar: error transmitting "'layers.h'" '(should have been 2049 characters)' fi fi # end of overwriting check echo shar: extracting "'layersize.c'" '(3586 characters)' if test -f 'layersize.c' then echo shar: will not over-write existing file "'layersize.c'" else sed 's/^X//' << \SHAR_EOF > 'layersize.c' X/* Copyright (C) 1989 by David W. Trissel X * X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X */ X /* All rights reserved. */ X X /* layersize - update BSD Sun Unix with window size information */ X X#include <stdio.h> X#include <errno.h> X#include <sys/ioctl.h> X Xextern int sys_nerr; Xextern char *sys_errlist[]; X Xstatic void gotsyserr(/* char * */); Xstatic void goterr(/* char * */); Xstatic int getnumber(/* char * */); X X X /* main() - update BSD window size */ X Xmain(ac, av) Xint ac; /* argument count */ Xchar **av; /* argument vector */ X{ X struct winsize wsize; /* window size structure for ioctl() */ X char *ap; /* argument scan pointer */ X int lines; /* new lines value */ X int cols; /* new columns value */ X X if (--ac != 2) X goterr("Missing lines and column options"); X X /* get window size (actually do this to set xpixel and ypixel values) */ X if (ioctl(0, TIOCGWINSZ, &wsize) == -1) X gotsyserr("No window support in host"); /* terminate with message */ X X /* scan looking for -l and -c line and column numeric sizes */ X lines = cols = 0; /* reset values */ X while (ac > 0) X { ap = *++av; /* point to next argument string */ X if (ac-- > 0 && *ap == '-') /* if option ... */ X switch (ap[1]) X { case 'l': /* lines */ X lines = getnumber(&ap[2]); X break; X X case 'c': /* columns */ X cols = getnumber(&ap[2]); X break; X X default: X goterr("Usupported option"); /* unsupported option */ X break; X X } /* end '-' argument */ X else X goterr("Unsupported parameter"); /* unsupported parameter */ X X } /* end while argument vector scan */ X X /* must have both lines and columns */ X if (lines == 0 || cols == 0) X goterr("Must specify both lines and columns"); X X wsize.ws_col = cols; /* set columns */ X wsize.ws_row = lines; /* set lines */ X /* update the kernel */ X if (ioctl(0, TIOCSWINSZ, &wsize) == -1) X gotsyserr("Failed to update window size"); /* didn't go */ X X} X X X /* goterr() - issue error and terminate */ X Xstatic void Xgoterr(msg) Xchar *msg; /* error message string */ X{ X printf("%s\n", msg); /* send error message to user */ X exit(1); /* terminate with error */ X X} /* goterr() */ X X X /* gotsyserror() - system error return */ X Xstatic void Xgotsyserr(msg) Xchar *msg; /* error string */ X{ X if (errno > 0 && errno < sys_nerr) X printf("%s: %s\n", msg, sys_errlist[errno]); X else X printf("%s: Error %d\n", msg, errno); X X exit(1); /* exit with failure */ X X} /* gotsyserr() */ X X X /* getnumber() - parse option number */ X Xstatic int Xgetnumber(str) Xchar *str; /* start of option string */ X{ X int n; /* number being built */ X X if (str == NULL) X goterr("Invalid numeric in option"); X X /* skip any leading delimiters */ X while (*str && (*str == ' ' || *str == '\t')) X str++; X X for(n=0; *str && *str >= '0' && *str <= '9'; str++) X n = n*10 + *str - '0'; /* add next digit in */ X X /* make sure number terminates legally */ X switch (*str) X { case '\0': X case ' ': X case '\t': X case '\n': X if (n <= 0 || n > 200) X goterr("Number out of range"); X break; /* these are OK */ X X default: X goterr("Invalid numeric in option"); X X } /* end switch */ X X return ( n ); /* return the number */ X X} /* getnumber() */ SHAR_EOF if test 3586 -ne "`wc -c < 'layersize.c'`" then echo shar: error transmitting "'layersize.c'" '(should have been 3586 characters)' fi fi # end of overwriting check echo shar: extracting "'layertitle.c'" '(1242 characters)' if test -f 'layertitle.c' then echo shar: will not over-write existing file "'layertitle.c'" else sed 's/^X//' << \SHAR_EOF > 'layertitle.c' X/* Copyright (C) 1989 by David W. Trissel X * X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X */ X /* All rights reserved. */ X X /* layertitle - utility to specify window title */ X X#include <stdio.h> X X#define ESC 0x1b X X /* main() - send string designating layers window title */ X Xmain(ac, av) Xint ac; /* argument count */ Xchar **av; /* argument vector */ X{ X char *ap; /* argument scan pointer */ X X if (--ac != 1) X { printf("usage: layertitle \"new window title\"\n"); X exit(1); X } X X ap = *++av; /* point to argument string */ X X /* Transmit the title string in the ANSI Private Message format X ** which is X ** ESC '^' message ESC '\' X */ X printf("%c%c%s%c%c", ESC, '^', ap, ESC, '\\'); X X} /* main() */ SHAR_EOF if test 1242 -ne "`wc -c < 'layertitle.c'`" then echo shar: error transmitting "'layertitle.c'" '(should have been 1242 characters)' fi fi # end of overwriting check echo shar: extracting "'macbput.c'" '(9383 characters)' if test -f 'macbput.c' then echo shar: will not over-write existing file "'macbput.c'" else sed 's/^X//' << \SHAR_EOF > 'macbput.c' X/* X * (originally macput) -- send file to Macintosh using MacBinary XMODEM protocol X * Dave Johnson, Brown University Computer Science X * X * (c) 1984 Brown University X * may be used but not sold without permission X * X */ X X/* To compile: X cc -O -o macbput macbput.c X (Sun 4.2 BSD) cc -O -DSUNBSD42 -o macbput macbput.c X (System V) cc -O -DSYSV -o macbput macbput.c X X Latest modifications 10/20/88 by Trissel - X X 1. General cleanup by removal of unused definitions and headers. X 2. Added #ifdefs to support System V and BSD 4.2 Sun compilation. X 3. Removed ancient Macterminal Beta 0.5X code. X 4. Fixed bad bug where XMODEM block count was not bumped up X after the first fork transfer. X X Dave Trissel X Motorola Inc. X ut-sally!oakhill!davet X X This code is fundamentally from two earlier programmers: X X Jon Hueras X Symantec/THINK Technologies X singer@endor.harvard.edu X X who added 2-Byte CRC capability to code from: X X Dave Johnson X ddj%brown@csnet-relay.arpa X Brown University Computer Science X X who did the initial MacTerminal 1.1 transfer protocol. X*/ X X/* If you have System V define the following: */ X /* #define SYSV */ X X/* Sun BSD 4.2 systems should define the following: */ X /* #define SUNBSD42 */ X X#include <stdio.h> X#include <signal.h> X#include <setjmp.h> X#ifdef SYSV X#include <termio.h> X#else X#include <sgtty.h> X#endif X#include <sys/types.h> X#include <sys/stat.h> X X#ifdef SUNBSD42 X/* RAW is no longer being found on latest Sun system (??) (Trissel) */ X#define RAW 0x20 X#endif X X#define RECORDBYTES 132 X#define DATABYTES 128 X#define NAMEBYTES 63 X X#define RETRIES 10 X#define ACKTIMO 10 X X#define MAXRECNO 0xff X#define BYTEMASK 0xff X X#define TMO -1 X#define DUP '\000' X#define SOH '\001' X#define EOT '\004' X#define ACK '\006' X#define NAK '\025' X#define CAN '\030' X#define EEF '\032' X#define ESC '\033' X X#define H_NLENOFF 1 X#define H_NAMEOFF 2 X/* 65 <-> 80 is the FInfo structure */ X#define H_TYPEOFF 65 X#define H_AUTHOFF 69 X X#define H_LOCKOFF 81 X#define H_DLENOFF 83 X#define H_RLENOFF 87 X#define H_CTIMOFF 91 X#define H_MTIMOFF 95 X X#define H_OLD_DLENOFF 81 X#define H_OLD_RLENOFF 85 X X#define TEXT 0 X#define DATA 1 X#define RSRC 2 X#define FULL 3 X Xint mode, txtmode; X Xstruct macheader { X char m_name[NAMEBYTES+1]; X char m_type[4]; X char m_author[4]; X long m_datalen; X long m_rsrclen; X long m_createtime; X long m_modifytime; X} mh; X Xstruct filenames { X char f_info[256]; X char f_data[256]; X char f_rsrc[256]; X} files; X Xint recno, crc; Xchar buf[DATABYTES]; X Xchar usage[] = X "usage: \"macbput [-rdu] [-t type] [-c creator] [-n name] filename\"\n"; X Xmain(ac, av) Xchar **av; X{ X int n; X char *filename; X X if (ac == 1) { X fprintf(stderr, usage); X exit(1); X } X X mode = FULL; X ac--; av++; X while (ac) { X if (av[0][0] == '-') { X switch (av[0][1]) { X case 'r': X mode = RSRC; X strncpy(mh.m_type, "????", 4); X strncpy(mh.m_author, "????", 4); X break; X case 'u': X mode = TEXT; X strncpy(mh.m_type, "TEXT", 4); X strncpy(mh.m_author, "MACA", 4); X break; X case 'd': X mode = DATA; X strncpy(mh.m_type, "????", 4); X strncpy(mh.m_author, "????", 4); X break; X case 'n': X if (ac > 1) { X ac--; av++; X n = strlen(av[0]); X if (n > NAMEBYTES) n = NAMEBYTES; X strncpy(mh.m_name, av[0], n); X mh.m_name[n] = '\0'; X break; X } X else goto bad_usage; X case 't': X if (ac > 1) { X ac--; av++; X strncpy(mh.m_type, av[0], 4); X break; X } X else goto bad_usage; X case 'c': X if (ac > 1) { X ac--; av++; X strncpy(mh.m_author, av[0], 4); X break; X } X else goto bad_usage; X default: Xbad_usage: X fprintf(stderr, usage); X exit(1); X } X } X else { X filename = av[0]; X } X ac--; av++; X } X X setup_tty(); X find_files(filename, mode); X if (mode != FULL) X forge_info(); X X if (send_sync()) { X recno = 1; X txtmode = 0; X send_file(files.f_info, 1); X X if (mode != FULL) X unlink(files.f_info); X X if (mode == TEXT) txtmode++; X send_file(files.f_data, 1); X X txtmode = 0; X send_file(files.f_rsrc, 0); X } X reset_tty(); X} X Xfind_files(filename, mode) Xchar *filename; X{ X int n, tdiff; X struct stat stbuf; X X sprintf(files.f_data, "%s.data", filename); X sprintf(files.f_rsrc, "%s.rsrc", filename); X X if (mode == FULL) { X sprintf(files.f_info, "%s.info", filename); X if (stat(files.f_info, &stbuf) != 0) { X perror(files.f_info); X cleanup(-1); X } X return; X } X else { X strcpy(files.f_info, "#machdrXXXXXX"); X mktemp(files.f_info); X } X X if (mode == RSRC) { X strcpy(files.f_data, "/dev/null"); X if (stat(files.f_rsrc, &stbuf) != 0) { X strcpy(files.f_rsrc, filename); X if (stat(files.f_rsrc, &stbuf) != 0) { X perror(files.f_rsrc); X cleanup(-1); X } X } X mh.m_datalen = 0; X mh.m_rsrclen = stbuf.st_size; X } X else { X strcpy(files.f_rsrc, "/dev/null"); X if (stat(files.f_data, &stbuf) != 0) { X sprintf(files.f_data, "%s.text", filename); X if (stat(files.f_data, &stbuf) != 0) { X strcpy(files.f_data, filename); X if (stat(files.f_data, &stbuf) != 0) { X perror(files.f_data); X cleanup(-1); X } X } X } X mh.m_datalen = stbuf.st_size; X mh.m_rsrclen = 0; X } X X if (mh.m_name[0] == '\0') { X n = strlen(filename); X if (n > NAMEBYTES) n = NAMEBYTES; X strncpy(mh.m_name, filename, n); X mh.m_name[n] = '\0'; X } X} X Xforge_info() X{ X int n; X char *np; X FILE *fp; X X for (np = mh.m_name; *np; np++) X if (*np == '_') *np = ' '; X X buf[H_NLENOFF] = n = np - mh.m_name; X strncpy(buf + H_NAMEOFF, mh.m_name, n); X strncpy(buf + H_TYPEOFF, mh.m_type, 4); X strncpy(buf + H_AUTHOFF, mh.m_author, 4); X put4(buf + H_DLENOFF, mh.m_datalen); X put4(buf + H_RLENOFF, mh.m_rsrclen); X put4(buf + H_CTIMOFF, mh.m_createtime); X put4(buf + H_MTIMOFF, mh.m_modifytime); X fp = fopen(files.f_info, "w"); X if (fp == NULL) { X perror("temp file"); X cleanup(-1); X } X fwrite(buf, 1, DATABYTES, fp); X fclose(fp); X} X Xsend_sync() X { X int c; X X tputc(ESC); X tputc('b'); X X for (;;) { X X if ((c = tgetc(ACKTIMO)) == TMO) X { X return(0); X } X X if (c == NAK) X { X return(1); X } X X if (c == 'C') { X crc++; X return(1); X } X } X } X Xsend_file(fname, more) Xchar *fname; Xint more; X{ X register int status, i, n; X FILE *inf; X X inf = fopen(fname, "r"); X if (inf == NULL) { X perror(fname); X cleanup(-1); X } X for (;;) { X n = fread(buf, 1, DATABYTES, inf); X if (n > 0) { X for (i = 0; i < RETRIES; i++) { X send_rec(buf, DATABYTES); X while ((status = tgetc(ACKTIMO)) != ACK && status != NAK && status != CAN); X if (status != NAK) X break; X } X if (status != ACK) { X if (status != CAN) X while ((status = tgetc(ACKTIMO)) != CAN); X fclose(inf); X cleanup(-1); X /* NOTREACHED */ X } X } X if (n < DATABYTES) { X if (!more) { X tputc(EOT); X tgetc(ACKTIMO); X } X return; X } X recno++; X recno &= MAXRECNO; X } X} X Xsend_rec(buf, recsize) Xchar buf[]; Xint recsize; X{ X int i, cksum; X char *bp; X X if (txtmode || !crc) { X cksum = 0; X bp = buf; X for (i = 0; i < recsize; i++, bp++) { X if (txtmode && *bp == '\n') X *bp = '\r'; X cksum += *bp; X } X } X X if (crc) X cksum = calcrc(buf, recsize); X X tputc(SOH); X tputc((char) recno); X tputc((char) (MAXRECNO - recno)); X tputrec(buf, recsize); X X if (crc) { X tputc((char) (cksum >> 8)); X tputc((char) cksum); X } else X tputc((char) cksum); X} X Xstatic int ttyfd; Xstatic FILE *ttyf; Xstatic jmp_buf timobuf; X Xtgetc(timeout) Xint timeout; X{ X int c; X X if (setjmp(timobuf)) X return TMO; X X alarm(timeout); X c = getc(ttyf); X alarm(0); X X if (c == -1) /* probably hung up or logged off */ X return EOT; X else X return c & BYTEMASK; X} X Xtputrec(buf, count) Xchar *buf; Xint count; X{ X write(ttyfd, buf, count); X} X Xtputc(c) Xchar c; X{ X write(ttyfd, &c, 1); X} X Xtimedout() X{ X signal(SIGALRM, timedout); /* for pre-4.2 systems */ X longjmp(timobuf, 1); X} X X#ifdef SYSV Xstatic struct termio otty, ntty; X#else Xstatic struct sgttyb otty, ntty; X#endif X X/* should turn messages off */ X Xsetup_tty() X{ X int cleanup(); X int timedout(); X X ttyf = stdin; X ttyfd = fileno(stdout); X#ifdef SYSV X ioctl(ttyfd, TCGETA, &otty); /* get termio info */ X#else X ioctl(ttyfd, TIOCGETP, &otty); X#endif X signal(SIGHUP, cleanup); X signal(SIGINT, cleanup); X signal(SIGQUIT, cleanup); X signal(SIGTERM, cleanup); X signal(SIGALRM, timedout); X ntty = otty; X#ifdef SYSV X ntty.c_iflag = BRKINT; /* only interrupt on break */ X ntty.c_oflag = 0; /* no output processing */ X ntty.c_cflag |= CS8; /* 8 bit characters */ X ntty.c_lflag = 0; /* no echoing */ X ntty.c_cc[VEOF] = 1; /* "MIN" minimum chars before input */ X ntty.c_cc[VEOL] = 1; /* "TIME" maximum .1 secs before feed */ X ioctl(ttyfd, TCSETAF, &ntty); /* set mode and flush input */ X#else X ntty.sg_flags = RAW; X ioctl(ttyfd, TIOCSETP, &ntty); X#endif X} X Xreset_tty() X{ X if (ttyf != NULL) { X#ifdef SYSV X ioctl(ttyfd, TCSETAF, &otty); /* reset after output drains */ X#else X sleep (5); /* wait for output to drain */ X ioctl(ttyfd, TIOCSETP, &otty); X#endif X } X} X Xcleanup(sig) Xint sig; X{ X reset_tty(); X exit(sig); X} X Xput4(bp, value) Xchar *bp; Xlong value; X{ X register int i, c; X X for (i = 0; i < 4; i++) { X c = (value >> 24) & BYTEMASK; X value <<= 8; X *bp++ = c; X } X} X Xint calcrc(ptr, count) Xchar *ptr; Xint count; X { X int crc, i; X X crc = 0; X while (--count >= 0) { X crc ^= ((int) *ptr++) << 8; X for (i = 0; i < 8; ++i) X if (crc & 0x8000) X crc = crc << 1 ^ 0x1021; X else X crc <<= 1; X } X return (crc & 0xFFFF); X } SHAR_EOF if test 9383 -ne "`wc -c < 'macbput.c'`" then echo shar: error transmitting "'macbput.c'" '(should have been 9383 characters)' fi fi # end of overwriting check echo shar: extracting "'makefile'" '(1674 characters)' if test -f 'makefile' then echo shar: will not over-write existing file "'makefile'" else sed 's/^X//' << \SHAR_EOF > 'makefile' X# Makefile for Layers 1.0 X XBIN = /usr/local XMANDIR = /usr/local/manl X XPGM = layers XPGM2 = layersize XPGM3 = layertitle XPGM4 = macbput XMS = l XCFLAGS = -O XCFILES = layers.c protocol.c XOFILES = layers.o protocol.o X Xall: $(PGM) $(PGM2) $(PGM3) $(PGM4) X X$(PGM): $(OFILES) X $(CC) $(CFLAGS) -o $(PGM) $(OFILES) X X# $(CC) $(CFLAGS) -o $(PGM) $(OFILES) -ltermcap X Xlayers.o: layers.c layers.h X $(CC) $(CFLAGS) -c layers.c X Xprotocol.o: protocol.c layers.h X $(CC) $(CFLAGS) -c protocol.c X X$(PGM2): layersize.o X $(CC) $(CFLAGS) -o $(PGM2) layersize.o X X$(PGM3): layertitle.o X $(CC) $(CFLAGS) -o $(PGM3) layertitle.o X X$(PGM4): macbput.o X $(CC) $(CFLAGS) -o $(PGM4) macbput.o X Xlayersize.o: layersize.c X $(CC) $(CFLAGS) -c layersize.c X Xlayertitle.o: layertitle.c X $(CC) $(CFLAGS) -c layertitle.c X Xmacbput.o: macbput.c X $(CC) $(CFLAGS) -c macbput.c X Xinstall: $(PGM) $(PGM2) $(PGM3) $(PGM4) X rm -f $(BIN)/$(PGM) X install -c -s -o root -g daemon -m 4711 $(PGM) $(BIN)/$(PGM) X install -c -s $(PGM2) $(BIN)/$(PGM2) X install -c -s $(PGM3) $(BIN)/$(PGM3) X# install -c -s $(PGM4) $(BIN)/$(PGM4) X Xinstallnopriv: $(PGM) $(PGM2) $(PGM3) $(PGM4) X rm -f $(BIN)/$(PGM) X install -c -s $(PGM) $(BIN)/$(PGM) X install -c -s $(PGM2) $(BIN)/$(PGM2) X install -c -s $(PGM3) $(BIN)/$(PGM3) X# install -c -s $(PGM4) $(BIN)/$(PGM4) X Xmanpage: layers.1 X rm -f $(MANDIR)/$(PGM).$(MS) X cp layers.1 $(MANDIR)/$(PGM).$(MS) X chmod 664 $(MANDIR)/$(PGM).$(MS) X Xclean: X rm -f a.out core $(PGM) $(PGM2) $(PGM3) $(PGM4) *.o X Xshar: makefile X shar README layers.1 makefile layers.h layers.c \ X protocol.c layersize.c layertitle.c MacLayers.sit.Hqx MacLayers.doc \ X macbput.c macbput.1 >layers.shar SHAR_EOF if test 1674 -ne "`wc -c < 'makefile'`" then echo shar: error transmitting "'makefile'" '(should have been 1674 characters)' fi fi # end of overwriting check echo shar: extracting "'protocol.c'" '(25546 characters)' if test -f 'protocol.c' then echo shar: will not over-write existing file "'protocol.c'" else sed 's/^X//' << \SHAR_EOF > 'protocol.c' X/* Copyright (C) 1989 by David W. Trissel X * X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X */ X X#include <stdio.h> X#include <signal.h> X#include <errno.h> X#include "layers.h" X X /* protocol.c - BSD MacLayers protocol driver */ X X/* This module handles all interaction with the Macintosh MacLayers X** program. Services provided are: X** X** InitLink() - initialize link to MacLayers X** X** TopChannel() - return highest prority channel X** X** SendNew() - request new layer channel of MacLayers X** X** SendTitle() - change window title to given string (NOT IMPLENTED YET) X** X** SendDelete()- tell MacLayers indicated layer has died X** X** SendQuit() - order MacLayers to terminate layers mode X** X** SendData() - send output to indicated channel's window X** X** SendReshape() - send Shape structure to MacLayers X** X** ProcessStreamin() - data is ready to be processed from MacLayers X** X*/ X X#define DUMPALL X#undef DUMPALL X X/* C library calls */ Xunsigned alarm(); /* alarm system call */ X Xstatic int GetData(); Xstatic void Packet(); Xstatic void Parse(); Xstatic void AwaitInput(); Xstatic void asciishape(); Xstatic void fill4(); Xstatic void fill2(); Xstatic void fill1(); Xstatic int parseshape(); Xstatic unsigned get4(); Xstatic unsigned get2(); Xstatic unsigned get1(); X Xstatic char inbuff[IOSIZE]; /* input buffer from MacLayers */ Xstatic char *inpos; /* current input position in buffer */ Xstatic int insize = 0; /* characters left to process */ Xstatic int Outstream = -1; /* current output stream channel */ Xstatic int Instream = -1; /* current input stream channel */ X Xstatic struct Shape SNshape; /* SendNew() shape response */ Xstatic int SNresp = 0; /* SendNew() reponse poll flag */ Xstatic int SNchan = 0; /* SendNew() channel return */ X#define SN_WAITING -1000 /* SendNew() waiting response value */ X X#define ATTRSIZE 15 /* size of window attribute string */ X X#define FLUSH fflush(stdout) X X X /* Initlink() - initialize link with MacLayers */ X X/* Returns: X** 0 - linkup failed X** 1 - linkup successful, Maclayers now in protocol mode X*/ X Xint XInitlink() X{ X int Outstream = -1; /* no default stream yet */ X int Instream = -1; /* no default stream yet */ X int num1, num2, num3; /* scanf item result */ X int err; /* error code */ X X#define WAITTIME 10 /* second wait response time */ X#define INITTIME 2 /* wait time after succesful startup */ X X /* we must non-buffer input since all input must be immediate */ X setbuf(stdin, NULL); /* non-buffer all input */ X X /* send intitial request for terminal type and version number */ X DO DEBUG("write: ESC [ c\n"); X if ((err=printf("\033[c")) < 0) X { X DO DEBUG(" printf() error code %d\n", err); X return ( 0 ); /* problem with stdout */ X } X FLUSH; /* force output buffer */ X X /* attempt to read "ESC [ ? 8 ; typedigits ; versiondigits c" */ X num1 = num2 = num3 = -1; /* default to unsupplied values */ X (void) alarm(WAITTIME); /* set timeout */ X DO DEBUG(" doing first scanf\n"); X (void) scanf("\033[?%d;%d;%dc", &num1, &num2, &num3); X (void) alarm(0); /* cancel alarm */ X DO DEBUG("read ESC [ ? %d ; %d; %d c\n", num1, num2, num3); X if (num1 != 8 || num2 != 10) X return ( 0 ); /* not correct response or layers term ID */ X X /* ask terminal if ENC_ENABLE is to be forced */ X DO DEBUG("write: ESC [ F\n"); X (void) printf("\033[F"); X FLUSH; /* force output buffer */ X (void) alarm(WAITTIME); /* set timeout */ X X /* attempt to read "ESC [ flag F" (flag indicates ENC_ENABLE status) */ X num1 = -1; /* default to invalid response */ X (void) scanf("\033[%dF", &num1); X (void) alarm(0); /* cancel alarm */ X DO DEBUG("read ESC [ %d F\n", num1); X if (num1 != 2 && num1 != 0) X return ( 0 ); /* something's wrong */ X X /* now startup packet mode in non ENC_ENABLE processing */ X DO DEBUG("write: ESC [ 2 ; 0 v\n"); X (void) printf("\033[2;0v"); /* "ESC [ 2 ; 0 v" */ X FLUSH; /* force output buffer */ X X /* we are now in packet mode */ X sleep( INITTIME ); /* let Macintosh keep up with us */ X return ( 1 ); /* return successful startup */ X X} /* Initlink() */ X X X /* TopChannel() - return highest prority channel */ X Xint XTopChannel() X{ X return ( Instream ); X X} /* TopChannel() */ X X X /* X ** WARNING: Most of the following functions may be recursively called X ** as control commands are processed from the input stream X */ X X X /* ProcessStreamin() - MacLayers has input to process */ X Xvoid XProcessStreamin() X{ X int c; /* input character being processed */ X X DO DEBUG("ProcessStreamin()\n"); X X GetData(0); /* read some and don't timeout */ X X while (insize > 0) /* while more data to process ... */ X Parse(); /* process next chuck of data */ X X} /* ProcessStreamin() */ X X X /* SendNew() - request new layer channel from MacLayers */ X X/* This command is unique in that it returns a response from MacLayers. X** To do this we continue processing the input stream until we get X** our return. (This leads to recursive conditions.) The variables X** 'SNresp', 'SNshape' and 'SNchan' are set when our reply is received. X*/ Xint XSendNew(shape) Xstruct Shape *shape; /* shape to use for new window */ X{ X int i; /* attribute count variable */ X char astring[ATTRSIZE]; /* copy of attribute string */ X X DO DEBUG("SendNew() new layer requested: '~%cA'\n", '1'+ATTRSIZE); X X /* check for a recursive call */ X if (SNresp == SN_WAITING) X { DO DEBUG("return 0 - recursive call\n"); X return ( 0 ); /* return failure */ X } X X putchar(ESCAPE); /* send start of control packet char */ X putchar('1' + ATTRSIZE); /* send command size */ X putchar('A'); /* send command */ X asciishape(shape, astring); /* convert shape to string */ X for (i=0; i < ATTRSIZE; i++) X putchar(astring[i]); /* send next attribute digit */ X FLUSH; X X /* now stay here and process the input stream until we see our response */ X/**** THIS SHOULD BE ENHANCED TO TIMEOUT WITH GetData() AND REISSUE REQUEST */ X SNresp = SN_WAITING; /* indicate we are waiting a response */ X while (SNresp == SN_WAITING) X { DO DEBUG(" while (SNresp %d == %d)\n", SNresp, SN_WAITING); X AwaitInput(); /* wait till input from MacLayers arrives */ X ProcessStreamin(); /* process available input */ X } X X if (SNresp == -1) /* if Maclayers rejected request */ X SNchan = 0; /* return failure channel of zero */ X else X *shape = SNshape; /* else update shape structure */ X X DO DEBUG("SendNew() returning channel %d\n", SNchan); X X return ( SNchan ); /* return the indicated channel */ X X} /* SendNew() */ X X X /* SendReshape() - send to shape to MacLayers */ X Xvoid XSendReshape(chan, shape) Xint chan; /* channel shape belongs to */ Xstruct Shape *shape; /* shape to use for new window */ X{ X int i; /* attribute count variable */ X char astring[ATTRSIZE]; /* copy of attribute string */ X X DO DEBUG("SendReshape() reshape: '~%cA'\n", '2'+ATTRSIZE); X X if (chan <= 0 || chan > MAXPCHAN) X { DO DEBUG("BAD CHANNEL!!!\n"); X return; /* ignore request */ X } X X putchar(ESCAPE); /* send start of control packet char */ X putchar('2' + ATTRSIZE); /* send command size */ X putchar('R'); /* send command */ X putchar(chan + '0'); /* send channel */ X asciishape(shape, astring); /* convert shape to string */ X DO DEBUG("shape: %.*s\n", ATTRSIZE, astring); X for (i=0; i < ATTRSIZE; i++) X putchar(astring[i]); /* send next attribute digit */ X FLUSH; X X} /* SendReshape() */ X X X /* SendTitle() - set layer's window title */ X Xvoid XSendTitle(chan, buff, cnt) Xint chan; /* layer window ID */ Xchar *buff; /* new title string */ Xint cnt; /* count of title length */ X{ X int i; /* work variable */ X X DO DEBUG("SendTitle(chan%d, len %d, '%.*s')\n", chan, cnt, cnt, buff); X X if (chan <= 0 || chan > MAXPCHAN) X { DO DEBUG("BAD CHANNEL!!!\n"); X return; /* ignore request */ X } X X if (cnt < 0) X { DO DEBUG("BAD COUNT!!!\n"); X return; /* ignore request */ X } X X /* for now chop title size to 29 chars since that's MacLayer's limit */ X if (cnt > 29) X cnt = 29; /* due to packet size limit */ X X /* we must guarantee that the size will not appear to be another ESCAPE */ X if ('2' + cnt == ESCAPE) X cnt--; /* truncate to avoid ESCAPE ESCAPE */ X X putchar(ESCAPE); /* send start of control packet char */ X putchar('2' + cnt); /* send size of packet */ X putchar('T'); /* send command */ X putchar(chan + '0'); /* send channel ID */ X for (i=0; i<cnt; i++) X putchar(buff[i]); /* send out title */ X FLUSH; X X} /* SendTitle() */ X X X /* SendDelete() - tell Maclayers layer died */ X Xvoid XSendDelete(chan) Xint chan; /* dead channel ID */ X{ X DO DEBUG("SendDelete(%d) '~2D%d'\n", chan, chan); X X if (chan <= 0 || chan > MAXPCHAN) /* check channel ID */ X { DO DEBUG("BAD CHANNEL!!!\n"); X return; /* ignore request */ X } X X putchar(ESCAPE); /* send control packet start char */ X putchar('2'); /* send command size */ X putchar('D'); /* send command character */ X putchar(chan + '0'); /* channel ID in ascii */ X FLUSH; X X} /* SendDelete() */ X X X /* SendQuit() - order MacLayers to end layers mode */ X Xvoid XSendQuit(chan) Xint chan; /* dead channel ID */ X{ X DO DEBUG("SendQuit() '~1E'\n"); X X putchar(ESCAPE); /* send control packet start char */ X putchar('1'); /* send command size */ X putchar('E'); /* send command */ X FLUSH; X X} /* SendQuit() */ X X X /* SendData() - send output to layer's window */ X Xvoid XSendData(chan, buff, cnt) Xint chan; /* layer window ID */ Xunsigned char *buff; /* new title string */ Xint cnt; /* count of title length */ X{ X unsigned c; /* output character being sent */ X X DO X { int dcnt; X X DEBUG("SendData(chan %d, len %d, '", chan, cnt, cnt, buff); X for (dcnt=0; dcnt<cnt; dcnt++) X DEBUG("%c", buff[dcnt]); /* dump each char so null doesn't stop */ X DEBUG("')\n"); X } X X if (chan <= 0 || chan > MAXPCHAN) X { DO DEBUG("BAD CHANNEL!!!\n"); X return; /* ignore request */ X } X X /* if new output channel stream then prefix redirect command */ X if (chan != Outstream) X { DO DEBUG("Redirecting output to %d '~2O%d'\n", chan, chan); X putchar(ESCAPE); /* start of command sequence */ X putchar('2'); /* send command size */ X putchar('O'); /* send command */ X putchar(chan + '0'); /* put out channel in ASCII */ X Outstream = chan; /* new output stream set */ X } X X /* transmit the buffer converting the ESCAPE sequence to double ESCAPE */ X while (cnt--) X { c = *buff++; /* get next output character */ X#ifdef DUMPALL X DO DEBUG("outchar %c 0x%x\n", c, c); X#endif X if (c == ESCAPE || c == (ESCAPE + 0x80)) X { putchar(c); /* put it out twice */ X#ifdef DUMPALL X DO DEBUG(" Doubled Escape!\n"); X#endif X } X putchar(c); /* write character out */ X } X X FLUSH; /* force out queued output characters */ X X} /* SendData() */ X X X /* Parse() - process next chunk of input stream */ X Xstatic void XParse() X{ X#define ST_NULL 0 /* not primed for next state yet */ X#define ST_STREAM 1 /* processing default stream input */ X#define ST_PKT 2 /* processing packet data */ X X int c; /* input character being processed */ X X static int state = ST_NULL; /* current input state */ X static int psize = 0; /* packet size */ X static int rempsize = 0; /* remembered packet size */ X static char pdata[MAXSTR]; /* area for packet data */ X static char *ppos; /* packet read insert position */ X static int escapemode = 0; /* processing escape character */ X static int escapechar; /* escape character being processed */ X static pchan = -1; /* packet input stream channel */ X X while (insize-- > 0) /* while more data */ X { c = *inpos++; /* get next character */ X switch (state) /* process according to state */ X { case ST_NULL: /* prepare for new packet */ X DO DEBUG("ST_NULL\n"); X psize = 0; /* clear packet size */ X ppos = pdata; /* start fill at data position */ X pchan = Instream; /* packet channel is current input stream */ X state = ST_STREAM; /* default is stream processing */ X X case ST_STREAM: X /* stream keyboard input for layer */ X /* check for escape char with possible high bit on */ X#ifdef DUMPALL X DO DEBUG("ST_STREAM %x/%x esc %d insz %d\n", X c, c & 0x7f, escapemode, insize); X#endif X if (c == ESCAPE || c == (ESCAPE | 0x80)) X { if (escapemode && c == escapechar) /* previous was ESCAPE */ X /* this is really a single ESCAPE character */ X escapemode = 0; /* back out of ESCAPE mode */ X else X /* what do we do with back to back esc esc+0x80 ? */ X { /* flag in escape mode */ X escapemode++; X escapechar = c; /* remember character used for escape */ X continue; /* and continue scan */ X } X } X else X if (escapemode) X { /* this is the start of a control packet */ X if (psize) /* if we have previous data packet */ X Packet(pchan, psize, pdata); /* finish up previous pkt */ X /* process packet size */ X psize = (c & 0x7f) - '0'; /* save size byte */ X if (psize <= 0 || psize > MAXSTR) X { /* bad size */ X DO DEBUG("Bad pkt size %d\n", psize); X break; /* trash this packet */ X } X rempsize = psize; /* remember this size for later */ X#if 0 X ptimo = rtimo; /* start receive timeout */ X#endif X escapemode = 0; /* escape mode now off */ X ppos = pdata; /* initialize data store pointer */ X state = ST_PKT; /* expect packet data next */ X continue; /* continue scan */ X } X X /* process standard data output character for current stream */ X X *ppos++ = c; /* save next data character */ X X if (++psize >= MAXSTR) /* if packet full ... */ X { Packet(pchan, psize, pdata); /* process this packet */ X break; /* end packet processing */ X } X continue; /* continue scan */ X X case ST_PKT: X /* process next paket data byte */ X *ppos++ = c & 0x7f; /* store next data byte */ X#ifdef DUMPALL X DO DEBUG("ST_PKT: %x sz %d\n", c & 0x7f, psize); X#endif X if (--psize != 0) X continue; X#if 0 X if (crc((unsigned char *) &rpkt, rpkt.pkt.HEADER_DSIZE+2)) X STATS(Scrcerr); /* communications error */ X else X#endif X Packet(0, rempsize, pdata); /* process it */ X X } /* end build packet switch */ X X#if 0 X ptimo = 0; /* no more receive timeout */ X#endif X state = ST_NULL; /* no more receive packet in progress */ X X } /* end while (insize) */ X X if (state == ST_STREAM && psize ) /* if we have some data ... */ X { Packet(Instream, psize, pdata); /* process this data */ X#if 0 X ptimo = 0; /* no more receive timeout */ X#endif X state = ST_NULL; /* no more receive packet in progress */ X } X X} /* Parse() */ X X X /* Packet() - prcess next input data string or control packet */ Xstatic void XPacket(chan, size, buff) Xint chan; /* channel (0 if control packet) */ Xint size; /* amount of data */ Xchar *buff; /* pointer to packet data */ X{ X static struct Shape shape; /* Shape structure */ X X DO DEBUG("Packet(chan %d, size %d, '%.*s')\n", chan, size, size, buff); X X /* verify channel */ X if (chan < 0 || chan > MAXPCHAN) X { DO DEBUG("BAD CHANNEL!!\n"); X return; /* ignore bad channel */ X } X X /* if data packet (chan>0) feed data to server */ X if (chan > 0) X { ReceiveData(chan, buff, size); X return; /* we are through */ X } X X /* control packet (channel 0) */ X chan = buff[1] - '0'; /* assume channel specified */ X if (chan < 0 || chan > MAXPCHAN) /* if invalid ... */ X chan = 0; /* set to zero */ X X switch (buff[0]) X { case 'I': /* redirect stream */ X DO DEBUG("CMD 'I' redirect stream to %c\n", buff[1]); X if (size != 2) /* verify size */ X break; /* break if bad */ X if (chan == 0) /* verify channel */ X break; /* break if bad */ X Instream = chan; /* new instream channel */ X return; /* we are through */ X X case 'A': /* returned A_NEWLAYER packet */ X DO DEBUG("CMD 'A' A_NEWLAYER response %c newchan %c SNresp %d\n", X buff[2], buff[1], SNresp); X if (size != 3 + ATTRSIZE) X break; /* break if bad */ X X /* if SendNew() not waiting for a response this is invalid */ X if (SNresp != SN_WAITING) X break; /* break if bad */ X X if (buff[2] == '1') /* if response is "failed" ... */ X SNresp = -1; /* show -1 response */ X else X if (buff[2] == '0') /* if response is "success" ... */ X { if (chan == 0) /* if invalid channel */ X break; /* break if bad */ X /* build shape structure for SendNew() */ X if (parseshape(&SNshape, &buff[3]) == -1) X break; /* if invalid data then bad packet */ X SNresp = 0; /* show good response */ X SNchan = chan; /* indicate channel returned */ X } X else X break; /* break if bad */ X X DO DEBUG("SNresp = %d, SNchan = %d\n", SNresp, SNchan); X return; /* we are through */ X X case 'N': /* new layer creation */ X DO DEBUG("CMD 'N' new layer creation newchan %c\n", buff[1]); X if (size != 2 + ATTRSIZE) /* verify size */ X break; /* break if bad */ X if (chan == 0) /* verify channel */ X break; /* break if bad */ X /* build shape structure */ X if (parseshape(&shape, &buff[2]) == -1) X break; /* if invalid data then bad packet */ X ReceiveNew(chan, &shape); /* pass to server */ X return; /* packet is done */ X X case 'D': /* deleted layer */ X DO DEBUG("CMD 'D' deleted layer %c\n", buff[1]); X if (size != 2) /* verify size */ X break; /* break if bad */ X if (chan == 0) /* verify channel */ X break; /* break if bad */ X ReceiveDelete(chan); /* pass on to server */ X return; /* packet is done */ X X case 'E': /* exit - awaiting shutdown */ X DO DEBUG("CMD 'E' exit MacLayers awaiting shutdown msg\n"); X if (size != 1) /* verify size */ X break; /* break if bad */ X ReceiveQuit(); /* pass to server */ X /* NOT REACHED*/ X return; /* ?? should never reach here */ X X case 'R': /* reshaped */ X DO DEBUG("CMD 'R' reshape chan %c\n", buff[1]); X X if (size != 2 + ATTRSIZE) /* verify size */ X break; /* break if bad */ X X if (chan == 0) /* verify channel */ X break; /* break if bad */ X X /* build shape structure */ X if (parseshape(&shape, &buff[2]) == -1) X break; /* if invalid data then bad packet */ X X ReceiveReshape(chan, &shape); /* tell server about shape */ X return; /* packet processed */ X X case 'S': /* signal */ X DO DEBUG("CMD 'S' SIGNAL chan %c sig %c\n", buff[1], buff[2]); X if (size != 3) /* verify size */ X break; /* break if bad */ X if (chan == 0) X break; /* break if bad */ X X if (buff[2] == '0') /* if SIGINT */ X size = SIGINT; /* yes */ X else X if (buff[2] == '1') /* if SIGHUP */ X size = SIGHUP; /* yes */ X else X break; /* invalid signal */ X X ReceiveSignal(chan, size); /* pass to server */ X return; /* packet processed */ X X default: X DO DEBUG("ILLEGAL CONTROL PACKET!!!\n"); X return; /* ignore bad packet */ X X } /* end command packet switch */ X X /* switch falls out if bad size or channel for given command */ X DO DEBUG("Invalid size or channel!!!\n"); /* dump error */ X return; /* ignore packet */ X X} /* Packet() */ X X X /* GetData() - read next input from MacLayers stream */ X X/* An input timout parameter can indicate that we return if nothing X** is read within a certain amount of seconds. The return code is: X** X** 0 - timeout occured and no data was read X** X** 1 - no timeout occured, data read X*/ Xstatic int XGetData(timeout) Xint timeout; /* timeout in seconds (or zero) */ X{ X int result; /* return from read() */ X X DO DEBUG("GetData(timout %d)\n", timeout); X X /* if buffer still has data simply return (SHOULD NOT OCCUR?) */ X if (insize > 0) X return ( 1 ); /* act as through data read */ X inpos = inbuff; /* next get will start at beginning */ X insize = 0; /* default insize back to zero */ X X /* set timeout if we are to do so */ X if (timeout) X (void) alarm(timeout); /* set timeout in seconds */ X X /* do the read from stdin */ X result = read(0, inbuff, IOSIZE); X X /* if alarm was set cancel it now */ X if (timeout) X (void) alarm(0); /* cancel alarm */ X X /* check for timeout or error */ X /* EWOULDBLOCK for no data avail -(but we should not see this) */ X /* EINTR if signal stopped the read -(rare but could happen) */ X if (result <= 0) X return ( 0 ); /* return nothing read */ X X /* return with fresh buffer data */ X insize = result; X DO DEBUG("read %d bytes\n", insize); X return ( 1 ); /* return OK code */ X X} /* GetData() */ X X X /* AwaitInput() - wait for more input from MacLayers */ X Xstatic void XAwaitInput() X{ X int r; /* read descriptor bits */ X X DO DEBUG("AwaitInput()\n"); X X do X { r = 1<<0; /* wait for read from input device */ X if (select(32, &r, NULL, NULL, NULL) == -1) /* if problem waiting ... */ X { if (errno != EINTR) /* if not simply signal taken ... */ X { /* SHOULD NOT OCCUR - shutdown layers */ X DO DEBUG("AwaitInput: select error %d\n", errno); X printf("layers: AwaitInput: bad select %d\n", errno); X FQuit(); /* shutdown layers */ X /* NOT REACHED */ X } X } X } while ((r & 1<<0) == 0); X X} /* AwaitInput() */ X X /* asciishape() - convert Shape structure to ASCII */ Xstatic void Xasciishape(shape, loc) Xstruct Shape *shape; /* Shape structure for channel */ Xchar *loc; /* location to start filling result */ X{ X char *origloc; /* (for debuggin) */ X X origloc = loc; /* remember start of string */ X fill4(&loc, shape->worigh); /* origin h */ X fill4(&loc, shape->worigv); /* origin v */ X fill2(&loc, shape->wlines); /* lines high */ X fill2(&loc, shape->wchars); /* chars wide */ X fill1(&loc, shape->wfont); /* font size */ X fill2(&loc, shape->wattr); /* attributes */ X X DO DEBUG("asciishape(): %.*s\n", ATTRSIZE, origloc); X X} /* asciishape() */ X X X /* fill4() - convert parameter to ASCII */ X Xstatic void Xfill4(loc, valu) Xchar **loc; /* pointer to fill area pointer */ Xunsigned valu; /* value to use */ X{ X fill2(loc, valu>>8); /* fill high half word */ X fill2(loc, valu & 0xff); /* fill low half word */ X X} /* fill4() */ X X X /* fill2() - convert parameter to ASCII */ X Xstatic void Xfill2(loc, valu) Xchar **loc; /* pointer to fill area pointer */ Xunsigned valu; /* value to use */ X{ X fill1(loc, valu>>4); /* fill high byte */ X fill1(loc, valu & 0xf); /* fill low byte */ X X} /* fill2() */ X X X /* fill1() - convert parameter to ASCII */ X Xstatic void Xfill1(loc, valu) Xchar **loc; /* pointer to fill area pointer */ Xunsigned valu; /* value to use */ X{ X *(*loc)++ = "0123456789ABCDEF"[valu & 0xf]; /* return hex value */ X X} /* fill1() */ X X X /* parseshape() - convert ASCII image to Shape structure */ X Xstatic int Badconvert; /* indicates bad conversion */ X Xstatic int Xparseshape(shape, loc) Xstruct Shape *shape; /* Shape structure for channel */ Xchar *loc; /* location to start parsing */ X{ X Badconvert = 0; /* clear bad characters indicator */ X shape->worigh = get4(&loc); /* origin h */ X shape->worigv = get4(&loc); /* origin v */ X shape->wlines = get2(&loc); /* lines high */ X shape->wchars = get2(&loc); /* chars wide */ X shape->wfont = get1(&loc); /* font size */ X shape->wattr = get2(&loc); /* attributes */ X X DO DEBUG("ParseShape(): origv %d, origh %d, lines %d, chars %d\n", X shape->worigv, shape->worigh, shape->wlines, shape->wchars); X DO DEBUG(" font %d, attr 0x%x, badconv %d\n", X shape->wfont, shape->wattr, Badconvert); X X return ( Badconvert ? -1 : 0 ); /* return conversion code */ X X} /* parseshape() */ X X X /* get4() - convert ASCII to parameter */ X Xstatic unsigned Xget4(loc) Xchar **loc; /* pointer to fill area pointer */ X{ X unsigned hi; /* high portion */ X unsigned low; /* low portion */ X X hi = get2(loc); /* get high byte */ X low = get2(loc); /* get low byte */ X X return ( (hi<<8) + low ); /* return word value */ X X} /* get4() */ X X X /* get2() - convert ASCII to parameter */ X Xstatic unsigned Xget2(loc) Xchar **loc; /* pointer to fill area pointer */ X{ X unsigned hi; /* high portion */ X unsigned low; /* low portion */ X X hi = get1(loc); /* get high half */ X low = get1(loc); /* get low half */ X X return ( (hi<<4) + low ); /* return byte value */ X X} /* get2() */ X X X /* get1() - convert ASCII to parameter */ X X/* This function sets 'Badconvert' if an invalid character is detected */ X Xstatic unsigned Xget1(loc) Xchar **loc; /* pointer to fill area pointer */ X{ X int c; /* character to convert */ X X c = *(*loc)++; /* fetch character */ X X if (c >= '0' && c <= '9') X /* zero through nine */ X return ( c - '0' ); /* return it's binary value */ X X if (c >= 'a' && c <= 'f') X /* lower case hex */ X return ( c - 'a' + 10); /* return it's binary value */ X X if (c >= 'A' && c <= 'F') X /* upper case hex */ X return ( c - 'A' + 10); /* return it's binary value */ X X /* invalid digit! */ X Badconvert++; /* set bad character flag */ X return ( 0 ); /* return a zero */ X X} /* get1() */ SHAR_EOF if test 25546 -ne "`wc -c < 'protocol.c'`" then echo shar: error transmitting "'protocol.c'" '(should have been 25546 characters)' fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 2 ---
werner@rascal.ics.utexas.edu (Werner Uhrig) (06/02/90)
[MacLayers 1.00 - part 3 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # layers.c # # This archive created: Thu May 31 21:58:18 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'layers.c'" '(56819 characters)' if test -f 'layers.c' then echo shar: will not over-write existing file "'layers.c'" else sed 's/^X//' << \SHAR_EOF > 'layers.c' X/******** Layers.c X********* X********* Layers - MacLayers Multiwindow BSD Socket Driver X********* X********* Dave Trissel oakhill!davet X********* X********* The sockets handling portion of this control module is based X********* upon 'screen' by Oliver Laumann whose copyright remains below. X********* The rest is X * X * Copyright (C) 1989 by David W. Trissel X * X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X */ X Xstatic char LayersVersion[] = "layers 1.00 17-Mar-1990"; X X/* Layers Changes: X X Version .92 22-Mar-1989 X X Original Distributed version X X Version .93 31-Mar-1989 X X Deleted dl and al termcap entries since they didn't help any X (al was redundant with sc (scroll) so should never have been created) X X SIGINT no longer causes us to quit (left debugging code in by mistake) X X Layer #1 is always logged in and takes over as user's login console X (Real tty disconnected from /etc/utmp file while layers is running) X X Version .93b 05-May-1989 X X Try getenv("PWD") before getwd() so Sun networking won't hang us up X X Version .93n 07-Jan-1990 X X Reset TTY back to normal if initial link handshake fails. X X Version 1.00b 22-Jan-1990 X X Corrected problem of layers forcing all umasks to 000. X X Version 1.00 17-Mar-1990 X X First public release. X*/ X X X/* Copyright (c) 1987,1988 Oliver Laumann, Technical University of Berlin. X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X * X * Modified by Patrick Wolfe (pat@kai.com, kailand!pat) X * Do whatever you want with (my modifications of) this program, but X * don't claim you wrote them, don't try to make money from them, and X * don't remove this notice. X */ X X/* X * Beginning of User Configuration Section X */ X X/* X * SEQUENT -- your host system is Sequent. This changes a setvbuf() X * call to a setlinebuf(). [Suggested by Peter Newton X * <newton@cs.utexas.edu>] X * X */ X#undef SEQUENT X X X/* X * GETTTYENT -- your system has the new format /etc/ttys (like 4.3 BSD) X * and the getttyent(3) library functions. X * X */ X#undef GETTTYENT X X X/* X * LOGINDEFAULT -- if set to 1 (one), windows will login (add entries to X * /etc/utmp) by default. Set to 0 if you don't want this. X * (Also see USERLIMIT below). [NOTE: current code always X * logs layer #1 only unless -l option used on 'layers' X * command.] X */ X#define LOGINDEFAULT 0 X X/* X * USERLIMIT -- count all non-null entries in /etc/utmp before adding a X * new entry. Some machine manufacturers (incorrectly) count X * logins by counting non-null entries in /etc/utmp (instead X * of counting non-null entries with no hostname and not on X * a pseudo tty). Sequent does this, so you might reach your X * limited user license early. X */ X#define USRLIMIT 32 X X/* X * SOCKDIR -- If defined, this directory is where layers sockets will be X * placed, (actually in a subdirectory by the user's loginid). X * This is neccessary because NFS doesn't support socket X * operations, and many people's homes are on NFS mounted X * partitions. Layers will create this directory if it needs X * to. X */ X#define SOCKDIR "/tmp/layers" /* NFS doesn't support named sockets */ X X/* X * End of User Configuration Section X */ X X#include <stdio.h> X#include <sgtty.h> X#include <signal.h> X#include <errno.h> X#include <ctype.h> X#include <utmp.h> X#include <pwd.h> X#include <nlist.h> X#include <fcntl.h> X#include <sys/types.h> X#include <sys/time.h> X#include <sys/file.h> X#include <sys/wait.h> X#include <sys/socket.h> X#include <sys/un.h> X#include <sys/stat.h> X#include <sys/dir.h> X#include <sys/ioctl.h> X X#include "layers.h" X X#ifdef GETTTYENT X#include <ttyent.h> X#else Xstatic struct ttyent X { char *ty_name; X } *getttyent(); Xstatic char *tt, *ttnext; Xstatic char ttys[] = "/etc/ttys"; X#endif X X#ifndef FSCALE X#define FSCALE 1000.0 /* Sequent doesn't define FSCALE...grrrr */ X#endif X X#ifdef USRLIMIT Xstruct utmp utmpbuf; Xint UserCount; X#endif X X#define Ctrl(c) ((c)&037) X X/* C library items */ Xextern char **environ; Xextern errno; Xextern sys_nerr; Xextern char *sys_errlist[]; Xextern char *index(), *rindex(), *malloc(), *getenv(); Xextern char *getlogin(), *ttyname(); X X/* Local items */ Xstatic void FAbort(), SigHup(), SigChld(), AddCap(), FinitTerm(); Xstatic char *MakeTermcap(), *Filename(), **SaveArgs(), *GetTtyName(); Xstatic void InitWorld(), ClearShape(), BuildTitle(), KillPG(); Xstatic void SetWindowSize(), WriteUtmp(); Xstatic int ReadUtmp(), FindUtmp(), SetUtmp(); X Xstatic int loginflag = -1; Xstatic char PtyName[32], TtyName[32]; Xstatic char *ShellProg; Xstatic char *ShellArgs[2]; Xstatic inlen; Xstatic ESCseen; Xstatic GotSignal; Xstatic char DefaultShell[] = "/bin/sh"; Xstatic char DefaultPath[] = ":/usr/ucb:/bin:/usr/bin"; Xstatic char PtyProto[] = "/dev/ptyXY"; Xstatic char TtyProto[] = "/dev/ttyXY"; Xstatic int TtyMode = 0622; Xstatic struct stat RealTtyStat; /* Real tty stat */ Xstatic char RealTtyName[32] = ""; /* Real tty name */ Xstatic int RealSlot = 0; /* Real tty logon slot */ Xstatic struct utmp RealUtmp; /* Real tty logon utmp entry */ Xstatic int RealTtyMode = 0; /* Real tty mode */ Xstatic int Oumask; /* Original user's umask */ Xstatic char SockPath[512]; X#ifdef SOCKDIR Xstatic char SockDir[] = SOCKDIR; X#else Xstatic char SockDir[] = ".layers"; X#endif Xstatic char *SockNamePtr, *SockName; Xstatic ServerSocket; Xstatic char *NewEnv[MAXARGS]; Xstatic char Esc = Ctrl('a'); Xstatic char MetaEsc = 'a'; Xstatic char *home; Xstatic Abortonmsg; Xstatic utmp, utmpf; Xstatic char UtmpName[] = "/etc/utmp"; Xstatic char *LoginName; Xstatic mflag, nflag, fflag, rflag; Xstatic char HostName[MAXSTR]; Xstatic char *myname; Xstatic DevTty; X Xstatic struct mode { X struct sgttyb m_ttyb; X struct tchars m_tchars; X struct ltchars m_ltchars; X int m_ldisc; X int m_lmode; X} OldMode, NewMode; X X#define MSG_CREATE 0 X#define MSG_ERROR 1 X Xstruct msg X { X int type; X union X { struct X { int lflag; /* login flag */ X struct Shape shape; /* window shape */ X int nargs; X char line[MAXLINE]; X char dir[1024]; X } create; X char message[MAXLINE]; X } m; X }; X X X /* dynamic keyboard input buffer definition */ Xstruct Kbuff X { struct Kbuff * next; /* next buffer in chain (or NULL) */ X int size; /* size of data in this buffer */ X int offset; /* start of first data in buffer */ X unsigned char text[IOSIZE]; /* text buffer itself */ X }; X X /* World layer definition */ Xstruct Layer { X int chan; /* channel represented by this layer */ X int allocated; /* layer allocated */ X int ptyfd; /* psuedo tty */ X int ptymask; /* mask for pty descriptor */ X int lpid; /* layer head process ID */ X int slot; /* utmp slot number */ X struct Kbuff *kbuff; /* keyboard input buffers */ X struct Shape shape; /* Shape structure to/from MacLayers */ X char cmd[MAXSTR]; /* command to execute */ X char tty[MAXSTR]; /* psuedo tty ID */ X }; X Xstatic struct Layer World[MAXPCHAN]; /* all layer structures */ X Xstatic int rows = 24; /* default window height in lines */ Xstatic int cols = 80; /* default window width in chars */ Xstatic char Termcap[1024]; Xstatic char Term[MAXSTR] = "TERM="; /* window's terminal type */ Xstatic char *UserTerm; /* terminal ID we are mimmicing */ Xstatic int flowctl; Xstatic tcLineLen = 100; X X/* co#80 and li$24 added dynamically for proper window size */ Xstatic char TermcapConst1[] = "TERMCAP=SC|"; Xstatic char TermcapConst3[] = "|MacLayers virtual terminal|\\\n\ X :cr=^M:do=^J:nl=^J:bl=^G:cl=\\E[;H\\E[2J:\\\n\ X :le=^H:bs:am:cm=\\E[%i%d;%dH:nd=\\E[C:up=\\E[A:\\\n\ X :ce=\\E[K:cd=\\E[J:so=\\E[7m:se=\\E[m:us=\\E[4m:ue=\\E[m:\\\n\ X :md=\\E[1m:mr=\\E[7m:mb=\\E[5m:me=\\E[m:is=\\E[1;24r\\E[24;1H:\\\n\ X :rf=/usr/lib/tabset/vt100:\\\n\ X :rs=\\E>\\E[?3l\\E[?4l\\E[?5l\\E[?7h\\E[?8h:ks=\\E[?1h\\E=:ke=\\E[?1l\\E>:\\\n\ X :ku=\\EOA:kd=\\EOB:kr=\\EOC:kl=\\EOD:kb=^H:\\\n\ X :ho=\\E[H:k1=\\EOP:k2=\\EOQ:k3=\\EOR:k4=\\EOS:ta=^I:pt:sr=\\EM:vt#3:xn:\\\n\ X :sc=\\E7:rc=\\E8:cs=\\E[%i%d;%dr:\\\n\ X :dc=\\ED:ic=\\EI:"; X/* NOTE: the above two cababilities are beyond vt100 - unique to MacLayers */ X Xint Dflag; /* debug dump flag */ X X /* main() */ Xmain(ac, av) Xchar **av; X{ X register n; X register len; X register struct Layer *layer; X char *ap; X struct passwd *ppp; X int s; X int r; /* read fd test bits */ X int w; /* write fd test bits */ X int stall; /* stall flag for priority channel */ X int fderr; /* error fd test bits */ X struct timeval tv; X struct Shape shape; /* window shape */ X time_t now; X char buf[IOSIZE]; X char rc[256]; X struct stat st; X struct Kbuff *kbptr; /* input keyboard buffer pointer */ X X Abortonmsg = 1; /* quit if message generated */ X ClearShape(&shape); /* initialize shape structure */ X myname = (ac == 0) ? "layers" : av[0]; X InitWorld(); /* clear World array structures */ X X while (ac > 0) X { ap = *++av; X if (--ac > 0 && *ap == '-') X { switch (ap[1]) X { case 'l': /* login this command line */ X loginflag = 1; X break; X X case 'd': /* dump debugging flag */ X Dflag = 1; X (void) freopen("layers.dump", "a", stderr); /* append mode */ X#ifdef SEQUENT X setlinebuf(stderr); X#else X setvbuf(stderr, NULL, _IOLBF, 0); X#endif X break; X X case 'u': /* do not login this command line */ X loginflag = 0; X break; X X case 'm': /* force this to be master and not a client */ X mflag = 1; X break; X X case 'n': /* no flow control */ X nflag = 1; X break; X X case 'f': /* flow control on */ X fflag = 1; X break; X X case 'v': /* do nothing but issue layers version */ X printf("%s\n", LayersVersion); X exit(0); X X default: X help: X Msg (0,"Use: %s [-f] [-l | -u] [-m] [-n] [cmd args]\n", myname); X X } /* end switch on '-' option */ X X } /* end if '-' */ X X else X break; X X } /* end while parameters */ X X if (nflag && fflag) X Msg (0, "-f and -n are conflicting options."); X X if ((ShellProg = getenv ("SHELL")) == 0) X ShellProg = DefaultShell; X DO DEBUG("ShellProg %s\n", ShellProg); X X /* we mimmic the user's $TERM ID */ X if ((UserTerm = getenv("TERM")) == 0) X UserTerm = "layers"; /* use "layers" if none */ X (void) strcat(Term, UserTerm); X DO DEBUG("%s\n", Term); X X ShellArgs[0] = ShellProg; X if (ac == 0) X { ac = 1; X av = ShellArgs; X shape.wattr |= Wa_shell; /* indicate a shell window */ X } X X if ((home = getenv ("HOME")) == 0) X Msg (0, "$HOME is undefined."); X DO DEBUG("home %s\n", home); X X if ((LoginName = getlogin ()) == 0 || LoginName[0] == '\0') X { if ((ppp = getpwuid (getuid ())) == 0) X return; X LoginName = ppp->pw_name; X } X DO DEBUG("LoginName %s\n", LoginName); X X if ((Oumask=umask(0)) == -1) X Msg (errno, "Cannot change umask to zero"); X DO DEBUG("Original umask o%o\n", Oumask); X X#ifdef SOCKDIR X if (stat (SOCKDIR, &st) == -1) X { if (errno == ENOENT) X { if (mkdir (SOCKDIR, 0777) == -1) X Msg (errno, "Cannot make directory %s", SOCKDIR); X (void) chown (SOCKDIR, 0, 0); X } X else X Msg (errno, "Cannot get status of %s", SOCKDIR); X } X else X { if ((st.st_mode & S_IFMT) != S_IFDIR) X Msg (0, "%s is not a directory.", SOCKDIR); X if ((st.st_mode & 0777) != 0777) X Msg (0, "Directory %s must have mode 777.", SOCKDIR); X } X sprintf (SockPath, "%s/%s", SockDir, LoginName); X#else X sprintf (SockPath, "%s/%s", home, SockDir); X#endif X DO DEBUG("SockPath %s\n", SockPath); X X if (stat (SockPath, &st) == -1) X { if (errno == ENOENT) X { if (mkdir (SockPath, 0700) == -1) X Msg (errno, "Cannot make directory %s", SockPath); X (void) chown (SockPath, getuid (), getgid ()); X DO DEBUG("SockPath directory made\n"); X } X else X Msg (errno, "Cannot get status of %s", SockPath); X } X else X { if ((st.st_mode & S_IFMT) != S_IFDIR) X Msg (0, "%s is not a directory.", SockPath); X if ((st.st_mode & 0777) != 0700) X Msg (0, "Directory %s must have mode 700.", SockPath); X if (st.st_uid != getuid ()) X Msg (0, "You are not the owner of %s.", SockPath); X } X X (void) strcpy(RealTtyName, GetTtyName()); /* real tty name */ X if (stat(RealTtyName, &RealTtyStat) == -1) /* get current mode */ X Msg(errno, "Cannot get status of %s", RealTtyName); X DO DEBUG("Mode of %s is %#o\n", RealTtyName, RealTtyStat.st_mode); X RealTtyMode = RealTtyStat.st_mode; /* save mode for later restore */ X X (void) gethostname (HostName, MAXSTR); X HostName[MAXSTR-1] = '\0'; X DO DEBUG("HostName %s\n", HostName); X X if (ap = index (HostName, '.')) X *ap = '\0'; X if (ap) X DO DEBUG("*ap %s\n", *ap); X X strcat (SockPath, "/"); X SockNamePtr = SockPath + strlen (SockPath); X X /* if we are a client send create message to startup window and exit */ X if (GetSockName ()) X { DO DEBUG("GetSockName says that we are client\n"); X DO DEBUG("SockName '%s'\n", SockName); X s = MakeClientSocket (1); X DO DEBUG("Client socket is %d\n", s); X DO DEBUG("SendCreateMsg()\n"); X SendCreateMsg (s, ac, av, loginflag, &shape); X close (s); X DO DEBUG("after SendCreateMsg(), now exit(0)\n"); X exit (0); X } X X /* we are the server */ X DO DEBUG("SockName '%s'\n", SockName); X DO DEBUG("We are server\n"); X if ((DevTty = open ("/dev/tty", O_RDWR|O_NDELAY)) == -1) X Msg (errno, "/dev/tty"); X DO DEBUG("opened /dev/tty fd %d\n", DevTty); X X ServerSocket = MakeServerSocket (); X DO DEBUG("ServerSocket %d\n", ServerSocket); X s = ServerSocket; X X if (fflag) X flowctl = 1; X else X if (nflag) X flowctl = 0; X X if (loginflag == -1) X loginflag = LOGINDEFAULT; X X MakeNewEnv (); X InitUtmp (); X RealSlot = FindUtmp(RealTtyName); /* find current logon slot */ X if (RealSlot) X { if (ReadUtmp(RealSlot, &RealUtmp) > 0) /* read real login utmp */ X RemoveUtmp(RealSlot); /* remove original logon slot */ X else X RealSlot = 0; /* something's wrong */ X } X X signal (SIGHUP, SigHup); X signal (SIGINT, SIG_IGN); /* we should never see this */ X signal (SIGQUIT, FAbort); /* quit layers on these 2 signals */ X signal (SIGTERM, FAbort); X signal (SIGTTIN, SIG_IGN); X signal (SIGTTOU, SIG_IGN); X signal (SIGALRM, SIG_IGN); /* alarm clock used by protocol.c */ X X GetTTY (0, &OldMode); X SetMode (&OldMode, &NewMode); X SetTTY (0, &NewMode); X X if (Initlink() == 0) X { SetTTY(0, &OldMode); /* revert tty back */ X Msg (0, "\n\n You are not running under MacLayers."); X } X X sprintf (rc, "%.*s/.layersrc", 245, home); X#if 0 /* NOT YET SUPPORTED */ X /* if no window list start up a default shell window */ X if (ReadRc(rc) == 0) X#endif X { n = MakeWindow (0, *av, av, (char *)0, loginflag, &shape); X if (n == -1) X { SetTTY (0, &OldMode); X FQuit(1); X /* NOT REACHED */ X } X } X X (void) chmod(RealTtyName, 0600); /* lock out broadcasts */ X Abortonmsg = 0; /* don't abort on msg from now on */ X signal (SIGCHLD, SigChld); X tv.tv_usec = 0; X tv.tv_sec = 0; /* default no timer wanted */ X X /* client/Maclayers processing loop */ X X /* poll .20 secs for new startups */ X#define WUSSTARTUP 200000 X /* stall nonpriority windows .5 seconds when top window I/O active */ X#define WUSSTALL 500000 X X stall = 0; /* startout no stalled channels */ X fderr = 0; /* startout no error fd's */ X X while (1) X { int priochan; /* the top window channel */ X X priochan = TopChannel(); /* find highest priority channel */ X X /* check for I/O on all available I/O descriptors */ X r = 1<<0; /* always read MacLayers stream */ X r |= 1<<s; /* always read server socket */ X w = 0; /* initalize to no write tests */ X tv.tv_usec = 0; /* default no startup poll */ X X /* for all active layers set read and write bits as appropriate */ X if (stall) X stall = 1; /* start counting output layers */ X for (n=0; n<MAXPCHAN; n++) X if ((layer = &World[n])->allocated) /* if layer exists ... */ X { /* if not yet started or has just terminated ... */ X if (layer->ptymask & fderr) X tv.tv_usec = WUSSTARTUP; /* don't spinloop but wait-a-bit */ X else X { if (layer->kbuff && layer->kbuff->size) X /* keyboard input for layer */ X w |= layer->ptymask; /* try write to it */ X /* read layer output unless we're being nice to top window */ X if (!stall) X r |= layer->ptymask; /* read output from layer */ X else X if (layer->chan == priochan) X r |= layer->ptymask; /* read top priority output */ X else X stall++; /* indicate something to stall */ X } X } X X if (stall > 1) X if (!tv.tv_usec) X tv.tv_usec = WUSSTALL; /* set stall timout */ X X /* process signals before trying select */ X if (GotSignal) X { SigHandler (); X continue; X } X X DO DEBUG("Select(r %x, w %x, fderr %x, stall %d, prio %d, us %d)\n", X r, w, fderr, stall, priochan, tv.tv_usec); X X switch ( select(32, &r, &w, NULL, tv.tv_usec ? &tv : NULL) ) X { case -1: X /* errno has report */ X if (errno == EINTR) /* signal delivered or timout */ X { errno = 0; X tv.tv_usec = 0; /* clear timer wait value */ X fderr = 0; /* turn off error stall */ X stall = 0; /* turn off output priority stall */ X DO DEBUG("select errno EINTR\n"); X continue; /* re-loop */ X } X Abortonmsg = 1; X DO DEBUG("select errno %d\n", errno); X Msg (errno, "select"); X /*NOTREACHED*/ X X case 0: X /* timeout reached */ X tv.tv_usec = 0; /* clear timer wait value */ X stall = 0; /* turn off stall */ X fderr = 0; /* turn off error stall */ X continue; /* re-loop */ X X default: X /* a channel has read/write status pending */ X break; X } X X DO DEBUG("after select r %x w %x\n", r, w); X X /* handle any signal arriving up during select wait */ X if (GotSignal) X { SigHandler (); X continue; X } X X /* if server socket has command process that now */ X if (r & 1 << s) X { ReceiveMsg(s); /* process client control packet */ X continue; /* status may have changed */ X } X X /* next process input stream from MacLayers */ X if (r & 1 << 0) X { ProcessStreamin(); /* key input and control packets */ X continue; /* status may have changed */ X } X X /* process keyboard input first so output doesn't hold up X ** keyboard echo and break/interrupt processing X */ X priochan = TopChannel(); /* find top priority channel */ X stall = 0; /* assume no stall needed */ X for (n=0; n<MAXPCHAN; n++) X if ((layer = &World[n])->allocated) X if (w & layer->ptymask) X while ((kbptr=layer->kbuff)->size) X { /* pass as much keyboard as possible */ X if (layer->chan == priochan) X stall = 1; /* stall lower priority channels */ X len = write(layer->ptyfd, &kbptr->text[kbptr->offset], X kbptr->size); X DO DEBUG("keyin len %d to chan %d\n", len, layer->chan); X if (len <= 0) /* if no data accepted ... */ X { if (errno == EIO) /* if I/O error indicated ... */ X fderr |= layer->ptymask; /* wait-a-bit on this */ X errno = 0; /* clear errno */ X break; /* try again later */ X } X /* some of buffer accepted */ X kbptr->size -= len; /* length processed */ X kbptr->offset += len; /* bump up offset */ X if (kbptr->size > 0) /* not all buffer accepted ... */ X break; /* try feed again later */ X /* see if another buffer chained */ X if (kbptr->next) X { /* yes, free up current buffer and queue next */ X layer->kbuff = kbptr->next; /* to next buffer */ X free(kbptr); /* free this buffer up */ X } X else X { /* otherwise leave this for next input */ X kbptr->size = 0; /* empty buffer */ X kbptr->offset = 0; /* refill from the start */ X } X } X X /* first process the highest priority channel (top window) */ X if (priochan > 0 && priochan <= MAXPCHAN) /* if valid ... */ X if ((layer = &World[priochan-1])->allocated) X if (r & layer->ptymask) X { /* output to send to top MacLayers window */ X len = read(layer->ptyfd, buf, IOSIZE); X if (len >= 0) /* if no error ... */ X { DO DEBUG("read output len %d chan %d\n", len, layer->chan); X } X else X { /* We expect EIO error if socket not yet open on other end X ** or if process using socket has terminated. We expect X ** EWOULDBLOCK also after process terminates. X **/ X DO DEBUG("read output err chan %d errno %d len %d\n", X layer->chan, errno, len); X if (errno == EIO || errno == EWOULDBLOCK) X DO DEBUG(" ...anticipated\n"); X /* layer not ready or just terminated so wait-a-bit */ X fderr |= layer->ptymask; X r &= ~layer->ptymask; /* don't read it again below */ X errno = 0; /* clear errno */ X } X if (len > 0) X SendData(layer->chan, buf, len); X X if (len >= 0) X /* To keep lower priority channels from hogging the line X ** we delay any output from them until the primary window X ** has no more data to be sent to it. X */ X stall = 1; /* stall output from others */ X } X X /* now pass all available output to MacLayers */ X if (!stall) X for (n=0; n<MAXPCHAN; n++) X if ((layer = &World[n])->allocated) X if (r & layer->ptymask) X { /* output to send to MacLayers window */ X len = read(layer->ptyfd, buf, IOSIZE); X if (len >= 0) /* if no error ... */ X { DO DEBUG("output chan %d len %d\n", layer->chan, len); X } X else X { /* We expect EIO error if socket not yet open on other end X ** or if process using socket has terminated. We expect X ** EWOULDBLOCK also after process terminates. X **/ X DO DEBUG("read output err chan %d errno %d len %d\n", X layer->chan, errno, len); X if (errno == EIO || errno == EWOULDBLOCK) X { DO DEBUG(" ...anticipated\n"); X } X /* layer not ready or just terminated so wait-a-bit */ X fderr |= layer->ptymask; X errno = 0; /* clear errno */ X } X if (len > 0) X SendData(layer->chan, buf, len); X } X X /* handle signals again */ X if (GotSignal) X SigHandler (); X X } /* end while (1) */ X X /* NOT REACHED */ X X} /* main() */ X X /* ReceiveQuit() - MacLayers sends Quit packet */ X Xvoid XReceiveQuit() X{ X /* We completely quit layers cancelling all active processes */ X DO DEBUG("ReceiveQuit()\n"); X FQuit(0); /* normal termination */ X /* NOT REACHED */ X X} /* ReceiveQuit() */ X X X /* ReceiveNew() - MacLayers requests a new shell layer */ X Xvoid XReceiveNew(chanid, shape) Xint chanid; /* channel for new shell layer */ Xstruct Shape *shape; /* shape for new channel */ X{ X DO DEBUG("ReceiveNew(%d)\n", chanid); X (void) MakeWindow (chanid, *ShellArgs, ShellArgs, X (char *) 0, loginflag, shape); X X} /* ReceiveNew() */ X X X /* ReceiveDelete() - MacLayers has removed a layer */ Xvoid XReceiveDelete(chanid) Xint chanid; /* channel which was deleted */ X{ X struct Layer *layer; /* layer pointer */ X X /* validate channel */ X DO DEBUG("ReceiveDelete(%d)\n", chanid); X if (chanid <= 0 || chanid > MAXPCHAN) X return; /* ignore invalid channel */ X X /* if this layer active then kill it off, else ignore request */ X layer = &World[chanid-1]; /* locate target layer */ X if (layer->allocated) X KillWindow(layer); X X} /* ReceiveDelete() */ X X X /* ReceiveSignal() - send signal to layer's process group */ X Xvoid XReceiveSignal(chanid, signal) Xint chanid; /* layer's channel */ Xint signal; /* signal.h signal ID */ X{ X struct Layer *layer; /* layer pointer */ X X DO DEBUG("ReceiveSignal(%d,%d)\n", chanid, signal); X /* verify channel */ X if (chanid <= 0 || chanid > MAXPCHAN) X return; /* ignore invalid channel */ X X /* if this layer is active send the signal to the process group */ X layer = &World[chanid-1]; /* locate target layer */ X if (layer->allocated && layer->lpid) X KillPG(layer, signal); X X} /* ReceiveSignal() */ X X X /* ReceiveReshape() - windowsize and location updated */ Xvoid XReceiveReshape(chanid, shape) Xint chanid; /* channel having shape */ Xstruct Shape *shape; /* shape structure */ X{ X struct Layer *layer; /* layer pointer */ X X DO DEBUG("ReceiveReshape(%d)\n", chanid); X X /* verify channel */ X if (chanid <= 0 || chanid > MAXPCHAN) X return; /* ignore invalid channel */ X X /* if this layer is active then reshape it's window */ X layer = &World[chanid-1]; /* locate target layer */ X if (layer->allocated && layer->lpid) X { layer->shape = *shape; /* install as our new shape */ X SetWindowSize(layer); /* udpate the O/S window info */ X } X X} /* ReceiveReshape() */ X X X /* SetWindowSize() - tell O/S about new window size */ X Xstatic void XSetWindowSize(layer) Xstruct Layer *layer; /* layer to resize */ X{ X#ifdef TIOCSWINSZ X struct winsize wsize; /* window size structure */ X int retcode; /* ioctl return code */ X X wsize.ws_col = layer->shape.wchars; /* character width */ X wsize.ws_row = layer->shape.wlines; /* window height */ X wsize.ws_xpixel = 0; /* necessary? */ X wsize.ws_ypixel = 0; X /* update O/S window state */ X retcode = ioctl(layer->ptyfd, TIOCSWINSZ, &wsize); X DO DEBUG("SetWindowSize(chan %d) col %d, row %d iotcl() = %d\n", X layer->chan, layer->shape.wchars, layer->shape.wlines, X retcode); X X retcode = ioctl(layer->ptyfd, TIOCGWINSZ, &wsize); X DO DEBUG("TIOCGWINSZ: col %d, row %d iotcl() = %d\n", X wsize.ws_col, wsize.ws_row, retcode); X X#endif X} /* SetWindowSize() */ X X X /* ReceiveData() - received keyboard input for layer */ Xvoid XReceiveData(chanid, buff, cnt) Xint chanid; /* channel receiving input */ Xchar *buff; /* buffer containing data */ Xint cnt; /* count of data bytes */ X{ X struct Layer *layer; /* layer pointer */ X struct Kbuff *kb; /* keybuff pointer */ X X DO DEBUG("ReceiveData(%d, '%.*s')\n", chanid, cnt, buff); X /* verify channel */ X if (chanid <= 0 || chanid > MAXPCHAN) X return; /* ignore invalid channel */ X layer = &World[chanid-1]; /* locate target layer */ X X /* add character stream to layer's input buffers for main loop processing */ X for (kb=layer->kbuff; kb->next; kb=kb->next); /* find oldest buffer */ X while (cnt--) X { X /* if current buffer full then chain in a new one */ X if (kb->offset+kb->size >= IOSIZE) X { kb->next = (struct Kbuff *) malloc(sizeof(struct Kbuff)); X kb = kb->next; /* base new keybuff */ X kb->next = NULL; /* no next yet */ X kb->size = 0; /* this character is first */ X kb->offset = 0; /* at zero offset */ X } X X /* add new character to the end of this buffer */ X kb->text[kb->offset+kb->size++] = *buff++; /* insert at end of data */ X } X X} /* ReceiveData() */ X X X X /* InitWorld() - initialize layer structures */ X Xstatic void XInitWorld() X{ X struct Layer *layer; /* layer pointer */ X struct Kbuff *kb; /* keybuff pointer */ X int i; /* work variable */ X X for (i=0; i<MAXPCHAN; i++) X { layer = &World[i]; /* point to layer */ X layer->chan = i+1; /* channel ID */ X layer->allocated = 0; /* does not exist yet */ X layer->lpid = 0; /* head process */ X layer->ptyfd = 0; /* no pseduo pty yet */ X layer->ptymask = 0; /* no pty mask yet */ X layer->slot = 0; /* no Utmp slot */ X ClearShape(&layer->shape); /* clear shape structure */ X X /* allocate the primary input keybuffer for this layer */ X layer->kbuff = (struct Kbuff *) malloc(sizeof(struct Kbuff)); X layer->kbuff->next = NULL; /* no next buffer */ X layer->kbuff->size = 0; /* no data in buffer */ X layer->kbuff->offset = 0; /* start filling at front */ X X } /* end for layer scan */ X X} /* InitWorld() */ X X X /* clearshape() - initialize shape structure */ X Xstatic void XClearShape(shape) Xstruct Shape *shape; /* shape structure pointer */ X{ X shape->worigv = 0; /* default window position */ X shape->worigh = 0; X shape->wlines = 0; /* default size */ X shape->wchars = 0; X shape->wfont = 0; /* default font size */ X shape->wattr = 0; /* no attributes */ X X} /* clearshape() */ X X X /* SigHandler() - process signals */ X XSigHandler () X{ X DO DEBUG("GotSignal()\n"); X while (GotSignal) X { GotSignal = 0; X DoWait (); /* handle dead or stopped children processes */ X } X} X Xstatic void XSigChld () X{ X DO DEBUG("SigChld()\n"); X /* flag child process is stopped or dead */ X GotSignal = 1; X} X Xstatic void XSigHup () X{ X DO DEBUG("SigHup()\n"); X /* Detach (0); */ X FQuit(1); /* stop all processes */ X /* NOT REACHED */ X X} X X /* DoWait() - send SIGCONT to stopped windows, Free dead process windows */ Xstatic XDoWait() X{ X register pid; X register struct Layer *layer; X union wait wstat; X int i; X X DO DEBUG("DoWait()\n"); X while ((pid = wait3 (&wstat, WNOHANG|WUNTRACED, NULL)) > 0) X /* dead or stopped child process found */ X for (i=0; i<MAXPCHAN; i++) X if ((layer = &World[i])->lpid == pid) X { if (WIFSTOPPED (wstat)) X { /* stopped process so restart it */ X /*** DO WE REALLY NEED TO DO THIS? ***/ X DO DEBUG("killpg(, SIGCONT)\n"); X KillPG(layer, SIGCONT); X } X else X { /* remove dead process's layer */ X DO DEBUG("kill dead process window %d\n", layer->chan); X KillWindow (layer); X /* tell MacLayers layer is dead */ X SendDelete(layer->chan); X } X } X X} /* DoWait() */ X X X /* KillPG() - send signal to layer's process group */ X Xstatic void XKillPG(layer, signal) Xstruct Layer *layer; /* layer to signal */ Xint signal; /* signal to send */ X{ X int retcode; /* work variable */ X int pgrp; /* process group for layer */ X int tgrp; /* terminal control process group */ X X DO DEBUG("KillPG(%d, sig %d)\n", layer->chan, signal); X X if (layer->lpid) X { pgrp = getpgrp(layer->lpid); /* get process group */ X DO DEBUG("getpgrp() = %d\n", pgrp); X if (pgrp != -1) X { retcode = killpg(pgrp, signal); /* signal it */ X DO DEBUG("killpg() = %d\n", retcode); X } X X /* After a lot of experimenting it was determined that csh X ** creates a new terminal control group when it runs a command. X ** Thus the above code failed to forward SIGINT to such commands. X ** (Csh would get it but just ignore it.) Thus the following code. X */ X X /* forward SIGINT to the terminal control group also */ X if (signal == SIGINT) X { retcode = ioctl(layer->ptyfd, TIOCGPGRP, &tgrp); X DO DEBUG("ioctl(ptyfd,TIOCGPGRP) termcntlgrp %d, retcode = %d\n", X tgrp, retcode); X /* but only if not the same process group */ X if (retcode != -1 && tgrp != pgrp) X { retcode = killpg(tgrp, signal); /* signal it */ X DO DEBUG("killpg(%d) = %d\n", tgrp, retcode); X } X } X } X X} /* KillPG() */ X X X /* KillWindow() - remove a layer from the system */ X X/* Note: This function does NOT tell MacLayers about the dead layer */ X Xstatic XKillWindow (layer) Xstruct Layer *layer; X{ X struct Kbuff *kb; /* work buffer free pointer */ X X if (layer->allocated) X { /* SHOULD THIS BE SIGKILL ??? */ X if (layer->lpid) /* if layer process started ... */ X { KillPG(layer, SIGHUP); /* kill processes */ X layer->lpid = 0; /* clear pid field */ X } X RemoveUtmp(layer->slot); X (void) chmod(layer->tty, 0666); X (void) chown(layer->tty, 0, 0); X close(layer->ptyfd); X DO DEBUG("chmod/chown %s, SendDelete(%d)\n",layer->tty, layer->chan); X X ClearShape(&layer->shape); /* reset the shape structure */ X /* free all keybuffers but one and reprime it */ X for (kb=layer->kbuff; kb->next; kb=kb->next) X free(kb); /* free input buffers */ X kb->size = 0; /* empty buffer */ X kb->offset = 0; /* start refill from front */ X layer->allocated = 0; /* window no longer allocated */ X } X X} /* KillWindow() */ X X X /* FAbort() - signal catcher for quitting */ Xstatic void XFAbort() X{ X DO DEBUG("FAbort()\n"); X FQuit (1); /* quit with error exit */ X X} /* FAbort() */ X X X /* FQuit() - terminate layers */ Xvoid XFQuit(exitcode) Xint exitcode; X{ X int i; X X DO DEBUG("FQuit(%d)\n",exitcode); X for (i=0; i<MAXPCHAN; i++) X KillWindow(&World[i]); /* kill all windows */ X X DO DEBUG("SendQuit()\n"); X SendQuit(); /* tell MacLayers to exit layers mode */ X SetTTY (0, &OldMode); X if (RealTtyMode) X (void) chmod(RealTtyName, RealTtyMode); /* restore mode */ X if (RealSlot) X WriteUtmp(RealSlot, &RealUtmp); /* restore original login */ X FinitTerm (); X sleep(2); /* wait for port to reset */ X printf ("[layers terminated]\n"); X X exit (exitcode); X X} /* FQuit() */ X X X /* MakeWindow() - create new layer */ Xstatic XMakeWindow (chan, prog, args, dir, lflag, shape) Xint chan; /* zero or channel to use for window */ Xchar *prog; Xchar **args; Xchar *dir; Xint lflag; /* one if this to be logged in */ Xstruct Shape *shape; /* shape to use for window */ X{ X register struct Layer *layer; X register char **cp; X register f, j; X int tf; X int mypid; X char ebuf[10]; X X DO DEBUG("MakeWindow(%d, %s, %s, dir %s, ", X chan, prog, args[0], dir ? dir : "(none)"); X DO DEBUG("login %d\n", lflag); X DO DEBUG(" origv %d, origh %d, lines %d, chars %d, ", X shape->worigv, shape->worigh, shape->wlines, shape->wchars); X DO DEBUG("font %d, attr 0x%x\n", shape->wfont, shape->wattr); X X if ((f = OpenPTY ()) == -1) X { Msg (0, "No more PTYs."); X return ( -1 ); X } X X /* if channel not given obtain one from MacLayers */ X if (chan == 0) X { chan = SendNew(shape); /* try to get free window */ X if (chan == 0) X { Msg (0, "No more windows."); X return ( -1 ); X } X DO DEBUG("SendNew() == %d\n", chan); X } X X /* verify channel */ X if (chan <= 0 || chan > MAXPCHAN) X { Msg(0, "Invalid channel %d.", chan); X return ( -1 ); X } X X /* login this window if it's layer #1 */ X if (chan == 1) X lflag = 1; X X if (lflag == -1) X lflag = loginflag; X X#ifdef USRLIMIT X /* X * Count current number of users, and if logging windows in, X */ X if (lflag == 1) X { (void) lseek (utmpf, 0, 0); X UserCount = 0; X while (read(utmpf, &utmpbuf, sizeof(struct utmp)) > 0) X { if (utmpbuf.ut_name[0] != '\0') X UserCount++; X } X if (UserCount >= USRLIMIT) X { Msg (0, "User limit reached. Window will not be logged in."); X lflag = 0; X } X } X#endif USRLIMIT X X layer = &World[chan-1]; /* find layer structure */ X layer->shape = *shape; /* install new window shape */ X X /* ??? What do we do if layer is still active as far as we're concerned? */ X if (layer->allocated) X { DO DEBUG("??? newlayer not free !!!\n"); X KillWindow(layer); /* kill off old layer */ X SendDelete(layer->chan); /* kill window back off */ X Msg (0, "Makewindow error: Duplicate active layer %d.", chan); X return ( -1 ); /* return failed */ X } X X layer->allocated = 1; /* show layer now in use */ X BuildTitle(chan, prog, args); /* install window title */ X X (void) fcntl (f, F_SETFL, FNDELAY); X layer->ptyfd = f; /* pseudo pty for task's I/O */ X layer->ptymask = 1<<f; /* set pty device mask */ X strncpy (layer->cmd, Filename (args[0]), MAXSTR-1); X layer->cmd[MAXSTR-1] = '\0'; X strncpy (layer->tty, TtyName, MAXSTR-1); X DO DEBUG("forking %s, tty %s, ptyfd %d, mask %x\n", X layer->cmd, layer->tty, layer->ptyfd, layer->ptymask); X (void) chown (TtyName, getuid (), getgid ()); X if (lflag == 1) X { layer->slot = SetUtmp(TtyName, chan == 1); X if (chan == 1 && RealTtyMode) X /* set to original tty umask */ X (void) chmod(TtyName, RealTtyMode); X else X /* force to this mode */ X (void) chmod(TtyName, TtyMode); X } X else X { layer->slot = -1; X /* do not allow any other user access to this device */ X (void) chmod (TtyName, 0600); X } X switch (layer->lpid = fork ()) X { case -1: X Msg (errno, "fork"); X layer->lpid = 0; /* clear pid field */ X return ( -1 ); /* return failed */ X X case 0: X signal (SIGHUP, SIG_DFL); X signal (SIGINT, SIG_DFL); X signal (SIGQUIT, SIG_DFL); X signal (SIGTERM, SIG_DFL); X signal (SIGTTIN, SIG_DFL); X signal (SIGTTOU, SIG_DFL); X signal (SIGALRM, SIG_DFL); X setuid (getuid ()); X setgid (getgid ()); X if (dir && chdir (dir) == -1) X { SendErrorMsg ("Cannot chdir to %s: %s", dir, sys_errlist[errno]); X exit (1); X } X mypid = getpid (); X ioctl (DevTty, TIOCNOTTY, (char *)0); X if ((tf = open (TtyName, O_RDWR)) == -1) X { SendErrorMsg ("Cannot open %s: %s", TtyName, sys_errlist[errno]); X exit (1); X } X DO DEBUG("Now in new process\n"); X (void) dup2 (tf, 0); X (void) dup2 (tf, 1); X (void) dup2 (tf, 2); X for (f = getdtablesize () - 1; f > 2; f--) X close (f); X ioctl (0, TIOCSPGRP, &mypid); X (void) setpgrp (0, mypid); X SetTTY (0, &OldMode); X X { struct winsize wsize; /* window size structure */ X int retcode; /* ioctl return code */ X X wsize.ws_col = layer->shape.wchars; /* character width */ X wsize.ws_row = layer->shape.wlines; /* window height */ X wsize.ws_xpixel = 0; /* necessary? */ X wsize.ws_ypixel = 0; X /* update O/S window state */ X retcode = ioctl(0, TIOCSWINSZ, &wsize); X } X (void) umask(Oumask); /* restore user's original umask */ X NewEnv[2] = MakeTermcap(layer->shape.wlines, layer->shape.wchars); X sprintf (ebuf, "LAYER=%d", chan); X NewEnv[3] = ebuf; X execvpe (prog, args, NewEnv); X printf("%s: cannot exec %s: %s", myname, prog, sys_errlist[errno]); X exit (1); X } X X return ( chan ); X X} /* MakeWindow() */ X Xstatic Xexecvpe (prog, args, env) Xchar *prog, **args, **env; X{ X register char *path, *p; X char buf[1024]; X char *shargs[MAXARGS+1]; X register i; X register eaccess = 0; X X if (prog[0] == '/') X path = ""; X else X if ((path = getenv ("PATH")) == 0) X path = DefaultPath; X do X { p = buf; X while (*path && *path != ':') X *p++ = *path++; X if (p > buf) X *p++ = '/'; X strcpy (p, prog); X if (*path) X ++path; X execve (buf, args, env); X switch (errno) X { case ENOEXEC: X shargs[0] = DefaultShell; X shargs[1] = buf; X for (i = 1; shargs[i+1] = args[i]; ++i); X execve (DefaultShell, shargs, env); X return; X X case EACCES: X eaccess = 1; X break; X X case ENOMEM: case E2BIG: case ETXTBSY: X return; X X } /* end switch */ X X } while (*path); X X if (eaccess) X errno = EACCES; X X} /* execvpe() */ X X X /* BuildTitle() - create and install window title */ X Xstatic void XBuildTitle(chan, prog, args) Xint chan; /* channel for title */ Xchar *prog; /* program being executed */ Xchar **args; /* arg list */ X{ X int i; /* arg scan index */ X char buff[1024]; /* super huge title buffer */ X X /* skip any leading "/bin/" */ X if (strncmp(prog, "/bin/", 5) == 0) X strcpy(buff, prog+5); /* leave /bin off */ X else X strcpy(buff, prog); /* start with program name */ X X /* add all aguments but stop if option ("-") seen */ X for (i=1; args[i] && args[i][0] != '-'; i++) X { strcat(buff, " "); /* delimiter */ X strcat(buff, args[i]); /* add next parameter */ X } X X SendTitle(chan, buff, strlen(buff)); /* set new window title */ X X} /* BuildTitle() */ X X X#ifdef sequent Xstatic XOpenPTY () X{ X char *m, *s; X register f; X X f = getpseudotty (&s, &m); X strncpy (PtyName, m, sizeof (PtyName)); X strncpy (TtyName, s, sizeof (TtyName)); X ioctl (f, TIOCFLUSH, (char *)0); X return (f); X} X X#else X Xstatic XOpenPTY () X{ X register char *p, *l, *d; X register i, f, tf; X X strcpy (PtyName, PtyProto); X strcpy (TtyName, TtyProto); X for (p = PtyName, i = 0; *p != 'X'; ++p, ++i); X for (l = "qpr"; *p = *l; ++l) X { for (d = "0123456789abcdef"; p[1] = *d; ++d) X { if ((f = open (PtyName, O_RDWR)) != -1) X { TtyName[i] = p[0]; X TtyName[i+1] = p[1]; X if ((tf = open (TtyName, O_RDWR)) != -1) X { close (tf); X return f; X } X close (f); X } X } X } X X return -1; X X} /* OpenPTY() */ X#endif X Xstatic XSetTTY (fd, mp) Xstruct mode *mp; X{ X ioctl (fd, TIOCSETP, &mp->m_ttyb); X ioctl (fd, TIOCSETC, &mp->m_tchars); X ioctl (fd, TIOCSLTC, &mp->m_ltchars); X ioctl (fd, TIOCLSET, &mp->m_lmode); X ioctl (fd, TIOCSETD, &mp->m_ldisc); X X} /* SetTTY() */ X Xstatic XGetTTY (fd, mp) Xstruct mode *mp; X{ X ioctl (fd, TIOCGETP, &mp->m_ttyb); X ioctl (fd, TIOCGETC, &mp->m_tchars); X ioctl (fd, TIOCGLTC, &mp->m_ltchars); X ioctl (fd, TIOCLGET, &mp->m_lmode); X ioctl (fd, TIOCGETD, &mp->m_ldisc); X X} /* GetTTY() */ X Xstatic XSetMode (op, np) Xstruct mode *op, *np; X{ X *np = *op; X#if 1 X if (flowctl) X { np->m_ttyb.sg_flags &= ~(CRMOD|ECHO); X np->m_ttyb.sg_flags |= CBREAK | ANYP; X } X else X np->m_ttyb.sg_flags = RAW | ANYP; X#else X np->m_ttyb.sg_flags &= ~(CRMOD|ECHO); X np->m_ttyb.sg_flags |= CBREAK | ANYP; X#endif X np->m_tchars.t_intrc = -1; X np->m_tchars.t_quitc = -1; X if (!flowctl) X { np->m_tchars.t_startc = -1; X np->m_tchars.t_stopc = -1; X } X np->m_ltchars.t_suspc = -1; X np->m_ltchars.t_dsuspc = -1; X np->m_ltchars.t_flushc = -1; X np->m_ltchars.t_lnextc = -1; X X} /* SetMode() */ X Xstatic char * XGetTtyName () X{ X int n; X char *p; X X for (p = 0, n = 0; n <= 2 && !(p = ttyname (n)); n++); X X if (!p || *p == '\0') X Msg (0, "layers must run on a tty."); X X return ( p ); X X} /* GetTtyName() */ X X Xstatic XKill (pid, sig) X{ X if (pid != 0) X (void) kill (pid, sig); X} X X /* GetSockName() - set SockName; if LTY env return 1 else 0 */ Xstatic XGetSockName () X{ X register client; X static char buf[2*MAXSTR]; X X if (!mflag && (SockName = getenv ("LTY")) != 0 && *SockName != '\0') X { client = 1; X setuid (getuid ()); X setgid (getgid ()); X } X else X { sprintf (buf, "%s.%s", HostName, Filename (RealTtyName)); X SockName = buf; X client = 0; X } X return client; X X} /* GetSockName() */ X Xstatic XMakeServerSocket () X{ X register s; X struct sockaddr_un a; X char *p; X X if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) == -1) X Msg (errno, "socket"); X a.sun_family = AF_UNIX; X strcpy (SockNamePtr, SockName); X strcpy (a.sun_path, SockPath); X if (connect (s, (struct sockaddr *)&a, strlen (SockPath)+2) != -1) X { p = Filename (SockPath); X Msg (0, "You already have a layers running on %s.", p); X /*NOTREACHED*/ X } X DO DEBUG("MakeServerSocket: unlink(SockPath)/bind()/chown/listen\n"); X (void) unlink (SockPath); X if (bind (s, (struct sockaddr *)&a, strlen (SockPath)+2) == -1) X Msg (errno, "bind"); X (void) chown (SockPath, getuid (), getgid ()); X if (listen (s, 5) == -1) X Msg (errno, "listen"); X return s; X X} /* MakeServerSocket() */ X Xstatic XMakeClientSocket (err) X{ X register s; X struct sockaddr_un a; X X if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) == -1) X Msg (errno, "socket"); X a.sun_family = AF_UNIX; X strcpy (SockNamePtr, SockName); X strcpy (a.sun_path, SockPath); X if (connect (s, (struct sockaddr *)&a, strlen (SockPath)+2) == -1) X { if (err) X { Msg (errno, "connect: %s", SockPath); } X else X { close (s); X return -1; X } X } X return s; X X} /* MakeClientSocket() */ X Xstatic XSendCreateMsg (s, ac, av, lflag, shape) Xchar **av; Xstruct Shape *shape; X{ X struct msg m; X register char *p; X register len, n; X char *pwd; /* PWD environment string */ X X DO DEBUG("SendCreateMsg(%d, ac %d, lflag %d\n", s, ac, lflag); X m.type = MSG_CREATE; X p = m.m.create.line; X for (n = 0; ac > 0 && n < MAXARGS-1; ++av, --ac, ++n) X { len = strlen (*av) + 1; X if (p + len >= m.m.create.line+MAXLINE) X break; X strcpy (p, *av); X p += len; X } X DO DEBUG(" nargs %d, create line = '%s'\n", n, m.m.create.line); X m.m.create.nargs = n; X m.m.create.lflag = lflag; X m.m.create.shape = *shape; /* pass window shape */ X X /* Since Suns can hang up on getwd() [damn their stupid networking] X ** we try to get the current working directory first from the PWD X ** environment variable. X */ X if ((pwd=getenv("PWD")) && strlen(pwd) < 1024) X (void) strcpy(m.m.create.dir, pwd); X else X if (getwd (m.m.create.dir) == 0) X { DO DEBUG("getwd() failed!!\n"); X Msg (0, "%s", m.m.create.dir); X } X DO DEBUG(" create.dir = '%s'\n", m.m.create.dir); X X if (write (s, (char *)&m, sizeof (m)) != sizeof (m)) X { DO DEBUG(" write failed!!\n"); X Msg (errno, "write"); X } X DO DEBUG("SendCreateMsg() done\n"); X X} /* SendCreateMsg() */ X X/*VARARGS1*/ Xstatic XSendErrorMsg (fmt, p1, p2, p3, p4, p5, p6) Xchar *fmt; X{ X register s; X struct msg m; X X s = MakeClientSocket (1); X m.type = MSG_ERROR; X sprintf (m.m.message, fmt, p1, p2, p3, p4, p5, p6); X (void) write (s, (char *)&m, sizeof (m)); X close (s); X sleep (2); X} X Xstatic XReceiveMsg (s) X{ X register ns; X struct sockaddr_un a; X int left, len = sizeof (a); X struct msg m; X char *p; X X DO DEBUG ("ReceiveMsg()\n"); X if ((ns = accept (s, (struct sockaddr *)&a, &len)) == -1) X { Msg (errno, "accept"); X return; X } X p = (char *)&m; X left = sizeof (m); X while (left > 0 && (len = read (ns, p, left)) > 0) X { p += len; X left -= len; X } X close (ns); X if (len == -1) X Msg (errno, "read"); X if (left > 0) X return; X switch (m.type) X { case MSG_CREATE: X DO DEBUG("MSG_CREATE:\n"); X ExecCreate (&m); X break; X X case MSG_ERROR: X DO DEBUG("MSG_ERROR:\n"); X Msg (0, "%s", m.m.message); X break; X X default: X Msg (0, "Invalid message (type %d).", m.type); X X } /* end switch */ X X} /* ReceiveMsg() */ X Xstatic XExecCreate (mp) Xstruct msg *mp; X{ X char *args[MAXARGS]; X register n; X register char **pp = args, *p = mp->m.create.line; X X for (n = mp->m.create.nargs; n > 0; --n) X { *pp++ = p; X p += strlen (p) + 1; X } X *pp = 0; X n = MakeWindow (0, mp->m.create.line, args, mp->m.create.dir, X mp->m.create.lflag, &mp->m.create.shape); X X} /* ExecCreate() */ X X#if 0 Xstatic XReadRc (fn) Xchar *fn; X{ X FILE *f; X register char *p, **pp, **ap; X register argc, num, c; X char buf[256]; X char *args[MAXARGS]; X int key; X struct Shape shape; /* shape for new window */ X X ClearShape(&shape); /* initialize shape */ X ap = args; X if (access (fn, R_OK) == -1) X return; X if ((f = fopen (fn, "r")) == NULL) X return; X while (fgets (buf, 256, f) != NULL) X { if (p = rindex (buf, '\n')) X *p = '\0'; X if ((argc = Parse (fn, buf, ap)) == 0) X continue; X if (strcmp (ap[0], "escape") == 0) X { p = ap[1]; X if (argc < 2 || strlen (p) != 2) X Msg (0, "%s: two characters required after escape.", fn); X Esc = *p++; X MetaEsc = *p; X ktab[Esc].type = KEY_OTHER; X } X else X if (strcmp (ap[0], "login") == 0) X { loginflag = 1; X } X else X if (strcmp (ap[0], "unlogin") == 0) X { loginflag = 0; } X else X if (strcmp (ap[0], "nologin") == 0) X { loginflag = 0; } X else X if (strcmp (ap[0], "chdir") == 0) X { p = argc < 2 ? home : ap[1]; X if (chdir (p) == -1) X Msg (errno, "%s", p); X } X else X if (strcmp (ap[0], "mode") == 0) X { if (argc != 2) X { Msg (0, "%s: mode: one argument required.", fn); } X else X if (!IsNum (ap[1], 7)) X { Msg (0, "%s: mode: octal number expected.", fn); } X else X (void) sscanf (ap[1], "%o", &TtyMode); X } X else X if (strcmp (ap[0], "bell") == 0) X { if (argc != 2) X { Msg (0, "%s: bell: one argument required.", fn); } X else X { if ((BellString = malloc (strlen (ap[1]) + 1)) == 0) X Msg (0, "Out of memory."); X istrcpy (BellString, ap[1]); X } X } X else X if (strcmp (ap[0], "screen") == 0) X { num = 0; X if (argc > 1 && IsNum (ap[1], 10)) X { num = atoi (ap[1]); X if (num < 0 || num > MAXWIN-1) X Msg (0, "%s: illegal screen number %d.", fn, num); X --argc; ++ap; X } X if (argc < 2) X { ap[1] = ShellProg; argc = 2; } X ap[argc] = 0; X (void) MakeWindow (0, ap[1], ap+1, (char *)0, loginflag, &shape); X } X else X if (strcmp (ap[0], "bind") == 0) X { p = ap[1]; X if (argc < 2 || *p == '\0') X Msg (0, "%s: key expected after bind.", fn); X if (p[1] == '\0') X { key = *p; } X else X if (p[0] == '^' && p[1] != '\0' && p[2] == '\0') X { c = p[1]; X if (isupper (c)) X p[1] = tolower (c); X key = Ctrl(c); X } X else X if (IsNum (p, 7)) X { (void) sscanf (p, "%o", &key); X } X else X { Msg (0, "%s: bind: character, ^x, or octal number expected.", fn); } X ktab[key].lflag = loginflag; X if (argc < 3) X { ktab[key].type = 0; X } X else X { for (pp = KeyNames; *pp; ++pp) X if (strcmp (ap[2], *pp) == 0) break; X if (*pp) X { ktab[key].type = pp-KeyNames+1; } X else X { ktab[key].type = KEY_CREATE; X ktab[key].args = SaveArgs (argc-2, ap+2); X } X } X } X else X Msg (0, "%s: unknown keyword \"%s\".", fn, ap[0]); X } X (void) fclose (f); X X} /* ReadRc() */ X Xstatic XParse (fn, buf, args) Xchar *fn, *buf, **args; X{ X register char *p, **ap; X register delim, argc; X X p = buf; X ap = args; X argc = 0; X for (;;) X { while (*p && (*p == ' ' || *p == '\t')) X ++p; X if (*p == '\0' || *p == '#') X return argc; X if (argc > MAXARGS-1) X Msg (0, "%s: too many tokens.", fn); X delim = 0; X if (*p == '"' || *p == '\'') X { delim = *p; *p = '\0'; ++p; } X ++argc; X *ap = p; ++ap; X while (*p && !(delim ? *p == delim : (*p == ' ' || *p == '\t'))) X ++p; X if (*p == '\0') X { if (delim) X Msg (0, "%s: Missing quote.", fn); X else X return argc; X } X *p++ = '\0'; X } X X} /* Parse() */ X Xstatic char ** XSaveArgs (argc, argv) Xregister argc; Xregister char **argv; X{ X register char **ap, **pp; X X if ((pp = ap = (char **)malloc ((argc+1) * sizeof (char **))) == 0) X Msg (0, "Out of memory."); X while (argc--) X { if ((*pp = malloc (strlen (*argv)+1)) == 0) X Msg (0, "Out of memory."); X strcpy (*pp, *argv); X ++pp; ++argv; X } X *pp = 0; X return ap; X X} /* SaveArgs() */ X#endif X Xstatic XMakeNewEnv () X{ X register char **op, **np = NewEnv; X static char buf[MAXSTR]; X X if (strlen (SockName) > MAXSTR-5) X SockName = "?"; X sprintf (buf, "LTY=%s", SockName); X *np++ = buf; X *np++ = Term; X np += 2; X for (op = environ; *op; ++op) X { if (np == NewEnv + MAXARGS - 1) X break; X if ( !IsSymbol (*op, "TERM") X && !IsSymbol (*op, "TERMCAP") X && !IsSymbol (*op, "LTY") X ) X *np++ = *op; X } X *np = 0; X X} /* MakeNewEnv() */ X Xstatic XIsSymbol (e, s) Xregister char *e, *s; X{ X register char *p; X register n; X X for (p = e; *p && *p != '='; ++p); X if (*p) X { *p = '\0'; X n = strcmp (e, s); X *p = '='; X return n == 0; X } X X return 0; X X} /* IsSymbol() */ X X/*VARARGS2*/ XMsg (err, fmt, p1, p2, p3, p4, p5, p6) Xchar *fmt; X{ X char buf[1024]; X register char *p = buf; X X sprintf (p, fmt, p1, p2, p3, p4, p5, p6); X if (err) X { p += strlen (p); X if (err > 0 && err < sys_nerr) X sprintf (p, ": %s", sys_errlist[err]); X else X sprintf (p, ": Error %d", err); X } X if (!Abortonmsg) X { /* MakeStatus (buf, curr);*/ X printf("%s\r\n", buf); X } X else X { printf ("%s\r\n", buf); X exit (1); X } X X} /* Msg() */ X Xstatic char * XFilename (s) Xchar *s; X{ X register char *p; X X p = s + strlen (s) - 1; X while (p >= s && *p != '/') X --p; X return ++p; X X} /* Filename() */ X Xstatic XIsNum (s, base) Xregister char *s; Xregister base; X{ X for (base += '0'; *s; ++s) X if (*s < '0' || *s > base) X return 0; X return 1; X X} /* IsNum() */ X X Xstatic XInitUtmp () X{ X if ((utmpf = open (UtmpName, O_RDWR)) == -1) X { if (errno != EACCES) X Msg (errno, UtmpName); X return; X } X utmp = 1; X X} /* InitUtmp() */ X X Xstatic int XFindUtmp(name) Xchar *name; X{ X register char *p; X register struct ttyent *tp; X register slot; X X DO DEBUG("FindUtmp(%s)\n", name); X slot = 1; X if (!utmp) X return 0; X if (p = rindex (name, '/')) X ++p; X else X p = name; X setttyent (); X while ( (tp = getttyent ()) != NULL X && strcmp (p, tp->ty_name) != 0 X ) X ++slot; X if (tp == NULL) X return 0; X X DO DEBUG(" slot %d\n", slot); X return slot; X X} /* FindUtmp() */ X X Xstatic int XSetUtmp (name, mainlogin) Xchar *name; /* tty name */ Xint mainlogin; /* this is primary login */ X{ X register char *p; X register slot; X struct utmp u; X X if ((slot=FindUtmp(name)) == 0) X return ( 0 ); X X if (p = rindex (name, '/')) X ++p; X else X p = name; X X strncpy (u.ut_line, p, 8); X strncpy (u.ut_name, LoginName, 8); X#if 1 X strncpy(u.ut_host, Filename (RealTtyName), 16); /* host is real tty */ X#else X u.ut_host[0] = '\0'; X#endif X if (RealSlot && mainlogin) X u.ut_time = RealUtmp.ut_time; /* use original login time */ X else X time (&u.ut_time); X (void) lseek (utmpf, (long)(slot * sizeof (u)), 0); X (void) write (utmpf, (char *)&u, sizeof (u)); X X return ( slot ); X X} /* SetUtmp() */ X Xstatic int XReadUtmp(slot, entry) Xint slot; /* slot to read */ Xstruct utmp *entry; /* entry to read into */ X{ X int cnt; /* return count */ X X if (!utmp) X return; /* no utmp access */ X X (void) lseek(utmpf, (long)(slot * sizeof(struct utmp)), 0); X cnt = read(utmpf, (char *)entry, sizeof(struct utmp)); X DO DEBUG("ReadUtmp cnt %d, errno %d, line %.8s, name %.8s, host %.16s\n", X cnt, errno, entry->ut_line, entry->ut_name, entry->ut_host); X X return ( cnt ); X X} /* ReadUtmp() */ X Xstatic void XWriteUtmp(slot, entry) Xint slot; /* slot to write */ Xstruct utmp *entry; /* entry to write from */ X{ X int cnt; /* write return code */ X X if (!utmp) X return; /* no utmp access */ X X (void) lseek(utmpf, (long)(slot * sizeof(struct utmp)), 0); X cnt = write(utmpf, (char *)entry, sizeof(struct utmp)); X DO DEBUG("WriteUtmp() slot %d cnt %d line %.8s name %.8s host %.16s\n", X slot, cnt, entry->ut_line, entry->ut_name, entry->ut_host); X X} /* WriteUtmp() */ X Xstatic XRemoveUtmp (slot) X{ X struct utmp u; X X if (slot) X { bzero ((char *)&u, sizeof (u)); X (void) lseek (utmpf, (long)(slot * sizeof (u)), 0); X (void) write (utmpf, (char *)&u, sizeof (u)); X } X X} /* RemoveUtmp() */ X X#ifndef GETTTYENT X Xstatic Xsetttyent () X{ X struct stat s; X register f; X register char *p, *ep; X X if (ttnext) X { ttnext = tt; X return; X } X if ((f = open (ttys, O_RDONLY)) == -1 || fstat (f, &s) == -1) X Msg (errno, ttys); X if ((tt = malloc (s.st_size + 1)) == 0) X Msg (0, "Out of memory."); X if (read (f, tt, s.st_size) != s.st_size) X Msg (errno, ttys); X close (f); X for (p = tt, ep = p + s.st_size; p < ep; ++p) X if (*p == '\n') X *p = '\0'; X *p = '\0'; X ttnext = tt; X X} /* setttyent() */ X Xstatic struct ttyent * Xgetttyent () X{ X static struct ttyent t; X X if (*ttnext == '\0') X return NULL; X t.ty_name = ttnext + 2; X ttnext += strlen (ttnext) + 1; X return &t; X X} /* getttyend() */ X X#endif X X X X /* FinitTerm() - reset vt100 terminal */ Xstatic void XFinitTerm () X{ X /* print out termcap 'is' string to reset terminal */ X#if 0 X /* This string sets scroll region 1-24 and puts cursor at bottom line */ X printf("\033[1;24r\033[24;1H"); X#endif X fflush(stdout); X} X Xstatic void XAddCap (s) Xchar *s; X{ X register n; X X if (tcLineLen + (n = strlen (s)) > 55) X { strcat (Termcap, "\\\n\t:"); X tcLineLen = 0; X } X strcat (Termcap, s); X tcLineLen += n; X} X Xstatic char * XMakeTermcap(lines, chars) Xint lines; /* default window lines */ Xint chars; /* default window chars */ X{ X char buf[1024]; X register char **pp, *p; X X strcpy(Termcap, TermcapConst1); /* start TERMCAP build */ X strcat(Termcap, UserTerm); /* fill in User's terminal type */ X strcat(Termcap, TermcapConst3); /* finish our own definition */ X X if (lines <= 0 || lines > 200) X lines = rows; /* force default if none or invalid */ X if (chars <= 0 || chars > 300) X chars = cols; /* force default if none or invalid */ X X sprintf(buf, "li#%d:co#%d:", lines, chars); X AddCap(buf); X X return ( Termcap ); X X} /* MakeTermcap() */ X X X /* DEBUG() - dump output routine */ X Xvoid XDEBUG(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) Xchar *format; Xint arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8; X{ X fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); X} SHAR_EOF if test 56819 -ne "`wc -c < 'layers.c'`" then echo shar: error transmitting "'layers.c'" '(should have been 56819 characters)' fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 3 ---
werner@rascal.ics.utexas.edu (Werner Uhrig) (06/03/90)
[MacLayers 1.00 - part 4 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # Hqx.1 # # This archive created: Thu May 31 21:58:29 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'Hqx.1'" '(43662 characters)' if test -f 'Hqx.1' then echo shar: will not over-write existing file "'Hqx.1'" else cat << \SHAR_EOF > 'Hqx.1' (This file must be converted with BinHex 4.0) :$8eKBdaKH@9bFbjcDA3!8dP8)90*9#%!N!-"GcJ!N!4k190*9#%!!3!"GcKb6'& e!3#3"`)!#8eKBdaKH@9bF`![l&K!JG%13)(4'%#"d5J!"!!$FNM!,J"Q!Ri!,qa Z!#d6I!!`9KS$'J%*!"i!!3#3!brXL%&38%a8FQP-)3#L+(Z`SLKlX!!"mNi!N!8 "GV)!N!3ld`#3#)h)!!!%#"K!h5H"k3i#12!US-1(%#0+K*LJ5CJa6-,N+50RMJ# (3D"!B8*&6KSQ)!)##3!NBXL4*8qQ",#bjF5ESP$XJ38aJ$`R0i-+(8UdU0'M5)r ''!M))B%B,Q$!+!&9+SK8)',N`*'$4GBF1@#!%*-("*%`GY+3!!&aa3@)Q(2QP'( MN!$($SXB0A+FNc@Uf"BJKVb"NmIN'64dVRlPkP9Vf,&PckCGfrDYbEKc(4jib56 L!5T&X&!4q*!!4-c1"*--F6+#Y%"k!J28-b+PL"(A!*S1$143!CDQ!`J&&)$J)C' J(1!-!$5`1@RR!`8!5Tl8U)+&$L%XP"h!AS"l!IJ&`"GJAi"mfEIA%k"!`!)"%!3 `%2"!3!1(,'42r-II2!8)3BMa4Kf*iCA44KdPme!!,8ad5RG"+6!1!8DN`8BC$$` "4aPZ[&8'(R5i)1*$%@M))9YTZ%(''hH!%!3EDB3aad-&$-(''h)Yf'"[8k"9KSY cL1M#3a!3`D)E0iDaeK4Td&''N!!20@$N(8LqS53)&9kSid--3''5'iPGNH++Gfc T9"4e01NJHa&1Q#@'*RC)aBFKM[K%3#9Zf+'B+V,S)S`bdQJMMQ8!F!9"1`DN3)p fr"K%N!!MCMGPP9Fbk558$NPjC**V[@PQ3&eq'HDB,!)!"D)2%B#QQP&%e-9h3J9 !3"&N0%P!&Aeq#X!!3a#BUQ#%d3L&M%i+HQ%BFZLkk&aPM*(BLh4*e)9lXFjD+af hjUS&UJlakLX@!4%!E"i!$"&3!F218D`9jpTB"V,+6X'XXhr5&84%Ci5h(hrr8$M Q!4@UL'P!#35mPK0d4QN`#&k@NGD!-cVN`-,bAZKX'QqimG!$4lcaPXF90dX(aKT ,G!Cmqr,RViS!M`RPE3!82#B)#)-)`"%"0E"```rA-H0a!%`mFmJAC`c!&!&al$% 9)-mlXY%4"5$*H$FGJ-Fj"`J'TKa[X1&"%QkBmBBFEB!`44lUPP'f&5#mB3D+IEE )T"k&1T3"f'+6$B)38a$4pYYmNQPf'R3rT)'4ETb3!*J8cBkp&K-TPX(A%fDmc63 FZNBJ@"YYe1&''Q1%mE3EN!!1kG!#Fj+GBKKX$!`!"'pD&JETCR$N1S-EZiYX[5" !lSENZMl3F1ebF$L'j##i[J%4CCJ44KeXM"Uhf@A3-E)ECr#PI+pb&!mQh),,Dhf +f5FID8!D*$&'aRc4i6(ccN1I'"3i0NPba0cL'H$BL5'"Bf)(fXY$(-!iZ53QG@e BAE3#-J&jU3J%5%!@'Hk!V"m*SAKK@)0%T#DIUPdYDaQM!pHmKVHaPHeXD9[Ehm$ RTlR9,5"h#jX*ppDh&3DZKB4l)3!1Pc(&JB"akj2$ib)hZFTp$(-1`Ce$02F'cRN 1G++lRqY3aj%%ZS&eVS1GKAj8NYR0JALh5a3!(U!l1I$1Gm"E3[l'1$b1'!pjbS2 Imk,(3VP9lhVPfeiGZXFKkBA[MZ66hSLbJ$leX3m%lM0,mqBi[rU0$Rm#%@-%pLH (r[f[GhVTb!!,@$d2UHk+#`4!!cQdPJJ+NB,&faX'05L4)T3RCIp!&aSb9SB$%#& 'V6YIc#+)[6V!`A84J-)XIdHpm@'[G"-T!ReJ+8YDfK+AVNX!,mrJ5f!+NjE&a#- b*4+1m`KP!!B)B%F'J,!b`D"GH4L$PR#`aJ$%!!$[&)J-!$"2JF`!!2F8#!d!X%q "e!!!ra5)$3!`8)(F!!!(MH4$&)!%YIa)R&%bj1ISKNN%$C!!#Nfk8!iVbK&GAF# "D`'ENlVRbm3N%U)1SF!8NR!%d%LK#5pBk4'3!&!&+(!d@3jj`"633#!bG8LFN!" m5$MXmme`CR)1j#b$1G'TcN+a8k&*I'Fm!c$2HJEJR[N-`$ll'B"r"M3!!beS!!k D8#8UUU&NH'JQ!B#%R%PdSa"03N!FJ&%kD*5L%"d09!2b89+#3+3FN80*%HNaP!C %T5ae+8aP5P1E'RD-1qhTN@iD9)F-)`$kB#Eca&#(-b4J#'LBhHrB!)*c1Z5cSAA $D,2b%05+GLiJU#I"32YDdZCcYUPGE6pa@eX3"*5hUS9Y3B'lfS3'a*CeD!-F32# %NTeV#R33(532-+`aV+&kN!"8`!AIY3Bi[#&&G(J)!TM`KM-`M(m6B3!!e!#!C#% M!*i)J!XUja"+!1!M$lNA-J"3"9N4S!#8$#p%lR@R+J"J%333J"2H!*%$!)!($`l !#"!""LUJ)3emZB1&5,Z'$B0JGQ@CTET!`)DMJJ!1A$YHA%#3!)F"J8"G(JjYSd! J@0@5cbe"5'@,kr$L2IjSab#Ji2F5Z5*%ARJ12h#)HYRVA[J')!Md$BJPlMYJ!0# #[`&`!!%3%&Nkq,6+"6j`JKIFi!G(H-)92R+3!$hFB6D3!"E%)""aBNU-),kJq!d UjJZ3!'(XjMMlL-DHqacfF+aM&mr"abafXC!!6HUa)Y2Kb%N'eAVE#i$haKF)96" `3-K!jIa@'XX%q'q!A3+!-#0B`3aqL)-Kc!-*)`)'AX+cj2M#Cp,@@0"RF)Z4%Xe M$Fm"$B6pX)!U#B)Qr@!Q!&#[%!#J"`"B)J"mB*!!'CalQi%mC*prB#X!GT(J*kL aY3$`!J"8!!"d)+)%4A$$qY,k`c,%S3k55mb#&pHX-U5K8ChL@YRmTbiZ!@$CcAi f&3,!JQNlj$M@GXJqdk$Y8R6lfkFY03!De!j%N!!JhH[q%A4&jc1D[B(HalYh'I, G4!Mq6mN!i$3E!S#"!,`A"RFS8d$Xd'Q(B-,+!'J&!1!4kP8*f#%j!!#l+K'!+## #!#,`!Ja%!*(LF!%!,`L!&"!4K#"ih!h&@eqMj"!'-9b)B9`l!pI,9S6ZM3f#-Q, Z'-D`aq+Y4F12"J&H`)XMB!29hbTRZF[G'A1(m+(Q!ERj,3$!#J$-SqGTqRP!JXi Z5K3G%3iS1pINd!1PHbAT-@#kH!(`p+K2[3G@Ac$@'lIeVRrp#6%&JH62(X(*VEh Y)epch1F1TVT6eYmD!aFj!L#+!1`JbJ"!"'i#dLVY&)S*$iF)"J!!"J#JJDU)1!2 B$Pdjd+@KMb"SJpV'9TC%VSm`[$DMA#`fZK8U(34M##hARE@AB$rk4cC+!a`%*%' h@+BXBAKa'eKh)I%lM@5Q)fP!)4bq%!"d%!!m!(aYPA!"J6-dY`8!)![*pa!5B#V m9'k)F!,69`I90`EApce0X(eb8"Cj`c$%mL-Q`R@MifrJ!JN!3!d"X()b!(aS-(` !-"S-9i-1*`$HeR3!)&GbK3f)J!63XQCa`aF90"BqN`IfP`8ZeMNMTNk%dME%*!E 0-cBrjQ+Kdb'$F5,jpcXY3NX"U&iDS`J!J!d"S!GATB!fZ'cXa5kQ-)(Td4,lG!k )J!*1b'03Q"Lr*PP83Q)QCS9jmb2[eL4iK(,0T`N!`!d"m(`dd(F"X@`-b&r1"`! -4`U)TbB2X3!!d!8!F"ZcJ!JI-'mJ`#%$FKMC*i)NH(B'FP6q"R$1&J!$9`2!a`) fD)[Xe4*ab)-3*fQGB3)!F!f)`!#h0!GV8'amB363Xd$+aQba1(!f!(cl0)Qi5"- !X)Xpk'qr')b)-!'aFhE&H)cNC9dMpiV1+("M"Aa$3Sf6TSYbk)X!!)c#+$4IP`3 [m!5UChBiP@b6eQ6aK31CjK$XK9mJm@Rp&@S$N!!&`!0QP(KUC"BP!+!%p"3!!i! )0l"V[!B#DrCV'TP),rCR4[BM6J)L(rC!kl-eAI0LJ(4-N5CTTp)8lq8)!D!$`0F CNpJ%!*!!#!!3"J"3$1m)!"8!!1$5DX((!KYA5Ei%!L[#GYVh24J'!Ql`F4mQGaF "9%U*CmR94bJ(,X,aAJHB!f`iL@fP-8qR#Mmj!3$3'HbN$4PSBD)$!QD`4FK)BRK fA@YaGPXBPBPKK64@"Mj6MLKh'cGAJ+33!$d!%4)jLA*e"Td)!+0!!!B`",0c2+% %!"@SAMJ3!!p`EJX'GZ$&%G4$IV&hGPlbQ@C%"#DaGIk'!J$!QZE!%J(J!`%C%04 JJjN!!,bKFlh`NqVPLBXJ+`K!#aEfP%B33S0$8IYhAHf$"MqLBG2M2Ki6AAe@JSr fP(-`"X9c)R-3RFaTK)+MBAh'Plr'2a`bFQl"Ehb)R@9`)L2A*'2$&rYA&RS*Pjj 60"d54&PR9fAK150$@ZmACjIdP#Q50pThPfrcRf$iBMNdKUhCS&2fQMm`Q`#`MK! K9`cRL6ZBM3k4%Tki6lf!#!f3!!4Z9JCR`$SJB!@X!fmX#!"GDB!"m!,!*fk6D'$ N`R#em*-1ePC!B@ipB!9GNj9AL6cc+@-rSR6(Q(l)FK%Ma4Hr-h+a4jeUjP1F%S$ mb*UXq9iY*`35LJZ!"`#$!!!C!!#AB#UCU(KH#J"q)+D,5!!+d!4[N!"@C8-rP33 4&'#0cEB1L1!(T3NQS1PGa1BjD"%'&Q*k6m)`("&DF-!A33!(F(!KdRQ-6qNcj&0 X)D*k6F+FCJ4DEc#&EI#QDR0Lr0-fCP5)G1!9G,"(A'K%LpUSeF-kacJlDk%Zb*) BB9#L+F+J9PTTHMF%4!!d!#!+0[LPB6UQ82#63AN[H`!!l)!)JQ"eBT!!"ZEeD,1 c"ZhM-9I!%EpM4P@!"SC4NQZKCQ)!UbXN"+f+52'f&b&!PAP4Ch1CIh-!VCm6PeZ SRkAS"UPe2'YaCf43"r4LKD(cPb[dIQPJ4Xf60h33*#LAUeJD!,hUUj`3V'#UTXA +La"aV!#3!+c,bJGjk'FcPRmf3!0,m%02d!6UkKDYb+i8a"HFC5'*!AI!YUSAFJ* md343F!9+k6"c-4K0bBGSib4PF`FAPRj"bU45H@L-'USlCNEVSe`%BMYQ-cBM')" "q4#i%!$R0)P*T'N"!3VBm4$#S3fa#!+KaLJk"!#H!!"J#`X"),D41CQCm4#(!!! 4S+E)J!JB-#QF8UdZ`UM[BNC)i%B3d3%!B!c`*&p0!4&V'C&Vqep&S!BL%a&5J,B TYlJ&J*SLea-k),F")*(#S"f"'c3!N!"YaA#i!4'8bH+#cfD6@#X3l1)3*#!4"J! !&J!!(!!!X0#03R!PeA9G)'G[q2B3TJX!U"X!UVY"4I!3`"J4X6ZlYAZl&B#HP18 L&f-(SJ1BT8YT`eZm8B-c$X'D%C%!!-#*)3!!SAJ"d'Z9c+1NpeDpR1B33ANU,JJ +d"BE'i3d$J%c%2%!i@YQkB!)0A!&b)*V1N#&E&!@TYKC`+CpR6U#(dDpJqTe2e+ #f15FC$+qlQZ"m6Zr!E#k!A!S#LF4qXZ*%0Dr)a#1@,+-)C!!VS"K"&cc2@k$*A, *0*K""P3DP1H%"`#`HmZhZJ+"NaG-EXqR",aRJdR89J%a!+cC'Jp4$jS,[Nh`Nr- !!1i3!!F3!#S!QC+TEQrV%1HdI-G""3C3!-UJ$$-J&4(4%XXh'Q!XaXTJ!fB-%DH bI*bfaXS3!c,`aJr4I-XAAR3F!cL!a`k"1FXR((3X!c3!b!&a6Xeh(*`3aQ6XaUE e%#h4I+24b'*-!hmFb3ja+Xh(DCDX$$G`ajSF%-hAI1(eb6N!b4'"1FdR(*DX&D) F%A4a%,aa$3C!!+*AYR4K$EJC!!e`bdA3+-i9%#ZRAS)`N`B`!%p!"Zhl%)+,$4- (!2KJ!'-9%B,E$a-A!"e!c8re%+8!!-A4#`#`",HFba$"TF8"$3$3#3B3!9M3A#r `cNCN"[SQGd&J,K$4$$%$!18!!(PJ!-4)"9)!PrAF"2F-%Gr-YEd3!""3cV3%%ES !!&`V$3'!!JE`!1rX"[&-13IU-3D0c`r"$!!3#MNF!"&J!!S`"&3`"F(fd4$4c`- A%1K3!%A#0FY&"!,pBBRKFa$K$cFB!,0E$64G"A,KQAaU4R*UTVFKcNr($G3F6`q "-pm!!&Z3!'A*$"@rj4"(N!"PRILLe#aE$L&mEB8*!i%)&b"k,@#94R!M,D)e)Y3 e%D')JUX+!-!()"T"G!4%[PX'Q3X4+A&1j`3)L+"Gcl-@8P#pIHd36`I0F"!!&)! )e)8X6C)(LHd3"4#-!(!"!I!"Jhd@dE8h66)(P3d!PhhCbdF,CVdjRI-jSI0)f44 )%A&c2*%+!E!"N!#(e`I%GD563(3`f[HNcUiN!S-0AB-"fJHEf%%*a*Xla$`F!1! b($i3X8YFZ1$E"Mr*a,F3!1"lH'fVaC8j6`2`E`!`"JD3!!#iNPCb!#1r%a([a*2 QNJS'B!"JXh9QZJ%!S#!ci%lPIGiFSGjP#drhc9B"i!&K,!3hBPd4`DA,Yem`%,[ RE)(lK3B16VA"pfQJ-1%1`DA!m'RBJ1%"`DAiS+X0(4%L2EHlP`)&-!*[49&AF'& I4iSXE*``#d8V#"&YT5"9,3)&J!!'RL)GKMd3dAcK65j3B!"F*N+#HKKQfRa!35j aB!!#)!3-PmF!J$RNdZ%,`!55mkbcm`*(S"%4`4XP!!"6-`')S%Ma3dF5&AXhe#, dmkk200Sh9kGF5J-J)!!"i!X3FA1G`D@NKHHrX1FX#J"F5JTh(J!ErK!ha`Z%[SL ((Jb#$KY95`'(,J`3F5Iha*12-)a2B"*p&%8C-pUFQ!d!X!%Q$GRFXjeb-0UdLad [!!#SN!$DkUHNS0P3K`%M5NiqV"klQ6ZlXS!)%%$8S0P'hU0L&q`"V`-!i3A0c3d 8$X%ZiId3QDYH3)%%S@B`%"&dAiU6[i$&EPZCb+jHVmi,R[X3i3fqXdX*L"!"#p2 LE`PGAh)',3Q8!2#kdHB&!D!E%a%!FM8FTi+@5E4m+%"`+IH1,#I4"-m0hZlG%+% GfX'Dq&!!(8#fCU1H*d+ZJfKbf[F#C46EbBi+0*(-4&!%U2%3)+mGA#VKRa9#)p3 #)*hKbEjIJ'!!#e!$BY%'I,&G'434qk8Gd)`)!#h+fCIcUb6S`JIbZ#$b*"m4)#p mA!S1jHh@,Irb!E%,&Ei0!f%!II9!J%95F%!($B!#-T8%6N!&+4!4VkXG%"Ea(F! i@eI8)K!")Z#Y)#!#Jc%kFhpGD"-4l+3GTa,a(L!#DH@SCC!!pf93&R+K)R`K"98 J"%p3"93!!LK`!dC`pJqK4YSa"Y*F!"BJ!Q"Jq)K25Ra4"&-`"*)I!d*Jq3la"FP H*K&[!HP'U#G+"5d3!eCa"&`("d%E91M4FZ#,$ZAZ%$4AJA&E$fIHpB,epA@IEL- epdY`q'LH)[B$03iK$J"`6[)!!0#!#"BJ$4(3!Xc2%G0!23m%llSZ%5fK(GXI!3L N3+pp6"%KI#PaFhL!#!Z!eN$&kX*hFcF($T!!RIm2i31NR%&(#``3rBSD5N!"P"1 cJ%[+Ld23!"+K6J@Pfq$r&-!YB4f65ZNi"!&)Fab"P3N!D@U$fD!!X!38S&*KJ+c $!3B%C%1"!-!1'$Ih$GK0NdP9"CE,09P[efYEq)%!)!)#J-CSEL82!%J$F!B43&j +B(4Fi#H"2"I%k*M"`U0-38lEB)kNT`#B"Vp#!bf!DH$!3+CYK!-K#'03!(VN#)J JI-l*cB%'"5!#Z#NiC6Bf4!B"64`Y)V#Q8m&1J&p%+!kXDIPX2`Y`!hr%"94[jN9 mD"1)`*U+!cY"!JMJ!$L"j'+&9Pe%k!abjHP8JXk'5pj#(YJ3L@ef-4hQi!3#3,* SENE!Pjd,FI2bU"J!F$cf$4SB2)'3!*NSJ!%L"$AL@1`MKe!F!X,b`3&!6bVS`P' fI!)#Dm+&"Q!A)M+3!2IK!!!`&)DMV+hJ-("aZi+K-)3)i!+(eD"QL!`4&`$!B@f &'Ml$Ke#$F"J1diDlN!!3AN0MD,Ybi6Cd#0k``S&$A8J'ak&X-iIKm#&dXlCb$-q K,h3)l+3HaN1(X&m#!M66Kqc`)8!cQ@B-i@&!G!MS`#'%1)#)b%+F3$#%"K'3!!@ !@RM`'+)Q1hJ#i4G'a&('T3,#IV')4A!FFUPeL-L@$`jM654aP"8((,Cm8Z+$`f( la58qK2f#`k#C6(3)d!b(*F5E5""a@)MML3$JjJ3%N!!(%Kr#FkY%4G(QM%13!!F 8K8rJ+BM1F"m'""`@%)428J`)0@JU3X9Uq"#-Q&$DL[D3!!LbNq@$"K""!F!#8'! 0(+b)F!XE9&NX!&)J,Dl&N!$)6P)Hd"X#8Q!)""BEClZqSVNa!,Q,$0bcA[39H8) 0qSZ"d3N%!F,)6RK#@rQ,6i"!b)Xi!"'Qi6Jd0iT`-8S"%8)Za#&2U)0(4`S3!9m #%EjKK6-h"%!++%E#+(ai`Xe"M9KJ09V$3eMP3Z0J&)IjX$B5!#a`'fFL1@4X3#m `)J%b-![2%$P-L(!!XJ9'&a)4%L)l#A(*m3!%aM%!*LU60$1'%r%D)J)HTb6'!"N 3(6`TL4M#JeIr!+15'!*JBN(F`SUQ(DAMH8`Y#BiFdX6Y1"hT`#8X@dbadF'$lEK JT-!BX!0#J!-TRll)Q[BMA-3SRHS1pXAPBb"&3aT)N!!2MLIXPreS!+E!&AJ#GN! 1$,02`a1JfAkN,T8N$dLHL'!6bmh1!AT)i%*Qb!fj%krMKf4KB8$lG!q2adj!APQ XN!!UiS+`%SF!,YK*$BU18d"&+!'13"N&(8m!HIJ!XJe*14!(K-!Fk)`2`5S'4HG M&T8!&8J#6H"1P%Cb+(b5S`'`NPKbC&9'FZJ0Yk0rY!0+)!LFJI6B&FNKZ)L1Cp+ cKFIVG5T1K5TJ#3H`*j`+a@D$10&PZbIY!!(iJ$f&4i5%4Q)DJH(EHB9C`JE@JNm "!4%!"1JpZQFI0m48fK!Qi8e*2KH3!!+SP*QT8a*TUMf%--@D#-!i!`""K`"`X#G !!*KM3+K!38%!IS"$*mkZ&p-j3#Y"%6@h9N%35!%!Z!m2S4fm$K')I#K@#a`0V`X 8))++8*9F%83B%QT%#!3!%h$QX)*@B!aIi6'3!!@cJ"E8!PY`#h"Kr%#%DE"$!-" VBJ#)3!4BK,,!PqMCHLTJk'F`A*qe`&N5`hcD6Sh58k+PJr#kK0"6m!Yd#J#3!,S 5X,BJf`ai!6(J"Vb!X"!4hX&1#J!I34Jia8e%fV60%3!'H!if2)6"-l[fLkL%#&r U10J#!&"a5N$XF#%kB)`TR5A3!)+!!bXa%'b!D53[)!0BCY+C!CTRBr)cl6FYYk- AL!%Pi)5j'BMJ$J$!0)#BQSN!(!$FG`Jm8+!BNjFYfV#!1e3(2%Ie#!&FjcTK%G! 4**S@(T!!%5jJj05"%%"RpN),+"k0#NS'K$Ya!FCE!*!!!"B(T#JKmi)fq3F5HL# (jJbFJAKc2`J,FQY3bkFC1,FmZ5!LPd-!"`$J1Mb%TY!5l!XIq%P0J8[C&hV`",G B3%!#"`m,8*AiN!!(e1E0#(#(SKc%"ca!&4f#'1L,bF)K3S39!!$q!3#B!jT*)J! Ml4$GJ0i#1&RYalM8K@3h'Q`RlZ`))#$S`,&N9i0Q(J2iRAc"MN%%6U-GrXk&8i2 0NPh&J"Q`0ji!%r"9138!X%i"Z!m3J3$3J0I,5ZNGR06Fp)T!'))1!#+SXh0#$J! !'rK*kSa,Y8r+fGfJi%0S%)VS-18##'#e)J,1f!5'!J$S![ijbRC5XSX$%l%!B)N 6G*SfKC9B#bLJ-kdH-m)i1+2U#`MK46YFJS&3!(6!mbX$0mf"ASPJGL+Db`+e%$i Ql+h,[C%Q'Z98%JaHcdPdLLeb3A&15cJ'kmc)JCCQ3Df5#d3BQF$+'!3!"C!!c2! LeBYQXHX`@B*Za$cSc0kS(RGJ2A8)fU**)-*YL&hX!K-`dEQJ%CiS(BLL*`+09*B '%HKk`'BE4QlXdI!&HA'5QYRP"!!E6R1#!$3+!p3Sp@LM%1%JA,CCi0JX6Z`)3@k !aq#Y"cUTX%#@((NN5d1-$PCRJE5$ZE%!XD1,d!l3*!KKfd0B2Z##0DfriS68L-@ NQK-JSV+4,SKJ+ZI+"R3)2q"`P9)!X%TE+5SpA!,3P)B,Sc#h!N)-1&aa)0(p!m3 *!(+T,6eFYE3k)!9!m!2q!6q`4Kq"&m`$5+G-)4dTN!!%pq+C4P0S#J#DD@iJ$IS ZQf,6EFS8Z1NelDEJp*Z+8fdD6P[#4bLQae5B5J4LDNb4D68P$BaZ)2K+H8SDjZN l$DIk,TlH8`"J6rXT22@QqI5IdY1"ZNr0+3"!TqT8+,$6BfT3Qm*KFUMAG-`e"BN +!#MU3`@S!1#LAP5+bP'[k8AYTKSeSST8L'T3%@T#*3S,eCf5dh'+8I&T5f@T,R8 J@&0V+Nhj+6@YUGDdT,E6NcS8f'Q)D`QQXLPm"+&k6BFUP5'U52@S+P@MbP5,UP0 0UNd9UMT96j!!"kbI&mJ$lE1BUNkH1K%%J$A`UK$K-!Q"#"!!Z*BJi&Sb+A%q"!% !$33!%,JjLY-K(#D['"$%DPJ9Ea$c(K$"2m!2A#Fim'N1jJrSJhq3!1q`Jf!PV%d "I!'"BcS!LQPLT3Q-eE(ZXm@k+e,#Bk@X!m#b6PE'UPN9+fHpTJQ!*I$9Ib!!`%& L&DepYE5H9L!`@P9Vc'!*P&8!J)$9'PYRDrK+!%!!#cb!$2!*2X%$X+d,!,GLJ3b 3!!N`!A%&"8dKZ1C@iQTF-3&`&Dl-03-ieq3UA$r!)rJ!(q#h8YIPDJJ`3!B)"-M eYR*Al`THYqY`lDl(GEYqJ8aJ#$j!*RJ%YM@d!S(D5PZ2U@cGVLeK!+66jcTIaiM V"!$mY5AiJ!1`i3*XP3-!L02!)Nji!'$a+k+M'J&f13b!Ka9KaiKk#E#aLm!e@2% +"')A$iKG!6CprJ%(%f$9L`-)Eb@@GU&Br+THP-1'9Dj!J!%%!(#`BQrV(`!'$1! !i)-D'e`K3)ap!$[fa5B!(jXqi3'*TDiqPTT"25'EC!r!c'1b3'!!k+m,Lf5MV!H XAFr9a`D!I`KPGmk"cE)Y!A-Nf#S,!!CXJ5@c$q#rJYPGX9p2UiqeVkRdY8+!dBT JA@GaJ!$T9!$iY$ZECrIXkqLc42!$p&8!i!pmQJ$3UecV%A#Y3I"I"`+r!!6miKm F,NNE%!,"i3S%Mi!rj)0-q`rbJ90-!)UJ!QJB4D!#LN!58!3ki!bN!9*Eq4D"+NJ 6RaB4c0J%!0P`!+eG!$5!eNi!'8"V4d!mk,@r&K%F!Ab3!!M``E"0"--a'5"E&Y! -T!N'+'q)N!!!5"-$J!'NbD`eBJrJ#I!(I'!63-!Ii!rJi0&'fR&,EXZYZ6fhk$E GUPYeqfhj3l[p"qmfh[),HHYZYffl"3IhPL$i9cmEhSU$G2#h3-$IJJ"r#`'+``$ !"l83!5J!8BX'&%#T43)+)08fA"9J"&$!!RLeD#$K)S!CL`!5)3lSZ!L!!h4F##! $1Li)#!FQ0aKdA##`(a&!%""X#'!-K)2Y#!*8,J,)!)DJick!,B-!U'h(jEJD0b" dA+'EC[m"2NLc2UhSqPG*@h5"3G%&"d8A(K6GSlYYTkl9VETBeqKHADfEGDNZerf kAMIXEPfafhA(VYRGYKXU)2`$B2!,q%(E93@NS"@FJ943"8*")4!(4B!%P)*b8!T '34'`ZlqJ(`##$r!2'1`+2',!`!(!!3Z!"N`!'6J#iU!BL)*#%!SB33KJ"$%!'FJ !,#!"B!!(`!!BJ!'!!5IV%"*G4&J1"!!)T0i(!(9E,qYp[E`d++4H"`"eJB'6*E! 2!"4d!#L!!%$HdqPl4'(jp-)BJ!Nf!!B`[Ji!!b4I!Y!,J`)#!!&G`J!JJJ%!!3B !+#!!`!!"J)-%!!-m!1LYK40"Ihd!3)!"!%%(!!3D`2b5Ad#!!!$"!`!%"(B!J)- !B(K[!L!J!1$!!8##cH3"%)%,!!31!!!,i!!m%3B!)eJ3p`A2lBS"`)!EX!0q`"# B!BHD#8b"+l!&[X!B1!0Vi!h-J6Z`"rl!)$J%Lq!46))r-'Q6%@6!$+#"-k!(m-" r"!"L)!j%d4&%"qcB$+!"0U!'p)!FF!0D`"rV!J0L#mLI"X!'e-!*@!-lJ!Z`J"I J"YU!#dJ!)!!-))!"B0q#JJ[S!14Q"A#!$4",Am!!m!!lSJI!!"Y-!fU!$6JSA#% l3)!ec)EEX"YH``8J!#b!2`!"#!!%B!!3J!0dJ!q!l)*!hc!#51!)D!%X-!6BK4# )!PHJ#%L",%!&3J!3'!%N`!Z8J"@!!Nc!&e!"+D!22,ipN!!%S%!$B!*+3!3X!4h !"hM!$h!#6F!(3'%r-)@Vm%e`!5SJ#kq!$A#BS-i!H!&KH!c,J"YXKY'`m(`GEcJ BYq%i2)IVm"h1`hZi$rrK3$b)#r'r3F5+Q"'6i4bmJh[`$hjm@k!6If)PF!+@3"* H`UMi#8IK9L`8VR!@hX*Gq![RBM,FLihK,aE'm"J#%'-kE)IaX"lQ``*K!N#Q4+J "--!!X!!`3!"%J!Y3!#4!"U!!J-$5!J)2!!JDmZ"Yb"hJ!95!$6"N'`!$8!!HB!& -"`l`!4a!!qJ!#5!3X')UA)kaX2C%a`("#i2KZUU,HI%CGXGU1"kriAPXM1ea-Mk S2b!Rkf5GM*0hXNrqb8!j+![PR#`8H2*1$JK(H5MMC&6UN`qU8dib8,NR$f@L6*% !hNh`!e3a)A*9GIS4LN-Ta4CGL`ii'2#Pl-#AHP&fkJ9BJVe5Kd(YQq"5GS*V*L3 '!'$"k)!&F`JH$J!F8qe`PKH#!R""1&'YYNirQ`!%!,"b-"pK))!eP8#lZX%iQ!H p`"R`9!CJHL@#!1!%!U!DS)")N!!#X)!!#!)8S"VS!4)3!ED!"-!!S)!&cY+(B!! `4l4c#%+!A$k%+aB3ZS%+Z!FY)(,G!A0`")c"!pJ$"1!*c!&Hm!lq`#l)!pjJ#,L !HF!,[N%[D!IZi"pS!ZDEli)"),LPhH)KF)!"3!R)3Ej3!))!%b#G3#!#+)%33!% 8)!53!)!#%!ZUPM1!!rIKU3b!Aa!1GJ!d3`"Ji,D8!"H3!+B%`$33"3+J!'#$+G! 2rN!eN!!$eXm1Q)0PF!mH`4jJ!'R!%Gb$6Q!1cN!HX!GRB"GiJh[3#Tkc1h!'M8! !H)-cN!!,2J%lZ!Ir!$RlJ9[`$[E!([J'UZ!Er)02d!RD35DidFjJ$R##$F!0cN% 1F!BEqKHX!c5J$q,!)i!(2i!0#)!f!!JUJ4-i!p[J%m`)%`!",!!JQ!1E!*S9!"C 3#0`!!F!'@k!I@)%,)!rH!5#`"FeJ(RL!C[!-GX%Xm!ArS"(mJh'3!!I-`4rB"aZ k'6cRGk!0-1FHk!E[i"l`JhV3$PVd0eJ(Em"&C`09B![Z!52S"ZiJ8Vq$(E#Kpm% Gk!8YHN26JM&`!e4"0p!(i-!Hr)&IF!RH3$E3!QZ!'l5"E3!'RS!B5!&!`"YXJfi 3m9i!(R!("!!Ir!0XF!p+`#53!!)F`"CJJcrJ!EE"'-!&0Z!Aa'Nlh3rX`4EB!rD !(l5$jj`,C%&Ef3I0S"rF!Pl3$`Ve([!'-b"4Zi&YN!!%$X!rH!6GZKYdJfp!H2q "TFE8hrSHd))hm!R836p3"U$J#lJ"GI!'h%%f8!)Ij`[i!cpJ"#i"&!!&rf!EC)- h%1)+J*Iq"lm!()b#,L!*K-!BX!(`B!aiJQdJ"PL[)CM3jZ!0p)(N[!1-`6eS!lf !Fq5%!2#R`m'f*Y5CHJXNkQqY!Jc!2H!%[5"5Zi0hJ!1-33aiejRk(X##F+d#lN# )X`G[!"F)!$G3#C3!'$!!l)!EP!0$8!CJYDc1"Rm(!)J!0e!![-%%`!F(i!Y8S$( !!Il"-*J('B!CN!!#)f!(q-%lm!-li!mmJ@(J!SD",@!'ElX0q!)8N!!2r!'*rJ5 mi"kdJhEJ$Ia!$2J&hf!6r!09B!$X`6Zi"$Z!2r5$(0d*pS%Gm0(1i&[$Ja1!$9a !0"!qPJ!2(!"jm!Ck!F$@"lrJ$S!$3i!),%%Pm!E1i!md-cp!!,3"5rJ)&cBLF+f J8*N(32-&!&!ZdB(H5eUl!#a%X!Nh!3'J!-@EfB4UeJD3!`!BI#N'm(kR&Y9)'ZR dH*qaK-S"#LX!'0i1SIiLli!`5L9#0p2H5+&dEZ@EF0QZ3rT%5r"EP-M[q%frjlI m$NV,*bjA9"M)1K[%UpXR3HF&4VFNXfa`KN5k%dJ$A(LLdfN'!)!'`4b8F8E3((, aGjT#)3!!CZJ4R%)!F*Xk`8Ll4J"J&H3F!"!,!%!Y!!#j!!!%ZQ(`DI6C%,`'!'! E!)#TeMl6!3#)"`$!(J#!c1)2QX-!#!"aH1-f!-d8!#D!hZRH)@"D@V%AT9A!bN` +!$rJbI#l!0!*Ti"c#`#[)J`%J$)3!0+!$``!X(-2j,X!8!J#3#))!)`J!$5#!!! *!J$4)6UD)!"mJJ"3Q&""!'!&!5!@"!"E%!"d3Ci,!-)J!!K4C4!!R%%!1*TSU"X %!(%3!-j"!%J(!@!G")!T0Jqq3hM!F`)!bVf(q&!"")!'%!!I3!#3!!!"F!)%3!S 3!#e!!-J!!9!$"!!1%!!p3!!-!3'!"!4!%a!!8d!!9!%"i*QhJ!!!!`,!$#aT!3! (")!F%!"d3!$N!3(J"`5!)"!!KN!!,!)"!!N%!#83!*K!!(3#`b`!8)%!D!8#)"B )J&NJ!'b"!1!&!J"M%J-"N!!-")!cm-m#!"[%F`(3$35!1"!!k%!![!-"B!m%!$i 3!2hJK`q!!M!!$X!!5!!$J!%-J!M`Mlq`fPfhr)'dNGZ((QN$!$@MCR(B!%"dFhY IC!8VT@*!h++,G$`AhX*EDD0))If(AcD-,Y)cZNKRk4FGBZk+MhlC9#8eUf)a2DE (BCG1c8aP4LGY)*fR[r53!#l83bY,Mm-U(D@IG&ATdS@k8!p[0KfP'r@KIY4$HNb IkKKp9k$d(aklK(T9eqP%2DalpD%Zd'9&5kIUD$fRDh@Q$Y49T8d(hLmGV[p`TQl 4iIV'GHYQ(D`lGDXZdR'k5*rVTM#UGh@JlQ"iZPfIL(NpV*Ge`6j%)rT#J!8m`5' icX[@1LIl3R$R`"Xh")%3X!(D33NB!q3!!84CH$!*jN%9k!%@3",)VMf`$"4f8f! 'h+!Eq)0jB!bX8#l)"Ib!'6#$Ii!"L)0&M`"3M5$KJ!r!f6dlD"IY!i#da`-K!*T 014+i"`JJm`3%%c!"2-%*b!6Q`,5Jm613!!'H34k3!!C`S"3NJ#6!#Fi!"dJ(5N! +A!*(F%k!!!JB#-!J%#5!9FT+(i*Fi3H,3"r-J!f`$r5"1L!"S[ee3)**m!IX35S iR5Q!''J#Z"3%mX%0Q!%c)!*)!%-`#Xa"jD!!ZTd4r#BhF!I)!$mS%6FJ*prS6d! &IX&qlqrr2F"$!%JJ#3L"#!!%!Q!&H)0U!!'3!)#Pqd%`J!LXK4639Tk!#,!#P+! 8S!!K)!'Z`J0)lj3!"p!i*%N%%!!3M!!HF!aMJ#1B[!9J#M'!Fa!0R%14632e 6"2c!%C!!!2j`$qU""`$`k3m5H)),S!!5`6r`"#ZJ#+`#A+!*e!!"#0-6S"[iJ8- `!Zb"(XJ$P)!Cc!)+`!J!33C)"*pJ"Y3!2U$EKF'0PJ49i!Z3!(NcMqB&I#H3!!5 3!'#81cHQN`6H`5%!"%X!!M#"8i!$!$%L!!333"2FJa$J!Z5!0`!"XH!"U!%ZF!N ``*,2#!P!!V3%mCi%T%%N5!"%3!p)!8UJ$!K!PiF!L)!5m)-Mc4rUJ3T3"-88([# "$k$Q8m#[2je0!![`J6*3!SL"2,J%-f!#4!!CF!UfpKL!!e6J'F3#%Y"@mN!LU!F c)!F`HQBJ!c+"2D!%NU"G1hYSAhLR[CSIpU4!!!J!4P!%!)'0$`L0)!))!RK!#K* "CRS!#F!#8)*3-15P!!Q)"3P!#d!"Dd!!NX!5B!BL!!'iS!%Jh['!*2MeK%$B8i* J3!JS!5p)"L&!Y2-$9,rIkd%"N!#Y`#$03i)Hi!D5J@T2!Q,JEj%!)8!!)J#%(rH Q3"5B!6'!$UM!,8J'4+#YC)*%3!MQ33eJ!Xq!"bJ!5j!!$r!!&IJ!0IrQJi#F,q! P!F$I&FVJK#F"cC-)*%#4ErM&!G9$J#"Im8P!+NJ!5J!+h+JN-!1N!B"h334![!- "4r$VL8"k(`I!J!K-JKj`!S$!UCrjNL!%$)"qS!!m`GK2mj*J"EJ#R43#$%%I@!5 C)!1N!J6`#(K!0i!(dd!Eq)%b%!V1`55J!FQ!$k!!2Z!(lJ!GQ!'bJ"R3!JB3"qa !*[J!Aerb8hl,6rCAI#4`"$TDi(1#@@$`!@`#-!!6J"QF!!aJ#'!!)J!#)F!"A), Z(J3N`4`S!HNJ#8!#1S!,M)!-N!!#*`!43)%2-!"``6R!!B+!-iX!*F!%!-%`%!6 I2`682dKlZ13[33F(`-!6J1Va!ffF)%F6M&,"6e"J!*a[C0q@i4#!!I)C12$r"B! $i#4JEYd#ri#-pQla#bMD4XF[[!0h`,M9$[`$e`#r!+Ia#rE!2l!'r!%K6[&@-EP [mY[X%UE8,Z0,Dp!D!#1Xdj!!-#5m%r[%33&Kh!ZhJ4S"&,3+l!)%mR5)'dKJZ+% %*S'X$`-hD@J-b8*i3A2J-(m(Er#Pa#h#a`(QJUKf8iBLFVB!+kB!!%$AZ!)4#2P L`M8kM-i+"`$J8-X!!2!-'%fBM3`heB`$!-!j!!#S!e)-!*!!rHK`2"c54-dS!&R 'fa3!9!!"3!DJc33!54c"P!)`#%aFIP-$"!!j3'`#Qa!"!3$Qa!3%!&#!,0,""!" 9c4F3!)!"!F!B%!$N#ejF'a!!)&"e3!#3!!F%!(e!!"!)N!"a!B#XPFDeFBi(@F- *P&8"`#K!a`8!$m)U%!#S,E9!(rI(A4C#9$)3!$!$!8!dF-JYJpC!!)$eH!-"!$6 B6H`HMK`l%!$%!pe"H4!!q!1BR#BR(`J!$S!!-!%)!,eG"b!!L!#NR!$!!JJ!-B! !B!-)!$Z!@b8!+"0+!!q#b`N!9i!!`!8)!''!!&!'#!"UJ!$`"L"cbK`c*`!-!J+ !pa5L53)#`#9`Q3N!SB!!B!S)!+Z!!2!+#!#dJ!#3!!X)!,k!!$!-#!$)J!$3$!J !dS!!F!d)!0b!!$"8Q!-#`$SJ!-!$!X"kS!m)!2r!!%!!((3$`)Ne!IKZ!d!(-!# )!!2!#6!!X!!$3!``!0J!!m!1-!"%@8A!!+!%N!!6!i!8-!"B!32!&M!!J!%$3"N `!+J"!m!E-!$3!30!(M!!q!%$`#"3N3`!MF!!)!N-!*I!K$8!K!)$J#N`!+`#!`! X-!$8!J0!,M!!q!)$`$!`!#!$!d!c-!")!`2!06!!F!-$3$J`!*J$!i!k-!#m!`2 !2("`6AkU8X@dd`&e1ad34pS%D*YKD9-aR3X"'QIS'CBfSU&P'"S@!1L@!R$cABD M)@BBS'Q'*aeT1"V#KTCKE6JD[SDcB@ZS'pU'Q#&[Z"[QKVkKD4JE@SDdS@jB(*D 'V'&`1"cqKUjKFJJFCSDXS@L)(&SfTk&[1"fZKYHKFUJG1SI&iADi(AD(c'&ik"f +Kq4KEeJHRSIMBAUi(&U'MYd"!0Np"*CGC9Fa(3#BAHb5F'afRGeR&pU0GUAGDCI DVADYA6E`fX9fXeeY9`EFGVRGEYIEE9cY6(#($a&hqH&aaar+!lf!,l!1p!2@`#h 3!0`$fm!Ym'hY!cd!)l!$-!$$3!l!,rKSMX!BJ!#)!GK!2I!+V!&Q3!lJ#-3!Di! @B!dF!Lr!*`"["9i$@lI@!IB(NGBZm!X%!b$!LHII9ASV(S&Ri#&i#Kk$jq!GI40 HKAIKCAJEASIhi6d")Gi2-1+9H%CLLTIQ43*rfKr3$e!$)B!+m!ld!Xr!Yf82C!2 h`"b`"qJ$eS#leJ"S!jC!,G!+I'[G3$h`"L`!0Q)YX!r8L0E!2A!(F!2r3#i`)hS #iX!2d!rF!fL!1B!$c)L!iL(`TeNGNpkCTq+TH@bHQ`IRbAPdRTf(jqPjI*kI"qJ *HS5HSBIS+AVcRU1A#8"kNYir81CCLQQH*p#TE!2pJ$p`#R3$rd![3!KN9rC!*f! 2V!%B`$eJ!i#!rS!p!!8d!Zd!"L!0G!$d`$Z3!2(C!)l!(V!'E!%j!!Li$I`"rN! Yd!k`!9T!0p!1h!&mSMAJ*`++,CSf3#3fHmpHY1I[H3,@AJ+!l@Plh*kh"qk*Hq5 HZBIZUA[XRMrclX9lmekpGqrPHqJL[bIY8AZG3#X`,IB$rF!FS![m!@MLYq81G!( 23#L`$VJ"f-!rm!im!'j!RGJ1l!(D3$G!#l`$DS!@)!pm!V[!'M!%p!$I`)YQG'Q ,$N$(H++&Llk!Y$J%f!$H`$l`$K#*B4r1Tr2aI$lI$a,dP3&$Ap&hp-N!5Gr5er3 pI9%I"dIe@AeBRpE(pAPpB0m'B22TM!*H*'!`EJ('9!fJ"15+(Z)ri!jd!lh!,M! aHJ1ZBU&P$pL*('-h8!Zm!68L2I!+l!*XJ$$3$I`#+Z2Cf!li!H+!YhJ(e)Ji`#m !0`S$f!$Gq!d3LF*IjAIjPAfD(qIRqB&qSKrTCrUKIUSIkqIk`Akb(qeRqq&qZKr [jrX"Im6Gj'Fi&RmXAKc!#)`"##0'`$#kDrl!0p!$'!*l!!I`$P5,Hd!rm!jB!#R L!Q!1B!203#J!)q)$Y-!H`!PdM)G!(c!iiJ-cSL1J$h3$V8$*D!Ei!la!(m!)D!2 HJ+3i1#*1rTrm43(L@38Ji3)%))"&`3,i%$5!i"F%H-4)J0DM!)KR@B#49JHi$EL +'5#jj3piJ*&@$k!M4PVR32[i$a4DN9Bqm!m)L6k0CD0@[@qb5m4#!`)!0Q!mSMe 0+!JN$iK3Q"P!i+Nd"!SG9!hRX341N!"*S,M4"!)!$4al!38U1`$!&&MAi#CR#KB )!'L"C)kc!3"iJEm+#$F'PS'c`"R)TD5"!!!,a`DkJA!J$#F(!J"dS"f)"aC0Hq! 14fMjJ808)#J"$)+&i#'B#!B!Lf!,d!Kf&C!!S#5i%P##PL!QU!PH!CaJ!1!*JS+ L)#NB!*L#U+!Ub!UkJV#J,-M'"3#eB!"`#mS[ZQ"KdJ[qJJ&!-1M(&5$%B!"J$#+ $bZ$4G$3eJmpJ0"J!6)10A!"J$@+$hS&j`!e#60lJI"!1MS2Pi$QB$Uk$lH!l'!m #!I1J!&!22J%#!"8J!'3"hj-!-!B)!'M!-(I-h3%#!"mJ!!3#d*`d4md*!*@!!+! *#!#IJ!!3m+8#!S!V--i*!%TE,b!!#!-#`$%J!$!$!N!di&8*!0Y!D58!P!-#J$U Jc`N!p)!!N!!2k&N0f"6@!!`!%X!!F!%-!0ZCj'F#$!!V`!!!!``!0F!!S!-d9J- !%6!!*!&3i43`!'!"!d!A-!#)!32!'6!!X!%$3"``!0J"!m!H)'%9!J1!)M!!2!, Ff3#3!!N-!*l!!$!+$!#S`!$3#J`!XX!!F!X-!,c!!"!-$!$'`!#`$!`!d-!!8!d -!0V!!2!0$!$N`!#3!!i-!1j!C$JCpJ-*KY*%!2K*jU&BeaQZP*iKD,JD@SHki@Q B'Uk'i'&c@"c#KXKK6INEiSE%)AVi(+U(jU&b+"VHP1(KFIK6&TAN)4$(8aU(X5& 4ae*1KbjPG[K5hSC6*9$T8eU9@199U99QP9cP9ZP9ESH1R3)J!84fDPGQ0jKPGJV !!'"Re4bG!61($"3"H-!2X)De"2i!![!*E$MPfrT@&*aB$0B*`!i3!PI!))!0QNU X9b+3!,dPJ(TPBRNj2@4l`ar!"DJ$U8!)-&IH&`L!)'!%T!,2!"P`ih%"ZB!`X!r i!RCJ(EJ$1!2hJ$q!$X!$aN!%X!J3CcY!2$!kIJ$a3'Uf%J3!JX!%!(jC)kA,$5! 2%!!R3$hJ$+J#NJ"C98V08Dq,%+!)i!#(Km[P%""c4`!(-!'F!ck!,a83F!"a`$2 !!F`$l`!RN!!)!!1LJ##!!R!#mB!hN!!$d!043"&!!A`"'-!J%2HP"#$!,92d65) %598d"(`"[!!-)!ci!Ep!2C!!"dL@2KCPD9PQLj@!#Z##M!('J!P!#2KZJN!#J!( iE*BADUB-E!$-`"L!!4!$N3!M8!9!!0!!0+"P#AcCN81![&8!@m!m`!#F!1[!2h! &"*FH(B"PFI`ER`$N3`K!!#8!d*!!%#)$SN$**3!S!LP"(5B#+!)SJ#LJ##!!`Jd J3!S-!Qb!MaN$p#T4!"&!#J3"%%!J8+HiG`!@!Q!UL8"V&4P8"(`#T%!1m!ci!lq !2R!)K!16*A%J#2!"+S!P)!TF!0U"+8!)h'D$!!C3$G!$(S!a!!0BAJJ!+#!09!# XJ)3*$&5B58!%J!6!ArR!-h!(r!$6`![!#V`$2X!cJ!iB!l(!)h"4cJ1F`$p3BU) #IS"`Z3*P))!!%+!!4!'&!JJ`!3J(V"3Q!!3)!P2!-h"MKR`M`$fR$U!!S-#218F "!UL!)+!+'*P!!"'3!'35!8)!J("Fm!*a`$R!!I`"K%!%%!*i!&M!1I!)a!,R`)k *#S`#qa%3m!'3!!,m!K*3$Qafr!'5GR#0QAf!-L!%D!$m!$kJ#L!#dJ!aBQi)!#V !2`!02!+p`!m!#SJ$%3!Rd!Gm!$K!KBN%L!*r*J,JXbN#4X!-d!6-!4M!-3!$)!( '`,FjC2),p)!M3!9)!1eDF[F$B*V1*Ji!V)!!&B!Rb(1J!N%!!`!*S!#%J"P"%mJ +Um!l!!)X!Xq!#B!2!!+`J##3!!+)![+!$i!$f*UijSYj,i!c2LB+J!J`!N6!*&% "P!%83"5J$*b$LN!T)!,%I#$!XjN$(!0r!"+J"!3#59bQk9r+IUf!+L!"m%mb!#6 `!c!!5F!&8!M3!dq!%6"RKJ!B!#VJr6!#B3!'3!K%!Sd!%Y#VX&qTT6k3!'mf!a+ Q-H!!!*`0A`83'A)#G`!p3!LJ!NmR"M"F-T`+3'MQhN8!T43#J!`)!IkFc*N))%k T*J)J$l#D2kC`J`M%QMfQ)"!$%!#f*K83"#!!%)!&J`"dPbr!c&Pc"J-9J(NC"33 #`X#1+3U)!)kIXdN+f*G&C`'!rH8ljP4P#8R@!T%!#-!rL3#R*b13!!4!!)*!af8 %a!!0*LUJ$%3!B1H%'3PB!G5!f3N)*!#TT@8j!l3!E5HrS`US!U&@C$KLdJ1!J#8 *!HLGPqEV%K"!2ULHf#*d)3*%J!JJ!FLFCmlVB#TjPciQN!#*##!#T!$l+ARf+NS !'a!+V'%@6!,3AD)!#!$0+@b'RMNR)#!#Q!"5J-mTf+LH)!"VT@PqQE#RIdN*5J0 S!$"JdA%!rB!`-!FJ!ZI!UA!%(!'N*6L!$Y`$4d!mX!L!!ZJ!,L$QL3&2`$M`#"J $qF!lS!Ii!$0!"b!')*SHJ!d3#83""YS!X&XH!,!"TEPplTf[5dZ3!!1-!!&AqX2 3`!&2!#F3!4`$#%!F)!`NA(,!#h"GSJ-F3#*`$)J!qX"h'3K%!cM!%%!)&!%4`!H !!D!Pr)!"`![N!AB)(e"c4J!9!"&JE!i#`B!Q%!)J!Cp!XrN"-$UK#a$JHLDGXDF Jd")F,M*G`c-8*)$a*5Z&AdLCiJ9IZ4$!"YSRpkPLNJ$Y9JNBDC@!2q+i9@*ZG-S DZ5@MN9[[!!R),b#-ipBqS!)UDiI,MD8!%&2jcK1!-6d!iX$i9SJHALF9$R#@)D* F8(+h%"a6"58mS(FH8b#!2q"p5J5UQ5#U@"jBc8Hi-)QiJ1-AAXD2c#eY%`3N!,d Zj%D$d#$-%q`%Uf'0Q!Zh3@F3ZB!,iJC28LKS%*44XP!(!!$MD$P+MTkMiqJ%KkD F+F*()`!!H%#4`!ChQj`YA-Xh%`E503e"#6Fb@6dE6M%!!#J$0'4Y3ZU!,Gc!$*I $e)(+bJfA``%!jS&!%)F"JJq!Be0%)R&+h!TJY6#41J!8al"-F9AF&IFUL!'MB!a b#S*a!F!Gi%9''mF-)@$'"3!bb533!*!!0Ce!!"!+"!#Q3!$J#q*aVd!!8!#jN3( !,a!!%!0bC#'h$+)KM%JhmCT)F[!!Gk!2"!$p`$EB$Ak$%J!j+!#BJb1!!'!#a(J #3%$f$ZB!!J"AkJ-)!%3!,5H@-J(fS"6!bf@5C!"!1-c&!3)!+0N(')5NC&`k5Xk PT13K)!#%D*1!!*!!#E#5!N!T3"''F`,!,5!!f*)IB6YRDPB$`+3`b4+b!`+!21$ 2-C-hB9TCI9N!e142L-3-!#l!!%!$H*0,i3"J"!`!6%"8H%i1!&l!!%!'E)8$J(* !6r)"!i!JF"Bk![fN*Q"paB9ci3!3#bL8!d![d"F1!-R!!2!-@*3$`$D3!"J1!1I !!-!1k+#6S6m`J5N!GKJ"B!%3!"`!dN%!S!!%3!Y!!-`!"%!13!$m!,2#PDFU%!" A!!(3"4!!B`!"J!B3!&iDYU!(%!$hPb&!!$!#")!N3!"F!J4!*d!!L!)%!#T!!,3 #"-!X3!$N!J4!S"1lA(4QC9`(jF3h"1U!LTH"%q"%CUHJ*M-2+[!'6Q4bk&CmNmR 9G4(UJ@V4CA)1+SCkS3kS('U'kU!kU"mUKSUKMUJLkS0kSUDS+'U,QU*qU"mUm"D LZUJVkSakS,US+1U+kU*QFM&UKRUL#J3*DLBAhqLS!3'%fU"QU%HUJcUKjQ83!B[ UT0+S6fU8LU0+U96UP'UP9UPBkT@UT8DT1UT'pep&A'4Pkf4@hSpS*3'!P[KE$J& 3i&E#PA*PIePAhTAAe$#k9kU9&U-2X!qX!S5AX[B1C++q`$i`Rh'!m'1J+ULQ@hI !,m"J0CD2C@3CCPD@Pf9QZ9PfPTpPD(N1M*DPj@QC@Uk@NjTV13E!PV,P"P0EhTB IjJh3$q`$lJ#[H39i!4#EaFLRfSc+QMHJ#i`$RYmqm!fm@f1!1i!$l!2"d"M!D4P Gi`!MJ!--!maA0r!)A!0I3"f!$3`$[QS`8!GF!ed!(H!kTSRh3$r`$dLVRm!hm!h F!C8SqmJ[q!2hJ$G`"3!#pL9qU9rbPhfS%3"J#TMM6B&jB')!#HD##AabRD$!JaP K'Tm@*SDTBDi%(#DSkVjX!I`!GSN(J!#VJ!H3!+VZUIa"RdU`HJ1`3+E4#`KZA3# rd!8d!pI!(0!(r!0G3!Li$h#VAF#bfJAd!IG!&r!0@!2I!!R!V#kVGm#bZJEF!B# D1r!,l!25UV6k"mKSpd#f@SPbUpd!$3!)D*PFTTF*C[DABLDCD@DLQGI)QRN2Y*P [CTbjGGDCGfDHL3(XQEURR`PS#TU%TU'*D#UDM+DMU9q0!B2![hS&i!-rJ*kkUVi $[-$,UJpF!dh!(r!1f!-p!(rJ$f3$lm!hX!B`!$p!aFUa(J"r3"'`V(B$(1Zk9Je m!eA!&C!!X9i$p`$*HURG!jhS2d!)i!$KJ#23KAi$GX!pd!$mUS8!$X"f9!20UJG `$h`$f'Hd1@f'!0AQ$h"YmJ(CjVECEAkEi5B4-'k@QqGQZVPZYT[[CVc*#-bEpHD pQ@rZQrhQ[aP``Tq$!)-P#2J#mF!Ui!r`!c!!2P"l59SfBpMk$@4XVS$&@!p!!51 @2e!0J+hE3$hJ$B`$)@!RkJY8!`6!$G!0-!!f3"$`$8`$hd!GF!N-!A3!$K#iAJ0 h`#[!X4DZ'Q[-iE(@!IF!&F#XdJ'!Dae3$CbX#qXlJ(d1R8ARdFQ(,TdS302jG&) 98LI9DA9LR9TRm2PeKTeMCpPjGYUE%B$D131`R3[QffN-a*eAUc(3Tei"lk-r))T qVFDV2P!29!*I3+!fX8kVc8"a&J68!qVD)H!U(J"p`$"`Yh+XA8!hX,FZUmAUY@U rhJ(H`+M+[Pi$hF!"F!GiV((!29!&M+ci31"D$F3FIX$PLRfbRNM!(YU!LTQcCqe jHqDHZfI[L3$mRX(Rm&Pm8TM)Tr,*I#Tmq5EdZ@"+Rp5Rh0Q[ZJ0`fLUJYRk`"5Z VbLp8!eA!,d#i5U[6+U4f$q`"GB#kKU*GV"QJaNV$GJ-J+`j,XYS"XX!Dd!hiX2a "'3$%rJ&$,10Ua)kXrm!GB!E8!QZ!(F#YBUk!3!,k"bbJhB65+@BqS"(S"&U"AU! Ck-h!JGi$(LJ)+S+5S#BS#B##UU!XU!X+JmUJ0+J0LS0HP+-UPfPLFUdHE+Vk$aL XbTU-0Jki!9q!V-SqlJ(M!$Z!!H`$MN!2S)+HX2h!1&#q$J-&!$l3$6J#0d!3B+a q!id!VrB)$,(F!!Ak$#"TP!!1%!BF!RL!aaTc9!((DL%!$q3$Pi!Hd!d3!TEV0h! 2P+*kk1XTbXUHF@SJ5L3-SK"")CTJ#&hd(3*`BUQYbTSEHcr#XF1X(%[QM9YrV,Q &ad*dfDVNCQjp@qq@2N[49V+'UN0JLU+LJ)!U5KqdSP9Q4"#-*J@b+%,l%,KQDQX aG3@BEF%X,&"-q3,!!-&UEK@ZjTBS1ULQ@lTDAm8[H,54eUjDIf9fkJ8c@LipSc# 3!$4+6j!!3pCS5i#0TL8!`$DU"(UM$P`[4@QBSe`Y1YT"qM2Vk*I5MVkM!%!mDPr -Sa)0!'#2LS%!3$i+!1bMF&42mSm'T!+6j&+3!0*`##NlS*!!kR!0D8J(N8UNKL" &DJ)%!"BT$)#4DU58B"*!a38!9TcQp*''T#X(!J8lQD5V)%SD!+LNCea,qT)'!$( T6&U6hU3"3%kkN`U$2LP3DJ`DFSKF!"J"(+IfPP$+P6LNK#C9+T4k!!&$EMR) U3&EU$JS!2!"['q8)!%D!!%#@NU9QU@IQ"3J!D@P!@-cC!D'N-jF3#J#1J$@R5Nk hUf4e1pf#!K+K!-!+#!#b!#h*%3S!kpc1f9Cp95RK2CI2Z32)T!#J$j4dbBa#&dh kBal!!%!#$!!UJ$Cj&!i!2-!!)!3-!%J!9%J&$!"D`&8i!*J"lq3!)!F-!(M!@"J Fj*-$!#3`!&J#EU%S3&!1!+l!!%!,$!#k`!!!$%#8!`!c-"J1!0M!!1!0F*50BA) h!0J$qP9*+@9U'43!!D!"%!"LL`P!!,!!")!-3!$J!!5!$d"j%J"+!!&3V&J""%! 5*!DBTqJT!D#HXUF%J(X+RmURiTNR3!"J)QB*,%!!f!)%!#p!!!J$"!!b3!!i!`3 !0G$PeQiGkS"+eFQS##U4+U&#U#jUNMUJ,UN9USEkSPjd0UU('U4LU5@UQ*ZPfVP EDTllS-+SFqk8@U2ZZ94UPiULmUJ*UTi,TCU9KLk,UJ!QZScZRG[S2VU1EU3,k8k k+DTMe`!S!Q'Ukq4JY%lBM)2K!"3!9JmR%Yi-"+h,!D$$#3#J`!'!`r%'VC-!-!* NEh,U8D![!!!I!$4cLRi!kjbTT&q4INGYV1[V#J@XPfDJ$i!!k%,4"d)+",,9FC! !Q1@9kT3$N!!q'3996$Ve!D!$J%!&!!38#3*!+E9P"!,"MbUed[kkL-kcHe)pAql Ar0@!$,X5SE(,kN*-CS%'F!U8!)S!d-"C#J2j!'JC%1!!"`"bpJpd!pkA-"!$h!' G`$PJZ)f1bq5eDeN&!`N!U"N4+!#E`$'ef9#l#J!QJ1eUZ`J!YrXk3!'KJ$#!I'# Hb)BVGh)"!iq!)D"b)K(6C5m9$K`$Mm!R`!%3!A#!"!$J43)F!"i3"jbmb%!N)!) 3!BP!2*!!B"3(G`lj4XhJ*V4S8!!"Z!L[J*QfKKd"p!!F8!4N!HSZ3C!!l'i!F+) 5S'N3Q#D!DiS""!+8TldC!a!#)`!&N!!"$!'LSi3T#3#IBN!'J1SqAle-`[X3)"X +3#[!$`!"3F!(%!f!RQ6!a"XZ9,`16a3J$j3#8X#@!3%33rI&@5!"K!$E%9MU&,& I6%IEaqj"!$F[##!"%!%0J-f,m`kq#)$NZqiN'(9+I%#qE9a!,hd(LfB(Hi1L5Al "!%J[2L!1T!+NfE(,lK)"'S!US!8`!@l"Vl*QVU[2A!'`D'kp)3!&S!%)!ER!k)J "5!"NEhUT(D3%Vq#JNhBT#S%!2`!'"!-I`$3`$LJ#T!!N%*C5["B["!!&6&lbDF% &"pJ%P+IY+Gc%"d5!m$%3*"KiJ1+,"!bpIS-%3!JS!*R!cG[f685@E`3Jm'NHq!A lC@d%[FF[k!X%2!$8,JF`"lKVr8!pB!@N[ZZZE&8%3!1QJ!j!#-5qDUBdF!m3!ZJ !0C!!$bJ!')!q%!%3!VN["b!%e!#q,r#V#13%JJ#EG3lX!Tp!1R!*H!0h`#G`"Y! "B`!@F!bS!mP[G@NahJ29!"BJr@DlGfmJd$CT"k(!)'"ID,rF,dS!!4!$Mi!(F10 HIi,!!b!)%!#%3#)J$K!!jkpCi'PZ'C@!qcY%9ViLJ-`C!JKm$X%m-!`F!Si!"p! $J!2b(3(!!q!"Fm!`B!dN"fdI+B!%q!*$lrj,l8kVpi!q-!,S!k!!2p#Z!30r`$B )!S5Jm`$J@313!!FU!#)`G5B"'!!d)`Pm!kRP2A!+d!-BJ"!`!c`#Sm!j!2`Q!K3 !%V"XN!#R'%!a-!*N!+C!,$!kBJ+N`"K3"4!"8N!331Cp!qM!)k!1j+lY9RLJB`8 #iaIr"!qSA+m$!T!!#KKH#%$N!`+F!(XQ!K$q!J(#`84%#q3$%N"`jJ'B!(b!ilY P6!)L32NE$UKF0Ure'`3%SQm6ZaF*)!"&3*2*R+S!4)!L3!*N!A02fbF+)!+%J%B #![#rd`%FF!lS!b(!mNS#E*r@"VYl"-!$SS!U3!L3!!!K3$`3GBS!"L`KJ!aM!kN PedX"D-$!j`J!!BbpLX$lZ3QVL2h!*maSMSiA!!N`"SK'LN!-2!am!ZM!)9!0!!' 3!!!3!!C3[l@`4#-+r-$2&a"!B#%!Di&l"`KX`d3!$N-Ip*kd30X("61qIS-qKJ8 $!BP!jSN&S`!J`#Z)Af6$GL8hh'3b!!3!1#`14`%F!!M3pS8##!#`Ni#b`aJ!k6[ XLJ1J`$cFFMLpIc!i8-lj`ZFJ+!!3Cl%#(cj3%)m!&F$ZQa![a$%!+j!!"!#CV*5 +'!am`U(`k-K2AF4&J!+3!2`Z[p2Z)+!)!!)Km8LF!bHM!F%S)!@JHX@"69!Nc&D c&8aF()breC40I2lH[#'!qVX6pm3aAb3!$LGa!%!),"#i[#+I84`)I-2K-!N!"FK @6l()&`Ic[p`Z"(!%C"C&3,&#$h2&"l!#B!fJRZb"#&"k0Ue4!!%J!@LpA'm&N!! "#!%*-3BJ#DJ!h-"Ec(33!10!*r`*@`+LX)T)#Y#a4S"Hr2E'[HM!)(MYLX68l`j mAj3#V3,Q5El""d6!&Ma(`F3q9N2@F3%#jLp1A"N6!CFajDX)f!$Pm8$J'9-9fV" S20mTaDEah)-*L!,R-#L`'P1lad9QJHVb!l-aXQX@3!!(3+m(56)!&+J&LJLB!kG #")!1j!2H!$r3!AJ!k)!r%!23!4h!"4!"%!1k*ciJ!6`!i`!IF!lN!Kp!"Z!)a!) Tm!'`!5!"U-![!!0,Z`Q4!T!!Zh,(1E$$)a!3!ii!qq@j`(JJ!!l3$`-$Ki!$J!$ J!'$!pLKd5F-S,b5`mX)"iX!*820b!%"!("!""!-(!0*4(Z0`biC2-`em`Bi!!Y! $0*N)`*T*"+6"d-$RK3B%!86!%3!(6m9Q@S&-fN!""i!Z@JmRZe4'[S-$#k21&d6 J!#!lDj@eFG!k"G&Z3$$Y!LA1*M!J',05H'qljF[q!blLrDLRRPZ6XJIi#T4ErF! hi!DB@bKDJEDY`P[Me[Zi$VJ#bPVXG3!Bb,[E9U`JBdreR8Sl&(Lq%N%2&#l%P`J (MT`i(5k2mVD,@#*JX8*em#X,"3K(P6QqJ61N5l"lA2Jdk))Y"-8a"rS9V1cVFJ! 1cU&ml`S%dQk)Bqf5-J5!6d-!2!$a`,$mkeB(l!5'ma%FbjYZdQ$Z(KHJ5e"5Z`K !`%L$X%rN4SI*FG"@Y"@G`DN`'Q`,2%N0`Q$-#'9#QR,"'3)(4X'm#"M-#2-"TX' GY@B,2kA@`MSKA&pd`JdHM)iiBqRJ8!U#C%BZ362G!!"JrGL"HLd1Prh!"L&18lV "8$-b&PPP!G3fDdX!3$#T!%`F$6"@)#"5A#Ld"%L4rB8@B%8'!'4!&rI&`8ji`"G jc"`#D&`!m!L3!*%"`!Ce#qU#T8!!F#H*YJ&!,[$("A,(`$%B!!K1d%!!8!d%!(M NM"8!P!-&33$`$J3!p-"j`*3+I!)!I6JIb,m@J!#`!GLfS*`L@FUj!+bFEc[,eB1 hR#ATbiN"`9cI[!BBF`)!Fm[FkJ%'i62R26d#!S!PS-e"K(fTGMY,CS3EBH5X%8l 1'b('T%ZqFiKT5MJ1&*-#3$c`Q0D%bF`c53&3BCBT#R#,hEFp3$Jj!#`"SQN@)1# kNfl!!&!($!#XU9QS6dB#!`!Q-!"m!V6T3ARKlJ)$J$$!Qe+8KD')1`#8!mDT5+N 2Z(95jXleR(B!"!!*3!#X!$9ZGTTk%3"(!#jc+`5j"-#3!*X'%!"`!!&`"a!!Y&X Km*i5!*-!!6#GK3,j+3(J#K!!0iU9#k`@Hp(!PdB!I!-%J$P!!,!$"-"ZQ3q80JG !!I$T9J!&!!H3!1)8!#J1$&!!h!!&J!p3!"3""3!68!"-!3A!YZ"JA0#AA4@$3@[ 3"-%'V4N8G!8GGV""Kp!MY!D0EKd!"KepU%'$G"Gd3CFfTmdX0!bG3XI3+h30c8+ cd#jd$5e$E`FfG!p0aFM30l32,83(d66d$me"cp"#0"#04&-a"4d4283rd@Pc$Qd +HG!Ap!jp3CY#!S%(I9b!d&6d3N"#Lp"0G,Sm%A64C,3)E8CId@9d'Re'Vp&UG"[ 04Vr4ER3F$8I2d@Jd(@e(8p'@VM#3!1Pf,G-U%I6T`R#L,QR`h*Lkpd@UZqUUADi ZV$XZa`VMeLp3$G$"(b++aJmF!(j!2`!-K)!rE5DY5F12UXD`@qc1,3@`@G!R-l[ #P,0l&&3ar!)rd!rm!US!*1fZrBL9p$j3L9kdaGNQ(DMb!hp!2'",r`-FkhpelYi jF3JSc4@c[ZpZ["X3c,[eEQL*lqUlr#i'i1m#[!)[m$N'&,a$Efk!m#Um%!($UlE U!kYd0I!-,)U40,m35hH![N![J!IB!mp!frS,[&[l`#2J#r!!IJ!i-!m-!YG9T(8 -r!-F!!m!"i!$`F!aF!Gm!"hLehJ-2!$j0"cJ"R3$Zi!G`!jd!0%UL[B0i,&rJ2i iUX@1kTBr-+U@!hr(dC[d,Ve0lkX-p9S$8Qp!329D[9J[I1bc'F4IEpKV(*1pCLm SJ2DqJQT[rY[f3QbqJ$k!$q`#UX!Y!%krdZ,dU%T1i`)eJ"V!SMPRVD+lGJId!0X !FIB1@'kGk2[i$Z`#rN!ld#'q!Gr!,P#SEJ0h!$Q!80X"8RA1YP@r!pe!Y&TL[J- 30BSf89qdr)*2Zkf1UY2!F9!9PlkR,`%m6,HqVfrX+`V-[JKQJ(ElBX#k,qrE!3H rJm$`fmXB[jq[AMbMq3$p!$`3!e3$Yd"B(8lc"q0d`GS,e!(T!)[f#hJ$2J!(@+K q!lT!fmT86kZZiMlJ!%M9Y`"9REVp!YV!2D!10!-*Y96G$hb0#69BcE,LLU!e['9 @!m$NPPUYYSkUrm"ai2m#`!+`A+dJ(m!*m!+F%M6!$h!%2!&A`"G`"V`"rp8I-!S 3!ZYA)h!*I!+R`#Y`#r`#"`,r!([A!B!$B)!Um!`ieM`eC1e6hp1"9ai3$fc+Ph9 Q6HDG!CHe(4!1$!2hJ#2`YZd$i-!qB!rB!qc!$R!2Q0D&+T[S$P3$V6@Y#&Zl!QF LbmS[-!"RF"``$J`$$`$Gf!I-e`0e!m!$a!&IibUJ8(X![29a3!IE`AL`(X`Im-& q-#!X#"2#KM$9Q3L61Ba`"1!)3m+5-#9X#FF!Q,!Q("Flak"`G%`+Qm+SF""`6#% !1S$J93A%%[!!(-!2C#EqJ&S*!2M8M0B[J!r`!-VX,p!0B!(&P-9i"I`#[`!Xi!F !DRE!faBUZ`1@3!1`$G`$BF!`-!XF!,r!Q1f[l3)1!$[!!r3"X28hm!Ad!D$Sr8K DZ`(hJ&Ap#qJ"rB!kX&@c!p[!,T!!B52B[3!SkPZl`r#`2*`Jfm2iX$l-$r[$N!$ !@(`"#-35!%&m!AHp#$%MS"!ca!jaA)`!4-3C`%3m"P6%&h%ic&dl!M`!R`d+Y0* KY8@YVIi$ih56h3rd!A8!Hrd0q!'lP-9i!kc6[S!r!+MG!@N@INfU@J*5pApG93I Bp`"Xl3Hd!miCE2d+q!)))aiE9BrCB%#HADMQ!Ahf9Yd1F!0l3)EY$EaY(IEhCK@ $!&La9V`RGm9IX8B5&Sr&['GCI"DRaF5aTXd@Zm9`-AQ+!-c&1ECGA!VA"SEe*q! $F01a`#2GDNZVX$56rBR+!E8!a2B0[)rm`E8+TrAD[hBR5R$l!iC!X8e9@p@p3'U YE$2EA[8UF+R9LY+fa@eYlpRCGQZp2hVElS"&,BSH"dF[E#`EZmVXEQem'd15#S" Z,!,`aViaF)`@$mI&mA'F(0IEcE%RR!&!ak-M!M!G9`(9-AIp#p68qf-V[5LkfJ@ h,)eH8mTU`#k3!!%UD`6hYGS,I*CI)`KiDc[9+6GTIA&IDPMeaVd0j'cV`#6`FE[ Dpf-cd#(LfAVf(Y!(q0QYp6k`#l!$km!Ui!Ud!bThEbhX&Y))-XbGl$,)$V*m%#& IS"5bh()KCmJEFSIm)BI))h+*I#+Rb#YbLr`LamJcFSd-!r-,Jj8M(8Z8PJ4h6be ,m`I+'Ml3$K3$9cGSI3rm!Sm!,m!"q!(a`$M`$M`#2`#Zc4qm!fff2Jd1I!2qY!H `!m!#"cA4f3&`!he!2'"Ym`)G!#p0@2d$,%#$I3m-!iAU(Y!,q0N90Mr!"mJ$p`$ kbJ"`f+*SeVB3C"ES3TiXH)[5bqkI20!+"EGPd%!S,jH'FRbT0!8!R$I%eNT2dP# hk$e,Ii$I&KkELCCE$$ImZ(p(@VKd(0$6eP[c&Nrl!I,5+&SRA8Jlbm-d+3@-cXT $JDeXL"S(!N(mlAR[eUpfC)eZkGB@VD#kLAU!9MHTA)#AbJDiUX%XldNY4bT&NI! $dR+X5bhIb[*3"EjYbGpVYDX)Im2Di)"r[8[[i1M@25h8MZ$M9V[Qf'N'lA+V!bp (-r-b193[Da[iXJ@b,aY3r[,V"!!%c!$!`)``(maBH-)-!#c-(&c$l#Yp-b#2#-F 66-c[P-@m"JBi'V0ae$&rc!QTb!`!N!$-5rB')p+Pc%!0brcH[F`ammcFDPc$0M2 1(!$Sc*jJcqc&Z3%NDG$F#Jl04I24l(JScEPJ!0!d2mdkDG3m03F!96-bL$9Vc9b c-qJeJmhUJ0K-0T[0r3$DV$B,C!*!fr`felDK($Si0pI0[HdXGcF,!'BT*JR-R3` RJaXJ!03"cDdSL4!U!J*!*)$0mD86)6LA%Hi#Yb3laeDCK-Mi5DL-)q2H`$!T!$# Qmi"k+p"0B3p!3qF6cVICT!``!13!RHN4!"9@!3-!&c!!M!'SU6bCi2i"!i!KJ"E fNj[!!#$KTJ*e)@l+&aB$(Hi!-!eJP--T1[!BRVL8BDLa!2M'"%!'!12bPJ5!#d! !e!"QX,M!ihkR@!!"m!83!'B!!@$GB![!f4+F#"!!N!$!I%S!1,N1"b[3Ra)!ZJ! "%!aNZ36!-d!!F(cG!!&!$K!!kd$r6!$mck40!$e!&p!(Y!T3!-3!"3!18!$m!!@ !%9!!0!%&!"93!'`""B!B8!#N!38!(*!!P"F!C3)9E8Acd"fd'Ee&Tp"Xp"IG3T[ 3jaB+,8AAd&kd#Ue%bp"KY"(Y4$[4@lPBMND2j6Vd%if@Vq8DY!aY4BIP2E35$CI $j@`j@aj&Up"6p"dYPDr4l,)Fh88("AkjAKkB$qD#H@&1Q"rQKRPLhNBlGK!!$E" (ed*pG((`!"`!I0P-&a!`*J["2L!3M!DmR5[B&$`!r)$SpCSa(k6-)Le-HEM5VPk ,,ZKA6jZ$m`-SeS"!AmE&C!HNY'RZkqBliFd(!!iF!0M-3Y!2a!FJ6fGZDBd4S6P @'""X!#9'L"-5#eh$`IVQ!qJ[eF%HTemTb[5!TJN+X1Ea$9)'Qm[Qf!!E!!1N+3$ @YCXUE"k,0"i!#+K[2"8iNHrSjUl"%I#E"`"9J2hAFJcRbBCS(K$X!@c!2,!20!+ D3",3&'`!cF!jB!LiEGi!9I3!q!"l`$N!Tpd$X`!mi!Ac!0j!#qS*r!-m`$c`$2` !NZ(b!3`!0Jk!!C!!!B3$YEPdl["q!09j!8!9LPlCH5*c5r9P-%"hMJIi!h!!$!! 'J!'53#6$!1!"-!$TK!%FfI`!k93Dm3&i!$i3T2-$26ScJ!F`!-`!-+$E"HP-HS+ Sfc%$bLm`8"@6jKZ1HY'p!3*J3"L!T4-&k[RJp3jS[#dh$L!#U!*-`$!`RamZ$)" p6J$X!8CeXa8&0!8A!(rJ$-L1aY3i-!!)iIc#2!!220mr1(p3S9rSm3"qbh`!0J6 1Kcj+B6Klh"P`(8qli)!LN!!+c!!SqS3cKXAQb8k,rVYb!rJ!$1$H83'4$!,!$aM C2$SH3+3I8h$!mJ%'m!1rkkJqUK[T$!!h!!cNGUSkNIkNkhE+,a#!!H!`jd59(Q& Jk9Tk-@VZR&l8M#&3`JB$S*G9c!I%!9C!QGjb('QJJReZ!1`"E8#&p```!#!k3I% (31M$!#!`$c!$jN!rN!!*M!0CRaI-!-`$B)!r-!c-GZ(k$2#R``$a`#$3`*Na--# cYC-FkJZ#,@"-mFAT3$a3$'3"N!$kdrB$*$U6ZRUaI,6SE!!dJ!pJ!c$!K[l(1!3 B!$-!"bcT`!!iJ+5,0$%km-S-'!1c1M#JT$-$-!!$J!qmkZc!V-kaLqbL&aM3X(p [FDekBGMU"PXk4$#D(c(8c#2`$E!$pr4[A5[U!kR!,c!-m!Y5Pp6&,m`"K`!B`!D %!qE!-j!!CL&1*J!l-!2B!rY!12!22!2X!$m`$#3$cd#r1J``!$2!UEkc@qJm!$b JVXm$rd!-!!m-!LcF!H!2j!(h!#r`$f3$l3![d)*q!YR!2h!'H!,+9$pJ#c5m-[! pX!qS!kE!2e"dV9hrHT8pZG8Zj`3E!!IJ!3MlK[klCJIF3-I1!f!$q!!q`!(NGM! !((#UB`!FJ#3!THYf'VZ5hV($!kqkNjkN``"2HQl(!B!")!$1&4$`!8)kN!#1"r3 "m%#@$JZ!!I'!Jai1f!2$J)"H1GJ#BX-`3-dJHZb!dd8(p`-43$p!"I`!1rXr%!q iAcjlT29A`3((`#$!!*`$i`!mB!D`!h1!XMB2r!,2`2*a"M5Xr-!-X!q-J'!!2M! -B1Mr`!rJ$hcYHm!m!!Z`F%XAD*d2m0hMeYcq#i$Y-`#GkX3H!FZVhmiI%#k"Hk6 Pdj`6rX!I`f!Tl-I8-38$01iF!!i`UM[`(([+MJ2S!N5kNKkjF`2!+`-!!'lZX(U QrU5,kNab[1i3a1Ti3$q!$mMZB8!qN!!2l!2c`$e`$ZMZCX!Y%,)C!l%,-2!""1m 3XM[mQqX$U!#*Z(0iEfRkH2-2(!0#ZrNk$$3!88$ZHJ5`!H(@!`$Kr3--!$pJ$-b d2)$i6VkElcf!I[i$I!0I1aS+!q!cihV@P`e39IR!1K#Z[`-'`0aq#m`#'B!YS&r &!4Xa26!%U!1J!+5Zi8VUKQfQ4ELl6rPdL,1KFqTk'B$&$X!!XQKS2V)$Vm`(2e! 9Z`+jR3@2$f$`(IX'c`d`!rJ!P-i(N!$Z5cSHB,P[R`k"b!i$0!1B3*B1$S3"V8! QX!R-!$F!J@X!9!kcJ$%3"J`#e-cJa3i3!q+fH`i"a!&8J!qIP+,TkX8Bm!m3,Tb $2a!2+!$qq4VB"J!$[KQ%a`GdkiD!&j!!pFd!9rXm`!C)l4Ak--!$$!-c!$VP$-! !QNqbi3Ar!'0m(P$'Kq[03)AQ#F`#-d!-i-BV[m`[24!%&!03J"d2[A%aH6a[ja# `!ED!(q!0d!3J3)hq!!lbF!!$%(U0l(p(a5i9m!+FHj+qXC2ZS2Z6[V%c!+6lU!i $J0IJ'`#3!0!$Vk#m+%r+Qr)cJ!d`"[MZP8-XB!L3!11ar!dr$-`"4bmf)`+!2#c F,YqXMcGc3$'-)FF"Q%!3`!Ni!)E!'m!)'!22!)5()S-63%#i(Xfc!HCk09qKSr+ rJ'i(!bJa$3$ARJ&39If!'9qK!`-f`"[J$kcaBF!k$rH5k"MFGDl3cI1*M'(E#$J $`3mrB!G)CM-k"$$4'd0!!-F1$M!$$I[)$Y'AkS-k)*!!X5rdP2c'RU3rkD5lU-k a1mS)32-ebA2ZRh`S(`E!!a[p+6p3N!!hji!jd-UVmZYjm&k-mZDE1I,q`r2bide T$VD$!bi)"r!!(!+GU$(`$m`$2m!H`%[j!Fm![r!!J1dS'JpJY[99-`"Tc`bFXkf "rmiIC!0RqcYJa[-(p$@h+VQYmp6jR3c&hr(d2"ShQep$LhX#'K!J6MM!U`i$%1N l1[$DSeIZ$`'X2UUrkNBk2i$"dqVB[A6rh(2XbQpJ[`hUCDSk$0!2'2Di`%E2`YX $"m!iF!bipblm1q#lVqI[!$$3c92fhCaPlp,AjjNpD6i'c!'1-Ze5M6m$pi!KN!! (M!-H`"c3I"J!2-!cS+$r!`I!,-#J8qMH3$$!$(J$-F!i-!2-p[!!@[)2'!"Rqcf !#CcYjm!kN!$#IJ,"`$KJ#i`"l-"$$Gc6ZV#"!S#`II9i[('Ib#3bh!!1!`%F,Xc pHIlFi`'h1SkZbH-a16SP2k3$!hL!NClN*iKi!$$`X![jQ2ac2a+h($i0'p#kiqK pJ''2#C!!mTM!2(#l1j6$`#Y[$S`"mRe*AppV"YL-,"*$A[B[I6GIQU-F%m''`k4 '",&AA4",+4p!r-XHh[!$dcQ-IbFRG-4p@'rFhq$m!3C)EVd"%"fLAqM$Mb&iZE8 (e!0XqNl,(bMkmpEr2@rClI[!YeARQf[h4A$q`c2V3EbEcaCa9Elk8!#fSHN[Hk6 4j`YDLG0ecZG$Errkp@2B(Q#%[VQ91[,JjYEk1+MQh`EiMNKZCE5EISLMjVY155Q Shm[EjN1"ND9N[1b%mUU21+hQVli"%1Y,"6BqXMq-iM#)cUpH3'Qi!4$LC$KK"qP 68++rR3!)j%#4Z@3Z,8&EJC2J**(,SI"dU"`FC"8)!"$-(Y#8FA0iF-"++J!!k2[ mrViI-I-%JiHHiiq+0*,C%-6,G-adS$Q3!*!!1Na-M'EH`kP+J#$rY$*hEch3`1- #A+6j6@EL!`3!3m!8P`PD!3%!&a!!J+62"b&qJ+JKc)&+UJL-NFr',GKlf('Z3#6 ZadQJ3K3b50'J)G$JlY'*6c&Pmcp(@Fkf[GeY5fi+!#p!h4`2aR*"J!"`"!J!5B! !F"TE!IUJ!-!hGj+fH$+hc2d"!N!K-2!*!!aK0ZF*F(-"RcFR5jTcYZ3kY`c!Fep 928F121-[BG[IcbAC$TJc#8d1!"U!C9VIDZ-h!(kV1SHQ6X!!B%kLNer!!"$i$rl YC&Fi!0`"!`!kIJMXNfcKlM`!R!)$`#Z!Qri#!m!ai*X@caYPF3SChJ0UT8QjFed !"-!(3*!![`$CkhD+23GRi+P$6J#F!36!'b!q%`"r!!&`#"!!Mi"'rJN3!+F!!I! +%!#h3)"+!"`$*6N"F!hFc`6!18!![!-%`$e!!-35!I3$8!!3C"p!!A!#&!![`!+ pNaF!4d!"m!38!&G!!I!&&!"R3!(`"M$P"F!I8!!F!JA!)e!!A!)&J#G3!*J#"B! V8!$B!J@!,e!!'!-&J$03!&J$A9X"8!i8!1a!!8!2&!"P+'6#!"J!&)!"3#f6!!E !#Q!!c!!'`!i3Q4J!j-`8B!"X!3E!k93F&!I&!3*!("""aF('P3KYA-9"FI!BJc- $`"4@("3(a8&a-)89"m9"F6#&)3$%!A%!cT!!@`I!&,CaE9`EemDeF8eK'pI'YA& YA"[AaM@&E9`E&`,JffeF'pI'YA&YA"[AaM@&)3#qhFD&!2Kf'pI'YA&YA"[AaV9 aE9`E&`,JffeF'pI'YA&YA"[AaV9aE9`EemDeF@eF'pI'YA%K!,iG!N!F%%%)J'q hF@eF'pI'K3$iGK[A&,CaE9a6f-DeF@eF'pI'YA&YA"[AaV9aE9`EemDeF5%!a!& a-!"XA-9"F9!F&!I&!3*!("""aF('P3KYA-9"FI!BJc-$`"4@("3(a8&a-)89"m9 "F6#&)3$%!A&!"#P)a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I &3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3 (a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"` 8"m9"FE"a&3I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3(#!!M$NFm*LVAGL-C(i !$!RUa@Xfj4`!Q[Q`IkB6jrEj!rMQ@rY&JBIV2VUaI2lmf&XC8lYcEc@MP9[cicp !0Z,kZ,iQRGTr!V!ZE`kFYdjR1R&ZRjFkbER`BK283UqS1[@F#e25HD6e#34H-bf I2crf9XE8lYaEc@J#r"0`![$1T2I,QMj'@VdqVKpT13#fr3lq#I`!9AY8mjl(jfD kCpkX'qFA5hkqRrIRrhQ!2U#r!`9kdS#J2rJ-ZS0Zc8ISlm#%rUGMk,iE(-@KHqM 9qVlMa[-,[m!Am![i!k[!$p#[cSqp&Er3@qQ)mb0ri!Nm!5I!LI8"I!)rJ!m3TCf )$i"[p3!i!`H!)h!!2!"r1hm`Q6X!$i#cD`!F!!l!'I!!@(KqJ"P`"MJ!$i!$m!" dk*9$j@!'(!!q`"r`$1L)k[Zh96mH!rl!(r!*H!*r`2bSERd#2m!h(H+%k@1kXZk C0q['qCVHTLF!EhTQ)kI6kIb!RBkRm`Gk1TmqE[hT2d#J$Q'!!B5kKekY+k0*K#e `"LMF[m!Am!(d!PE!0m!*c!2cBfr&,r4@1Z,mU+aj!Nj!*QF%2!#I`+Kf"Fb2AZ- "31!F!)l!!G#K'`$QfJH3!0Vl!!FUJSUJRJ%2J$PJ"2J"Ucb#LU"@$T@$'A!!r!" rJ0%qSrN$heEpH!Mi!hr!*q!*r!(cilK9C8GDRm!2m!`-`V@m2R#X*qYQZY&XH+A Ta[Qc(UdAlG4k8f!$A1[H3,DqVAIVhlT32kkAkqFkeci2I1h2!,[ZVX[keiqmVU@ cC[8kIp"E,Gd2J!F3Sh%#mm$mb!R3U60DEc@Mm3FkSLI`"*J!AS!$m!4i!Rr!*j! !m[),cX!Ci!'B!@H!!q!(r!!@hKR`$h`!RX!"i!R3-j9$jH!(q!&Q`"R`#CJ$$S! IB!#B!*9$j6#h9`k9`aP`$Z4NcX!Cm,6l!pp@rIJ*q!2IPMr`"mb2ieD9(@Pp!Mq !rRpcf1cq!-kZXr2X$d$crJm!l8)ld@kdle,aL0,1Y$[Y8,[86V9El9LleMlDChe HHi8HYSrYCAZ)VlDcl@ll1`#hbqedqcaJYbYZM`!(F!$`!JC!!h!&k,M`!%Ff#!! #qT9D14hX#Tr!)r!)C&SkiJR3N6d"RX!Im2@EDrb"0h!%I!)#ZK2J!$`!02`Cm!P m!!2@-f!-D!0Q`#T["[J"IS!IF!Cm!ZD!"q!(a$H93qA`"hJ#PB-CN!$'(`0G+c- !YRri$m"NrJ!m!"I0*q!*2!'IJ!2`!$J!$i!"m!3B!"j!j5!&9!i(`#I`!cJ$S$b R'kd@lmGlmVkm2`$01lr`[%I[dh[eIVeRlk-ppqkpJqp@r$p3[Tr[B,[kcVkllr$ lhbkYcZrp0hpJ[q2[+Hj&3emD!,iV!3!2F'5$`#$`#I$jNPEYXMYhbHED*j!!C$m #RX!(i!rm!Cq!)f#fQfZH`"(`#4`$MN"mF`!i!QRm*q!2I&[RJ#1J#-3hIS!Ci1` D!3I!*f!1q!"qJ"Q`bUrb&idR8$QF!3l!!8"lI`+TrIf)S"S!"d#(IJ"m!Tl!%q! *)+J)UJ(J!9318X!UI`$NC1I!H8qlk2!3!!q[b`2a[I`3Am3rhdLm%Xr%qqe2I"3 ra92S9[`r8,i2!eRm2V$&Gr&6(KM2YBIcihb&MXDVm@bm'hqZB9GIJ#r3!-bdR!$ BhP[0D2a#Ec@MI3)SG+DP)ji!ai!Km!$i!hr!*h!&I!,qJ,RQ#j`!Rm!MB!iF!1D m'A!!k)J$eM2J#BJ#Ul`IB!BiZdE!!I!*Q!-qJ"pJ"KJ"CS!$B!DJd*j!jA!'2!! 2`!H`aDIfpf2P8$R-l@E!'I!*H!)IJ#FJ"931PB-*m!Ii!*A$&1!!R!(2`#I`!hc 60mGErC[MmVSm%0r,rr)!3$!rc"Icam!aRmc2!-Ym2p$-2r0$26ArS'2cfM`h$bT mmq(m1&qKPr0c1cU[cUZ9[G8[m!Am!Kk!'mX*J1fpeBc',r4@-pSRJ%,2Mrq!#C! !P`i"m*B[%+Aa#cl!#I!*I!$R`$0JcTm"jYS(i!NF!*q!*f!)9!jqJ"RJ"rJ"CX$ FEJCi!(j!j@!'q!&Q`"P`$RJ#CN"mF`"i!MRC-j!!fYq2PB-IB!BF!*k!'A!'I!+ H`!IJ#8J"P82PF!BFk*A$&1!*R!'pe3r`6GmF+Eh@aY+cqIcpIbr6H`-d[8f2dq[ d2,e2EkFE!%&p06qZ%rA@r)-q$b$e5Me6lp4$p9,p2%$9@r9B[4Z[F2m#NPi[-02 fUc1DMMJrcQJkBQre#$`#qlFrF!")!,jm6[B0H!,&e#2J"mcY2X!Ci!bB!A2l'A! 1I!)I3'Vr!hJ#rN$P8$Ri!Ak!'6#hQ`%1J"p31CJ"IN$P-,HI!4hkh2i(r!$[3'T r2aS"PB-Cm!Gi!QE!'I!*H!)2J#FJ"931PF-I!&dD!4@5!b$[I!)r`$FY&2RQPAe ,$m3Iqk6jCYrCIrDKr@KIfTrfU6erX0UcMklp-!$EbrDdIH[dYq2fHB"ZRpUEED9 P"fLhdkRmJD6R$rLZ"!$BhP[0D2a#Ec@McBrm`I`B$TTVkr6p@%`j!Rl!!H!*'!! (J$0J!"`!RX!"m!"m!N+i2l$+)kJ'J"q3!-Chk%E!+Qm''!"q`#Tr!(J#"i!RN!$ 'H`)(`!r`$P6Y!i!rJ+!D!!H!*j!!aRm#RX!4i!P)!@B!JZS((!!1`!%3$XBh"m! Rm!0mdkS6ISm+k2G!r,([h`2icBGRljX@q!GqJVrJ0rJ2IS3ri82S&Mk'Vq&cq"i qL)qfMrKSU)Rr$U$i+Mk,lq,6UIb"T0F2F,!%!0MH@meSr%*[0D20Mrc"r1J*(!& T&YPi2aC6MS$IlJNF!!q!dIi!q&BI3'r&,h`#rS!Cm!!iZ`E!(q!!R!%2J!0J"Uc bCi!$3+bG!3q!Eq8*Q!&cq`(`!p`$9EYDD3)m!*2j!r!*T2'IJ#F`YdX"Ci!$m!! B!(r!!r!)R!#I3"T[!"`!Rm!2m%fV6T5pQYr5!r((rJ2SEm6jL'j381F("$c!RAp *jINZZej'Tr)(NTiri-EfUc1DMMJrcQJkBQp9EXf2ieD9V@j9f6-Dr,LVNPX2`$h `Yj0EpH1-*X$r!I8MZ98rAZLI!+c,kAGcBQUacf#&qMI"lkC1PIT#`DN2+U6k4db N4AMe!c-YRcqMkBLF!*hD@meSmf0&[3(Lq[a#DMqSQQ[q!*lZ$r`"p@1TE+kPdUU 'X-qCIrS-9UK[l3F&bMkS`1`I-HkM'm[RcfJk)LG!TrC@-pVmL1[MqK!GdP9PUke r32e)E[hY1a84(Zi$!10qZ3m!R2[@L,S2!,$l!G5llcl&qb!N[@p#h[XTC,rIlq[ lBMJ!%2$,Y35r%!3!(2`iT,Qdm!-!$Im2#I%c0(8ia9r4b"FBI`#JmA2m(Rm!!2+ ,r#6r&hIbMh%U2mY[4[)H!3$-,r-r@$9r!($ckj%krb6hLI[ma!(3$cIMYN5rd3r ,I@C+2p2[p!X!82mq128[E36KeCreEreG[`$`p30SBAmX@FjpYmD!1qI1rC,01%Z )h[CcEcq$HQ+G@*4TI(Y0CUC)S3rJQ8+&9'&T5Z$'c[3N@DL1Uq2UZ$S1Qd+i!D9 F@1'kmAaK41N-$!$@J2(-')D8++jbHXYS'FqT%5cM'Z3f3)j,)@M23+iA!*%AZAB !qCcN%J#1!!&J#@cN"%!FmMj6ZEi!!@!-E,NR13(J$H62"!#ZCJpdb`9!'22T@J! &J!G3!*J!"B!,8!$B!!ed6ei!1!%QHJ(J"43!CS$$9J$B!3@!(e!!'!)&J#03!&J #lIrl(rr2rrArrCrrlrrp[cP3!,J$"B!p8!$i!`KUKfi"'!!%MJPJ!,J!"S!0B!$ i!!D!%@!!1!%'J"9J!(J"Ul`"i!BB!(D!!H!('!"qJ!&``48(a8&aJ!!3"d43FE" a*8)E9h&3($c'i-`!-)89"m9"F9!F6'(&3A&3(%aK#!"a3"b!-q6@!6#&E9`EemD eF@eF8pM'YA&YA"[AaV9a6@%EemD&!2Kf'pI'YA&YA"[AaV9a6@%)J'qhF5%![Yh 'YA&YA"[AaV9aE9`EemD&!2Kf'pI'YA&YA"[AaV9aE9`EemDeF@eF'pI'YA&YA!L !EiF!%!G%%!,JffeF'pI'YA%K!,lGaM@&E9`Eea5fF@eF'pI'YA&YA"[AaV9aE9` EemDeF@eF#!"a3"`-!"YAF9!F&!I&3A&3("3(a8&a8"`N3X9"F9!F2-C%8(&3("3 (a8&a8"`8"m9"F9!F&!I&3A'3!(icjm9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9! F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A& 3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8& a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`8"m9"F9!F&!I&3A&3("3(a8&a8"`J!)i G!Q!,J!'+da5JL"A,XPA3c!(3!45!%(-b1+[3J$"J!Q!!Ci!C)!)-!5C!"(!'I$j $!!Q!!C`"@X$34`*)!'F!&6$d+3&!`"ZJ!33"QB86m"V$B%,-'H"bC4Cb`'Xml`X h*-!L!!E3!#4!jQ)%#$'X2`Q3!,Pd#(K!,!N#3"M@"Ld!#C`"[6!5-!8!!Qk!23! '5!"F!"*!!L!#3J#jF3"!!XF8"L$FT$i,`5,N`d3%B%!"F1''TGbJ+Z3#"!&J!md `%H#RiX"3+!#`K&"!!H!#"!'4%4hJ`r!p"B!qqFP4!kKZ35i%J!dd`d4`IH%#!i$ !Kml4!!@!#q$i%!KKJ!83!V4ce-$6&JDNCqdF0c!"r"dI`3'!15a#FS#4Ljm4!&( Jkj!!QH`$iJ!+J&mm!'H!!Q"JR!'YQ5I`cLa#K$`e4`lJ!HhA3Q!'+!#+N`"`"LK HR`!BB!j!!"#'!%!1i!%a!-B%#5a#B3![8!6mFp!!%U!(&!#d!"+J"aJ!R!!5S!I B[NM!HNS,)!&"Xc#!"1J""S!kJ!6J!3+!-A$-d3(hJ"dJ#1!!QBRbU`+%!C4!%I$ 2B30#`#Q!"1J""S!DJ!6S!I-r%V#H#J*)30"XVHN""J!ZJ!6J!4aK&(J"!%Ji!*) 0"aJ"d)#3!!N%`!&'!$3!#*4lCi!"N!!Kdbk,d!M39P!!%m$Im4%F!#3!*)!!U$- (J'Pm"1#"cI!AB!*!!b$!*`!#I!%Q!$3!!R`$@!!5B!*!!b$!0f!#3!-J`$F3G,, q)B!%kJ1B!%U!#C!!$0J!`3"2-[""!AJJ"3!&i)&XU,N!F5iE+3!-`!0X1)PI4)i $m!$-J!)!!r!!kNALe`jJ!49!XK,Gh!&(!"iB!L3"Q381!!FF!")!"f!$--GlJ$( !!4J#()!&-!a%!FM!2b!2#"(#`!C3!G`,)S!03!M!!HdAZ8%#E-XI3!A!AV!Q(N! B3!9J$S[3"r!(&&2I-[*'QB8[`*bB1S8P'a,S!J!'m1,chI+Y9U+'9)B#!!8X!!c !2p!!e)5a"'(P!+!#$i#2$(mV!!N!%a"NE9R3!"j)!%J$H#!Z8`Hma[q!-L!(N!! !3-!jJ!6BJD1mpF1D!J$r34'!"iB!--!')*(BH4#!"J!1F&k!!$L!"EJ!Pi!%!!K 8!8(![ZB%a!(r!42`$6JBjB!#X!AJJ4b!%I!0,%)#`(bhI+Z9U#%#%*%183Q!%&# eq!"*!(NJ$#`"rj`ad!6mFp#!(B#I13"*!(NJ#b`"rj`[d!6mFpJ!c8%#@!&+!,Q a"kJ"#J!FF!m!!q5'"l!YN`"KJ!h`'[m$Z)!F!!(`*2m!(R!%i)&NjLD!!Q`$@!! MJ!*X!bM!*&"X!!!8!#J`!JJ"qMi&)!4B!S3m0@F1i!&3!$"J$Z!"-3$'"!PJ$SX 3%R!1D1`mb6r3k[d$3)!Gb*S#Bbl!*5!"a&-Z`#@`KKN"hi!iJ!"8!FR!2i!1-!% E*6P4"j!!!(J!@c85N`"i3$ch!l!Q"X!,J&[CJD`T!"!%*%3D!"cJ$SJ!#X!ES!I )!"K!&3"P1!!m#6r(N``!83i@!!0Jk@4!&`"PL!%`!"iB#C-E'!!)J!GU!'#!aBF (X&8M-3Q!"m4c2`"VBJ#m!,L9(FLD!J""3%+N!FJ!'-!8!'@i[!V!'m$MX"Hl,eh $!KJ"h`!Am!3X3L5!![!'b!"$3'C"!h`"3F!DS!)`!2I#"#!'N!!!dN!3)!2%!!i 2Z4&"a3,D!HCJ"(`$)X!AJ!!)3!R!bE!)[3!I&cq`#,dcF-!l!!BN4+c*2V%Y%#i M8fe#"I`$QB9p%3E'F4QTc*`a#3$aa43@ah9[,!!1J!(J!Zb&#R!'H$j,GX9'el! !+!!@)!0!!'D!I)-(`J"b!""`"1#""S!*`!cB!-%!1C!!"0J!`B!0%!`X3Km!Dh) !M-3I!,Pa!5J"j!B%%*%,!H4'"e!#J!X33!d!,[`('-#fE!&XbhT!4-k6b&Bm53" J"d!!(`!X3'jF!'H!!E!YA`"R!!@`#&8!Tm)HX!K"!16'"i!!i)'a5`B!"LJ!%!# j`Ar50E&,"V!YH`"J!1cJ-"%!2)Nr8)1`TZ$-KN-!b!%&3(LN$&J!JB!,F!PBDBX 3#3"K)$S9`&@+1F!!M+r(R!43!i%!)3!-V(+06`@`E*3!i)!58!%X'bD!)4!-`!# SHAR_EOF if test 43662 -ne "`wc -c < 'Hqx.1'`" then echo shar: error transmitting "'Hqx.1'" '(should have been 43662 characters)' fi if test -f Hqx.1 -a -f Hqx.2 -a -f Hqx.3 then echo shar: assembling "'MacLayers.Hqx'" '(131047 characters)' if test -f 'MacLayers.Hqx' then echo shar: will not over-write existing file "'MacLayers.Hqx'" else cat Hqx.1 Hqx.2 Hqx.3 >MacLayers.Hqx if test 131047 -ne "`wc -c < 'MacLayers.Hqx'`" then echo shar: error transmitting "'MacLayers.Hqx'" '(should have been 131047 characters)' else rm -f Hqx.1 Hqx.2 Hqx.3 fi fi fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 4 ---
werner@rascal.ics.utexas.edu (Werner Uhrig) (06/03/90)
[MacLayers 1.00 - part 5 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # Hqx.2 # # This archive created: Thu May 31 21:58:35 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'Hqx.2'" '(43745 characters)' if test -f 'Hqx.2' then echo shar: will not over-write existing file "'Hqx.2'" else cat << \SHAR_EOF > 'Hqx.2' $J"$!AUJ!c8FrJ!C!!AKJ"l!))3"dMB14!93!l%@cB3&!!15'"0"mQ*%)!"lSB!c (j)B&!!'3!"X6!"M!$N!!j!D0N3#!!C4!$A!Ui!',8!9`+Z!"&F#TN!!()!"dMB1 4"ba#*!!H`&D0a#3!(K$2!3&f)'YU+Z#"'d!B`!5m$@%!$'$H33$N"S"%EM#h,F% rB!BB!#!!(S!!d!01!#4`!3"95J!3X!DdCTr)0l!)#3(NaJCJ"(`$V!bK*3DB!%% c0Q!0i)%mlJ6J!e`##!"DBK,bSJ,")U3%N!!E%-!Cm#@4'af!'F!!+!(N4J4`"LJ !5J#j`3'`rSh0)S3j,%)N!"i3cih%*!!H`&BT!H5'(@!'+!"+!,Qa!C`"$%!BJ!b B!8#Q&!!%R!20acpJ"dJ!M%i%93F)!H4'"a!'b!*Q`*G%EQ`!CJ!jX!L4!(J!@c8 5N`"i3$`("l3$)S!#`'$d!k-m&3!%f)'XUCA"AV!!Ci!(!!&36e@Y%%!,$!(#A(K 4!b`E,N!B!!-B!Gq!%J!%U!(F3"LJ!$3Iri!6!!AJJ4V!d`B%f)'XD86#APJ!C`! $%!CB!'%!#3!,X"F-!0mF"TJ!Q)-4m!dX3Lr!ai82,%)Q!(YK!0J!j)B#`!630E% ,#l!)'ED3!)!3N!#@3J1V34fJ"*!!'aI!'F!!)!"d6Hb5!E$q2)Nr!!%S!H5'"A! '-!-)!&hMB'3!C`!a!!'3!"X5J"*!EYJ"C`"J4'lB!B[3YNbp%&VB`"P!$e`!3"8 BX'S'c6T!#2!09$4+3!@`"S6q&N$jRJXm!fF!"P!&-!%3!!8`E,&9$4i!S#2U!d- !HU#Xl30KJ!B!"R!$,N$3V!1m!*P*"&8($&[ah%JmE,&9%%#T4!*X!5E!&!!-N!! EGi!%3'lJ!@F!!U#f4133!,Q4"bJ"j!B%F!C3!,!!Z5%"-#Eq!$)!#j!!'a1!'@! !3!&iB!F!"X!"5J#jS3'F!Bc[%X#6r!-LJ"SJ"JJ"j)B'd(ci!d!!6r)2D!!A!+T Ae3B"XX!3)-`P#l+!%'!'G&aiS#d%"[J!0F#p`!)S!Hb&"A!'d!!m5EpJ#3!"YJ" li3#3!!%SJ"*!EP`!Cm"[M!I',KQ!'3!0m#6p!!+J"*!!'aE!'9"`iB%14JCJ"Q# Hj-B%`*13!&D,d,!9cih%`aCE*3(%8b6!&Q!#6!&2Tad!"`M2J`#jJ3&!!+85-%" Zh!%8!,P"!3#P%J#M!`-3!`1Z"Q!"N!!EH-!C!!'-6"%j"%"Zj!'FlqS2(eb&VC2 K4fjS!'F!+`!(P(Y,J""!EQJ!cFFq`!i-@r(F5$aXX98N`"CJ!N`"VK!a3'j8!'F !"S!%R!-0'3c`Gb`!iF#e@`N#!6!!ki5D[3"-`$H``3JaD`!-8!iJ!&X!(XJ"-!$ XaDQ`)5!!bC%Fm!$`*$dk#C!!QDJ"Y!"G)`HF!3K!#E"Xb!&#!(X""dJ"l)AP[Q3 l!K,*'Q!!3!#PdL)%"jJ#5J#jS3'B!B,!)N3`'!&JJ1)d"5KLbZjp!3)%c4`!(8! "#$%RJl-+$3J$*J!'F!DB!5,!%'!#4!"R`1Fc"*!!!"M!'D!&$(dNJ!4`"P!"3jm 5!!5m!4T!%*!!@6J"Vc%-*X5F!5jACL%([-Ec[R"$!L`#B!!03!*N,ND!%-2kN`# C5iH!"m55)!#%B@h3!T!!`"R3#b-"8`!Ji!EB!f#!"-!&)!%N!#)J"*!!'`F!*(" -B3$#6HUc%#a#2Na%m,3KK4ZZ(J#D&Z4"!0K!-d`%SN!"`"8@P(`c-e!!Z!""3'4 %"rJ`I!p!mq!1!&!!09Q3!!X"B!20-"'!!UkRJ[[+`3)&J![Jq"!)BB!&%!+dFp6 !daB'T'IY($F`!I`G(m%"J$NX3R+!NBZI%3"4i1Z3!*RX!q)!#S"I2!"RJ!*JB*` "VCNRm-iX3S3m08F1i!(Yed*J"LJ!LT-!F!BSATm!''!13!!3KJ"!$Z!"-3$'"!N X3Q%!,e!%r(23!"+J"aJ!0J!5S!FF!"i!%U!('!"U!"+J"a3!0J!5%$3,!dL!(R! !X!&)!"iJ!"J$aa`GF!rB!B)!$T!!Q5Lr+N!B3!N8!ImF0L!%R!*)J"i!Y5%"HX! #L!6S!38!&"`d@fYk`!'J!b!"H!"('!9H!!!5$S"N``&'!$3JC!)"F)!4!!d!!ZA H'@!!C-Ldbb)d!V39&-!%m(Gm"!F!#3!*)!$Uc!&J'Km"H'!cr!@B!0!!#2!*J!" IJ!N!$B!!h`!@J!5B!0!!#2!0Q!$3!!M`$35GV(m)))(k!#D!%Q!#*!-f3$$!N`` !#!!8J!G5!&!!(XL'QJX3jl+4!X!!2-#'NrK&j$J!$m!-+!!`!!qJAL4ql3!@8!% N+cM-(A!%i)%K3"+3!&R)!A$!!5!"F!!f!(1m"aJ$()!K`!&B!-0!&)!-r!2bJ"! K$'`!&F#p)!,B!)3!(0"qN4XN`,Em!93!l!9ViJ&!!15'#4!1R,rN4JP!"3!"-J! 2`!N!!EA!2`F0X2ib!!rJJJ!$eYQb0`BJ!8$!2)%%a&K"`"%3#`b%8J#Q!34Xbb8 !1)!%E-XQ3"LJb3-!Lp!(m!F88pmbmNDCK5r&U*d9hP"QFKJBi$h0GmZh@SND8KN +!"5`!$!!rd!$8"2'%M@Kr[8!q-M`Y`*3Q-ehblGDL4T5'3S!0,!!-!$r3!03%mB 5K*8$!!Sm!$ibr+d!*!"-3*!!Y@9"!hJJ!5!0i)'i6"h`'[m$TN!Ym-p"!jLj!I! D$l0b!!N!"*`$5)!G1-Vc-Ra!l2)I&!&iB!J!!f`!%SQG"`&S!1!!j`8)J!0BJ!Y `#8J!J%!9%!6XDdj!(2!I-!(IJ)04#racd-!Cd-lJNXq!&"B"i*,1`$LJ!!5hjB! #X!AJJ4b!%I!0,%)#`(bhI+Z9U+&!S!!N!%*!eH)$*!(NJ6#`"2acaN!6m-p"!hB !IZB!*!(NJ5b`"2ac[N!6m-pK!c3(#@!&+!(NaKkJ"LJ!F-!p!!b3!"XH`,C-!S3 "0X"Vr!rS!R+!!m#6r!0Q`"'!"j+CQ`!+X!eJ!B`!#V!0S!#63,%"!&!!S-!))!6 Sqa5!%'!*%2,8R$Q!"d!"`)!jJ!I%!"J6*)!j,%*)`$QJXI-Nr`!%)!Im!d#!(FJ (a#jVQ!Y`#8J!mC3,F!QXB8E!0b!1)!"93$,`$k!$6-"'58l8!53!(X"@MF3N!"i 3crd!V)N"m!,J9RBJ(a#l"!%*N3B!"lJ$)S!#m!ES!6)!"P!&3"N1!%mL!2!$2-N !`10J!6!!PNi'G!&3KKJ!!q#"N6#jJ3'!!(LJ"J!'@(ai!&Xe%T-!H%!mp`1`*JE !#i"EfB&m31`5"#4%'S!-J!&-!9#'bkX![!%m$RZaqp)e,)!4m!e`!8r!)N3#+!" [J!``"'3@0-!A%!5X!5S!!h![6!"L!!NJ$33"-N!-i2#3!"X49#bJ(@!14X!h)!* m!3L!!*3!R!b,d![`FI%$Lp!l!`Hm!f"!3X5Dl"2E!Z%b-Y8Q9-!rN!"Cf"GKB"` A#Ud%$J"Qi8Sk0YCA44-!i!!i!!D!#l!A+X!Ci2NXf4D!%%$AX!!S!"BJ!d!!CS" mJ`I#!()!%(!%i)%'J!R!$0J!`3!jN!!%f!$"J!d3$#a#(`"VFJ#-a"m!ZA%"+!( N"J33N3X"j%B(8!+!#a"!$3!Zr!FB`,CX!@c,HN"%cT0BT6`*Y!%"I!#`!,Pa!C` ""X#fI!'F!46!)P3"R!Tl`#)%!C!!'am!!S!(aLiC!"LJ!%!!j!Er5GI%,KR!YZ` "J!'`Jm0%!2!NrN!0`JI%,JM!KN-!b!%&3(KN$9J!JB!,F!PBDBX3#3"K"!$S!"* 3#racd-!CB!#3!!!3"L!AMa"ce`rMkc%R!G4!)%!)!!1VA106!5`E*3!iS!48!-Z '#@!)"!-``#!J",!A+N$cd3m-5RKJ"l!))3"dMB14!93!l%@cB3&!!15'"0"m"!# @!!+!"cSB`c'jB3&!!16'"!!'X!-3!,P"Bb3!B)$rFLVJ!BY3"A!Ui!%9`+Q3!!F J!(50Jj%(,%)N!"l!9Sh%*!!H%-m"!ABJ(a#l3!&ii!B3"KJ"Ed-B!!1BGa!!Z3% JN4[-E8[`$jJ""J!)J!FJ!25!%`!*A!"!P4)!"+`"VGNRmJdX3N)!ZE%"'!(I!#Y $D&N"*N$3M!eB!hJJMcX"q!#A!!+!PLJBGB!53'j!!'I!Pd4ZG!"Q!!1J"*!!'a( !'D!!+!(N"JI!qMFfLa$QX!L4!(K!2$F5N`"i!&ZP"*!!'hD!'D!!+!(NaJC`"M! !B3!bB!B!Q9)!%(!10"rr!"mJ!6!k%93G)!53!"XG3"JJ#jJ"Aa+jX3'B!H6!)N3 #i!&Xe8K-!Z!"m4`Fd!k)!!S!Jp%2D!0K!"8!"0L"I%$X3JZ`&bc!'H!"3!$88e8 V"0!#3i!`&el8!-Z'#a!'`!"'`$HJ"!!"DJ!h%!BS!-h(2d!&3!&iS!E`Y!%"GL! I%,XS!Hb&"A!'-!"KJ!83"T!!!,!!Hm%!m-eKJ!Q!14J"hm!Lp!*mA2M!)Q3#X"F 'J!e!ELJ!6!"G%lZ`!)Z3!'%,#3J"D5NdX"V8!8S!ZA%"R!%-!!*!em3Z'3$Vcj2 i!`U!%N"Z@!"R!$1!!0!e$NB'F!B3!a!!Z5%"+!(NKKe`"J"'j)BGX!KYbp3,S6@ Ld3-A!&!&"UbD3E-1%!*m!`%!#D!%9!"V31K[!C6[ZF!cF!CJ!&8!%`!"8!$$&P[ 9i!%!1U)q-!5J"mVD2K!'D!"J!$IJ!J601X!,N!#CN!!!Lp#`&Fq0a--@@`8"P%S N`"CJ!N`"`!#jF3G)!13'(R!')!"U5d31!C!!'hQ!%N"Z3!"R!!8!#j!!'a)!Bq) 2)!1`!,Na!CJ""J!8J!Gf!'!!(+!%N!!E'X!C`2JZ!6c*2b!#U!&LJ""!EQJ!cBF rB!6`*2q!"R!"S(T9E4!J#``"`Pbb)!X)!@C!ai8(fN*JJ!p3!p`,,)!5`&jB!'F !$F#6p!Z@!""J#l!A$J!CJ!)S!H6'"A!'r-CiB1b5!CJ"d!"2%SSV!H5'"A!'&&a iS)14!CJ"Q#Hj-3(`*+69)M4XaA-MmE$&9NN!m43*X!@B!&2!dfN(`!(#mb"!EQ! !%%#T"!b3!"Yh!!9!EP!!3+N%`1M!!-6!J+X"@!$N"Kj`"N!!)e0%$J'3!"Yj!1H lqX-(9f(VC2L4'aV!'F!+`!(PhK)J"*!!'aT!ml%2m'Er($B`%JpEE"8*X!@B!&1 !+d3-N!!E&F!CJ!%J!HG!3`B$r"d,3$K`l9D#3!!-`$UKCLm!%r!0E$"#c"V!!j3 $#%!Ym-p"!a(j1,$&4L48$4l)!6!!l-@TX#%J!(!!)#!(2!!m#6pJ"T!!!*Q*'N! ,d$9b`"Q!!*3!biBF)!5`&h#!&-"H@1j,YL!JND`""J!%8#SY3R#!+D!%N!!E'N! $p`rB!B[3ZC!!&48!9&%-F*DG44Z+&@!*r!!34J#`#`X!bX!2!'%%!,[`1rN$3"J "`#k-8Ii!%%B!X![[4Mm!K"%!l-+fl`m!B33!Zl!"`!(m!""'!,!,'`"1`!m!B33 !Zl!"!!lm!""'!,!,(`$D`!m!B33!Zl$)p`0!'!(!,S`!S!-r!)34!1c#lZ)2!'% %!,Y`#1!)r!!34J#`#im!Y-!2!'%%!,[`I[B$3"J"`#jF!PJ#2`#%%3$X`LB!#r! $3"J"`#jX!R!#2`#%%3$X`LF!"r!$3"J"`#k-!PJ!2`#%%3$X`Lk!'[!$3"J"`#i X!qJ#2`#%%3$X`M-!+[!$3"J"`#j-!h#Y%%B!X![A!(,!$`"K"!#lX!hJ$[`!%%B !X![I!&)RK"%!l-)iJ!,`!d!B!F!ZR!2S!6m!K"%!l-)qJ"2`!d!B!F!ZI1hq!"" '!,!,!`&F`!m!B33!Zc!3`![m!""'!,!,9j`r!)34!1c#33!Am!0!'!(!,L`%Z!% r!)34!1c#3`$F#Q%%!,[`%'!%r!!34J#`#`m"F5@%%3$X`N8!-I!$3"J"`#km"*J "2`#%%3$X`Nk!+3CK"!#lm"2J#2`!%%B!X!Y$!6M!$`"K"!#l-"3J#I`!%%B!X!Y A!3V!$`"K"!#l-"B!$I`!%%B!X!YR!9c!$`"K"!#lF"C!#2`!%%B!X!YR!C6!$`" K"!#lX"B!!r`!%%B!X!YV!@M!$`"K"!#lX"E!#[`!%%B!X!YV!Gc!$`"K"!#lm"D !!2`!%%B!X!Y[!9c!$`"K"!#lm"B!#[`!%%B!X!Y[!Gl!$`"K"!#lm"DJ$r`!%%B !X!Yc!4E!$`"K"!#l-"F!"2`!%%B!X!Yc!Bc!$`"K"!#l-"GJ#[`!%%B!X!Yc!F6 !$`"K"!#l-"IJ$r`!%%B!X!Yh!6V!$`"K"!#lF"I!"[`!%%B!X!XV(6m!K"%!l-* HJ"c`!d!B!F!Zl!83!Mm!K"%!l-*HJ#R`!d!B!F!Zl!83!cm!K"%!l-*HJ$R`!d! B!F!Zr!@BBK"'!,!,I`(%&)34!1c#A`"!!!Yr!EKqm!!3)"@m,p)%%M6i4Cl#J[$ !X(PS%)`RLK&jB36MF#$%-#``KP%LNSa)2L)YL@5&83`(M'-m`%5#X3bQQZ"UGP` )c``"M'C!!#8"P"T3IKJ"!&!S`##!J!1E`KX3-UV"!MHY`MZ!JUP""$+m`NZ!5'` &8f)YF"1lBUG8&S$%XS!RpJ8dX6(SDN9#G#mNX8NS!+BR9JNKX8c8L(8L3U`8$)k *LCf#61`@Gf+ld",V*Da@,rV%IZ%L&Sb"d[M%MMQXeFcTe[E%SQ%Q0SdQX@VLDP9 M61bDL9VEU"+V91%!TdB((SH(`*(aVcQ9'dbJjIPBT0,K+3"LAB(cl!ld@(HJc,S &"qB0Q8m1B2Q&[Zd0AT!!Bre#lq`C8QIIm$Sq2!lU@1F"!`*qjam)m#eAJMr@UF# DIbj)BGd,A@8AJbh@cD##G6JSBPea!a(Je&)KMTL'"dS"3)B69LL&a$N4!1#%,Q, i-'-BfL$44J&UT"+2M[jBJiSEU2L6LJ5T`*!!#M0`!2!#!+RXJ3S8F2cc!`"b,"8 !#"q!)N-9Mm!4`*8k3S2-M'H`XF-Ack"cKJN`Y0!Q%X!`!-JrrkK$b"NBa$PRRAI Q+FJC#ZMS$$e1Y$+!,&JmSJ3H!MM5"6!#!%(3$N!mJdf65V5KU4Nb2*R&)h+!m8- !G!6`J3!cNQ'-#"p`q5)`!)bUd#HTVYSU,#4m`-3hlG%5b"N#L)RT-pVB1P!YBRi JSbjN5+)X!*mdqb`CK(!*bbG@8'TT!-FbF3B2ScCjT4a#"I!#$i33!!!$U05b!TY )P,X8PSfTbkklm-V,*K&JqS$,!UV!m!'G+`!"M3KJ-,!#T*im!`3F&55mF+)%+$$ UM'#3!-,!*dU"JJ)E)SbDLMiEk`+'*"q(M%+ME$L!""i"d)#a1Sf#3C!!aSp`6%I ,!F5##4X'Q+a2SbQ$d6$)3@-b+4%!E*!!+3l+"X"#+VR-#id-jIi%CGCI310#Z3* FLEA@+SbklK4*$1'%3Y+N!XUmcd#K4#YERb("h@+I`3$I+TaK`0eeQe'STa!NZQL M),3KpJX3S"+&iQU-LJSf@ZYJ1HCKfl!$(`!3m!`lR`1!`62Ua1N2'PN!F5`mUT[ 4qV(Zc,L#1)TV-D-!,2LKlJ'+Lb(#!H8%%83ldC!!%3)J%!$3U"5(`)%!,)Hi33l 'V1TbJKXB5b$QNc-'`%IMMdFHKFRl32%)%qi!J-Jrq$MKK40e%0*'''QiN5+,rm$ 5k6S)H)-,QY3#)2b$&ceS`cU8m!pNJ!N*EZKIPMi3J"Q0330VDK-E$UF0%LK1&id 5JJ)4)$rk+@)0D@!$'qC3"MQmS3jdf&q,!+!%9`!!!AkEf3*`-5-!f#"R(S$$!'! K*bbBJ3%c!m#CG!%!%H4-!A!)eE-!B)&'PE!1LQ#K'mM`"6()S3aK@)--PI)#i1R L(fJ!d`pDX-!CK8d%,VLK0!)"JJ#8)a(5!%3G46!3TCKL4PC33Ka09JG[I))+Mb# N,ciK"RbSNBe+F#-`%1N#&rb$(eFm""RHi%8`LP&'9[L(2[iA3!)d#3a1J)-!L2L -4*M"!ipF)!4&k8CG#2)IrVL#Y`K#*d5#!39LBU8VBIQ)0FSbJ[T`)b9Zq3pG9SU ANh`%')T9`IPKNB9b`%-EdN!(1C!!)3mbr)Fc1U8T3Rf!M8MJQ#$!J!8#'P!E#9c J2mc4!p""i"rSU1%0ci!!1)!!'(++K4N38%p!!#"2B##!%#+SMJG'd"P0FYD0#"( ,51TLIKP%4bbC-#-[Z)j0k%$N&E2B`L'`!BaZU%16P-)L-LlJ#1hB"KE)LBdc-!% 1%!$S-f*a"JTX!(3"@!F52JHrG6#"U2GB)"JJ)!4d%P8I4L9U2KB)TR-+YD2Db#J EP1),(@N$"Kr-Q9*JJ91GmY3,$fb$0U5JScEUSJZ'b+LId%%R1AK#&S!`!eYT*S5 E-H"EM6+$""3RM1jpleP6`%DM"0!#!,aMTc2+J4,5UJdYY0@LAH""4X%J!FU+iE) ckJ)+-YT$-*3eS$fPV"VDbY'h+Q#cRAf%9q(!fKPa`4kNCD),HNM4BV+4#5pBJ%! H!)V33N'%!%5N#5+)5@XH)RrFR%),@6V$Z4,!J*jB!`[q5K!hQ!!D3)$"$J"J!#I X)d8'!)!%['S(a6&+QKc`UL6FQc-)N!!6(4[d+Lr#fM0V*Q)-D#M$'0E`"ML83Aq J9-T'erJ-+YL@&"9PX)0e`39,K!mD9d6%&eP)"qPQLEUil)$q&S#R'I@$#%S!a"R `-FYr(,D(&P$I51%!3`m$1!`I6M!!AM3!$,!JMJK!JIiBX)-4YZN0(23'I4hP+Ia b8"lmKHNf+QQ!DDS&"!HB`L&5E!Cl0#PKkb"!N4Hi$JJFEmSV3-)k-,!#)kb$!fP 9"clNS+S+AP3F@MhF0K6!ArCK!"MrJ-H-Dpa#-G6"$'B)Tck##p0e11&Zfe""SJ' !LLm$B4XQf+L1)QeE$5K"6MT!**mBd)S8k525AJ!'e+6f$"fB`3,K-mC55Df8!D! $eDU1@UCd!1R!FB(@"!&!T0q!J"@!,YL4eR3E)KhFMK)McjZ'YD*!q!K0)h0'@h! '"#bT$`5N#*&PjEBrJ5&Z)*!!@j5pIJ-*T0!+6)1J"CL'4EXPE3",4rVGQ*i#),) NJ4NSTBl6V0*brf'2NCkK$"eZiBecc$pMG!"d%@MJ``%`JAmN3`L@9!E'rl'-M4Y MimcBq$%fhJa9XY),VTPi!2j4mPA+bC8'82NrMN&1EjK"")5$J4Ni%%`jS6cQ32d (N`)Jc*3(h4MZr!Fm&FK!HS,1!IJ-JM[b0)5T'`-%fF#k3m8j36Yh33I3AVB(q*Y *$TZ"$@qi!h9GZY`E#Q%&!RM"f`@!Ja[`!8m"d)6GmFk*ZHGJlMZ!`3S#B)FT!1% #3"#!$Pi`!96-3CA!@%8!X-$2CZ[#!daSe-#E5cp%3*F1G'KK'm,TM4F&!!+q!`- 4X&`1)"`[H5CBD6$AJ#ScZ!!%I@aHj#Gr"Tc$r38lPrNh0Jk1@AT$m!'3!!1G`-G %'+J2HM8rJbN&%2$T9Bm9l%2!RDaa48Bm[JaP)!2D"r`'4)H6'bpk3*rLU)$@[ji -,9MT2lJK29MB%!&L1"`lR,"N%%53!2j%K`De"`!4i!qJihrcKh[""J$!J!Uma`! )b!d8%MU1"`Bb%)'3!10i%3J#GS-#!1!'!i@"%*!!#K83JC!!ji#8T`![B%RF-#- Gm%12B),QKS*Ri!#(YB,cKc&5S$kIeQTR3!-EQ(X-L)+6*JJJ`),bpJ``F!Cf%)' 8TK60-hNif)++SJNji`9"#)9$b(Y1%)%#J!TimJlr))8XU$LDN!#&!U!8$6KjMA) '&M#&-l)"(1#&B0J2H)F&M3+(ZX!"$+#('d!*kZ0rli)(!+!"-)!%e!F!%#!,%3J "+""hCD#)R-!!5Q%!BU#)P-"[!#!035!$1`!"jE82cD1)"-!##N!!%'!)U3J"E*! !!'`!!3A`"3"`"J5K!P-`LdS"$EGi"L5`Lhjd"EJ)!1$JLj0(M$,J,Zp#L`'J!$S 6!(#J")C3Jl-%$ZDb&!D!#S9`J2mR![m(!bN3!*!!3#IP!!LaK`!-!!Bm%)&5))# 5d#33X!+K)`-S%!#5J!6"!!Z"m)VZ#)m%)!AmH!'m!!!J!!!&%)%`-)re#!ab3%+ ki!3QN!"L24@"h$KrhKJ!H'"iX-#1EJ!,HUJ"RL"@$m!,d#L0%850pr)$ejL06P+ 'ZJ!"M!#5R$#5-P15eBL5f!JkHLJ"hJ#5I##6deL6+DQ0mkF%l%L,$i#&rbF%l0L 4+J#55!!(#Q!fb+!c$q!$2NQ6*aQ8![Pr%3"8F8H9(R#9rf#59f+6+ZQ&(YJ2!V! $1Z-!rL!pCN@,$N!2BNQ@eRL6@cPr!1#"!V#@E8N0$&!!!KQ*$X!-J3N!IR#*$N! -%YQ0hhL43*!!NI6S"PV3Q"5*N!#`N!!'&YN'p6BQ8))-*KJ!`2#)1b"BPXN0"dQ 2QEQC*&#A3)QA%DL8p+L($b!%M,10MJQ1iNL1dJ1"hBL3!%N`$`4TJSV)Mr*)MrD )MfqJ&23(!V"!!E3)!04`QUNT#DZ*"e[&J&QSL&YS4%VK#UkCPE$jIdqBKJ5""4' S"!i)"@H!!`D*N!"d%NIH-!N4k!X1b!4Y!!,eZCjXm)BXq32S3)IrB)GML)Faq(m +'!"U5)-@!#61J!UG8*189SpYi!r'!+&J%(YP3fQ*i)k#3@Q$m*i"`!K%`"d!8)f S3!PLFL@SN!!)kXL1qaL2m(Q2qGL2r'L#!M#DDeQ$lPJ!c+F"LU!"cR1Jm`F("+# M1b"p"!N!HS5J(V'J[+F#fkPl4#J$K`N#r#5KU0#1RTNPTj+LB)!"8pUG)@J!8Q! )(9!)`SJ"K8#GQ+QCf[3ZQ"#HCDQ9)JUC%4J$3%#26ZL"!E#@HRJ"2L"@$-!&X)L -+%#,$#!&[XJ!6##,dHN2N!"+%!4!M#D`"EK)Mli)!-k3!!A"5!e9J)X$B!LH'Tf `3)b!8+S!)!$mJ)`1F!CL!)aR!!5bDJ#hQ'J%!!e(1(rb&JeF)$JjTcHaqBJ[X++ IU6-,S!dpqL4`U#LLS$l)HR9*qBJ`-+`#%!-4f*ANpC8!X!#SN!#YASN$[K1"3B! 1!J!$%4#3!"B*!0!$"`G!2@bJ$Z!+!$Y`V[2DPbq!V'jJVIRDV@,!VmKU"3$EV8S `X![J!kFj!`))#AQAX1`B!*aJX"D3!*i#U!PYF(ZiHCPjYjTf`!Ccq(p%#E&Y)!& Z#V(Af3Epj*QT-*8Qi,"j"iiZb`QcbC)9i!Lh1Ap#3+`kS`#N-,!+J!R8qBhK#!c M@)k,bSma5J!4H*aiB)piY8%4H!%##%kQ9*bK%dGD"JB)F!'cJ!F%J!F&S'8LQT! !e0-'kJ#3!!)*YQ1kKYi*!2b3!)8+fTeR%"5rUC[!-!llaJ$33%IrTkF"J!CM+`9 !N!#RHkS'55X&66TrIVZ[GBX'9$#iIEZRE"#"5##!D'#XAUSZ,3!01S!+lk!c!'! )33Z1`B!1!D!)@*!!Z0cJYi#EXDMjMC*3ZL1DZS3E!'SJSSa39qV&Mc0b"(C!Zj% E!)`lIa2jZUF,$CCEZj2lIjAlYa(i!r2)#0Ai!T[EZHr!Vdk)#UZU&*1R-`N`XDi V!QR`,L!`Me!!#j'!C(Ui!lC*T25RL)qiH(Q*Q[-iY-c+NK'3!)j*ZC3X13%pkk3 T!JKXq`6[S)L'dk`$J,VZQl2FLJ#H-,T$@l5pU36m5)X))!K6F+0eQj!!FD5eA)X ("J#fl@Ue"!#[lS#f)+#f!-bGE*YSI`Uh8%TjG+Za3iZhFU#hI+ZiHpUk'LX*JPZ lKN[#9+#kLbZLMJZj1K`!bcYrcAZj9S)P@N+pR1ZjS-X)%#blU%[%1cbkX@Zk,kR &YSZlZLX"r#J&J6!M45!*`*[%`mX0a9Z4LS#mcKZm5iaqb9Zh*'ULdeZpRSZpj+Q pjYQp!(!!!k5bS$QYh)S25R#B'f!'$M#[IaS$1R-!jLLB)&!'%R#BA'!'5!b!X2# )-@!'31LklTJ#jeUZ!H!13J!$rmDm!ZJ1##`1r!UYj-8,eSUYr`F(2[$*jcS'j'8 +TeR+TfbklK!"DMUr8N#Y1Q-!K(#S5V%"Y'J!'S#-&A!'IV#,HV#,K6H,FV#,EV# ,DV#,CV#,BV#,AV#,@K#Ud8N-UPS!cU$1"#N*[PJ![BL,"F#SZ%J!j+#U!C!!DEJ S!1(mccD!M"bJM,CUck,3cS5`UD5!UE4)!"LJ-`9J$bDi!lbXFai3c)TSbMK3VZH kbUf-Xp4+R)j)Gh&8IiH`R!@!#m6Td6!!!6"!L1!P!`"3$NJ!$8%3!B"!L)eB!() !!`cVdY%3d`!JdBKJJZrkL$JJ"LNVP9UVMNSpVr8+!a+0P2-R!"ki$fYCd4Gp"Lk 3!(SI1hmZV34%l6Gp'MTq#3(33p*+$Dr@-,!&m-L)h+m&)!#R+ElNDllSUliXH3- ZF,2FS!5JI!Bk`0EAZV6cD!G1#`KY)!,TqBJb`#H'IB(ral5,[8('ZV+J'l'j$,r AUQqe#`Q6$GV"+`N3[*Y'Ze5(qim"1C!!"GRClbLMb%QME5#",2N!#$#kK4HC#pX SEk!"fmQN,Db#CDJS#Sb@!1!2@chA1M-!jX$9e1ShHSJ!1#00a*f$ZR!!9J$B$0b [!m$5+dbP$jLpfhZH&%Z2CS!Z),Z`CS!'2AJ&Cd!&IM#rV+G([FN!N!$`"hMb$fB !!4Y)22CYMNd#!S$3VZGE2G63V!5J"(U)!V#`J@K![S#JKbVJ$J6m,RVB!!3J9XZ SKpFSSN-E4p#6-b5,S!!1!VfCXk'ceR@Vf-"!2@i!$QY,K&`&`h,,"#"1*cD-`lA ,`p`JQlGEYhM`Z,AEaURTiRK,"`d!$8C)af!JX+jENC!!J-9V[,TE[,pK(1@2+EZ -!!9Jh-C[r)efJ-9HVVb8DlQS-!Tkb!$X%0`#M)+"*GI%qhm+#ii"!,6-64$NJ+1 mM!0QJ11`$FU)6AL,h3DMA+5H6GRcGjb+(3aie3CKlFEr9p)a!!ZQ,!2jppMA1P# C2C8Nd)LJI)[CQRJj!1S#)!1LcT@*9pKj(J"8S)F%J!U!AEc#h0(Q#J-5`-S!-!@ kVJ3"B!EB-,"ESSGp1HZ`cG%ZRHY+`HY+iH[!2V!!`!jk1!$8B1b)$J()IZ[+[ZZ prZ["RZG2SBF"i!$@rVlB6RI*VZ[-6N2H$ZhC`T@J``ER#JC0#1p,-Hp",Y*I#3B Qq!-AEAXQq!'m(-SLS)IY)!KkU!"LLZ@LMH@5%)MfrUIjUJ(,+L1+SJSj&eLj2GH #Z+L%B)L)f2(Zk+H`3!Mkm`j#3+GhHCEK6DEAhB+kX!!+l'I`m!r%F%@,`!CKN!! (,I4#G%"M-D4M,f)k3RC$5X!'i(J'AEK9%-J#!A#qN!"!E#r!!$-5!mM3+&1!p*! !!!01(m(N5!IQU0SNl)qKJm)%QE3bi26e50[J-28cSJ"1&)0p*0bX-(N$jIE'[9J XN!$FDqPR"a8reP3)Be!(FU"5DlGMja!!'&$dZ6hh!PchP+F8R-$eK)H4@MpTMU! %,#!!16"TKN$jAQm#B-m!mce0)acE*Cc5rH5F-`#fCm!1&"`kdDQL*%`pbqNq#UJ 8Mmpl#)$h!k$'BD)Z6J)!DDqE`9!1JI!#0)!"I8MeZS!"TZ$fZM!#LJ$kZ`N#S`m jdNm#*R$K(!!'KHhi`!$jAZf1Qkm$a4q101S'3D5)jrmNjXrjc1VmTR6KjkJ83#[ qN!![bJU)M122Hm"%q$f*p'H2N!#ImQ0qdJm$F)!8Fq%J319aIJVJ[8J"V3IkB!( 5X`0Y!!Q!!+DR"##"'D!!r8m0NErHjra+J"pS&*4[Yq@!238*FS$@Zh2a6hl&[a` `rfE%!-!'pQqT9%#NK`RHJ!&`JAB1%dJr"+!&V"r4qRVQU,kXYV,AfXiH#5YqD`m IY3%CTrrXhX3+%5+3!2HS)1FR!ML"#3!%HSr[l3!rFbF3KA-CI0iNl5#BPS,iL*l q3!#8$c*C3(Vd"R#!%5aDSfm#dL1dTrD58ck#!%Z3!!#B24rPr!i!+!L$bQd-ZJ- -m2Fb$"U8!fRJ$+#"S+GMJN[E33"+J2C)!Vma"65Kj6N!D'#a`+0%Z(Nb#4Sm+@B Jk,&"dl2`EJJhZL&5$V90X!T'%+#!)%)!U1m@DD,U4#FH(8'`!EH`1J@RiI3'H5' j+@S'!!2`!i&dq[J4M)-(Yc$hLEHfYHIHB)++B@F!+F(#qUAMmYEHZS@X+aJLT"r f"[e@N!$EKRq,b*9$b5814a5GL#%8J"q*J1b4!d3"iJ+(HmS0J)&cL!"H)4cm4ST !GN%#i(9$`Z%Ep)F9L4(),MA@T!TLiEU&#"%JbV(@j4#9@$[-A3TTGi@1b2*$'L) #+'*[X)QPZ9XSY3,!*!JGYl!mF5mX3!ErJ4QN(rrPT1!B'9!'hN"f@S@*VaAf`f) SY(B6-$&(4i!G%+65C`!X`$)%!5`1(C+Y3m!'fT`e&%)Y6#RBXUHiJ0M@'G#!aC! !'piYEmLh+L*&r)K!*FZK`b1'$beL9U4(kV!LkN2dG""jiZN5L!6a)ekjJJJk#)" Bh)Q`8#,HXBUi[&bK@r4K3)$,a8@3!(K$41)S5)Q!E#@fa*GB"f)L'*%$-J!0JKK qN!"q-)!+L#-3i-H3!#pV'1%B!!V`Ee44peR&Ir8'iF!-XRZ"a"$SP@L)"H9@bLX %CX!([!!#X)*Zb)ci!!'3!&PYT4XbJIS3N!#C%4-!$aL'#iF"$YK[e!8K3!$NSH2 S!9#""lT00`3%')"aG!5BJfGF!PL!%E5!+A"*A%#9)3!QJ"Y!$ee32I#"#A!&P`3 "m3-9Tl4#ic4dB3D!09C&'L3&T111qiEVF)kj(3(%$e26N!#$A'S4"0`c3)#hm#0 I[)90V"V*!3DKZDEBjkThk&!4d!N48&jdJ3fJ")0a,L)!)!F4h5)Hi(*P,MmbVJJ j)HrC'E13!0[0)rUY[SJ!%Z5pZ)A(54%3J5"`+U5Bp8+3!!+)$95D)h4$HK8BF'6 YN!!0`))+C3EiQQh8"31!#%$(aKFkX#&SM)lLMd(G3Y-ih+*KC`3"lqk'U-6c422 q`I@`*SK!TFb"-H"#9%JiSBcR32eFaRHK'CpNEZZ-Rc%D6NG!8"h0%3TB!PP!1h* (IZ!$USarB`,BJ"pF%K'`"+b"S13()J!56)%MJ!51!ANd@qFa26)ApLJI@4L0!`$ bLLV',DYB(`[!IHb+FP%rENMqf!lrBeRF9fD+3!)#!aNU@D5,2"GPSd&D,c#JhNJ N-"!""@"'d!"TN!!K45@(E)Yjd5+"5"@C$pZKK,b9CZT%dJ!-55c0BQ'dA0AS&N+ [df8MqaL3!2'4K+)f-U3!m*%19(5mNPR5fb4',VN)DpkAl$ae`!f-b6+CRB3HM)! !Pe!)q#iSd#MV'`LB!qD)28U")f!,MS!EB!H3!%Ib8*lHY`$#KbpJ(&"4B2Bhb`- !5)!!@!8$kJieLZcc2KMM)KJ$-P%1V%[`X`CRL#A8P'T)B*i"&[!#q*(MX6[[iQm *!GUM"T!!chqm!IN3q5#jIE2N!J(-9'*J!!F`(XF6-(QIjDNC)B6fS)'9DEYFCM" B"b2+bpe-0b!cMqET8TU5#`N)c64A#Uh*)QJKBB#&E-`$FrJq*T5XLL)6"*4-#M3 (N!!2B,`5b+H'F88@03Nbe-iXQi0()5*0KSJf"mq83jU+3!B-(NGJMr))&JJ%AfS 59-h1mdAJ`"[i2JJ'P2`$Gr!L$J#m"*N-5'6f2T-j"a,+fj`PlJ!9B!)G-(JN!3q `QcecB$,-pS8+2%(Tkd-(`2+3!!!qm(`1JFbN%c"1(Gb!)N#2ES!4d%d4*(0QJZ` $$[k"NV%QKZ#,N!!"14!'e%lAA!#A-2H"!(1M-*8#-lJ&l8!*'Bl3'Ce%%ZfK!p- c4iP-TF!+3ZF4-CZ`J2CJ*rch0T'2h+4(UHYQYXbi#3eBjY+%2(,L9h'!Y1NdXpM 04!2)*ii*cC[*"X!!$D#IH$0ekFd!`$H$34kj!8(JEm'""K!q!`!LF!--!2QJ!5X !"2JR'&!!%[4am8qTqEG3!5P3!+XJ43L!b80)4S8,`!8#J"j`#@M`#5`'-4LFGB! 4j!mld%,S!"UF!fq!iF`3dr-iEiJ3N8Srp$-&dCA9**k%()Jl!@"Q")!VJ$'N3C- i!AX+#N$4!!"FR%6"I(kiB,jG1!S!"P4!%F85kL)!N!!!iS(`CJ!+k%0AY!(3%%$ 3!!Q&MQ!(+d*45%$A1AKF()aM"TE(2Vc1)hJ[%8$[J`#@"`1)!IZAIHi%i)1*h54 GMJ%cN!"#)P%P*'4!"XX3!)1L&%j!G#*9+JB0k"Y*Z%R9d#B9!e9!aBL"5CSL-N! f*+9+`3+FJA5QBVc!&QLPQr5FYG*3QJeMU5f&TEJd'p*5Y**,C@NYlD@a&!b3!)& 6)JE%""M`!US%$'J")I,NM"3BN!!#F+!!S")i8'@8J,X#!dC!HS!")3#9`)!2J!- ,!2c"JA0N!q#!!l"!F1!"J)%"!J'k+"b)!"N+$NJ!-#!#i-!%!!0"K)Y5[!S!"L` !(,!!R!81A!!`B)-L'K6*!+B"$QL!DB*P+XNPb54KJ!hB8$5!B`lILiJ!J"!!*)a lS!4-3"Z)"QKJ"5b"j%%dj3$+$!#SJXkm!(94-"@&%aeq-b)EU)-CS3e@K#lB"[! !5+J"b5(&S%J"-"XdF(29QhZ4#S)U01K-3&@+eCX0995P'$8a'iYRFa8,#3"9RHS lKDSjN!#%+!Sjd%13!!%jX3DZi@j`e0FR9T9!0J`I'!!L3B&QSbLdJH+3!!1P)`! m!b@M#lU"&QJUV5Di("BP@J5Dk%P02ST$#1K9iDG%Md!6&5&cG8Cd!a4JHES"$La J+%kM!J'1qP9TN6r`"hl!VK%2ei-mb%"N29(rK!D4V-hkIPk!VP-FfZ"j4!rVi`D N!9XG!+PeIEJ$"&!aVdJLF!0[`!hS2*kR-8'-0bJM'qFEK!p`F0,m!I@BRJ&JSbU "i+S%$N%EX%'+b**m!bNJA6[!)4"'c49P`3'"*eh&!$1i*Gq!*2R1,kTBpB(kF+K Z&8aqN6!`6(-S*@5$C331E!$QS`dJ!4cB![39%F#"(d"I!3%Fd*R23K[J!6L`!qJ V()!$-B#qALiB3&p05i%0X1dN`3CB+M%'k'XkB5,S3!jX!,abi9$!"q`KfN!1E!' mBMKk#$53!!0'!+qF!3LJ4&X!aK!(68+X!!"4)&rTU`h#V`(@!2J*+M!Kq`JP%JD !J!%%!UAJ,R`#JJdi$2CCC!0b!!H-!22*"M!2!2!"$FYK#aJ%-!-kS)Hi!4&,BX% +%aQH-S$%QS!HSJAJ+SRP!$d%#T`d'%!p"%F81DjmKSRi!$PJ"e5Xc+!C,1$&aPK T!JKP!29`*YrL@!!JKmTjBZJFS!-iKJjm!6+3!!BLkKZ)6Zjb!05+4j!!#ZS!#rJ !h#!J%B3mU`ZdJ3+))f`!!4!5A[!*b!!mb+i'3!"F9kA`"l!-qf"!m#2$Z)%bJ!F QDN8pI1rQ(KL")IC*I)'G5"%%!-(3!QJ!#-3,!JK&+3)8!!"-m#i!!!d!!'BJTV+ #M5S%j-!I!,,b&4p0'ND3!(-Q$5%3%aXeQrk$c4C6#3'eYEEBGJ[J)cFN9S8!dFL e3J!-m)%U%@lP+ke8*I9fh++"Q1U2*QZe[EEqG3bX@`[3EYpY#lJ(mGDDqS0kZ`( !`-53!+bk&Jli!c"36L'Z%ELJp(DbCY-Y!!CD8bY!Z!BAiBDTB!@"jYir!!BI0pl @Qcq!FK%ZcQ1N%V@&j!qJ"f,S`BZB!"$J#%`GQpX'lS%6X$`X3"))!51J2Z3P$$! !d!"d`!$%!`!5!!`i!%NA!#aG5`&&KTrPH3(bi2NF!3C`"0T$'m!'8X!)-!!MF%2 DJ$2)2XM!5ii8M)P53NmEJ!0c3)BB9aiD,ir!Z"'CCZS)J#jhN!!*NdpBE32l`!0 `1U*$Hq5!)l-m!X!)l%XCqed,lk3K"K$%(jL$b(XpG!%1S!*+`!e)hNN$#qS*3C! ![+$V0VJ!b4YjdF'-`!&DJ!'i!LT3",!!&I!(kX!-q)()+fKd33bJ"APSap!H9f! lE-%0d,bQ5a$-%YJaH)3[-(J5(*6hkJ)Ai!L1"6VBS[QPjqU1DG-S9#m9J)4-`#A Q%*U4C9X"!4!(1F-%l!$Jq`a#`ZJe"kFA"NJ"`1X"pL8!#+&+!3&)S5[U31Z,&0# mjJ!'R&pBS(R*`A,k"ej!#4b"5B-,G-3p@#flehDS!13M"k,Ze!d!Ym#Gq!0Ki&# -DpHC%6D!"@38p4&pld&lSEk2i2GDU!!J#2UZiI8FQYFBP0peDPd-52YNITEL!dN !m#*Hb)Yj!EEq+!$JJSCKJ#IF&Bd!Z%"pV![@khT0F!ML!GFh$6!"di"lQN!3'!* "i%NJ(q1,I"1`,Q!"h-$j0N!c`!RZVK5bSM2L!8b-)b8`e8GddUm)B2FB%3TJK!F (qafm$G6`pL%jS3MB+J'3!!(U!biTc%$LH1h''eB#bAG'[!""!#C5`5[)+$$MF0` $5X"I!V%ZH!&qi&L!!jK"!3Va)3BT(CMhJZ!Cd3!-`IS0[)A8(k##$&0J$Jc-GD5 9%(N@`q+lI%i8608&+i!F1&m1V)L"!Aqj'rY!!rJ02Fal#-#-i!H6e`U2ANP-L5e af,N(e)#rU!dNM(d9!L#3!"YD``3B$J1-IZ8SdRJ%8X`%T)*5d$*dAr6&"eTeFF3 Jap'bS-!3L*j8B,Z+!'`3"G)Z2i!$#B#9i))c%%6HPCbBark8!FKM(X9!ll(Jq#P 0paRJ!RM-5S!"2ACA"GN0MG1%E)2km6-`b!B!)#H!Kdb3!18%-MM)p[JCA14mc%S ZFN2Zb2mBG%aNCR`%d`-LXj#4cC$PaNMmb5`l*!4NDF&"2S#1HJ5a3(-U!JjU #QYb3!"5&-YK(!B!8h%a%J$*09e`"(HMJ'IcFPMS!j)%lNK1qGdrCJDIm$'l"c4b `!T!!+HZ$%q!T4!%9jFV2`"3m[5rk@X8",YB!&ii%%!VXB@Pb-3c0)SK@$Y!"PE* *I0Ra[)4'5Je(*j*-H*02'c!#1P9bm')M%TBmK6AJ%dS8"f!-EF"G*XmMZ(YAe!$ `J8E"B-""+Y!%aKJ6(`jmi%&!X"SC2)4J4XJ!F""fm)%-i#q$f3b8dliX"pV!hh# m++#bLS!Th)SGX3U!"V2i%AaM)S#D@A1SICMll4j-(Z#-5j!!*KD`2!r!&QJHjQ* E-HEK,!1R'-3i!akcq)B-ALE$GUrHM&Z#i!%X$`13!!FSS0J1RUB&8!b)8`B!"86 Tp!$D3`MQ#3KJ!PS!%E3!*,!i"fM6#JBY)!Mm!hP36aV!RG!(@mFCA'$E'iP"5J[ q"pQJ$CdL5f&*fkP5`(MSd4ki"Mq`R3'!,*K['5##j)23N4P$Kbj8,bH+JG)!@'3 '@-!8f(Y+UimS+,fm0e$d%5(1rU"!kBar`!9JY)bZTqi[(ShRa@BihLrh1NpDbdE 2haQa!1M!h[21'!!@'!,eB3B%`,K5dC'6pjJ!bl-!r!(L8Y+""31N(MEFC(*)'m! (9X!l5`2e3D&Gl5)%0,iJ`kaA-K#G,@T1,(SpY*pJCb0L5XBY%U$5T##1e%Bd5U3 e5M%"c4!%!&!!k3F$5!G)XApH'Kq!!Hp-"S4`kVbL#d!Ac"8kS6i@SfeGdf*Jr(` 5rS%QHdbEC(ajQI`"`TbbreEIrk-m3l8Ck8cRY`"D)33#"!+!&H#*'$ej4"lm#Kh TQ4qd)6#J6k"6C4SbZiSIe-RApLimJ!FLeJa!@f'"XqHF4X!Cd!FG,`*dA@3GRd( !!S!%L!"aj@S'F!!%NL-,*ZL4(lL'T21fKN`%L#$r)(5-*$jN3j4#)EJNE+$%N5p ,`JqN3,K19`#J!5#!!U"'R"iKQ#APqPe8,S)NL*@"A*%6G%8KH3-5DdS#`)qm,iN D$dLr"H!#H&!dJJ+U0d@mDh'G68QehIZQ!5"ApqX!m+qCLil!"iT!%0Z"JrdRj-$ #cLX0Ql0!E#6bT4Q"p&-!fU"5RqPrX(qXL5))!`If`,$T4MT'%0m!L00j@@4##SL *5`S8Q"LE##!9J!'$35H1p"9&!24!"!LN#LN#F!!I-68c3J4BJ6MbQ8QfX5SMJTJ 5)',G[*Np!ArCSdFdE*X!V,9P8TV51J!"*`$Sk8IG3`#4E%h$,M($X*!!-V!'fV5 l2$hA@5p,!5'0"9c!i'%#CI[EHLDdrBJY3'PQ"@qlMYD9l"%#9!(GEUj[i'lRlEh 0-$'!cYBqXGDj$1ie`%*ZSK@`8*8a#EJ$Im!2eU4[mU&(LJLPDS,!kQl)&jV9"8T EcJJ%i!F+L$r!"i&PGbXqFNf)TS!V10i`FKlGCaIJX*@#,5!!l9T"(Hm@F'bdYcU S)FFlCKbKiad0RVFkN!$!q%!#5i0Ef!-%%#(`"pkJ"6!"bHYj!i!rN!!(,8$ciJ0 r3!mUX$%Bd#b!'@38DI5PHB(`eJ8)!"bSMq8#Hkm"-rJaX0HE,P"B-!*8Xle1Mj8 +%!b2'3%#,!(LdJ5!3!N8!MF`Kkie)d"Fj4Yk&`!LS-%&NKRK3#PF85X!3Q6k&TS KB!1q3)36'r#0$r6(2dKjclZ(+i!,rSl4-a!ihQ"#@XiMbAdP9Y$aRK%Y)+jSjT1 Y$2K,X+CjrS$hJNNa%!B'M1&Q%Hr!$-4ZGr!1i%#mc+CcqU'4!LrXR3L!*X!",@" eB))+43Cd3"`h!aE,(h`@aN3!!X%b,!!p`)$`!L43$!5N(bG)JI`Ik!,6@)8$J#Z B*@ND14U#MI1@dV$!Y(qJ!KiMh`M59Eidc!X"Hi10&M!'B!Bd`-QH[*bFJiX#"Zb !1i!"+3Cjf*,E26EXH'A'PmkTU9`AJ!!pS$jQbB%GIT!!R-l)JX+,XSi(2Y!()J! "Q)EMN3mB3$*IUE1N)HN#%J!+EJNFf++dD!$NVJLL"fD%#9M!PX6&EI*rd-fR(b[ 3`U2m$"JLK&eAUS'G9D)ji-@+PAmJ0TRbqCEP"XS-3)%Tc(rrJ4d`!f3ArYk3!-N c5r5!r[ARYGN+L`"pJ-k6%Fh1"aV!mKJ!AG$,ZENMrJ#X)1c5-J%!$ba2!A!&"H3 GX)(CNh`D44Z3!!0$Z2@q1QDXK!qk10mah(a'K!"Md0"CdH()"bVJEBIc9NaHN5- Kb-h40arB#""Fd'F%#E!%QEP0`!`HS#2bJ46J,e-lTE[HGH'%SE",Vmda(6P5JCS He0P!)hB$BIbU(eqB6XjP1KTSk!`JU!-#rK+j-CH6X$-U)!Y2m6D3!!rQ#`L@PqL )HfZKGj!!4[idbBBJI&hkT3"q--!M+$YA50Q!a-D@(q!#`MKJ4`1#h4[iJ!p`Ahb #!$i$N[S!A*Gr-!cSmA8"!!q!6aLHRM,D)8!8!!*mSJUJGK$`f8@!*(ab5Y3'b(0 TdU"SaJfBl4G8LGD!fDj''RZde38TB'V[p,&He*%M(fMV'bT,V03CS3)F3!jd@`c p#'L3!*YHA%$`c'lUY-$b%!"IN!#(@A0qUXbA1DNlQDCHa8'`TB%'QFD[KfCGJ!, `c&c2"dV'-aF6hciM8!!b#$[jS(DBGhaqFfJcFEI#)%#!C`Td3)ZEZMrikZ6F%AF !&I"lr6N*pY(aGcJclAr`$LB2@DDrf+#Y6ql'lY@"1`M)+!d`qZS$#Y#Eih!E)!' 1@!3i!@+XQbXaTEh%dee()(2q%RD9J"%B&`ai$DL!aZ`'5!!0(Lr)YK+CMZ6,H'E %#(!!2B3&3+[%`84)`)9A(1*!Cf-!H2!1q!qBR!0KJ)Cqm4fDq1$P4afQD6cBJ(G -)0j&[-f`lRK$'Z1r8C&%e[Vd)`A4q08%$"6kiHHk2J!#MEJ0k!-Zd1D(-2E0aM, G%)Mh%(mip-(mN!$[f6J9Q),*AZB,[4VJ,`#Jka)!!A!%rX%hb-Bri!#NJP23k'A m"ai!e)CmP10ch'#f+pCTajFNdDZ#6UrR"3&r5I5`J0AV!lX1kLIQE$@N1'r@hJ% 13`IbaaQ)ZiV6'AM0IQ,%PBiM"J(F)$f$Jr9-JVhNaXNR0S3"Y+'BA5`'J#[r"qQ J"G!H,T!!*`*d4(N@*3!@K"ep80eV2C0T%ikX`CX$NJhK3`G""r#ZJ(%[jhp3aId ,(LM&))KS+djq-1b6YYfV@[3dFJ0XEii$aMdXX1,dHZ!FdMU!#1C!'Y!$d&RI(fk NRFCa!"Xh!c#!F60-(%#fe6[P,J'%(D5d)CUY$ii[r88!Ta[A1jHDL'Md2DIZph2 Db"Be%L$`QE-Z+!(5S,$,H'M!-,Pl$%Vi%@6K+i+$JcdEUH%%pUNiFBY-&F#i0A` 6Mb-Pd"1-qqX"JQ&S)LLFKl00`eG9M,[e-Y0RfV3D#b$hFr(@Cd3*@2&f[Z"8IHE XAqM!'f$j@Tr,Zm&hF3N2G'HR!CmpY,Z!d@k,82ZP3Ze+J4"F!G31!e3l*d6YD1# cKi!c!!H8KSlB"q(i[B#"cd)cC,[h&3IY[SiB+&5L4'rljBrF4YiF$'BZm*Kc(5[ qliim$Z%$p8'Frm%i'0*-a"rN$!G`Ad+Ylk-fILped`r"K`C3b1h$L8GEkI-H1[# di9(8&J0+i!Y!jKkL"aL('2NE(T!!!*3q(J#hXiF&`!EMU)mb!"B!!5KN(4%'be! I)!&c%rl([a!!!RPNT9UHIJ!%'J@X#!C"B%CB!-m0!)Vr$C(D9"XBq!)9-cP[5+C 2"@0!pJ&S-%B0(m*""k!"G8!EF)RFC@m3e&D0T!*N!05Q%1J$U8!C)!%1""6J'!" $T64Z`!'B!#k!@pmPj!!594'JmIF!PJ%`&#*3IU4##+!#H#D9%AG$0!!'R!(!d%G P@S4@88VM)!1q!+)@TIATa!TI!#`!#83N0L!2D$,mJ#"!%+Lp%!!q3HVKT0%3VB! -Z')e9dH%&102-98j`!9P"DS58"AK)+(C!-'+!["Z+#(BdN0b#0`FpJ+cJS5TG!" E+Y!2+!'I`"X`Kd%$hX02"59NJ5V)jP)(GS'(J(5cZ8!4#3"8T3AqJI!B8"8$cS! )L`fSRM`p2iJ8icei$8A9iqGI*3$-bZB#DqJ#`)d8Bi0!JND9$@)(&P8j8+LJ"aS T80AMCep4JNk#*6JMC!$5cZDb#9C9VQ!dK9@0FTm'01!$Z#'D)"Gi"qD#!`"3"3B -DV%J8a9933-f5#m)*I!D8H!-U"3S!MSJ[p0($#4@%3*`21`$$i`bC`"-Jpp+la1 L9B,332D3!!(i%cCJlQ034)26i)0M$8k$YS`fD%jaJplJkK%1YNENB$Z`$e`Gjk! m+-ZSJ`-!0aKRC3!B3&Tf#%Sflf!!Ba@4H0kATj&Ac)&34!-J#!+$d%"#Q&34JJV K(HK3,A`&i-q60B8H44Z2%DGG3e'DGb)!S!0[%j@N-"&-')-5X"aK1&I8!)!rY3$ m`1c&4q&,$-$)%iq`K(b!(m5"p3NXS8ZBrF'%-Q%r!JKJ#[`!(a!RY)6A$d`i&0D %`!!d!!NN$2b!(+!%5"lX#DpK3cK!3!K,+!I!!T)(%a!cF'90)4@e!Y!H8%"6f$" `KA3'&2!98P&0SHAa$@!!PJFiB,T*%b4KGU-!R)4mQLiJ!#!$2!"0k!2NK,4-+K1 S-3#T!%S(p5&HUJ![d!B%K8bD!q!,()Cq`%$4+I!$HS!biP8C!@C!)$'!53&$S4j 39r3$H-8EB!5!!-pI"h3'b%BY&3'!,S5'!p&M&PRT4Mp6JR0&H30ef"Ae$5J#@e3 c`JIi!(98&A!%I%i@#HM#C!d4Kk%H)&(*6"M*!,CD'!2edSR$%pjU*B`Ki!DNBm` 6l`&FP)E&9(5BcpN!bH&1+1!`Kh[2QB)%'!-[J!(3+*842p0Dp4SD!'UK!9!E+JA iJ1m`G$eX`H(NNKPZKRL&'`!#SBE56@QS"LaHdJ33m"MU!@q!$L"%$%Q3!'%E)!1 )K&'+(DB&,%T!K-Y8Qi'(iZ%a3"jH83+!'l![$9d0d',B%YBfB%"m!5&q8H-KhfB A-J',%Qq)"f5)M+%Ei!dBKN'Kah)82SMKBBL)H)%!$4#r`b,b!Er0GaJH[SM%RB3 S)YT[$9"H'"6bL&*B6YL+-8a+J2e6L-d"5X!(N!"Sq!0)a$&J,m'%hk&dT"3bKAD ![0%86Nm!`"3P4HdT6)!!',Mj&fh!#m&#E"*h3-IN)T`$4eZE9%R3IGD3!(+i(6S LSB15&Up0LA1L"e++X#ZLLj`)J5"G5b%3`!pNLDe!8lJ9(SCf`&Gf'*D&rG5l-5K UL5i%!d!@+SU$iY-M*K+!(!Eaj!BF(%AEX+Gr!3!131Y!*`3#5"-M!"3+K9#IU!J -N!#+T`Y3k!Id*d2K0H-k#)TkJ!M4%YU+I!$S`JX3Kj%*lG%$BBBjB329!`d9[Q* ,q"Mb!D%@VJLk5!+aBP'B*mk%3D%I0"`DL5rKXbKQ#)Uj)KF3+cC3'"!)%#Y#!V5 ((5#i!)8'A4ePH,L+1i$i&"4D),DL(R!X%Jh+iQa',@U(-5&c+!23K0+L!C!!,PS N35%-&BdJ(%GI4RJ11%kfQjXB4e!!Pj!!,a#0+!A#!%HSPhf'RK)JF$p")ki"dD3 '2$@TN[U83993l0!"J,JX695J!8!dk80iJ)2iiTb"&L,YS3rK6i2(XD5e#8JcJJf 52Zd`&+2)b$,pJZE6K,5eaBa5`-aB0!dHD%$lG,V`6cRMV@4'1!!dJ-rS"S5-)b0 "C6)H9aZ1bXK"S3%H&1m8D)`8-e30a3EN$kJB6R3!@%C3Ar*8!)`M+!"-q"3bJNS "4*'Mj5U8!,-bU0&INJ!$P-iT"E)!d53*c%lJL1@K$IJ"$U2!e)C3!1C2k)"mE4@ j%K0"$N!Vk`AKU##T&bMDPe))X!#!ipSSRaJ#[J"8b*NiENm2aF8V`Nk`86pK(IS 0*Z2Nf%pYMLm1E!4&@)G0'[6!#f5&E%!TmVKa!T5!*p!fTNlSSBpb4IN$hBq9"3B J!CT2k$!'#!&i)b4J0eSHf3"SmU4dK(pMi%JEl4L%B`p4X8N6LD-642C*!)eM!)# 0q"Qp8mr@H3a2aG2@1'X*M-(I'k3CR50)31R6Ma`#8i!K-*,8'mj*)b-2'%Ti3R0 PeQ3CFB%VaU,%MG')"j!!HTb2kH2kk%r!!Y$-qbJS@3N(!)Ub6+K'Y-#Pf(e`MhG !'M!'j&DK4kd&2QC'Q0'Eb!"F3QFM&#$cJ6m+ia[!1a53!!&!j8K&Z3%'`1Si3TS !)L383$5BN!!UT!BJ3Z)R"N!+q9bCN!"-J!r%3RU3!%f#!QNej3qYQi$4kq9@EPV iD24!K@I!q(!mUQ&QJ$rar,N!-)hQ9Lh#38lN1#)#i%[%(VB61Z`ph)"S)rlJA6+ N""!H6SJc`Mm!!mL0b8K%Gd9G!rC9P`JQHSQ@"cD`T&Nh6p3D'8ATN!$EBaR33ii "le8S33f`3VI3)XLHE&U)9B!#,#%!,S$jiJQN!P58fQ"'6!#b3![`"9`5SXbFCpH `E!QE(%!*N!"B(S$4S%J#4iU!)hP*""B+J#4Cjl8*P4dA3"l5DlF3K8"&(A$Q!!j !4PjC2S$*m,Cm!-iAU,"jh%RC`$&!8#N"'`$8XJ#!0SP(mr!(j!,,J"RJ$LL58Yf V3kqP![i!Pq"m(@L8!$rafE%"Sb%B`!,-%JQ1'I%!3&k!&iX"H)PrJ"GP&%%NBlT !!e!Sd!`l`)[Pr5`9YGrKX!mFH0CGZ%D2i5#BK#iJ!4J$SQ6B`3p)'qCH5h3Q!%p e@B%"6Na'`jiA1'NJ!S5$2P$+TB(2JJ4JEV%*#ZAK`!qJ!%Z'fL!R,"TVS1[9"[B $G)-p)!GD'Xq!2#"5q5VJMaI)"Y!!4FBcJ!qd#5#P2A![cJR"!"e!#3J,4i35a32 JG[C&Na&pm3-h*3Mf@PNKMi$#PdPX%R$!4HK)KB"[8%,*Le![cd!bS3Y%!2"!2MR Ak@USQ@699&SD[NV#m!cB!crP[&GS)3*#@e&jD(@09N!rX%HQ54L!cY82F!0pj(V LKYa#,B!!`J5BPA#P!!)&p!2B`#rS6TL9"p`lB!38%(KPSi!#Z!"d*@'*$GJICZ9 b)J#i!$5&0%)cm'EH9h@M-`J!TKacJ3V3!HX#*89Tp!02'`r!4#J&U-!Eq!8iPJ& !$i$E%33j&Fd!"@!-i"N3-2@N!XN2[$!(6$fki2!e5l!$Xi3mN!!+0!+C9k#KS1N )r8!e*SiGG2J!*"""d!1*R2JA3FJ$U%!SX$Y!9`P$2m!20#0L(cEQ@DB)S@Abjm* B!3b!)D!8T#(%4Zk6KM"8"X#4KKiZ!#X)AhNFM312KLKR`"!%+-"mS`,JEFk6kUM k6(!c3*0J"XJ$@!BN8!J)Fi"!k-B,T$3+`0dJAIS%Zd-AFJ$iP`$Q[Y*I&J,)ea` !"6`,!3!+d&PqPTYPmXHN+3@#`)$j"RK4"d!6TacJ#FTG',8Z+&X1`'B*2E!EdL8 FB!2)'p*PklJlU!(cjG6MH"ad0KF`)!0`'rB)#9!!8!1ZJ&P*#4!#6m)HN6dB!2l !brJ"N!!!KZ@3!&PN"J$cd)a`!%J!5QBHd32SCbc'FJNNA#LP`)$T`p%!fd#3!!Q UK!PG!9R($D3#cmJ(F!BXB$a!!X#!-"4RJ(jLFJ%$k*%h)!Hi!#U@R*NLR&aeTKc 3!DKB)`JYm'2JPCb!Q!Q0k!rqJ#G`B@+ASUAKB'$b!p*(q(#6k3)"!(V)!b!#M#E H3`!X'[5Dif(V6ARp`(lKA"#9N!"3"aK%qKK3(q2M(CN!5jMhm!F!N!"NJ"Mi5qS 4`53!m!GS'96Jq@B(6MhKBBPjBS++Qk@I!@J)'PB6UCNrd!''K[QKBc5@l8pd1@H %Q2V#!X)DmJ!SjQE*UlNV)ZB#iQ[U#p9QD,PSJTD0CXVLE(D)PNBrm'c@5-IMY0P YpJ1fe5B48"SBDL)8D'lb#GLQNc!3##C3M2V(E3+ESH9)i@kq!@1!FmC##)`aJS' *$p#E)DDpf56PQbBQYFP[pJ1q`lHCB5Tr'%#pZ5kd"b6Q@kIq1C`TCQMCVU`56*% 603"%Prc!Ur8q,(b,`#CaD#9D45@RU'0)R0QPmQH9Y!,5CAYLF+Tc&QG8S"4XQlp QapN2K#NjChR$Fh+FQf@j@@JP!TY%@"N'Z*cp9"#J$`!!9S#l!J`%!65BVJ-0#!% `$8Y4"c!!3S#c*3EJ!''!@BB$"!"kJ"SJ!mKI5X()K(B+!'D!#B!!$&N!3"LJ$&! L8PFCS!(3R6Q!'-#'$3"VJ(f"!`J!"qFTSK5J+j4#2Y!Nd!rF54%!!1J"!)$Lq3S !!)pRj*NeX@PS`"QJ"q!"Bi!G!!#)!A(!(G"#j!&d3!`J!m`!0)!08!2d!$R!$G! #f%&G`!Za"D3"#a3ES!DF!'[!$X!&N!"-EX$&NJ#!!&V,!"!%6!&%!'"f"'J"@-! 3d#))!9(!&9!%5!&C!"83!J!")`!*i!@8!#X!#Q!#I!%U3!V3"c`"9F!HN!!%3!% 0!"1J"""+1J!I`!2m!%j!%q!$l*jq!!,JH`+I`LIaDA`#!-LRmXPm8J'L*qPTHU+ HULIVbAeZ!GpRq+N%R!",J1e*-U@I,X$ZfAX'!"-!!@!!)!!(J!D!!3`!&N$'&`& F!!@!"*!!!9!!6)T5J#+N#-i#!0!"2!!9`!D3!!!d$`Q!!Z!",!#3!`I!!A`!$N! $d!'iQ6I%!,!"T!Ji+!lU!Lai'K8(X!'%S#r!!1!"0"B!3!m!!q5I0%!0B!2F!*! $$T!!!k3)%%!8+S91S95S&&S!"!"FJ"e!'N!!U-JQ!`&`!"h!"i!LJ!"AJ""`#J! *,9+&3J!!#8i#3d,m0!S0N!#1m!pJ'%J5mIN%F"N4A4cAqm4aY&%FpbbN!M+!rF0 m"!$a3af!%md!U+ETN!!Sq$50!rm'!Y`IBS)5J!Y3S#-6R5%-6+)@J"R`kH!"&#K qd`4!!8G!%f!'L#QF+-'e"0BJ+3`&#J*%1!X1He)X5&EqJ$C`"S!"am-ri!S-!IM !#HUZR(VZ'!b3!!h8SUk!#&#KN!!$)J"#U4T")--Sj$!M*!")3+1J6c!!r)6)Xb@ %F&0K0+Srq$HYJ$p!$[4UeULJ"J*NSqJ!Z(A%D3205,95LUkLSB2Ui!h!!Za*(m) $D*EKJdRi#"`2m*X)8)VL036!#)!%0%bTU!@`!V#Lri"GFikbS[rSUZ)2b$J$DHK 3N!!LQAY13NS!&+3+J$q3!%p%)bb!4k@00Ja&(J)("c3+KT+k0JQB!I#!4BS1B+3 6`2"'I$i#(HQ#mj'H@Y&H0`U"C+2JJ$lK!'dmLXJhUSebSc3T#!51pU2Sk)+M[@! TB%#j),%p#`Q!,c![A&Bm+5Z+!N3i)-"mB`F8*!H!eJB-,%-B!")3")"r3ei3)!4 3RA4%KC*N(J!N3!#!P9DP3J!a3*8L!8*!@LS0#!*"!$c!#!d"p)#h%8haSTF%p'! ,9!qqJ+84LrSCc!!qN8Pm!9)!&C!!",J"h!5Z04$X0h3QEc4&)(R@"#&!Da@Qae- M5JmF!HJ!!-!)0!a+`#3JIB!!8i!6!!R!Mfp,K8)2a!,,3"N!ql3#!5QKd$J%T#( !'`3UhJhiK1%JQA)JRLP"Y9He!A0S$k(!"C9X(re`#!#QV"FH!*Q+6D&$`F-E#3! N!!"!$!3$))!3%*DLTF3!-$$q#32!!$83"+#PD@Ndd$!L!,d#r@#F+Le2JK[kb&3 3GF"h5Tbf51G!HU%#!!"UJ!$!`MNpl5N4F#+eS#*FI!S)l!+'3(`D#2`+4BehqL5 !TiA41B!$0%a*9-SM"1`F0J$p#35-Ip)()"!-2&YS+3``!$LScpBmG2k0Ir48FRU K,UKTU4"J!L3I!!!Hm!"3!i*!0!!)c"'``#$3"K!!N!$!)#!&"!"43&m+$r#RD&C jqJ@3!+%hM6G3a$N"dF"jfU5*#5$!FN)!-!(3J)l+Sh*U3dpe"LIH%#h!%R"*m** Q!$m!2ri$DN'8HX8Y3JF&Bf3)(&Tb`"J3"Z54Dk,TF!N923`!-AP%R"*T95-$m%@ K%`!X80#FCa$!"-"[N!!!N!$!ISUPkRje`*ED6B`"EpHCP+55UCG3NhT*9+P[#lf @qfQTA1SB!!F-P1l5h)F!X*T5`#+J"(!!9LTqX`MNIJZIRLS(R"5*%dkNq,b*F4U CDUE@LadAP!V`F3"D"QF5TlUTC`$Ia43"I&9AR$UReUQ@QZV@6EJ"I1T+JD5qD8- 'U"US1UR6T30J!F3NMB`b*`!)!4Z!PX%'k!2+UMY`T@)!G`+akCYbUEMUSNT'(+Z R`![`*23K6m+JpL5J@ES!!D!,I!"2`JR!A`%!)F%!G+lL!1HUE23N#!'T`+[6VFi )")!bJ!8m!9a#GeS([!$(DTbjR+JJJ056i%8q#4T!+X!'j(rk+VmU"*`"fLS!)!B Z*ejN`&U)T!,idm%!$#5Xr@U3!1U`mS"5!*1hKLj28i#INJVB!JeVR%8!U!(h+X, k!G!2r'V$bT!!%!!N3-2UXA)!$5X'3+pkU`)*[3SB,J)Z+le+!mLXp#V*p#6BV1& Uc&TNdUXFJ)kUL'#X,U[-QJT!!JdVrH-m2!&-DhJ+Y#**ZN!UJ)eYUcB3q%@eVUb 'D#JaG8iG`%"VUL9*!+!!"I!+-3!bJ2B#DqJ$!B#Ejic`$f2Vb@@fHKX53!bJ2k5 B&J!S8!%i!A#V'"!q2(@K"#`JGI32GkYkSEF#QaD!LU-"J!+B%"$`DLJP,5JS!)% J!%0!C3S#L!$YJpSk&B)#$3$JfXq%$l"'+1%-(+l131+DYqkY9)6MUZ*X!%+!pX) "+&Z[%!63YLUL6bHLB$Mb$kIVe*'kZUDV+q2UZRSJX+[X#JV!2GISl@Uc2Tf&"40 aNa@ZKbXXS,SZVRbVkaVKc+i%!J"3VJJNY5Y1!3Ui!0'V`3#iiMlr+5c`H%+M[KJ 6i3C%VEX$'23%m+kSkr6+ZMDZ(SJ'B,Bf$l1VF#'3!&a,e5KaSiMX$T2C%f!`S+l MUjH9XjUZm5[`5VffV[8V+*!!!)b[$N$2DKG5!2FUrG$%H5#$K9f)!k5X&ZX9SE# H!KTV(c+#p!$j+YMDXSDRjqV!5N@%$pK!+R!%A+eTb,eDYITr!Q[$DJ'N!Nl@Nm$ N"3"Hk`bl,B%#C#K&i+`Z*rk0h!S-b,!QV&d6RSD`#fXU!-YX5kB!%XZbfMA,b4p eY3B!AN$0'Mk%D89Q`eSK,!6U!2Y+DD*dmbUPU3C!!9rV&+Za@V%kE2K3m!bYi80 %em8q#9h"!05`fJ$234M,Y9+D,N$$5Z*4QLB!'SZaVV(D6a[,42a@3qZjqXB#!&2 DNp$(2JPiV&@Jali,2B3l)-AZUh&(H0T$X!+S!*'Tb6)4e8iDLmNZV#9V$`%*S!) ffj-3Ccd&(#bGJ,%+!5H!aJU`0U`5!#V3#N!!"`-Ji-SQX4+Xmj!!#X3#[DclqXS bV+TX$m%$T!+A3#RlCE@b&bX[DlAUX1HU(!X!M"e-"*+`#[La2B31F-N5T`6!QVN mL3")!!4J5RN!%N!%)!%!!a$!Vi-26!+J53*JH2aD5X%ri!2P2JF&"+"(r+Id!cF VV$aF8@K#!3&8TM"UfU82B*hF,2f!%mep&q3Ep,5KPi*"(&(,lJ$ZL+p`Te+%h83 AY`D)!@m!)A+YQU&4UarEX)+VD!5jfL@HUd+Ve#A5&PK2JJq3!!T-!0MX'4(!PV" 6E00Ub2i$0%!U)-dk2c6D*A[#mNBkE#U3!!')X6qF6TZarUZ&V(U4#V!!+ZX8#mZ @V"TVa*S+H!#i,"+JbcDc-Hd55m3@Y4K!+P!#[,,CkVDUX3jU%LX(N!!+V!!`VBh +*B!#6)!,X0E&!898!K!$8!SJ!2e`5YJ$S!$0DLRiB[U!5r3S4!SdCJS6!-!!Z'J !!!)K!*!!3#6`-m!#JN!CB!')!&&!#)!-#,BL!#!J"%3!pUJ!S!S8Sb"!LCS+8,* e!#J`"RLR0qS(%!Ti!#i!)J#irJ1XJ!K`Shi"S-$+QYH+!USYPa!+`"'QE9jV#F5 fV1d)F0Sb!U#!E*IA(M99,"b!!5bXU"krYip+!)*9e%!M+PY5"!DJY&iJ3LS-!$K C#K$)&i$'1J(33**&!(J#bj!!6'!TL#P2!#J3!#LYhLejN345!HmVKS(!qUk,U`* J1X3!S)1hS3%XVYl'l%S!"(+8V"HJfPD`d3$mbYkbVKJ!I0Yd&5*QUh[,!G#h!JN SF0pD#SQ$IQ[G[Up$c8"!pDbhiJ5#'q"D#SrVJZZ`bJqU,AV,Sm)!!d("P0Hk945 Z-l#i8L)",ZL3!)BmVS#FTH!!q%-LJ1c+iBi'%+jr@q%1'HpYI&Z)J!)Y,UJ)ieD Q(-$Y'YFkZ&a!M@Zk[JJ`!!b`8$LX5X$Ik3LS!8S"+8!(k!-5!*!!35c3!IK!'%! 3J!"Q!"B`"3J"@UlLSmm*0S1-Ye8P""RN"8%5'i@jJTGlmRFU!Qi!%A"%T6!#J#Y !,lddG1Fr)$J8(edZRC%&2!&V`r**"*`+FS-*F!%i-LNV$X#-q!3JlMm!"0"+UB" T-`3J!0$!)12B#J#+J"$`jTS!N!##)Q!#6!&`3$V!!+`#8i#J'cUB!Ga!P9Z$[VP (K*B,!,J$!`!qJ1Q+#8l!**!!+U#Z3`$FZMGBZ34!VXZ!KJ"*J(T"ZG+[8B1b0EN '!4US0"!-4!(+!$la+c!!9!m@mJ9iZ0!!IXZ-e!j(lMQ3!15UZJL!UfX*l,92EV$ cjVi"dJ!`-)N#0i-,aSB+P,T5!06!"!)$hmfX+b0!!NdZTQX'-#+G,LJ`!P3*)3# PS!Kd$+KV$0"eTVM""SXEJPb[(%M!-9-C2[`U"6"flJ21cNHS!23PS"dr838)!0) ((1!*J!%DJ--V!%3#cJi"i2&#!KG-QBX!6,bV#V%!"h`#[B)5J1HT&+0%!+$biJ- "lhFVhNi"%3i')0k#ZfU!"@"Z5&RTK9r,$8!!!8N#i!0F!N5[`fS%f'*e!!%![Jk Q"3$iqJ6!%%k[%!$eZJ"#`04,"kLf%X!(B$#m!!Q!Vb0pR!)AP`!`#MKCqkJ[CU2 LXNQJ6k"X641N!!$J!kaedB"UbrBUI`3!+%"p#!#NJ!!`pr+SGLm3k2B1!($[!2$ heVeI`0hVpK)!F#m"F2J'[Qe[hPYPm,d'`11Eq!UqH5mAaIG5!*D[iT[hRL0m,`2 3q@+qS#[Ff`!F[MDZLHZDkVbP*G8P2jbh23-d%!8%!p-%&"!-T,k*+`L`Z$B2'-$ D'J*%!3d6jFS#a+i!!'2jkq5pHbmS-!$JYe6QN!!4iqiP-kl5bQIdYbAZL@XkJ!) 4!(lliKj%-Lk4fc03[q*%`)[MBJ#*kq`U!@Lr-blTGk4@[q-[+)!"D,m`V[Db@hL rkfriqpm#Q`%ZMXX#*+iZ!#K!"1#h$DjU+f-J[Tk[+)#h#3#Q`!(`q!UTb'F+S`# `!k"!#C!!BV`"M``8)!*8X6)!*R!"ab1LcB1,h3ip--!'c(9ZYJ,T!a`"6m!Q!!N !"@"H8X3LSJ@i!4V!&"!%Y!%6Lc8P!%!$(JJ#8#RJ%P!!%%!0!!2IU``-"U!$ckj !3Z0LY`i`"#`""jJS!!I#BdN4"!#M3-,*`'d!"U!hU")iX1pQ32J$26!d!!`)`HS !m@[A6,[T,ELl"XaQ!`%NF2D#Xb!ZY8$fcJ)A@IHhfRkp#3!Sm"IFYIPXG1X4J,1 Q`3!`!5`!)j6804"!!1)!%'"if#E&V3bJVY#jVX!-F(Ii!kZ+Ch430&eR3-U6!qm VMM#HX+UB`6#!)aaX#!#2`J)J!UJ"*)!RR)C3(ab!%$#q#!#5F"U#!,J"-kNRl#j 3(`D!*baT(D[M#`(!!!bS)p3,i!BS!"$!f2N###i6J+9`!*M"$J!#-+!5!++`i$! "!"8h"!1!"r`!!DNM)!BB!-p`X('#rTdHJ02j$f`"-N#)m1"F!FP!A4S%c!""!*2 lGdB#D`!')!%m[)(`!m!!+#LrMKJ)+A!$%d#%dkde!+f2!0!md(kFU$h3"K!"UM# S'!i$!$`!F9X1[be23!b!"mb&TS2d)!Vm5#4!$"$K2&X@J!&FbS8!%Bi@)(@&!(c !mTN%,!%YU*J`%EX'#JX9!5SUVAS!#*!!"+Lf4Di2`![S#6cUcNN"$!!$#8A*jF8 )5P9Q-``Z9E"J0jMC'&8q99!m96f%3R%%!&9K$1X%#2!2)U-bB'ULI!!$!3G-jAf PE,T!!K$he"aQ`0ki*C!!9Th9Cc9Z%#'MPI[4@CP@,)8Z8#Jp$eYAei8!Y!(5!') P$TLFH1SKm%"fJ'@5QkEi!+V&d!4JH)J4L4Ghm3U[+Ml!MfH$R4G+!3F+"4#L!)" BTJ13!'!"!#dJU!%!NJ"Y16e-!B!@0-&mM#TaK2VJ"L!!0J![J#G-PJ6!$G"e(DY 6!0VQIDN#hb`6X)kYBac1p`BB[`%d32da'b1em)J!B"BR$f*a!&*l9+#jm@j-"U` !+i8-+!4-!Fd),"!DMmB%3D@4$c+F')-ZF"chKF[%E+`8'!+fmDVb"JL&`6&Ra4[ ,(ViapT4%#MpkdkT52*4@,mfcN!!&1!1#KhRX(AY@+`AN3)+dalVaHraCbFGHEhI mIYc(HL*p,"cIab0)#$!G5a-%!@JX'QpR#NSQT"d,L02$E#`$q-If-AJXQ@"2mj0 q("E(aaR9Nj!!#JM)b,%DXKaAD,L!JL`!U"[CmBKF)E[(ql'%,)"J6b*MK``!1!) I-ZLL2Xl'&Pq$V"dRZ4EbGk`8""-VFLNhp8$)k(&D$!$`!J-b0K8MqiHc-3a3)Vm "+!#3!(`KlmMKX@""(lGLD09ar%6%b!6!KebVqUDEa0*jB+K#A0jHh+X#'F&%p9" [X&D(3c5`hK%"eJ$M!"E$(K,bpA6!e)9+J#dJjC9"YK8DF$L"(Yc%5A&UmX8q9(% 5!)J#H`p30JV%%61Cp'-%C&-jQJ%`3#%#LidC9R%fbN1CjH%%d!1@aaG!!14KJV) SS+4aLHp)!$!+Y&N86kF-r`M+DJiBTJYm!HB!)E@c5DZ0d5DaB9"8"SCH['f3!-P %KjQ-d[c#1N)d`!R-#*QVQb`Faaj3FJ1&2BN!8i#RB*BTblYBh1%N!!rH&dAh#"" 0Q189G33JEhqEbJF6S4!Ua'ieAEK,%i#5Z[d"'Ek$(C!!flc*C!#a6%2)b5Q,AQD Q(!*hDBbc+qpZ6d%2JJ2XBVNbdA"+q"%NA@XQ!33"5*-R31Sa)PP(`Bae,"8!-lG %kM@-"V2"$)dL%E5(*b$p%!'lkIUS84%%!8!TX(ip!q,!ArAc@&eA9"&!,dA-$"L 9l(h*!Y")'c9!$$m$P2)4$#ahdA++F41@c'2GM'"F@4j'J*Ia$d!V1YEJ-4Al'@Q ApXM`kAVHXJke*Q*8-%@$i3--")"!STK3)+Z,8Vrd"Z!$R`-cS!!d'(K9&`#3!-P 99X$@r!aF!3$C!2!-B!&HFaB!N!#G$XB!3!B&2!2(J%5QN5&@`J"L43cJ9FR!mI! -+!-,-pD"GGM0XN$Hh$"M(3"C!f#5i9@a31Q3!*3j!Bq%8ND993C3!LMX*+E*Y-# -%!480a66Q%Jrb&#%+4h!krPk50p"L`(%5qi6k%!'##p%%aU!-Sh1)ph`Se)*2p, $UBamI93jQG!%2V3#!S!XJ!)-,Jc!KF2PTXR1J13mQB8*UM-J*3"CA6['4e9mb-j 86bX3!+J$8030NCC0Bam9lU!,"!(b+&QQ1L04Vh-dB(2*cKC2lG`m%`#k-r3F$6L 93B!'`$Ji+K-YeTJj0j!!@d6D)6#'bjT4$cJc#!!pT3#J$PbIeTUFp`J)$*2NA#F 0-(P"J$BEJYe1FJ#eE(RFEep3($Pj%%h#SbD8-![-d42$V$FAc2b'4BC!19!hJ+I J"!3!KX!$l6G2d&L(-'F)Y#'$JjcJjj!!!@`HT*!!20[2*m!AJ)AUcrcc+$RH`FA 8,"#!#eaM-`0CQbMBcbM!M8V+@3"5CB`(&h0D3!$`)brC!I55P!MJR!#-J$N5+!% !LX#qe#rp5pBDd-bcf9DI"a1`mhc,m&8"@F)i$Y+!$d41L!Z%C"mK!&L$,S#+4Jr B#TSH-+!e#&k(Jc53!'AT!Mr!`B50E5iH3#T`c0i!98-pN!!+*!&DJ`B!5,!#%!N '8$93J,m!hH!2-*9[#9&9!k3#0`!$X'UGd@D!%U!X#!!+`"qY09J!Pr3#S%Q($4, !*6f#!0*K3kKB62!!V2!Rh4"HdJq!+PddR0)#3!1J5P-IpF)T(3$B!kSd*fe,h`1 UG#KY5r-$UV3T,4!3SUSdcc"-l`1ZG0@3!!r-dRb$,KD@i!fU9&U&0dJ!HJ2IJ2( q$AL$!J#Xi!d'!23X$4J"-i)2)!cN)CY,4-F$%!&5J"8J"D3#63#K09*`'#T&%h" Je!'GFbJaHD9*6!@+i5PS!deD+N!,,"5AK""3""b"mm)d)!&i9$+JY6ElJ!"YDLY J8%mDG9MM`55#'[f000344TUP4NZF-0NpRdA3&aJ5Pd150#!2'!i(R6i38Y-$HX- +%25*e,-%2Q"jJ!"%3"kQ2I%qH9Rme(B5%YS#hN!-A"!Pe#0`3U93+e3,T6!3!f` 9!%"Y"#Y1F5[`$0!!kKa1,5I3!0Z#'!"GCJSrkl0`!X3p#R83m8mS6+CImQ%b%`" a)aMd#%JII)$$GU`D!6CHlb&HAY4[b"A&Fp$-Xc0B24$`)$IH!J4hZ!#ii"A9!C5 -2[0Al6N"!1T$2E(Ib!-fRQbk!!J1&H,-XCq4%l)SR$(Il@Fk`M6J6ePGQiX0J!U B&SV)"q!$&$@,R58K$d6@0q`[KmYZeJ*B*Dd%%!&RJ"&3L0%"6H*S+!33!5B8#J8 2Z!!IJ$IJ8$X!Uh9Vc608@Sh5)L%'Z!1jYCUj@pF"[I8R-!BS&(SA!K"A5GDq3fQ Y"-5![`S4!$hj+Up%@Ke9q5Uh%5%!9eXmFM9J,8hS*aq9YML26-9aG9LYS&%[f2@ i5J8iSdH!"D-2h&qA4*`J@Bpf)S$K&cTS!rBe!8!0M(CbK(eG!#!$A`$J9`"%0$F %-c",m&c63&a,1bX$LC`rB(LS$f)%!N!,F"F(`"[%#KM'34i!)!Km)!+!*N"T"!# m3!#3!+"+!1V&3HF2e'CY3)+0Jb!+Y$2'!`!JDMI%cc-mVpM$QcaJ!J`Z#`#-636 P2Yk'APBAAJ(FJ&La)9NH@)!V)'4l$N$&-l"(TYMqL8Z8#X`#1N-rP#J%!-Y8FT8 T-(8TYS)0#ZGH4*TqC9Ab!',&!I#1cGL@K1k+!1J"0lDe"Q-I!,*-#c!0F!#3!)" $VB*-@Mme2!!VF!Pi44RJRMb$&c8JP*A0#%j!Pd-J(`#ZJ(b0iYe+CM3!!'5TIeF 8%q!0d$)(J#5`!U6B(-!dF$LJ$T'ef&4Qlp$DJ1@4"2J"0H)Ji`CNfM3fl5`0+!( H05eb!&6CV1'QRGeJ!fPfMMdh(J$qSDIJ$B`,&epYh*GK6b#!%SAR4CD0@@!ab23 *IAA0V![B!h4!(R*aL"C,*aN8cQ2+b,3Sdfq'SkQaLZYS(3,U-Bm2B"J!c3-m +-#*6")9+-b!TYPT'AY!#Q00PH6R"a43J5VF!+&([DbY3eb3-dd$Fi@Bh"48!8I% 26!-De4)`$4J!,3!HN!!!f!0j`[%`!!J#MZh!c8(YMPPfU5d!L!2TQ6N3!N`GkX$ !6Eh8fkR!)&"$c"2BA2JM%)T-"Fm9j3'JKjD%1@"j8!'aBD)!!'J#PNF(-%J9-&b 8Ec42R0aZJ""Q5@41P40j)3D@fI+'3CeDVpLT`!G`@2LDVVB"B!I%fM"f!H!0p)d 2#1-a0SN))B"%!alb)ic(KLc4k()mYfB+JI$F)4365*!!l'4C0LS3"q`Up!"@H1S LelmJjX4iC0T6YMb`@GXr6aHXmYP"*aE!D#F"M(B1`'LhS,'R[8G9BfP-!lEF!+! C0Y`hpj5Y$cah"F$$p6UVf)@hmU`2F"H"!#C(N!$%V&F8&Z!'L"8$pV[aCXICJ,H Si&2,eRIf"j!!Cq-rC,ICc36kfFc+&E8%#!1dM$iMAjF-#qUU@#VH6!DGQ`d#U)U XSL*`-r8NY)G`D$15R6MMi+%(0&$D"!BeRKNHY(IIK5cqhVNL"B"mm!(FBKYJI&F q(+2iF!0S3J'!(h"pfcN'"Ib9KN`Hm29d'6U%9*3fi&ekGpf[4+CGDG4NkJ#TcE[ 3cYV!FdF!k!#'GSreA5VDJ%#hm%`N8@2Ga9h26GN[plZJ-k!L#R9G#!&3'`2iL5+ D""3N03q`STAEViDB%*Hd"q3!L0YMPp[C($B`C@X"S`)pHh)je*!!!C4J)f3hl4q "$1VK(ZQD'J+#f`Pa#l69(TJ#T3-#)&RV!9Z#Qid"H"YTTlFaHJ3!d`!*d$!)!,L T2p#$@aV5J$e!8(m"dd$&+IciQMDi$832)0fMh!F89bRCDB9NR3V)!Vj%Hd$@Z0N N!!iqLe4)6)!1N!"3c!K-!#2#CqYP&)pSJS'6,!-"$Sj%'J#6pTX0H!rG'QF6ML3 a!P"i-V+Ud!-Y3)U0!EK%+rD0bB9liFU)+c"5,QTAe!BJ$@m*cK"k4!m%&K`Sr$@ 3!%JK[)YG#!hN$,e25@SA'J2NY&#F[6C98Y8#K43A#qM",NJ)'S0&PI,8%4BK@q! RD&4j$`L!)HJT8!1Kfib`",!939mH*3k-J'C$&e"c-'QQ@VLp"D,LH1!`hJADfQF !cl&9ch*@P9*XLJ[&%!"3050F!$S!*+d%&!(+#-"NEU!@")%i-+kJblfa953%X"i 4mVr4KQ0$8JSi[P,mE[I!(I*&$3rRm9QF(Xm)5%#MpJMX5eaAf58+h!e&Z$,5%X2 &&-dC6S0N0!$j"#)La!S&ZAp6N!$VL9Bh3B$M*14"Gq03K"[N%MPA'5#ASeJP)Vi +BL'0Z%[8KUJ!j!3YRViU!BS!p835PKV84Q!@"9b!"d8Ui)[2iV@i,P!"B!1YH&! -#"V&ia41(SdIJch9%$8-&J[1H#S`$-,L1(P%+*4E9D@i8(k04bIDpEJ0$%$J!pB f[P-`IL*9%Ik0rmIJX6K1MUI)j[Lr3DDNieJjGUNPR5I[12&J2-MMc3-DJ`eSAIR i@c`4ji&*H!m"!MLMc%@L33pi!pP(c5-0$*9[(`ePDMDU5QV+BN4TR-k2mj!!Kd1 M0S#0qAM-e+*65f98jb'!BFLYFSX#H440$KLQ!8@e,2"DMJ#Z-L1%Tb)#Q`4GpU@ 5P@XLr)`C-6j1kENm,+m8ZF!d-!9')`C!,V!1b$l[FVa-ME"@pN9,@Qr)"%)8)iY M@p&#Fmkc4FX"l$1Df$8G!220h3"iMk)pGCh0*C!!!iJ!#d9[1`#TKbPGDHA8J2F Bi+3&!2)M(2!T)J"cGq('A3`!qK#'IB-T"HiYLN$61&NYJ!`i)e!"dZQ+qZJa%9S !Y(*GSa+kJ,kK)a!!ZJ-63A4*%e0DHikI9`%q`(l196%4H"MdL&lMje4!JEkL#Uj -K!G`AY&VVqm4$!dX!P5!&2#%,3&6`"!J"6`"BH*NP+65i`LPLQ%,KB03J!N3i8! #$PGfc!D)-V(2TVJbXiDhSbP`1i-!ZA-k9j9DPTMPl8C#3+fGjKb!LCX!BS4SX`# B!Ec!SAT&'!+)eKC4"S`H)!CbL%rVA(0Sir"[TbCJ`'PRTBZ(Uk,TSJJNFY0C"(' Kd!&EHJBb"m`5bN"Jb2%*(A1F0-!2R0EL@iUYBd8[*BVJJJd!!6T!aQ'a5!1M4"% 3TerTmiL-"!3),YV!i#+R``"VD*FqSQcT2)$daJdBkPGk!6!UHZPEZJq3!0Ki!d$ !f%83b$YPYDCH#)4Z2-"!8!Mi!Jp&kqJ$@",13$i1"AL3!(i!&'!BmYZZ`@)S$IJ $6-M&rBA-!6[!%6#Vl`"'!,pYT3X!!e[N-!TiAJ3!r%#XLa+H&`Q!5b6VPd4,A6A d!UR!,T!!#L`"F%!'F#km"0EM*""Fk)MP"HfX"V"9!S!J8+fI#p&iYVkYqiJlp,I H8SAVa"%1FU(-!ARj2h#6J8P%3")`"8!"E)-@S(K5&rcELr!"B!#b'qdf@0i3+N! IJ5FS!pp@CN3!J!1Q`0&eA33!p8#%,3p`&a[!'k31Q1H)-3#J!i3Z!J!E-!!B!qi -!L!0$!#1`%HB`*hXi!$+VV+Rl#clbXkaHq`JZc13!-#4l"mK!k"irMS8J%UqS#q LFb'"h"a-2B6F#q#MP0-lY'A"Sq-pIFNKZ)@PVa#!-%"29L!hK,BBYJ!"%6B9`&d S!'m3N4TH!(RRZHRJY4X#'e)!)!4-(JjEf'iZMqf-J-e1%!`8-d)0i!jd-$K(-QM "6#`fi&KXpp`3HkKlVJ[F!(T!(1%Q)bjLa!&!$m#chF8JFl%A@c[!XG@e#bRLBB@ b8d8"5Y4TG[Q&f53CEklC$$)jR0`1h)5$%%$268hAJ!QeRZLjR`&0F)T09ANJE%! UF!XNbdTf5)jJYL3d3%Lq95$RL"8e--RB!IqJU"ep&#ae1`jS4#5#-L#2A(ZJH$6 $Vdd!U!2"pQ-fb!$[8pYi65AV!ZQ!l(G(kqdb3!Nqb4$N`E[[VQS$8J+kD%B#K0Q JX0a1AL`DhE[bh,-[-rZ([#d',$2EU2KZ!%JJhEY-EMi6b!E!11'qJiIPqqR5E)I )b,J-3%k)!cf&5Uj%c3#RT3'!#3J4JcR-,+j1iGB!,@-!r)4*YM@`c0J"DVX"!!Z $#6$!e'if#!00BU*4C@6`VB-BB3"J!Ga&X%9H3!%BHiT!L9")4S!"3(DjNZllcjU rb`(0pN2L[RGRqA[c4lrE&qjlhSkI*aDBpbJKYpXJ!P$m$J5J!1T$"[mA%b6H3!Q [2a3!eN!+Va5Xm%fSM+!Lj1i&`#0@[KF!lBY%3dL,l`8!+E#ck`*4!,BXdAblB,` M--C23*Kh#!I'5fcaZa4!$Q$HDJ!@,`D-mHNMjNd&+2&81d(#"(!A&5*"3J4)m9S 5llZ)cP-%5CiPEbp8NrFLbM!3*226e#j'&!!8!(GaVK%NHX[@IKLR##B!3J`!D!& e$3!!$`!!q)##8YF%!2[D#2@K8Qm*UK4`bQX"TdX!8-f*l`6!@f-$DLYrLJX`J(Y 9Y$``d!aU+`2!BMQ!6jVSj`#1mFMY#VN-Q%B[R!p+p`)-b`P@J&3ERp!3I5!-,`A 5l6,JllB2h#&M["*!`FS@F(%kpKch9$Zd&)"A@3(bpk-KYlmKmAX5%+$BJ%m)-X+ 'J225J1%bc[q"jEcAM-k2FJ-i39J!U!!$H2*F!)MKSB-[*QmV!Fh0Qcl%Mr&2J16 A(S5MjqHadKl%G`@!$0$FF"rbYKE3h0M[8Q"lJ(38mATl$d#qZqIbpSI1clF('!m bATJp!rjA9HUi5`j+e'i"E!-@b[ZSJPM&G`5!-0$FZ)[Lq`#!dTA[@)*B-3#3!!( 4"`KJE6aaY$0K(F5*'P"%4(qj'll30D%!"cMe8dPli!,8hiMfrEeS9a#P4P0LJM[ I8rXC!!2`e`"!Zd"e+5-m!(rYkUMeLS"p$@+VpH3!Ibd!H!#6T58JGI"[(h3f%(R 4!bq',Q!1,$J&$L!!BDmU[!$K,VbX+V)!X@9XCGL-Z`"2-dMZhjGB)3$B9jCl95m !'!*1B,YLIE`"`*!!1Nj'p)#T!")B"!k"FiKRhiBHJ9a#%JJ,,)&QJ$!!1U`e"m" #-QA,!R&%NhD9[mIU-JJ`H'!"K(M"FN5#h+#KZZD"E)TX)6p#JMcG3EI6EGa(h35 "XcS&N!#jQq+J0J%Fpp-pZ8Te6rI-I3!J$C`TpBGcL!Jd)mC!lKj#0S-'H5U!c5p U)`K!e4b,pd"X3,JTL9Bh52bq!a!$ID%I%0rVl6U!*Y!AXJ(L[@IPhQ0$4(`PU,I [!)K!GbIJiqFj!)&()0F-iMd,d!b',#l%PNY0&CNfi((L-L[`dR)c-MM)lG@+)LL !Z"!Y5qrH`P!mbf-cD1(E)aJq,3-!3!06[91M&"J$jE*UASiVi"1bi'#A9JqLhfD rdVIdMRd!%2r0p1H*mPl@hrCF1BhI)`-hTVe8r,b2!bD!DV8V+`1l)b(R!K3!9m! KX*9h9VRpENq)X`!hb"@P!d5!dhd&8(9Epi)MGJqYb!b&A0JbiA$ApLV`E$EJ!(l 'rUD"qaF"C4Y`2f`4))D"M8r(5jC%0,$-al21!!LHqk4V+&F5$Ji!!YIH2"#U+bM -3,RG!aJ"SJ31`!0i'mL!Sdm%A")k`,LY$*6E)+lZiHJE%1NEPL!&d2Er`$`J"NJ !FJ!A31V2!f@!!L!(D!'V[XVEqVT%6B)FX!HXq[Q((1!(V2TP!$@4b(NCbcJ@d'" $!!%&)5i(i!!'!!p!V`(K"(F2IPS,$J!!bJ)!12XhARV4"LJScMjc%F!A!d+l1f* *c!2-"`r!rRMA[D8qF!BFL)T)k[3XV+%S`VC4kL-M*d!EBNM2)K$!,S)!!#11M"r 3!9a3IX!(B"Vi!Gq2NpEq3!!(!1%H#$4T3X!aI1-p'UMeFae"5'K%J*%b*%%$B65 dfkej!$3JY`B!U*Q(#,GI!(MlT6lcX32)!bK#ElRkMGA3&F'r'6-$+%+M--J`+Dr ed+AaFlPl!a%39J9pr%6#$e$M!kqebGrID2`)32B8PcKTIi$'rb0YJR(*i%!C1QQ +H,I@'!*#4`TUJ3RGH0,I0L9fG@Xr%Z!Bp8rPIm10K`PKi`U&%5"3-pf8KkG"'4* F0[rH%%(i!fIURfejF3"dY6+#!fMmH,8"S2&h!EE(G2fV'!$3Nr3N!ZMpKeGlcJ9 -fB+!C(r!#cqF@'`e@CENAc6&cpN6r-L)DmF#1$3SJ%1$!DJcU1SX3J%J)`d!SD$ 1j0eI1%%&m22lrVi"S1p2%hl!J0#Y$3#U@G,"$0LQdG8r%!e39l+rGE@*E&H`3*r [b`J!,BXP`3aFF-b!h4`'H!!`J,GK"NM`U`S%S2&Mr*P-YkCQ@[`YU1#JmAF!1dI 3,UN6e9@,bUmU*ifKGJ"!Ic6qBA4Dj5N`!B+&dHmhD2``3"QJqMHKBS$0UMaci-! c`@mfM1$c`,5pi2X#!S$c$r,2rRfql5m00#1C$cE11akAPI$q6rY(!ae!3(+$[P6 Z2[pIq`FN6m!Q)T',!`6r6m1`D#,l2qdI$A3!X-!Sm[m6"#R2fZr#k!!%[kcL!5! MTT48Y+RB!T[+U4+-U!+JbjZ1M(XDf,JrK4i52hhebmc9LkXU[Md3I6cccd!@)-e 6aEK3%5(0!`1I"'1Q@CV`+ljLRlKRf*6)32*X29[F91c2rpIq!FNIX)Q!,T9'l-r reri"LD6erbX&P)$eVh*lp6,bK%rmp08[-eF[VN)VcmM$I`C3#E%rrerl"b3hk%[ Pl[2rYAp!mJ4X)KSrT@T+%!(pP-E[**S5m4Ed6rfE%N0!`"%%m"Yp2ZdI$A3!c-2 rAbS6r)5lLT(bprQdIc6Jrm-"(8$Z,rZ2!E%&(&"QJYCSCJF2!1`$V8QIci[dPQa rFa604a![PEXI$8KKaACF,3UibJK!cF0$@"1-`*Uf"T3"H3"'Lf13!!'G)L39(@P fQU8-F!B6lX'@"U$B*qiC0L9#BT2B*$EUmHJkDFK8C&)pf#""S(-&RUpD!-#Mkcf !!6"162KU1PF'!!'`DK8e$4@&ENd`!QlIAGa0f%4V3"R!U2)2T8HA9rHCLldL12+ L-@efL#$ckJCAS%ZK2AJ!!Jd8(j!!@Z1'iN0f%EF+B-6'a,%#r!2LJ0BbFE3!ri! i3!3`5NUd(-"R+-qU`%qcYealaBF5,3I`'FUc,2$6l#hAAMJ`F3`!PPlI&4Nk!EJ KfEN[*BGb!*qK2+X#2mhH!Jp*9l6r0p!"k"(&Ka)Y"r!CbV-Xm02X,I#3!(4&qhm $(B!HBC+iqp09G4@3!)!1i!"aCSGBH0b9T6F'2$+*0K*j82L(dP8brT2%rTHHe&9 Xap@LJ+Z-ZR%I2PZC5%2G8$N8kC&qa'R[b'*jLj3"E!$G+3#)!HN0L-D*H#+JL(N aLQLSK4&FE!K-)e1f-S!(N!!q%3!0APE2(FqM`k8M5!1F`$3bC5X$))`Id*@)l3A !"D$L,TE3#MJ,&k2E*FQ8V3c3i%+!b(KA3bYaG"8hVT)"MF)d-Q9,!pIH0k!%M2" MY9,J#-"YI)EbV!Vm0(Y,"`!)!!(J!0c'CbM2XX"2XlGd!)!!%"!1Q)cHa*5Y#[` SHAR_EOF if test 43745 -ne "`wc -c < 'Hqx.2'`" then echo shar: error transmitting "'Hqx.2'" '(should have been 43745 characters)' fi if test -f Hqx.1 -a -f Hqx.2 -a -f Hqx.3 then echo shar: assembling "'MacLayers.Hqx'" '(131047 characters)' if test -f 'MacLayers.Hqx' then echo shar: will not over-write existing file "'MacLayers.Hqx'" else cat Hqx.1 Hqx.2 Hqx.3 >MacLayers.Hqx if test 131047 -ne "`wc -c < 'MacLayers.Hqx'`" then echo shar: error transmitting "'MacLayers.Hqx'" '(should have been 131047 characters)' else rm -f Hqx.1 Hqx.2 Hqx.3 fi fi fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 5 ---
werner@rascal.ics.utexas.edu (Werner Uhrig) (06/04/90)
[MacLayers 1.00 - part 6 of 6] --- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # # Hqx.3 # # This archive created: Thu May 31 21:58:40 1990 # By: Roger L. Long (macintosh@dhw68k.cts.com) export PATH; PATH=/bin:$PATH echo shar: extracting "'Hqx.3'" '(43640 characters)' if test -f 'Hqx.3' then echo shar: will not over-write existing file "'Hqx.3'" else cat << \SHAR_EOF > 'Hqx.3' dHdX(i&q"!bBM$E#M1Hd#L3$J68cCPke!XQ5+TFX3'3#G,N0N!(BU"+bPGDSF`'F SckV!6l1hG!$q96KJ-XS"I)Eb,![m0(Y,"q"IQ@8&`)S&mRm$(8"!SND"!l6r0r# 6a2kARY49E-I9SS#VM!$8229Hjk&&N!!"$Kr%ebPDJN28+ci81i*$e#Y1#MlMHq! clMfF"RHJ[fP(VJ(K"cF"4(C0Sk$+-T6lj)iJ+FL6Mi+Ii&"16GRN3e3m9fcDN@Y !q-&0V)"kXELF2(AS5"-DX,efIpM!1NB!L"(Tl+L021r3FD0h29#Sj$m5EPMjk&d #`+)NJ,d",*B565q5ZGhXqBBkA[AQBUqBp)J![J$Yi3(P0[LKmfdZ"NB"&#!J!q6 X0!V8iML%#ZE$8q-iU!!C5"5`*@-4$130P814(RrU'a4F03j0C5"l$842K,@Fi!U %9A,#+m$iiG3#6bXJ$AJ$MK50&IY29pA95331X"XKj45J9(XC#J!X-!(XBJX!,$! "Z&N-e!3J@"!590NV)*fMIpi!a89)8'@ZJ(51rRN$(4I)2ee99jZ!--*ZK*46J&, YCA"APYiBX1&[P@j!B#0G*H-r5Hark8PG6Jpjc9f,![D238N#%IkIjN("IIJABQA SB3D!(f3!L!%,A&3!qp3"#ea#6UNYj#IL0rS0RR"%i)Re)S&cikZ)R+PkSQ&l0D( bU$aiV!+'3kMX+3mHUS!kajQU1(%!VeQ5dXj1Hap5NY,1ZN!$e1i"!V"Ik2*T[Jr &4@0U"k3"3#5)!3XNUE*Ere$hQB[9Ya$Nj@-"VGmI!2X"!+[(Fkqp#!*Q@-X#kK) G(NJFN!#-FkDi2!!3"r#D*5RYl,6h)58TlD`,0%#jhbJ@q0J"DF!+#',N,ZI![bk lp3qAd#c"bC,T[ch[34!`@*66,-%)D%iQihT+"43#Ha6HiS%X80M![U%P3#9Xd`r `mGm,@`U[@C,5cNll#RdXa4%j%&ZB2'[hqSB3m'`j#5[dXG3C1`TpB'j6!(3"J%$ C`PB@!&d!)!#['#)qX`-'V3S"HiqkX%)I5hjl$&)!3!+(30bQ200rES#60J"-ecm 5$F!($!#[#Ae#2ei*+)TT8`"!!SH!&9!rfL563+D(SNJ#9!"f2$diKp#!09NkSd` +J"*M-CV'`X[81")9!*!!`#&J"8L-K3[H1'T26BH4aeJr5JpX%p)ZI%83M!!UN!! *i##FV*!![Z$,4K)eCcS%)%eS`2EDr@%$kaMb`3C!!U$$!h!r)4pZ!#3!1M`!kT- d"!SJN4D!hMm&&PkhckNY*bX&XA-(&3T)!8+6&-!b6BeT6LIdYh4#BFa'6ANJSh8 $"c+Ir3-EVaF!q#[NG3-(XVfq'r6CaUX"EC'm"m&e2DeBM82G`)&XVd$!I2B2E,b a4l#rBM81G3-(XVf#!I2C2l$a2M+HJLd%"@b[J-"mpJpi!TkA!2!2L!+ca"ThNQ! *$m#Tm+@FS4(%!c-&$'c!HJ4"#Nb0EYe+K3U`!r68,-%)D%l9NQBi0Hd"9AFI1XA N!E-%)i!+C!)i##F,Vbp#q)#,N@%`N!"RJ!YK2#9pEa#ar`c!!Y+m3L)!!&NC,aN 3F&4BUV+BfT[@!B[!&c%'P!&TJ*ERmSA*Yr+5LJ"X!%G!24"5,3&+b,iS"c`$-Me lHJ'!$RA0#p#$B#Qf($YJ"c#9AYB,3!9`bJN$2B!,*!cd!#U3!$$3!h!H%%!2c!e !!$d3+0)$M!$a*!ZFJDCK85-!d"NE3""3$kK3QTeQ'8CNkTSPHBi$+2D*HiEYhPS !$92VfJ,8!hbpC%82F!)FlpCF$r$e9MBp`!Nd$&Yc2F$A5eEd3%c5!Y3$p%"Qc(m R$26!R0)#e!2dJ*%eqF)"3`$cB3&dFZ`!`L-RH&NZ!#c`4R%#6+@Aj3+3!!*046e 3Hb%!eAE#3!p-@d!!28!*0"Ae!'%Y*p#)-(GdSJPm'[8!2G$I[&&D[")b)``3Cri EK3``P9k@,Xq$Y!,d!#H`BVe4#BkFi'@j!%c!QIp'GGTbJTH94[GbE3!lX)[,#9j @*8'pd!1X!&2TC3h$Ea3X)bGi@5j!Jp)'X!-GRCcJCEN!X@S,8!p!GUQJ%M)MZ!# NJ)l3$U5#5JJ8Cq%8-$"!)B@R'J,Da1G4Y28J@)SYe`lBfdS)&!F-m#$h4`$I"V3 $h,X5!X9KEVS!*3+Yf2$d!#e`"9[Cp!!Y8',f%0ql0)(NCF@dJ"b!!6"X4"VhBHq e!EeH'e!6`4!LHTG(TI-$Eb)Q*#GJ+8V"!p-#d!1mJ'b[2+2-H3A"e3V3!lc!LU8 MY!1-PCcJCE8!0J#d`SDe![3!,d$!Y3-U!&2TCE8!(-JG63mBF(+#PiAekJMY!-N N*hKC,8$MhJldXA+#Pm8#,"UTNjcJCE8!QX$rH!MScQa!%1%(f$iBJ!83N!#F!"G !eb@fjmE""92TCE%!bN![e`Dd!`b@R1"PX3#m!!r5#Y!$Y!!rXBab!Xd)ppF#e!2 b3#3L4Y'G!m!P%J"`!*S)*q+*J#,Qa5MLhQ)$!!!f!!$3j'D%!+!0T"KY#(ZB"DJ BPCL+`B9UPK)!fki,+!#m!1J#$R"L*)!FJ!'3!&J-L3+J#S!Z[I06U3E)!4J!LF@ 3!2`XZZ,@A!qFCm*F#e!2d!0(K!M3!Y!$h)!dd!V3!q$!MfTPd`0YB`Y!$e4H"S! L)eC[@hF$28!*L(%!Q3"3$cKPh(N,8!qJe*K3+d!2F!-UVf4&$l50,3!p!!l-#!D !9b9@Q`&F`0e!$e!#T9cBA!miC9Bf2G!fYJ$d!-acMD3BJF90b83i!43AjDDFTKJ IH4HJBR#KQL8eM3S[Sr*!2rAfk!-p4cdJ$j`"rTA,83r)!fH!+3!'%!1&P1@FTfS 6E`!Cm+3AE61#"0#&'6)k3MXJ#LSKYJ2Qe3V3!i,f9D3MY!0KQTcJC58-l`Bp3!j !!kd!23!15+A,%&0hP5j$6*e@bT@+!#d!2F!)60QU3#@SK-`),!!4S#1d!j!!RCc JCDd!#!"aY)b5H2i&EY@D494#'d(j8V3$p8!Gh`,8!bMeKNm24*-lAUQKqj6GqdS 2JU@`BDd!2B!*1$)k3MX`iFJ*ATB+%)3&2`N$25!%(8Gr5SV4KQ55+NBPTQ*`!+L 8HM&T@!2#,HM#iPFC5X&29Y3S"F6!h9"fNj!!qr*6-##f!2@!2*!!$3%E6%VC(9i k2JR&Ze&fLfbq"6dJRCTXJ,(LS!*3NRA&bbCBk!MYJ#A!9(TC+N!pp4BU$HfNMY! 1((bk`!63[K!!TBEZ8hEh)&J+#U!MY!0%YCcJCD8!mJ$e8RBcP9l@#Y#JY!(Y!-m R*hKC+8$mAF")df9hk(C+-(N*!'2C#Y!$Q%$'@p38#`D!81PI%(eF+KJ"TI-2*cD E#,"2(Ij!r!a6e!0U!,&I$m!$NFJ!3!c3R3,!*6)!m!+D##ILLB!LjX8SiQh!D[Z iR)#Pf(,YJ'XP*hKC+B!AN!#(*@QU8Ee"B!m!qKA4%Bd`*$l06Vmee`2`J+9"$r! #128(!!eS@L@-9MQLb3Q`!#%HPXJ*@)SYe`l!ldV)M*!!!LJ!H4Kkq#a%!-S4m0c F9#XY!$h!#l!Ep!![F!&iP`**#d!2F!,3J+B&!!`#mJBp`![i32[b!*!!mXZT'T% BCA*4!S%!,D"L,%"b!TCLbl8$BDbFi'@K!(CZca#ZfZkV5Q$6#Y!$R%$[dHC*6D[ +m#B&9'%DpS`3!FcPMi#5L9F`DFmd2F!*L$*YRY5dUJa[`J#r!Bm)!RL&'EB!b3P BLLhA$Lc5FS+AK3)`!6*'Z&SUV#VPR,blUVB#p!!VB!D!j()#PQ,,Z3-4V*cJCD% !)J#RR$$3!lL!()!HfKN3313SfA06LXJ%)!+d!24!4KF)N!!!*KFa%!M3!LU'Tb% RB#QfR$Z!`bXK-m)*%1@#f!1!p+#)63-*!$h42#rJc!!Y8eh)#PQ,,Z3--PTc JCCd!39LBJ"iq#`m!,1#-bJPB#JUJ)lJ$LEQFi'@G!#ah#d!2X!*-TCH&!R4blJ! 2`&4k@5H!)%!FI4VeJ$a`"K$eV3!p-)rCFZi!%F"8HPNRJ$lR+,3#p!!Z%&De![3 !+0$Ik!MZ!(ZZK-`)*`!6!+h!%5d!23!+K#Nk3Zh!9(TC*d"R,`I`'FScrFH$R)( N!,Y"$i!#e!Xp!!S`P9i@#[#I@aVd3)MF#Y!$Q-$)"*!!#3$e`+NP*f!TYT`lX&E *#9k@#3!2m#!Y3$e!$a`4RdBp-&)VEi"MP8%3d(jb!TCLblN$%D#Fi'@C!24pm2- T"f"b!TCLblN$Q+@Fi'@C!+U!qV!ee`2`J+9"$r!#128(!!eS@L@-9MQLb3Q`!#% HPXJ*@)SYj`l8BA+#Pa9lj'(SiE2J!)4#`$2SBJP)r0%)3b)!!!+JLjHG-0!$Z%$ #3!r-+A)#PQ,,Z30#N!#Fi'@C!$3!$p)#e!2d3'9i0p!$P-#B+bGJ+EDF1a$pb!P HPJP!!DJ2'%"!BJ"N!+"$"E$PHJT*V[0H-hYIj[9B2DA&K-jbik#%R2J[-eG2!)J #14!8J4iq#dY1Sf#N#*Z,8bC"p!eBD`#Bh1c)#9L+,HF1(&pbJTG9!S!#R(,#3!r 3!MMe"`!0D&V+N9BCZlF#p!!QN!#PZ"ce!$bJc[8J@)SYj`lJ8A+#Pe8#S!&&9`Y 3$d3%rVZFJ+9FNff!1p$fb!PHeYRhP08$(9dUU)4iFk0f'q!1Y)*+L0NAL"B`0LZ B"!G!3Qe!'3!(V!&J+Z*cHX!8pF"J#@6d)&L+#D!MZ!1`M*cJCC%!r&lU*#Gi@5B !10X'[!2fYK*Le,A+"3bEF358h6e(28!2D+*h!ce!#96ACk#R)5GJ+EEF1p#(+L& 'RE5m,bX4a(ip)!rF)JJ(h4N!L!&E&SM'LAJLS)Kj-BUN&jd*%9%2M06a44Y!$`! $IX)efAq[kjl)J*F$QA*Y!$d!$2J*ef6r[Dk$(31HrG01kJM[!,MD!1M`iLJpJ!S 3%[-#28$[YJ$e!$e3bPNDp!!K,5GJ+EEF1a#cbJPH&JR`&YV-!GJCL1*BfI3!*J# 3!!N!pF#T*5GJ+EEF1q"DbJPHeJJ!$h4hK45HfU&!3Qe!a1FR,jYb!TCLbld$2ld 5BZ3"!pfG6J%,[!QI4MdJ$m5C1X)l`!F`P9l@#%!+k!M[!%FL*hKC)m!"h`rUM[Y +#d!2i!,X"Mf!#mJ"%4!Ji!DX&fh!1d!1-*9HeJJ`PEf&da64d3V3!lM!"h3hd!1 J!!%($pME5SL4C`AdFQd!20#(+L&'hTh@!Y!$Z!"6k@@4!#1G!*!!-0!$Y!"1r3& N%hZ,9PNE[pK@eK94#'`5EN!BFIMd)&L+,3F0-C9HeJMJA3F6V3!p3!Y-'U0%#e! 2d!0K93Y3$m!$jhld!3M+'r3!,R$lD!-p#*CLbm%$+J"6k@@*!-C!(LEQ2`X+J"d 0ZS6)FJ+@BX["!c+m%K+fN3,G(4&4$p!$CN"2dJV3!jc!'4"eLJ&%4$f!"N4E!f) V3!rJ!Qq!8b`RB#Qfh+R&9(TC)S!FN!#($3(-K`+!XNS6`j4N43r%*()#PQ,,`30 h[*cJCBN!6%!H*ZBr#`U!NL40@#9b!TCLbm%$4+DFi'@*!%THQ#$Q2`X+`2FZ6B3 PFJ+@BX["!fUmR1"PL3!-3"iQjMm,TiJ9S3Y34N[k*Z(fc3(eG,-M*f!TYK`m)!6 *#9j@#,#@Mf0+5(F$8Y)!@U9iFAIm!mq!6-qHfPC#QcEa"T!!!8rkm346e!1aQCb !TGKbm%$d)bGi@5'!)b"M-"'S`0e!$j!!!T9`$l'0bJPB#S[9"X!$*+ZFi'@&!'` !Y!*-E2f`3&$J*eb6rIHk,J3!GBF$2+#"k`)+`1m5*U$L*"NU6T+KiXL!MJ!2Q0a bJTF9!Y46@cml1PE(&fd!2,")b`PH9JK!Xm8$!ES5)Y1pf&C@'*R32P4@8aL!dFT PfX3E3!BmkBG2$i+Pf(,aJ#NT*hKC!9i[e`E3!pJaHLL3!(J+--#*rc*cp35!+'$ r[00#QjH+UjB"l4)Ee)0J+ECF22#Yb`PH&JM`4Yi0p!!Ui0AJe"p!R%d23!,43#Y !$c!#M`3pB)XT#KM%A"F2d!(,k%X#2#F-p-!S"MaKRQM(`1QQA3!3J1ef#C8q,md ')-d$!q%!)K!,(!+JJlNX$M)JID"rF`#-!iM!ekD)K!#c!#$3`3J!im!pEJMB!Xk K0c!&&!*X`(FP*f!T,S#1%!p-1(+#Pr8""#J'qmPe#&5#5JJ(TmZf!I&!(5BRH&N IJ$*!(!hk*pFKN!"pS!0Ap"N883@FA@S358%ZUF4E8B-,E3$52$$J$3!#k5-E3*I )#9L+#k!Ma!-fQjcJCAd!H)!($J`F!T@J%X,"X9KY3$aJ#6#9AYB(S!834aii-(! )d*&eJ&dF8Bd"Fd!##',8K$!#`0i1e!-S!*AHNmJ*@)SY&`m)3A+#Pr@[U`q(Ub" `MY8$)ee'N`d8YljSce%2S03LB`Y3$lJ$`Y3Y)3L%9EirkDiMa!24MjcJCAN!T8F E%!rJ8A+#Pq8"5!-k3Mc3dFN*ATB(B!`34h!!(c$1ZAUkJ$pJ"iacri#8U53p!NS QAJ'-!f3#3$hJ$TJ'@h-p`(I*#9J+$r"Te!2d3(qM)mJ$%DbFi'9j!,`FJ0jce!2 Z3(qM)mJ$**1Fi'9j!',!QDmMb!2XZ4)b)l4I&Gdrd!h-#!B!)T!!-0!$f-!X%3l -#**C`N!28!-5Z#8a$8J0p)!d-%YN!c0#0jd`d!2&4`44$F`)"S!@N!!`d!2ED!Y 3$p!$@aLaPc$3!p`!369,P!-cJJ&!#53-p%#3!1dSb!PB#KZJ)mJ$GlbFi'9e!13 !p8)2N!!$6+@Ap3'NSI)!(+q%Z#"i9!Y!$l3pFS+Aj3(!!ce(28!2K-pa1ch!$56 M1S)mS-E,#9j@"d#CY`$d!2bZK-`)(S!a%)Hf!I)!+-"8HPNG`"Y*DqJh,K%iB"r 5'[U05d31r-,!KUe"$h!$1C51)!p3jR+#Pp8"D!(8#ce!$M#9ATEqU#2)!lJ!8qP PG3##93Y!$l3pFS+A*AMe(28!24!qaqhd!$H3!)cV#2+!X#FRH&NG!&[B!Y!$m,X 5-L0i!$a!(0S'b!0YMjcJCA%!lpKEf)bFf"(%-$!M&!!X3-*!$`J$Xm3a-#-8*!N $2B"da2l,3$J`9!!"p)$'`BrS#2-!HLJRH&NF!$"JT)ac%Q*,aF-'&dbPPm8"S!) k`M`!$#SK-`)(d)8YMl2%--"@mE$""92TCA%!reSE-!rJm%V)M-!"$&JZ4ceJi43 `5!#SE%QF!i&!'d!2D"aY!$d3FV3"p)!c)%,3!phJPmB2d!0cCbX3"%!"8!!63!m )!kj"Y$q3!0!$bX!Y-3KN+Ik1*6%)N!!"1AXE-!q)6A+#Pm8"a"j[B6-#6(J!ZIm r-!L3!!%8`-6K!I`$Ji#1S1JcP9i@"l!T2`*1k3m!!GJ!H%#l3%B)$XM)N4jc"#4 I!"j!#0cieX0q0Fi4QFNc$`[b$`*#`,2P*0"Xp)$TT6cRC'd!2@"kdFkDJ)i`$l! "6+@AY3'`!VbQR1"PE3#LJ)i`$r!"6+@AY3&B!Zm'28!13!1Y!$d!$N!$QYB!m!p mE8h5P+d+9)*+b)c!!C!!!MV#2+$'b`PHeJB!Z,3!p!!iB'hY,9qElM0PAlBY!$e !$Y!"Im"DqQ4qEEV2P(hC#L3I3"laEY!$h!!Gm!F`15[9ekEl60QAl3FJR`3#1X) m8"R,#9l@"M#ST8jbJTI&!HJ!1X)m)$(,#9k@"[#@U)F&$%Zd#,d2ATerB3G%9'N !S`@#r(k[ffH09LB"l3!pJ!l!&28!#Y$cb`PBLLdh$k!#6+@Aj8*bbXDE2h#iXJ( cf6qJ8&J5E%!#8Alp!aY5")&EbaDDPca`J5N+B-GF0`rB!ME3$3dm(h3Km2lk$kK ibM0XfdHi#e1f+V#H[K[d!$N!$E3#p!!im,8e591f+Y!G'J+m`+G1%#bS%B5ddkd $0$V#2*!!Nl8"mi#"h3E-!f(k&8dlRj2U`SZP)m`$2*qFi'9*S,1%9dFlL`+c""[ !9(TCdib1-!pdG(+#Pj8I#,FA$Jl3M$J!"pT*aJ"mGNZ)9!5kG(,c!+BX*hKC'3! He9*TpbH0"d!pf$p[`1VK-8UfrJB!J,Dd%reT83N,j*FI5$maI1HA(`L+%`6!![R P"p*2D!'`3(ljJ3"#E&CqqB(%K$N!,*!!A`)!SCX8N!"IlMT-N9I&&+dAEF$JcP4 k@4P!-I8@JJ&k!#0R4H%p2#c5VJRS#%mi8qPPC3#N)92TC@8!0)#13!mNjR+#Pj8 "S!!G9Mm95,+61ZAK3!r-dFFU18d2#!0Ie%Yj6El-,081V3,8G%rL@f*Pd`0VR!' !aD9A-&&%0Al%IId$Sp%1d!2jK*b!TGKbL!*6k@8PDCabHXB,#+V#3!*4I[d$(dI '!9!c!eX(,(#"+3U[a9a($m`2P+D4l5Ld!25!0!$Yaa%'"([XJ,qCrd"0BHdV+23 !Jpd'd!20,ME3Kp-$aX!r3!hdiI3!0J!rp1(d!$9`553G[)#J+J`N%1AA2i"2bKB 4"#a`J5N+%N$B33mFk&68[)Hj@8eQ4b192a4*Z*DRN!$N1ZmeXrGPASr9rNPdj#N NZFjlcHapkIIp"If`T@i4!)E4E%AKCBU)R)S"M!1S!"q4JZ2I-3UU!!'8!kJ!#A# B+JA%!#"!#!3#-BS!%!iJ!PrE*!aN#3,LZY8bS3B#-05HJ(!m@`aJS"bRKJ1)`0F f#@0E9N[F'JM!8(X#`N(6-)#&84Y3$pJ$1N)pi%h@!i['ZKj+fY*+m[#6#UL2Y[D &3dflrcRp&l8k&eC0P2h63j!!!M0#"C!!Pb,qbM03#82"4PpU4!9LB!0rkKY%TG2 N#m#N9M0lkcT#28!CY3(e`#,0Tp(1SD3Y(30m8DQ!qQKVAcLkQ2ZIdhp4Uh0Ke86 C2ch%Q#@66`b)[r)-91Cq'!DBG!Dm!@iI0Q%d)ci&T`RY"bB2+MH["&r-0eGqmS! @@cbEL*22@TN$G$&&+(##%@D5QiE3BT!!,TS"N!!"L"(Z`S+cpa3!VN%'--N6*,' 2!6!b%@6`L!'!F-)#m)J"X')YC2#)!C!!T6"3m%Jhr6IX2Gfd!C!!!BM`j%9X3mQ N#0$qhU1J(-0E"G[j!`('Qc!9d+6K!*-!T[T1dmT2HJ[KFJ,QJ$)Q9-(X$I")!H! hC!"LK,Y!!'3!Nca"%[XB!'m#33D2'!!)*b`!MaJ!+pC#"SmB!&N+!`@2G0-'3!B J`T-AX3dPNb*!qhZ2JR)-!mCqJa)`"I!613"J[+VJ!*-!TRT&0!*c!+eF%p&3FJ! N4!BFPD(%L3dM!1a6"qjS$@Rj+B),)aN,G#J9&J#Fb30&3!m`HI3J9J!riD2*meM !h#&hh09%%bC3P((3#M36i#918CKA5fTQ"-ajr330P)N#0p08KLTIC8#C8,DR)!* [dmBXqK%GRS)jX%&B99LJ#IC4"[Xq`FDmM6THFf#a`!N59%i9!dC"*99Ae!&36,R p#)!TkCKV!Jbdh4MFeiX%6VQ-aPTCfD%H!41#!,b!IS-R50(qNQcXGd@1UIIZJ#j mZ4i)(!#YP&2"2N!!,Rbj(JJF!+f88fFF`!(`JZ!#*lS%@)(b#!`)'#X#b)('"`! -$)#%X!!3i!@$&a1FY"+J#m58#"8$!)$$m-A"9J"8Z43*30P-Q(*!STVcBJ8!"+Q ZJ%a9BHL(QESJS1J*J-$3%%TD2-2aj"d!#'G)4,d(j)`(1!&q!%L&E'""130H"%# #*m!8N35N#@R"Y5S!"NcFB8$dcjd6,dlU+(S$TibE1fRFN!"jF`H!BbG@r[P$FLi #"K0ZIS)&YLS!PM-F'GeU&if,'33h!`M#mJLT"M)#9[fErFFc@&KV*,*ZJ`0L!%K )J*8$"')1!JDq*3@("QN&N!"RLPENC[*-P23!8*kC#Y,ZQD`Kk`*i!T'0[2PX)J0 )J!1#XqI65!ZiB(d6J,5K&TJ55'9K5TYRjX!K!#crQF2D'`Umd!)d!JJS9LSk+*' E('CmY'#$"$bS!aJ1+-LJEh*B!B5'%NVdKQ2#X1FH&QBijSKrcj!!Sm4rj*J"!4a T!5!(33(!T3Y$B-MK4`"f)!$#!H8!`9ddC0`#Mf0Rd("NNNZ5!F*!+`8!$#UHR3( #P%U5CL@@)%#K"!S!Z'''"'"@L3+@8KaLbb&Zi!)(!V$3q58$Ch!!9N%H)G5!-bp 33&5KU4beN91'KX!3L"4Ce!%3NJRK`Qa)Z#%CL-&C!3LJ&iSNJ"4f-4$EE2piijN 3ZG'4eejpr4AB)Q1`mFBFC5#Q''1243B!C3&JJ%*Q#"cKcMm!+-''4'FJ!!-,%J8 (4S-"Z,"5Hkadk3!5EGKM8(V+!+Q#XJ(3BBB&QfAlfEEG'T!!@VJ0X@[24bm&S-` h%c"d*c$URX%#%XZkNTSZ5VKb&d0Rk-#Y24)-r)+ep+DRLed31&6`A3%pI0I!3$+ `-!8F2d+Z('m3!-)#B*Lm!"DI%N5"U,UiG+5RS$)S+UP@8I!U)2l3)kYJE)544aP bd*%'(@b8i4J!N!$p)`YP&f#3!%3lpm!3e94R'!$(2f"`j)FI!K6CTTJQB&QLZ3K XeYPR"X3jTa[Jh*QR'eS$d(@21V6J$aUDY1%2'6cSE3BRISZ"4$%J&"!)2`!8d!1 PNaN$JJ',0rli2raNkV4C"$%J4dFGrGUY"jVc)kSH5P`ULedFQ+&e!&d$S)rQ[)J UbT!!V)h0j*@1+B&'Z5d#B)VZBcUf,jHI13B*mEaEK)*UX'L+LaPid-imPNMmlNT k`LJ"#%0QD2%R!#)J'859,m!!!G1k,-$&pBkp!!&4m"-dr`Ie[i#Qb8L'Z6Z@mNY &#-!#*"V%5@jd!X!rJ%!l*14QHkf`e`fNTaS!V'*Tcm2#q*!!NJp[J)9LVd,(2c6 a-dDi)9Gd+!-HN!!Q0+)Y$6+1SBaPK[@6Uq%JDeZl'`M!*VEq9DPX[@[9DG6@TEE *L8ja`a1GkKBlH!bTIVi$RQ1'jd-a0HpiA9*Hr@$`2%(!BPQ#S"l!!Z#+qQ@2M0c c([M%&lVbPH0mBNVIqK#L!!ENEhi9Z'1LmVFr23i31`dai#%3Q*N&MY%9$N4M"*9 a!c"@m)+1bH!'$k),I$MLJeD"`+[i!SqI0H+%G`J$'p)3KMN%E@JlBTS9BPJC#'$ Q*dqXi[pkpcYcSB&i6S+5&ZU(aFmBBBYGa)eUc!#$4*C4PXAlPIE5q,e(V)PikAZ -,[,K$0BF8)Q&p%0H%-!AR`'Q$LCmJbK*DFS@TP+9rm#(5ek*QJRXj!F4-33U$J% "UA!"!8X,L'm3%5N+L!89LJ#$!H!C!%3!9(2i3-8LB(!TI8"$8rLi!4!#S)J*TM- !MUM#)q!!JhmfiJCI#!!M3-!$aq"c4DHj3'i5%3"5#&5P!@!T+c$c$fm'jK#i-YF Eh%#(AU@6-J0`*E&d-JH#b[-32l#@!`i+8B8bp+I!N!""3j%3$"F%`"Z!d#K(23U $$`4R)r9maMhckB"pp[1I!4eS4!bUL-R*!3,3#!3*$K!19B"!!0X%aMrBmE0&R+% -G"J$'X)JKcQN33p+3fIQc['!ba!VEh[VfppJ)$K)&#iiN!"S"64%X"%i8)!6J*! !33%N8C%,8(83i@'%$`)J!`0%)3LR$BmLF"!!A16'$Qc3`!f)3#55QK3!+&8!@`, J!lL))hFPr3P`efB'"m$d$J%3"8cc%)"4J)%"c`f!+UBEJ&8`i!J!+%6*I&$53M# !#!#!`KX%J!FSq)B4`4%"F"PA##3%34MdYDm3JK"A1@!JVK)0!$%MSSKJ%)-1#B# ')!*-K[G'kJ)"&S0[&"'FFA`2%!%'!aaq)%``[-%!0kM)$f$R'c`%)l9bZ%"F,qF 2hpMKa"5&!L!Za`q3!$`-Ff$j`&Jk`"4RAFSIN!#Sb!2%XV8(CD((F)#!@+5+1@R `i4rc'(%UhMF&*D!#!))i!jZQ!!)dB"N&8%#+!!$"QT30"!9!U)mF,XB!eS!Q!'l `M5HJN4Y3R%%"2SJ)+(!3%8q!33S`-!!N0*8jB-J"!HP44BRNd#`C4%319*d@@Y) M#Km!!!3,%S%F+""AE`!""J8BY'5#FqK%,lV4Mikd!#BG39(J`#+#&M)XMX!'!rM !!*i3-UL$$)!(`)))YFC"!6!Kj"XF)3#Jf+ei32+$$"eJ)$T1a3C!`#I(%)U5!4" ')Nf45%mJC"ji#$5[ICdE9*5+$3S3Gl%RLJVIS#)iX0#X#'TpJcC!J`3"D(HSCCd E8k"leqX1J#RJ3'k"IcM%[4Bi$MU$LKcd'`!0ZNT%@!%S5[,$(TCq&X5$Ji4ML## jXa(')AT+JBLXSL!J#)!)"%"TqB,J!p)!4!k#!!!$`)!#($r'@qFU$P(X5!)4NFQ P@GjUPm0FjM3R!%0H"BprN!#MK()SJf%4Uk[&0-DRNf'XBhpL%LYMZ8*)8AQC(B- +Nh6jbe!`#4Gr3J3JP&6YD&*!fbeY%K`B!"YHTS$D$`!0,eZ!a6SJJ#D-J)-IBq) )4$!#0pM!pL0iJr&e0!)!$Z!''5$"'($)"b`-i3B9I(IbEL""ac-r0`jSR!'3!'! mRSTJ)idl)28!8-#[c8!!2F"1!%)SJ'q9Zk)c-%!*"@M@UIjaMhpi"LN!)!(bfrX )T[r$(#@d!p(dm)BhY'%1G!K$#PqibPqG!`"E0e+9VjaP&TMGbi)!mqj2ZMEIH`6 jM1JB`(k#I$mXA5m+a)FRFdTpklp"$QP`"SR4+r'c!1bdIX[9*4S!Gf`("!&@GP1 `GR,RJ"0P#Q#!!3b)!'dAB+$!J"-BB*j!8kEc6Bf3!&0Qm(pYm(m"1)#Ua%VJ4d- )m%Tf4!9VTi&!B!2%3B0aYi&!!(%JS)-!B!&d"R%59A-rZ(DF0J9&5!#[NRmPP&2 BThe%8`CMd&-%k(d2S"6@!J%U!$(X"!FH!!Z&B!BZF$%8i(k8P!#d-(B"S!"+3!K SL"!4!!jM*cY))3&k8)IZ!!FI))CQ)!0QH!Bh%MT)m3#q!#51)3e[')G*`3Ge+!a )%3&@8)HfN!#"EIGU(MKh!"!iHd-iIj-i"!!)5m-"Dd!($##+MJ&RE!!0J!!$1i! !"Z!%ql!d"J!!4-#!3RJ%VE8&35!,3-!'$U"fJZChPVB&4`!'$#3jP--i#Z!*3'! 5F""UIMGVEk!#*Z%("H!*IZF3ReF!E%!!f!J'&R"jNe-j#Z"TJEB&3$"VhhKVaXK X"p"Xd$B@'i!8rX!"50%2[("r#0"dI290L8"B*(-(+5Kp9lK1a-*Q&E*lSYKl1X# 3!!Ri'3Q#E5C3CM!!%L8'Bib3!'*a4@3!)"DIm`%"N!!+(@""ML'+RR&GNi33!-! "$#'#RQ3d5&-'C#!'E&!VD6!'Dh#&P*'&l)4mb)!I*4BFeN)&Kq"L&3B)D!)($B! 0Rq)6",!6q[%$m8J!1ECM4M92F*!!)3!!8##`N`6J1cr"'QD!"*!!a6Gq!cL#iiN 59J#NGJ#*TJ00)AN,`#R!B#eQ)!"$SKq(Fb46!!JZ9`#8*KBr8$I49Sp3544XPM' *H436S"m#C*)U`4&BX%hqq$1(N!#61h9BL39$"R'!bG@3!1e(!F2h"mDR336a,C9 %"5p*D$qM#'3!@%H60*c*I38)QKcK',eR!j!!Q4rZa"-6S*J'`bFI%Ca(!C92F5V qm!fRL46ri!IeS3UYL6NrN`LaUCPZ8*XYk(d4!!#a4#9@4#BCK%p3`LE)&%hX!`! 9q3MA0$I3N!!A!-!Aq[G0M,!Bf#N'Ed!(G'"pYZPp"b"82k%$MjDAYKG@AE#6!3! %$1!B"*!!'3'!!cpR(d%J!cX!!E'i$qYc&lB)!,)!!)B!!1M!L@MJL@6J!i,M#B8 6D'qCD#9&!1#e!2S"DP-!"-&J$)6jE!"`Q,%6SRScSQPTS[jJ"LMU$a*Q!#XD3DT 38NJ*$"BQ"`d39miBS`8`Sc9kSr-SEE&M#L*+SLTUD(#*T#8PT94USaqj)#4`T4X !"RJ!T%*D1#KkEc"`!%HUACDQ(cLbC&-D"-0`$#53!'R8%!JrX'Sj1T*T+J4EqU- RkUEf4J*a1UHUN!"a%B%(9!!%R*!!CP"CQ$*+SakAD6%hBQLk6H$`$jhd6BYJRf1 `8h!30'23QGdh)mr!"'HJ"9VeN6S#!L2'&J#3!!`[`!1#J%p,93Xlm!A2J!lSYM! bJ"$U!!ZX-DXJ+3+hLJHjZUZp#J#r'Uc$@UcG)J6)UJLX-4"LXDZ!)!"0J3Ue!!B )`"d")!NKJ!`#i'hIT!KV8!CjJ*q%43BXZ*fZ#UZbZP'd+JHffK&5J365kU[NDUh %+PcGJJA)+J2,bUr01Q)+mJa%-,$8@V$#HV!,3`E)fQB15a!m%+lM@Ui'%!,G!36 YfPIa1UrL*!H,83G@k*R!)MAYB!qc0V0`i!,@JJ#,H52VH!J)!J%c-"")!!M5JJ! 33!0#5l6!X$-ej8NTHkUa+31P0!CTN!!'2J82c2SVQJ)2U3!(!b%$2##Z`U!TrQ! &`)"H6iJ'D@!'G*!!XPDA'9HEYCV$Y9i,!'#V%Q-V'@D,YZmk"Qe!"Ql,'(#,6Yi 3Xc6dH`D$!+#"C5"!,!1K&!+J-Bhl%d+!!T&V+Ir`$FEb$q!!"MV!P,"!!DGK!F` S"CIb$4E!$DDEZA`)#kFV"U5M+Gi`ZFlb2*!!"J`&341#J,QDHbcJ`""+),VGFlT R-)kb5lYF&#fibc3`)3J-3EX4F!54bl65m$1)8*0`!)!m03IFPbU8m3%!LJ"GH"F RF`CFm,JV%,PS)J6Tq`+mk`F'B!F!d!'fJ!IJJ!IK-!9(p!Ed`!F2`!b&!!HbC`K [B#3')!F`%&F#j9Bh%&H6`VRSd!LVq`e+-)E+S$RHB*Hjfl`A3!54birim!r'B,h BUled!+dq9EMR%!$K@lj'J,k4DbhX'lQD!`iD``#LSJDm#b3%--'2HlT+B!-!!!j Q!!mBV-(-Lf8A),d[`)q!m!r@3-*LN!#pL8%(C0#pXm0BA1L&3e8[8S!(rb!%QU) 2UD%$UD%#,8!Tr#!&J##'jfB!ABJj8P!)5eTak4'jpD)#ZJ!)jdB!FF`23R!%)6B E[`%'3Y"a8r)T-h!FpD%0*F83E@!#a[BEL)`Na'%F$+!,PN8"1##Raj!!b-9a()N $#C!!F$RkS!4'F"T5F!5qF&YYB#IYdAi03dN!J!dhN!!EN!!3!*K3KlK3)URR!+c b'm%X#8*!"',m$rT`blqKbbifSlrf"LD!"-3!!J3`(+(-!%V4&&+J)`!J!4Ba9F! J#i$!"JM!Cm)maVEe'm@lH`!!##MP!8L4$0*3CMJhcG9mbB`-!DNK!`bKE*!!B&( kN!#ZdIQ9Gk%%N!"`)+K4,dV!'NV3'9"`"RSA%9!!#kk!13Jb%#F`89#3!0%"`!5 @qAbBQEePB!CT`!D-Yjd)bA8lqAZ3!2!'bUI35*%!8jbDqlb5ZP!!KQ!A'+$-ZB` *-!Q3!'H3!*p[B!BN`e-(DB$%8XF@%DR"BFHk-!!1m01"BCdlP5XRD06E54Rr1Ei -J*X+p!r!8!JT"JQ"3!-4!9r#X()XZK)3)!)&!!kK%!@"-'("%3a"N!"SPXB,ZB% (VY2+4!,4(IF#FQS-,q!ZP#3!S)"m'!#USPUGL`&+8mHUYdNX#0Kl10G[5!`AXJ! N%Y"YQGd+",$C'e8!"H&Sd4)-DZ%MdcQ#JD%)NEfID(!V9TM9ja"8,,#&1(XAAXe qAB+2Y1`$K5hBB3F2BFF!GN%"(",F"a"ffP!UHG@dl`U&9KcCrGQ6,CaF[*dm!!! ,5lS43hQA5dh*`)!Qb4%F+N!3[fN5fA-9U$!+)(%R)$QSU+!$`eGmYL&a,@ADL%" 9iUaPk0Y5!BB)51%1!Y#Yq#d+"I(IlUfD!F!#pNJ+F!!%+d)aCX#S%@%(m'B)CU! "hjdR0Z,20e!%![d5-F%D(rf28ldBrCH#,XZ6@VcE%4Nmh(hKAaAHe32H[J%Fiah HbJ%-jde8kZeP%0$Hlaf2h#b5mff5bRAI%$"aqXhIJ1$Iq-d+!Bi8l8!#"YlNfTA Jq(ebUXNdqBKj%Vif&'lK4*,K'plKKr$K[2A2)Li*d@RLlY#2HdA#El$Lp`Uc@Rc E9j(EA6e8kEh5+U$2Y1`-14iFeSc*jEhMf!!*$(!)5e-)"f)!,T!!A1(&%T[("J, !"e!`bAK`!dE3@e1`h[2c*M405Hf!"5rJ&*5N$kdB%C!!)%bB3$&XB!,Xl-lYPp! )83cS`"V+M!R#R"Y`6Z+UN!!l+fh3Cf#0+kh*E#!#m@%%,d$Dp5)$R"0fE"#G1Rh LeSX(N!#YRE60`PmijPeb)kH1%!(`)`hK'05J)XcP'-T`kbMe*5fUQk2T'jL!k2M -!+KRQV0K"P*!d"p"k1NK!hk3!&i0S3+FmcPU-9IP)!J[-!-S%$%`S3lH3c&h9Kr #8'B-%#G,1MI-X+6@SVpJ!!2f6T3!N!$Sq9c6UDR`!F$`$Jra%Jm!kU$6U5%#S)c *mV22cMhR6cbIJG%)88I88SF'Fc!'*'254rf&%)"5q8&*!m!1p5%20Jd!&#$9G@! )4Ard*dhE@mh&p%ILQK$)`Ac3$3%#P6`F$mr)*1l)"Ym'"$$*N!#!bUV-bUkX$Ff mMVMX"Q&T"'r`%G,1NM!!*"43`Fe5(l*!(r8L"(+1!+%kUS'"##4YdR!3"Rp9hE8 G[K(HHik"i"&""I[Fd!(!QSq!)+Qad!fKka%N"BK2%f%[b%pQI'6[%'H[b'T2%f` 2b@prE('IbJL`bRjY"ffJ$BZ*qKc+'RF[6#hG0VJXMSFZ(2QHmp2HclLXbdJa!"U `q(TP8i+K3NH6p@q!p#iH,1'Zq3$J#d4eprL1!MJ2-Y2qIQ[[2@a--@[!!UHi0!) 3HUcSLV!SLd[Mc4c`p3J"XC8C0m!YpJ%)3!LcbrM41'$`PlLF(B-*LJ$p16reamK LRMD`0-F0@qd$'i!3ZJ%j8)"RMJ'fM05J"T6!%@!)T1q`kB!bJrS#J1*V2RVKL@Q r0IGr4XN*5AU15pap"K'`T&!HDK"i%83'%"@EeJmFJG@MJA*JmP8qfJCqf!N+1(D 8i!c`J55$8ZJ!83Nlm)cp$Eb9&%%%3-A,'@B!BHd$ED8,ZJ%'!)%B6J3k`'m"%b6 "%p`B&[!,8Vdl8`!9PLlJ"JD#Ach!!+!'8S-3f(NB`!Pp%d3J"X+!6V+"LHAEYE" M"`R13"*FHXbP$rkQj32`S0r!@e)0N!!0"J!ma[S#Q8i$!b*JpU@p10K-k'!Ef!G U!#&`!bCJ6HJHN@J$f-$`q8%RPNkX9b(858S`%6B0Ej!!dY+'$M3$DN"!p"lLT`Z 3!)YM@"qp4`3SJICP"MK!"dJ*Q3YcJB-MPQU@PqjkAL[Y"%#"d)F8p)%N!(J'cFe 3!#8(!#B+&Z"T!B!5+$0*%!!X!8h4"YE,qjQdR@,jAP!1j"GG!JS)!&D!+Rk"CmJ "bi)5r!D!f!i&'Jk$#6,K)!B!*I!Xa0Y`-!&di$J!#A,Aj,3C9,S![1$50!lde44 N!,43$X&!R-'0*P3,!C)mY"9Q)(Jd$6[3#kXG*GN(l3E@iEYV0J51K4f!!b&!"'# $+)!--)F-`!BZFH$9[03J"HU$*J"i0I%Ih-333"ji)ZD!!H9KT3d%%*!!%A"CG!T QQ!#MD651aJ3-(df4!kqT9T3"`S))Z9Ii#eqT330B#p!("Gb-$r",,3-%4!3Q`-D FQJ$3#Rc-+M!!-r#-jQ)Q$)S*`3hPaEYJ"XT'@"J,b!!-H!#iZ!E$$X8EM([aG6` )C,"0HYl2)!3N66&B2R$AaG+$@N`@$XdYbX@1pKI,A8+J"(*`,`S"aRKTjQ*G9%h X*68@4V!`'48MD`5-"8if5NE%@"P,iZ2,M$A*%1kNXmK1f1)Cm!%Z3+*jJXl!""j GT'X$P-l5%3,"aLfJ!A#ELr9"(-K"#'!MZ)0e&!)``#a3%Rr!#4DICI`QDbiaN!! "A((52&-[()+r80ITJRYJ#``F9db,IiQMK4N5Kq")h1V3LeE[HYf+-K!d`"p+3fS ea+'G!6#J8AT-+K!$5Z!,R!%HH1&Qe%c%C+0aSU8H$N$3)-"SC!+``,)!33$3(fQ #D!1&9*!!Z@J!T-!2D%"pd!Ff$4p`!BTa")2DIQ+2[D)Ii)1HK!'i'JbUMX8PJNJ $Di%"&S32i!!,iJI8)9E!!!`'a!%!1V+!l4jaP6*!J![3N@P-4ci-(CNTqN'0)@d (%3"Sam()(4d$)M!@AY*+kNKSX!JJ`5&)BjJ$$&!"A,!"c)#C-!"RJ!$`JJP3PJ4 %RQ!$(2)!9)'iZ!"HBh8%!ZP"q%('`KJ%h%'DA!#3!)#I&)+rP!)Q#K-i%Y!J@c# "5SNG!S8Zm!I%!#b8'4&`#ii&2aJ$`b1j#)$IF!Ld!A(B3T!!S"#`X5b*$`S*%KJ )6+FIJ!2-0!INJ'!j3DN%-RK*(MQqP!+a!*,TB8L#(b1**+'"NNah!-!C0%R()+k mT*48PAE$C&a*IT!!*IR"Ap)%J%!A$#GJ0-U'8c4`"9k5Ufh*c1%'r!&"!*-dB8a 51-FJ#4UPZe56r!!D)!)6!!3Z`6%!!qpM#9J$IM!EF!&hP!*+!%mD!&lJ%`4!Ra` 3K`"3(SP"LA)@!-d3(G!!88B349NU'+8lZ*H3!&*5XM&1H5RjMUENP'%'KqQ#IZ! +4'9$-!(f%J$%JQ8`"ML"Z,`,Em!#`%9A@5l[`U`%!PkbN!!!N9cjG!CKVa3XYh! i,JdGi!3)30IS!(V1-Nb0Dp!b(i"cb!E%3!i)J"83",)"-0J!VqmDU!+`14ZZ!5X SH(D!+9B4D)!0GN3)#!51`@h3#AD!0Qr%!3!'Ki!lA!0J%!%!`8#3!*YZ`"d)!5U !0Sh%!@"M'6-(3$S!!$MK`9c)"ZrJFEU$`RNNJJ(MS!(F!4Z!J#2`*!$!"DJ)8+" aI%l`da4B"F34!P1!IG8FeAN!9'F-8*hZbbHiJ+fCSq`@l4`(GNYecJ$!D3Xf5@- EK)PK0L8'TGNdX!(8k*%j#cV+M8,J"K$@0$!")Q%!(,j(X!1+`$@!"4VP"l5!GF! %5SHSN!!("30c8!&R-[LNJJi!$D0L,M`$TJN6p%$A%!"'i'UF6```,4f$2X!FAZ" X!B!0m"ad`,QJ#Hi6!Y62!5"#q%(q4#rmFhh@6j9Jd4"!#kJ)Z3PcC-rYf6d*$EG B"diJHSS!Ji@YTJ%1L*l&m"&-81kT1Hb"U0!(%1"5f!2b"!$'jjf"!rQ"I8`!(Y# YPTi+ID%A)(ITJJQJ!VT9HlLK#J!1B!!G1J(1i%D4F%!8$Q3!)QS!'*T88!%Cie* NMMD!3H83$`"H8J%&4&(-F8%cU#k)!,L!)4b"GS""EjY&i`MKm5TXJ#h8!V+"1`J )93!!,#jc%!AN+!Hi'`MJFEi$lT!!$C6"#N!#f3!HJ-hBidBh3"X`QpQJ,25"20% XR+0Mk!GQ`!0%K@Z!#Rb2,fJ&ei!8Z)kj3%R"!"Q3!!)YJ*+ZJ#13!%PM"c1BT*8 8BEE4Gh"R$#RNc!E*!#%-J#$k"r!Q!L0Vr"0bXJGBX%V*J%"S!$T8!J#"1X3)A1N lJ+8lS!eN!f'3!!hB!5G&"Ac8M`*539S4")!E$4+ZbJ@d!3P36mcQd!S1-N!UZ!# U!JX#3GB3!)X6!2`"%+"-iB%8D!@"&!)F!P#U5d%!,i@FBX!('&0B'J!$#X+VTBH !R3E5GaT2!F%8@+94!A*ZZ2%KKh6"id3'!4!-X!BKS%bGD4Ye"e0!``%!Il$ZC-p &MD3*PC9LJ(fD$!`T)S@S#8%'804Q+MQ6k68!"pF+!VJUM08'TS('(!!KG+B'$d0 !q%"!0e8&ha3BL#')KVQb33FS![r!H'S+E-#5TLFB!!-9BA*N6,hT#NLHBl#F!!" cYJ20Q33kTa,B##l!$)#!V`S!BX!Cd!#ZbKX)SXHe%@)!S&#CFSSKD)5bHK[!USf B2iK'&`!!,c"Ajm2TN`+'3'iB!MBJ#V,!)dJ&GH$Pa*YV!!V'!!X`V)MejFJ"$a" AR!0MR4(0p!aJ!2r36$%V1fJZNY1ck&!))!VN(!B3)F$JCaJ#-J#!T-mjD4U,TE( -L*GU#UF"%SLHdj0f25id%3$1fbiY""f8#Z$@h1'iVN)f8jjiJK"d8$%`A%@'9!! "@SCE6!-mJ"!JJ%c)@B*#1Mf#&S"8qF%B[3CFB"'KJ*mD9'%"(1)!T!X!p)(d+J2 5Da+JCJJXVPL!VdN%a#B@U'Mm)+S5Lb5!$L!1+23!()!"(!$ekRZ3!-!Kk$L1&%U '`89N!#c!-C!!![M9`3*@AF"jY-&!X+cF)*QZ!b9`$G#"hZ3#Ir3D`)-93'LZ!6h 3+0cL'N#$N!$8)eV"!"!!(04jqJ%3DZ"dk!2`!eF$"ELC$L&&8b`A3!LRk2jJJ+C 60'm+VP!-F+!8q44f`#1RKZCmA'd8'C`hj#U'J"%FL!!f&JD-(3&J$+i'G1eX048 5))3(F1q8+8TP!*J!H"@#XmSY%QQddehX3BFk!(j3+YiR*)#bIA3TAB8fQJ`f`K& BGdA![*S"$(!E0*`%S+M2`)-F"IEK!*6"PY8`6d$38VX"SH&B!*jG"Vi9"S$,#YB ')!i$@*kG9J!3J!eJ29N"(j+cNQ$,[JNU)'LpJ*rN2+LTRQ3$6,X50#dJi,3FBGh KL8,3D3-!-cLeM0B,i)k'!!(ik$)B!ZfJMdi!@!#YS&@FQ"arD@jif'5V$-!MY'U cbq$0ZPJTJ)J#3+JN!S+@#VaD-q!%J#e#F!!8S!G8K!'`9blY,3d%Pm-Gl!D1S'( `K+C`"lh@#K`cakNTj-%aS`I(c"iJ&-h"9ebX%ZLf`9!+#0TJ'!%fMaNJ!qC@&c3 !AG"QQ3!J&3"l)!DF"'Gm-!P#hNkIGlYPCqflMEDF&!2"!EYcENfX1pZdamlH D!Z"U#S%,83KZp$bid"*'"J&"kaKi3C*aZ)k"&La$!1!#N!-FH%cXS`%-8fKT$5* Z!j!!!D06*Ba6CES-,Zj0BkdFYe5F!6d!FJ2!AMPQJR0V[Gar'h!(VUBSZ!0!#DK 1"$!k#`!!5!#MX`r%RY%j!`$!!KLG0!FjA!Th%#PJ`!AS33e!#CaGK''9BX#di#K rPeSjN!"HBh8(J$+`&Yr!*bb!b2YfJB30J!-0Jhd`!06iA0d-Q*d'PN"3L)j%5NF -AX)$(F2&#JJ+63!)Q`ie`%a4C`cF4#@V#-HSjXaY#)$+dJRRL3ZDUa*BFl%)*XJ !-'#HX#S08!*ee`9F!@!J!(V3@PKD2-mhAMdmd!ES!-[+!jC[!-JXcFRR'!$Z$B1 &M5DS[SD!"(k[lQfHdK8D00I+H6Q2!$hS(E+cYN)I&cXpSqlEYEm[i!*)(J@`a(k #rA8"Vd+[1,ik8!LSEf$a-V5YL2)j"1$RP)#'il&A3E$4"#d!*0L!!kDbR-GjkKr kQcX-J2(0R##JUrB1X'S+U3'LiF!ET3p&6)4&$6K!Fmd!i#8"`'##F!6B3Hb4ApG PFN%!#(X9K*!!rTS6E3!HC!$*J`!b3%SJZUqL*k+ik9Ypa8!G#"lIE[YDbH5T0E! *#qD!+*MpCPAhkaK1"Y25ISMJVp#"1d$G`Tq`b!cHP`S6%KCX"0E[!IM!@h9cGNi 3X!4%`+8X$pRJ#mG$`%+'[CfH1`!bkaT3!Dk'Hl@`9Y@FR,0hr!G[3(X'!KM3!ZD h#Xm0&Uak86!F-!"9PJ@6@a6-!@K!k"bkBC8LZSX[C`1!"&Ve#6(!4ZKIZSU2f%F #X!CPaLTaMBMc+N,9%Mi%DS"Sa!'rGF9SQrCeXL#JqhkKHZ5+1F(S*!$hYb,)AIj E%@5!h9h&GJ45EL3DN!"SiQXJ5,`0B(+%SUAa!Xq!$,J#8Fi"G)%S4`(!m4RJ!9N JbZ%!--!%TS"25!$Zf1iDXY%j"Hl#k)`"e%S+['0p,)pC!$ffaa8""Z6MI5ajaG( Ll4#dc!C!hRG-H4F!3e!TEjFJr0qe'i"rCfZc5@3J&mZ"1*!!C'HEHd53!-jL!M3 eVA8A@*)DJ!JEChPPLT+X9m@(a'N+"@%PUmcia"&*'dQHbAL!)ijLQFb54!&(A'i hQ59TN!!(B288`G5U@R0JX"5'cCK#[ClK"!F#lXZ4!(B'eJk"8k0k[G(R%H$)a`C S`&RdF`IS!+#$U)amVX3$`*YA@@G%AkdmKNSD'h$'"r),RHAKa"h@R3LB!P*J%NJ !@)"2V&jE0QRi1#iA9mX+"ALbAK8$1-J`!i"cf)-%J')f")QA!#KQ2C!!H0d5'QC *U#$a'UR,I*J6l`&3!TMdSFRL`kZHA01lQRb&CHL&JD9-($ZMAKeIiB!Xdc)2`"U -6Xa*19Rj-STKVpbD!H"VYKET3$Dc*0Vm#'`cFHKSDeNh!aDiV!J2%&kH""!!!J4 9Dm&4jSC!b!&jSJdBcRF,"Pc!j,21F-!-C1IYI!A)'KM3!("Jjp)*J@!%a[14N!! $0m!mYih3M#Z6mcH"3i!P-01f#!!"E1m1@BL(&"a!apN+$Y`!M#`#6SdI`*HGP&I V!5`S&3F%BVS"Dl"0ZNPI#32iU@LF%U*K&[9FX*JDfB!H&1)hI$P"F#*1&SG!H6+ !2mQ#"8&c45!R`Mj`#fV!#4##!3JcF%NA,-c&QeI6lS`Q"6CD"k$NIf%0G63SQ0' X`%B$NBVS!R5S!B![EB!Dd!)E[4jHmN9L(`DJHN4TAi"ar3&(G+YBQJc-k"&fdp5 "A,3)i!!)U!-'8U3032H-dXi!idU$-`d$cJ%5500VHL6ED"P3%4ICdV!,2+!%4l' E9Z`fLJ!!"MjK"T4JFB"aGpNMQ0&qiDBjJLeV4`j!&!!%1dR8eMm'jD!F5LYk44G UD5`SE#!l!J!(#!!Si'T!84%`3Cm"p(5a'L$'cZK1iQ*$U2T8!E'$%R!,EH$X$U) !f+$2!4hX+LT3",#!jq-"4B!)*!%De!*ip8LHdDCM*+L!(4#X53dd%'FkVAM09%% d8l&903Lq1*8eF!YA69QFY8TZ!p9!!SJ+#K@Xc`h#UJBZZ&Bh,1hTUKd%0dYY,PB '$0)!m!a8`2L-@&ik!BL&$r"%8d%4Z"YS95U)J$cTL+P&!R9f8X&,+i#"VE!0GZc !"ek@BGX0KrdF3!$!KJ-,J')r!a"JX4f$0IJ"2)#!GT98N!!-BSFbb,%6XP@6J1J CUbq@Yhl9iIS4U%m8N!#VGlA(pYA!HPJ0kf*pV*2eXLlACZpF9`0U,+fTpE#beYM D+Q!!EIdId!'hVYVH1NMQl((0U*TedSl*k$U$MJ4f2DcF0EHS"JT,AS[34d#[cj3 !L'riHJ$Skj6`$&$![ilB6%PNS`#$VBF()4QS!fd!$JL@-$#iQJBC!mR2F"2pJhd !&Z!N2j!!fD9$Fqb$k+N#)$FD[JN$3!8NEKq`Z"Zh'V2FA&466'iAU`*SLJNP3Am lF0Z+-c$jG"*JkFfq%"K-J!M&$K*"J8AAj$BKD)-bmklT3!#X*[`+!L$G!$JCd$8 J#)#ki((0EK`J$!#"13J%UHfTFB#cE3J#S%qq#V2l!$6[k$d!M"5kCJ3"N!!4F-6 3%3$P3F&M(4ISE%Z#!&LhJ"BHL&cX!l%aK!2bNJ2!h#KFk*S5"%!RB"kP,f`#h&j ,1,jZ&fIER()JNhfIE!&!Ji!+"+*c80@K!)!6a&Rf%3!m`2`q!Kf(&p!*#`Y-+6J $#'4PaZ`Pm!81!KUiG&CD%*`@R1h3U`X#J!Dii"PmJc-P#)i0X"pdDffT'`iiiC6 S3R$J6l$F'q-PC'kVe`Kbq1VHi@DJKl[(!c#Ld3%JN!!$$k"jFiGUS!NN`%Ai&B' !UN4[!)!'#!lHR1+X!!,!!(cb`016kC+LUK80U*!!0p$L$K)6ceQlP%lF#$q3!*d 64)j12Val`d"`)iUcU0-J2-TTJ)elj-LJ$cT!CPJ!R6X!11j@(FdXU1LQh*KTF*1 -0UlRl1&2-!&-J2J+lc+1%2j"IA`%!j-M+!%qU3j)SPE'HYCAN!!cj6&D$B6"L!C 2E&2KpJk&l5A10TI@Ue3!6$`mDI)VcRCUeDY!S&5SDLma`6Xj%Y$PGCGpr!-f--1 913hBH3MJ20k8a4#&k%#(lMkpF*JlJ%f1`T@jPQd0-+S&4!-d!"G%`'V$6&J!#NL "*1!%U%!p4QP[[)BmdF+ASrh"dK9ZiTbFJcB9`"$k1'ZV!iFJRDrcGSi&I-Uef9c A4Q1FB!&3!TmS`T!!Mri!&b!q"6(1brPd8JESA*fcFbU!AK5,iFS-pD304!-`J$Q S6CjF!8aJT#YdFdF%q+9,5!@"!,,@!4%!-9)1IYP%5%$#-3iHN!$6K3!3L$P@a4Y m!YBJdhh"*a!$kJ6EN!!"%SXj4VTTI@)$Z)LRJ6Q3!+U%KVd5*@pJFHQjS))FBdp J@fim)!M34H(D`T9!pX44"5%9(!)Hm!%-kki5ke+!#P#P9!!+6-!AH1QM)0!m0qf h@RG+IY+&h3HS3)#Z,Pb1JA!,kf1G*6eZYSh@a`)LB1YZ(E((pEPHeqrk!NJ&HGe 0clRXjpMH`"J)!biVN!$$VDdqf+e&B6rXF*fX!`"@F0Bj4bS`"*!![69)GVPq!1L kAFIVHRfchr#V4mhh%jD)`S6pUqmU)X!%RX!4B%PH`,"5TB6h$p4#+Z!$+1!,4(E LEY`Tqffrl+1!f[6YalFBV[VUlNr[mE)2!UZA#!`$'I$Z@GfRd!-Hb5hmJ4T!"9% !0)rd0i-132-ci!%Y)J#!!ac3Sc""@U)X3FUb%+RJJ#B`JEaakcNVU9!VZKlGU8d Bj"Emi(LMi!E*!&+"+F!"(d#MT)*A)+[E!$r`0QTl3a%!!8!%-TG(D$DTi"4SH!j [Xa%@2e!&02B4X014ALCU80Zj(2KJaMX%pl+$J)!Tdr%erP,JJlj$p@J-N!"h,`f &b2mGb2&8GQ48ND+5S1DLYNXM%3C!SM%kcm-T2CACmH3P3j4(CPUFbQ[0+hpT2S! +#!!mN`SF!@J!!d4b9)&+NQ$86IQ8-qD4P((Z!8'JTU"NarcQDiiNb04KRXi6(He bjr1m2H!"")!6a&`IN!#0CQkM6#FLB!QFKfi!85Jpj[J'B`c6E`Up)3C%424)*h% '`*Z"+l#1#%dEk0Tr`p12-6H!!3!m'L$eRpiIY!%'m1Ma3D6AL6V4FiPk!@miJ%( P%!#[aY8,H$(YkaQ(!*!!5iKHdGF84Zm*CQihQ!,G!#apJd`pl@Z1mq%'UR99mC3 HMNjfC'h$!$c!Y%rhiRi%#K1$r`)1hXAEJZC+i5fm$mM`KjA&AbXAMp&$2(JCm8I !a$1!ZDlLihf(j`G46'e2,M[#iaX3MKri0El(Ql)Y!&%B2M,$0*Z&)j8e)Bm%K!% X%!4p$q*V'K8$EbN&2X!4ReiII"L3!-YZpF%2@[-SQ3"!JLR`80)*M8(*JLC6Yha p`'*UrDh("MT4ZGH0Xp$F4a)IH$N9'4fm*NI)'0$liP)PrS!Am-JIf4DL!%,J"eU !AeU+T%pYh!a(!'i+832S@6KC,cmQ,fJ"51!IB))H!%Eq!5FiCU)!a@S+3l!M4&, de!%'Lc9J+hl!U0Af3(JUY-$PA)TeAh55#c*1006jQrd$BU$h2AR,mI[-5lYX"-h "!`*&"0%!(iG"*Aj9`-ES!r0Lk*SMl4`!5'!)j!X`B"aLqVk!I[h#A`*"q8Jd'`c cD`Sb%(j(3KpF!&*T!F!"JDferJ%Id"c93e2iJ963#!5[lFr@,YjRS'!GF#N)J5E 3&*rLXPF!cH%(8%%SH#T+kh#8$dPJ#B#SkC4lPU*`[4HM,I-c"mrq!%$$rpQi -8%%T1-qBL`GJ,LL!ZF4d'qJ(`9F!D!)ikDJc4G+h(ICIkDrqc-ri4B8#1'i[A9& !58`+R)2Q`!HN!T%!(,#LD3U1L$-KA,3&3`"#N!!2%!2GL[h'!*S"d%!h4!qB9[# !2`#NS8H,!BDQbZeRj)jcF0m0&dS!3U!2d!(m%VI3$b!!,L$#dJpi$2p"(H$r[A3 ah@&9"lJ!(`!FS!9J&FG08AI8i3-&$ab`!Q``M*-e-8J-!(1$1b$6mB!q)&BK"#* e"3phd!pXFc$!YGA0L9p+i#Af*mN)8J%B`,$"!)FAQ#Cq`3%65a+M5Md$%T*9!J8 FATk2'RLqk8AL#(I`$03"BT`@U+I""10AR'!(eJ%-%E4L"X30(Ccip36fJ$`!9N( 8kB"'(9*(%d")ida5*`(#BM!30l(E`5DN""YJp&Nqr0Q&p4c`G'h"%L!"5J%Zh@@ A!b*@81!25'Bm!P-J%EJ5()&UB"I)"0)*6U!1b!0k!aP4d08+2S,H!aXJ#8i6NdJ PD+(4*i1&'h!'e!&``#ES8kJ$hi[8F#`i8d6!F-%%)!4$(VqN"``!0GD[8!a%1kk "%3#K&3%-3"(31,`"jJ#5a!Ck!'(JZ&B(1(lfJNG`L6Ne'S!6i"*FB[(0L)'bQ5D TJ"p`h)`2#91H*!Fi6DY'@Y!48")C!2Kd!'KGkd(S)!H3!$B$)8+3!!&`!k9#!1J Df!QTLHDJ$L#!Yi'QS!k3!#8J`!CJ",#"'m!4m!aS'#"$jk!1TJILJ2U%#04CIJ$ )Ta%f#e[*TkF1N!!KrD"9XV'""Ip2`L-3)J8C30eb&MJ&$D%ZN!!"L!'I%*!$MFL %BT85F!"SE)GA"EF5V$`-)8qS!p4CK"BQTK(D#1lJ+-B6-J+P3NEi$kJ$,p5!F"8 U%&D*"IJ9RJC+!"'3!#HP"l--3R!2q!+Q93J6Tj%UF%"XFd)SJdf$`(81J#r(c'6 3&Ya@ma%2`#rj!GLJ([3V'(E,$5@"!Ia(2Y-4m(P`!14Ji2!-8!&KK4F`Y1"iB88 L-,5m'Q&&,""8k3%3J$)`Bh4AR@&3jDmdEq#I2K$)N!!Mb38`!&`B!YYB154(53# aB3m5%05'FT3#!!BS!(k!"L"3q!&TLPl#!CK!Ed"#'*-KKNJ""Z!#P!U"$!c!!`K N`)!4F"XfF()8"%!!2#0bP!'`'rS"$F"[k!"-#hl!!d!F'SH(SA"$59`!pJ"cH!3 iK`Y+G(JG)Q20`R@)6f30[f(&S*G%!12Kq#$FRBI%J(VS(,*Ed@%@d"9)!9e!9k! %#)KRJ"!3"A3&1X##k)eGKeI"'B!#3)KBJ3F!)8*A&!#%+#%T!"$L,e!B%BDJN!! Ii$4j!1')"J#rL#0q`!&!I2N"#!#(i!FN!0ZKEQJ!q!%SJelbHa`"aD&qL"bHKdk !IbMNV3(84Q2Q"QJ!'C-V8R2`2lr&JJ)"q!%5`'mi!B#(J`q15"lZK`M""3!"q)F %!*!!b!!)L86LTl%$()Qc5**i&IJ"&F"[D!'!KaG!IKJk8)QkJ!9!$3KcBiarSa! 188'K"F!,#(0&J*ai&La4GD)T%"%UIdM""5!)&)!c&dCS&YS$C!N@X!0mK&6!"U! Tj!22J"H`!4!"cd!L)!#d!!$!-r!-a!*+3*jBLf#+%-#Qk2[T!eN$!)!TJJ#LSUI Sqr%$GdDR1'LYLPS'@mJjd!6X%`$`!Y%%5X$lK!kiK2q!23#h"&B,B+rB"[!"m"2 M3"J@J$XL3Q!"'!!3QQ-)AM!!j1"6B3q3!(TVJ"1`*EjG"q#@'DSk""G#5N!! 2kJN!F0jB#mkB%#1Aq!$N43$!"i!"*!"j!3$d!SU4(q!&R'GqJ!q!)VS!+k)(i#+ HLEcKGcJMkSCk#3(!#"`M%)Iid!"mHVlLqH*Vc&aY!"8!2cd$cdN$J#bDK`K""D! (0)ZIa`-3,DT3%')$X!D3!!$Ai[e$@AQ*B1,5J%mX+)I@-B*R2)IC%RQa2Jb-Gi- pm(20A&m!mq9mN4S4J#``Fh%"`B!!3(1X"F&!mhB'1!(`dcc`R*!!1mFKaDJ,9!$ -SPkdbR`H%F$'f#Y5L'Z!"h!Y`KRr"FR),GBFG`&jJBbP$16&JJ)cFJ5)!1D&-#* C&!$#f!C`!8cLa*JB)J38!#Z!-B)A&)$8D!p!L")!JJ)&K)`1#K+J,CD-[mAkS!% F-rM!h3!$G&hTa0eJ!S"F!N$Lb"(i#4A!f5JqA!"USa4!*VU05!%&%-`jMFkLjf3 h3SJ9`("%$[#0MJ%hm$GZMEi+e92-a!l'3&X31`!$le[XN!#mB3!)Bf%d+M+&e)) TNr$3L8M"")!0e&Q1JIL@!G51Be@HD"-fKA**`X-RpSkZ3*dea@J!NL-F`!&8M[$ 6$r#FS'F9BE+i3a%#Ff0,mMRf)"V!'Q!#m)dJ`1Q)*#SA$J$93eld),XKH5'+J)d mJ'Xi-(U&pN"B@$[+$TM(SGKFq(lq3,2!&Z++5%%mF&a8JL'-0e#GR#Tr5bDBhU% 6mN!cf"F+3lP1I4"#$4Gf8$`J"D!CK'%f+0bT6")!-Y!p3J$NB&M""349E3%b!!L )N!#QS3#!'ZCjp)#"-V58&+@KdL)(!!%VC+q)3XU3!!4!$BN2h*!!`B%HJ!')KQN K`hCl$!5Q6!pJ"1!BS8-353$mJj,'6XK"%J(mB-cP$fU(UdC8b%'b!-eKd`Kqc$r ABS0L!TL2BH+h'!LY$`X+"C!!)VU),5*[##2qLq$K!U!Q*Sh,MFS8!C!!!h"LVkJ RkJJI38FJ4c)$G53qX#D-$dk+@Z!T43#d3+N!DML)VN9AF#Dq#3VK!b")bT'@3*e P'*d&qS`H+BF)!R8@H5J(G!L@j"IP"N5%&9j4`%%U!B6L2b!2')UIRMa!PMJ'X-# P#!$J!f+&+hN1a*+BiLmJ+UU&Rb*()&EiI[4!UBJT#J#l*%6K5cB&`D3GQ8Xq"jb LmEJ)f"-Hi623"H!#F5)6%-J3$d!%HV-6L*!!,*3qX9DF&9e*@N&3X"@qa@5#8SJ IT%iUJ!)mMH"&lQ8,m!+%aTZK#-!&!X$G-#JbJIf@'`!&a)6p9KZ!""b,fD0`Sc* "!(a!pdJ!5)hb!,A)%64(cTH$3J5!NE6)AE!kSP'Z)dH!m"3!UD3EB!9iJIQN%i# 0B)lr*!R324S!"+8k-Kc4!eFMh-)1-*5135d#c-4FXB-eJ$M5!kB8((!!T*)eBr2 &%C!!'JZ!cQK+mS`qiddC0%BjK&0MYd'1@EC!plJ!%*4I!"!`("N#AD3Ei!HJP"V +qM!1"8)F!"m`!)!"CJ#a#!D)!Ab!dq3&m!'`JaBJ""J"B-"&'5c+!a@1leFr(Sq j)k8J-kimHD5Rp!!8Gh3J`R-`pPYQJ$)N6,+9B!'1Pr!!8jhN!`!#G)813%9CEN% !U@3EB!6i!3*"2aP(RPYd&ZIiHB#3!1E!8b%23)J1J*E)*8+9*q09)!3FE!D!(Y! L#J#JS9FS$pL2H#8!`!qF,fBK@ZQ'N!!YDf%%d6#S61f!'5""#PNK6"4$RiJd54c ,SN!HI8f$1G"N(3[U3&miA,"cZJ!lJ!d-KS8KjNK*1!!pSQ3*AMJ!j'!(m"pF!Ip !1P!N230CJ!BJ&@!"jU"Rq"q%!HbJ6I"T1C+UL323&FPq3`BhB`rb!2LJ2TJcT!l Cj4f*&JL5P%3$)!q8#V")H3*)`LK"B323h1K&`K#HT%R'PIQP-0!9%J$!J)%*5!+ @5%%$S!TdK3K!JfPIFT)4TL43+N!!"F!DS!BX+!$!!+!B4#M5`)45S9`S'BS#!!" i!(B,!2$#+)4!BB3*"Y4CRiY#'"AQPh6PA3!'6*)kJVX3B&)&G+!QZG`%Q"kPAQ3 GVJ&B!)MCS%J"*+D*DD())KR+JJ)#Z*K8*Y+L%+)'35%$!!p)NS"N!S"I!PN3BC! !#8JQ#&QQ"kNA5B6j*5QJ3@S+jJ!Ub@DD!5b!SjKG2J0A!+Re$'!"Nb*hf8c'!U+ 956KHSS6U%ad!22B)[+)jB$YH#ZN!lJJ@2$$TJ%liCHS#$!!9-'KH#36!TfF1Z!% DaNc*CVB"@)#)k&`#@5a!phJ!5)hQJ)!i(+N$ek+)k4L)!e#PLVNqH)XF31lKXYN HX3-aS!I%Nik",h!0aJjfJVheI0L6!SbPU8qbL*pQqp!I5TG[&kQj)!j(JJ$IU!G `PP'P%1!d83q`JaL!"hL9)*ZP1@JT!,9)!*!!m!#B5-%#)!I8@6k!!UKYBJ$F*X5 4m##B#%'K9'Gp"AIPmh%ZT*Xfi9N!B9)5#i!-3&KUQaC!ZTNfV$`B*Vj*!A5&#k1 m#6+FPdl0!S!'!)rq3,PT&TS$U+@mU9Tk%!rRJJ9E%J"X)9+3!!j3!KcJ2c!A"JD 13!SK"l3"LB%SS3bL%pA$pi%"E#jkJ(,(!a#D+dr2ppa&Gd$5Zc!2jJLHNJ+3!"$ G+HjP@!"IrJ2jS%G`++K-#`!5S018NRL!QrN2m$AM&,45#,J%b&)%N4)Z#0U'[4% N"3#+#*Q8&DadS%dHdK!3@[6NdSN9bRiiTmUN!)bE"+CCL!I!K'+Kf)N*#*f$!%N %"l`Q`0(*f653!!20i1E5FSda``9CK`l3!"KN!D"")SFU8`)`B5+E#!!j#'8p!kl !Ul&i[J*bL6N)#d#Ga-#UNm2FR'm93T!!!*J#lZ!!8!rkR2%Pe,N0ARm-h6cS&(3 1QZHRB(EUQeB"#p"IcSD!T"@THF)!#kD&U8RkQ*j5!S!"G)@('Tj%!3#5@'EZ#3" NNS$NN!$T+5%!l!!S1A4URQ9"4DJTN!!$5ZF(j%a!!(QQ+f"R[J,0*#`31rJ#[#) j!,GB![LNdh&b-3)Z`91"Gbi[ZDGM4QMF"!+!'*!!'Q5GfCS)F-!4@M!!,"#dT!P T!hCfIpBDGZ*LCUkX-XMA3'!'L!0`!"B!#d`!h"Tqe3E8%8l59m-2j%cCdm[j!lK fe9rKk3&`!3d"Y40feJJ'31%K'E#,a0m(qK93P-rR[0PY*MbbTbk!!!J!AD&9k(5 BS%e"`S0l`P9d*)'TD6SGEJ!Tk@Z5!ff!%*!!)R+8#-(Ge$dQRTAPT8!1**99BdQ C04U*@f-YBLV8)[e!bX!e8JZI(MN3FGB)'e@0@B9DR-K-E+NHH%VQJ&re+S3`%"8 *%[QS%%30AKMBR32r#6ZK"`!!849f%q-i"Tj!`H-#ML1jJEI4`L%#m%mcX94ZDK# ('m!(j$qJ'T+S(J!!238$J%F"9[m0+I$N"!2P&%66L&Bj3T`m%#GN14'"+'$D9!m K%5"J)bJiTJf'diRQ5A(#(20lR9Ar$B,c&'Sj#mj03!$m3AU4#cK1p4XXL6[`1BJ ci-1SB!K80Zd('P!%6MQ2D#6kHdijP'MdC)N'G-&Ed,'*3MQID*F6LN)jT1Jm93L FSYLMPL0dr$GHMLX+LaBdDaEU3`#X3#+$)H#&5J#-c3$Q#1384S-a1!IBRB(GqfF %M'[#!1#cFH'LMd"dpIk"!H-D4UGAa@[U!82J5F3QCJ"Sa`CB-EqP6f&jD"fEbkj S+P)+&&GE)!8J"11!2)"QH!3lJ3ZSTI8$HS!,b!IF-2kIER89l!rRM8HDc43!'i& )LLCdS*e$0#)@D!iAM+CJ$'J1c!$[jrXT!mH0+G32c&L@f-T653)+UBPqq2i""jS #-m!1UJ0`N[RcD3d8Y9p,+X*S$Y5!6+STd+4@!3PJNkj[15NP+8M50&N#f0B2N!! #61P3#LGT'jU#Ld4kUJ'D!p*5GL)%$'CCf[UTI[m!dR*kHNT45HIjHGk$31IAF"" D"8a!YI0BkJ)%J+6T0!i5XNI%K!l!!!3!%XS'A)X'J*S!9Di2AN$bX9FpTUp'AUS 3'TmU%`&J!G#B`1FMLCDbS(3JMbN(H*QGj!$J$K#I#L'Ck5N0!!-Q(,4mmU@f3#N T!f#%*1Jr`,!m!Jk+Z1@#bJ#pPK*!NFi"IX!rS$P!RdP3E#S$"!q#!%ckQiS+NS! 5B2#m'F6!SmF0*%A-`(R`9)J$SNEK8Za"(0'!l+)jF!2(k8L3!*`ZTfAKiI82F!0 q%d9*`'`k"3!$m+%i"Z+&!F!#@$Ve49LkPT+PBHP@NRNq0G%PeD1Q-+AGU3$`R5) -(!%4i*`Q4G5!G(STJ!1L"RGkR3S!fHPiZThfTrpT24UH0JMrJ+Yd&)SAT'8"J1N !9k4PB5DIMU9P+Bj`R`S!Ef,1X$9i1!c!)3L'B"A%eb(S"4`#jSU'0`FS!4p!Xc! &BLf(eBck!E3)S&+@)P0qHM)!h#,"b4kD!Qj+,rfJ0-eHLRY!D)$TRc5BAJSb!", U"U5DEJ!Dd'TU4%)-%i!(2"Z6U@DD%'L4LLJ3J!FN!*PT*aN!E*Pe*4l`D5Q%S+Q RK1E9@43!(L!aPUCHUVI9&CU&-N$%1Ca#54C@fcQFDJhr!*b8[1'Tq4d!32,*TZ8 RP$U5ZDP-e[Vj%V5IlkFF0,@*!!A2"9+GhCpZ32jTI`i%r'G'K!AmRiG!!!S!$+! &k!&+c&'8q"@VabX1TflJ!J1I8M5B!aY!1V3&2`"#m!fN'IXHP1UYI#3rCciiG[3 $hPRBqDIq-5Q$'EA'&+RKT`c!H2`$Z9aaPFd3!(Y-*'@50JkmJ#IU)6QV*kNdJ`Y %1BX4X4!"L)-QJlFUHHJHhLTkm6S)UTl50r!qA!SKP2-4$j)UBKJkQKLF!GHFd`" 8E#)p#SR#TJ`TKS-b8MNi$T!!3bAcVp)B"@"E8!9S$V+!9XTY[(qfJ2Fd%U`CUN2 @X!0)$mm!#`#Ik"8`AR4c00!N"DN2KaT!$-J(*G!5I#6@JJ53!!U-!3&56[%&E+` R&a0dKPd&2mP(!,,5-K4BDh$jD3#Qh"kQRl#XpG$,LKE*V%%F5e)Qf+bL!MQ+IdK IB4KJ)C18!5eVdb!2K(F+hVB`FfN1$54%)C0@0+kP#kKqC@'AJMa!8rJ&k"(,LJD 3!!(Y8@6`Y)*N1+",%2[44V8Ic@9+)K5m(mrj6f`##!8F`!m3*Pe*+P#h+KQd#LS !#l#YFq[AqTVJ*jUJ%kDId%0,`rl%B5)"'mFj)+S%-N&!31-!L!!B3)cQif!!Y)F +d!"S!S'!#9!%8!EJ!1i#B)B"Z5B6m!d-!!I!4H!$B!#aJbB!V@!!')!)-1+T"!m !!S#-%3!"36J3"%J!'!!#!$FY!(P51"!)m+jd3!"JZdiHa3X&d,X+!XLV!a!1#!( ++`,![$S!`DXJS,`5Lbb*')!!&!+p4["D#'J!'-!3-!m8G#4!%R#m"KmD!,6!NKJ "Y"l%N69SCpZ!*-!ZEJ05J%1`$65*!4EFj"M)!'@!2N2PJ3)Z`-X4$33$dd!`)&" )!$Y4-S!j(+pi%J&J!M3!ei!Ni"5C!DEV!r!2"!C[D-S3$M3#i'X8i!`J-i&"6`% #S(XIJ!JJ)D%!-N!#d&-1!-f#"#!-r#9QJ$a`JFJAj)$YCJ#)!#pX)'!'k!-fj98 T!,L`6T(T!!di"M%!L*Q+,!,(N!!'i"K8!@i!KTBdJ!$l#3J3QiLF*1F*B4,N!GJ (djSqFJ!NjaaJ@"L$)-!B8!F8&[q(Z+)$c!B3J!8J!%!#X3hf)C-N$3p*)@3P$'j Z`!R""U5a!J!UX!DiC4ZD("$(KJ&cE$&Sad)!T-RC-Y))T(3!#($9*,*Gl"Gl"Va B88bZ%*d*!0S!+&&e-!D+E"K3dY!N%%!%)!#i!k$%UF*6($fCl#C,"K!!!`!!N!! %$!&2J"0!b(C[S!4fFXRH!D9XdN!'0!!$!!I`",JX)-"3!`)d!8cVrj%(i,)U`#k Eb2Ub`'`+)JF-X`-!9F$,)V2"l$+V!!`!4S!Em!D`8iC"(9!)b3%-`!!J"65bmbS fk`EJJ46!95N&8#(rKjA!"#3'8XGJQ4,p))3""+!"$!"f!"'`8j`!LH`jHkU`,#$ !1RY#c!(ZV&K&"F5cjD`Nd-G'0TJ''e$(BKTM3"hV"U5a!`!U`!5`FdA!&0!$,,5 X,"03"63"6S"&1`CmY$Z!6eA1!J-U""c`Ib5b%kd680'#!"RY4Y[43J!5`!"J$4a Cka&RmXI1XD9%'8!%L+DcJ64J$L`!!i!mN!!(3!&4J"3`"G!"G3"ZF3IJ!G%C!5! $b,&A!J"bcG+aGU`"3!!N(RMC@%3'(!"-#%d,"C3L#d"ILX34$5#!%cB(j!%-J0- %eACNa3&R3XJf+$4Y4hE6KV'#,)&%!"!!K%!feJ,i!%fYDf2HIE9d`%15",`!6`! )3$6mJiPH0KBiH%J%J#L3!)d*!B!X5lY6T(*X3*NJ`#@b*mJm4)BTYLd!"(!"%!$ %!29e0&aIFbe95b#"!'N!'3!"9!!%!$GJJ!N@T@eG@pQQYNfY2!$9LVB(Q,rbfCN d$N!"3!"!YDEYE+[D5J!&3*a+FY)"1paF@mheVaK!!B!#''$*E9RlK2@@8'ce!3) %$Ba''G$E#J(!V@b,f[T5"B!8d0d5EREXGp[ELJ(ME4elfUDf#8!")!G!Y@S!e0+ rFTKm!!`3!mJ!-`!08!2B!$F!$M"c#!&$!"&3""J"%%"ck`MNF(4XE%[HVVGEE3' !#S3!)F!38!a1$K3P&*X'T#"(3J'!#a3(f8F+!3)J!!8!-!!##%GMUlpL!"3!lij '&JG3Z(0DDVELRVMD!!L!"q!++ki#8!#)!iTXd(!'p!"B3"!`"#`"0UilN!$M8Mi mVK-3"#`"!8!"S!md!$BZ2j!!`i@aYJ+ZN!!!'!!)!"-3"'3"4B!83!4XY&$!!Q! !5!"2VY%c&U838ki(B19LZ9SZPc[PSJ"2,Q&J'$3!"S!-B-4PG9$ZJ!5,!!&RETC ,lMN!"S!5-1Gk#@+Z&!+,D!&jVK4!lM%!"X"j"m#YEVeXB6#P(M!XE6YRk*B*5d! ZK`GiZF5"J%S&"!'8VU9,!$aTG'd28!!B!0m3M5[U'J#BJ"3l"h"G!3#ZNA)B!+" !!b!!'!#L`*F3R4N!TS"pLprUYrbYIaX%!,J#,S&VSH!#ZQjqZprfYrpYJ$[JYVV [6U[,$$3!8!!KB!"mX2r!0D!%P%dPAVA,!j400%$Ca!+8654!fD3"P%d830RN!*4 0#%$Ce$K#-336&%-2c!E@!$X!lj)$m+if!1p#!r"Z6`6&q!,`VLd!leBd8)`T!1p b![!Z*3$[+J,`VL!!li)a8-c@!-@B!I!Z53I&B!(`VK-!lj+9"S!d)&"B!`+&0L" 3H!-#K6JJ8*J$!S8k)&#i!`+&$'X!f!-#K6iJ82J$B-!"%%mH!0VK!D!E(J$Ii3( 3*"i!Cq)"i"XH!2VL!5!#a,`Q3-b,Uc&a-Hr`G3$B!$([KR!!f)ZY8ma,9RjQ-Dm 6F!!F6Vk5(8!'D"pK3!*`!'J"@DmD32NB"R5!!A!!C'4'3`V5"K3!"`!ES!DN[3A -!5!(U,KQE4j`pI)"+Li[KJ!F!)6!(+!BL!&44aL`"PbpMJ"4%`C8X@H!efX*S!& h`"2J@XN"G3$GF!#!!UMCdC!!"hLp1d(MqrK'[QD[,,"#A,KP`)Ga!1J#432S+rU 1,Ir($VIh+J0bE"@5"a3'9bmed2S@JhX[0p$kXR%maGjV$V5q@frfFIA#!kd[6m% 'A,hiJ"`Ef9#j!)!F@q)5!!J!!S!(#%I-V`-J"d#r#%#FfX5Z!Fb["L!(A,r-,`M !XL#$c5pQ)2K'(GCA(N$P`J##()el!*3cFQ`6Uj03Z8#!(#XF8EP)J0'cUXJ"rb! #!!8N3D8)mfX&j'5Pb2S,"MJ"2i#!Z`4)!8+!!P#Al,%Q$Di`bG%"%%!)X!$`!&, !i6X&%!&2J+0EbikaC3#QdFXqXf+959Xd&"8'`!,J"FJ(Ij!!be)#Q`(b34"Jc*E !EN!,E-`@!!Z!(8!!Z!"#3")3!bm!AD8,%!6S`2,X!L!)6!&%3bCB*Tbd"e"q)YQ U#3%)"kcDSJ!,J#G!"!-JSX59J!42GDLY'`!#e!'i3PQE"ibieL`GS-Ej+pP,9MI pYJ%4m!,J36Uk4%"V4GBD!CUX,D[)rKr&34&F"B[!%,!%X!#S!h#!bc)&5h+pl1E ld&i!#i#AjJF6$4)ZBI%"d`&pF#*lf2iIG35kF!M,!BQ`('!!-!!LJ"'3!08#XTH `#T!!8q!"1`8Kf`&S!AfX)+IJCLHUE363!F!"aQ`[+eB4!9-GN!!i"E4ZCB!#d!% )!Jf!D*ZGd!%S3!V3!%!!'8!(i!Jd!#2!#!!#B-"AJ"03h!8"bTS6F!5B28r!&*! !baN"53!68!4!!-i3+N!-'m0$J2A4"K"ZC%!,!!88`@q!P5"TJJ#rlK-3ec8!$%! (B!`d!BB3&9Yb9VDf-$8!$im"BN$*ZFa5-ad!1$!%5!&$3!0`!(3!jS#%Z`E-!B! ENpX"Z!0"3a5LNi!!28$+d3%XZ3p!"m!24#&&!c))#%I%EB(9b!jl!!k!!@EkZLb pm#pm!3"Bfc",f`33!H*`PTX%2!'h5$SFeb9V$8!&4`28a"k!$C!!FRJ!1-"1V!0 da$`!#`!"M!!HJ!q3!"*6!9,!A6-&'!&C,N[l"$3"8)!e6+cG)P0!&6!%9,4,F4A Jd@3"[h!%i!')!FA`-I`%*-2,X)!E%qGbRUd(N!$)$J(f49)m"""V4QfCd"42!88 !+qX%%!'r-!AJ!6!#42$1#XDfE[%+(9!%2!&83!m3!rc#')!(i0L'a8p!&C!!bcd "[i5b0J9)HP-!&1$M&J%3lLmm!AJ![)"jKhd%[Qf!"k`*A`%!5!Ua!&"@8LcAHkT %[R4!$e$"F3-03!,J!F`Z!$!G-!8m!8K!!p!!H!$S!'jE*NJ"48!,i1-Z!Eq`"1! "f!05J0&M*5!"V"8l0G9p``GB!r!!I!!+!'4V*Ic$3m!,`"B[!99a%p!!1!!I`!* #&pr&ah!9N!"f$-Hr-!4JjJ'fGI#+Dmd'X(*X!e!!I!!m!$VmicB!"-!(J$U9!5[ Z!H"9J!"#3((hikBF(`!8)""r!2p1J2`%$-J"`!HJ"4JY%m!(F,k8)XYYG5[GQJ' $-4A`(IH!*5d9NSjk#4Rb,e`"I!"2R&BEcUS3ePFBF#9FYVVa"f!*q-EUA(#-(M- !(`!TB"m[!H&XL!`-I`#b3"fX')5c*m3+`H'#aJI3NGX!,!!I`+m&J,3"C8"(eJ[ l9",!"`!88FJGEJFF%Hp`Yh&ZM#5c!aeCK4`40mMiJ'Em!F")5r*)XmNqb3MYP`` #1!#rX-i%!Ac$q,!qr!8cVA!!(I!&ImCM%A3%!U!!CX!Fi1BqY!X)$!!Rbm00E'A E%'FI$h&1m4$m`M"!2iYBN!!-E5eLmC!!!-D!4BCF"bHb-B$jd59AbCIbK4`L'`P q`'-Mq*E%%)!-!!)J!LPaPNXUr$Y&J"2!bPB"l9b@Qkb9a`2G-j`*"`(5X-h6"-$ %4F!2NK4hY%ba&2!,c`!J!#m3&V2&Gmd4d#Y6`pD`Vk`8"mXQ34&!"9!"l0`4`'8 N!Eq%UU`1FaP33*Bl"53"d[![c#("!bNaF)`8C`%r5",3"!c'MM'A8DaGaFND64` !K!"X-[8C!N!!c@qqV#r[bb#!Y[c[Q-Y5!,UF!)3!,-"LF#20!5Aa`'`$q-C',R' mfSB!3%"LF)+Xb+jE)T[fKViZbd15aSB!rqpa#`+F!%2!#6!(qb[B-6Y9$TF"[c# %k`E3XAq&KE`GGmFb,RAE!XLi(R2$("Z(!*!!!-0X*!r-VQ[0E#3c!#%!+@$H89m RFaY3%MX!)B!X)!)@$84cE')dqm)H8JJJ$$3!4X!QflJS`E&*dT!!3PJ*+!!4!-" ebEfX'q!,!mhN30B-@(6!Mr"EB3'%!2*!5S`-+m02!$1-$[p"-c%4%!,m`LD!#+! !K-@4AKR3*"r$JSZY!-M5*#"!eC`df$a2!"4!,EHbJk86N!!C(bdLJ!`3&Pm"3F" $@Ldr*-abVp`%A,N!FUr-cV'b8,&8h#[I0EF)+bX&5!(Qm95F'H[')J$4BpjpGLX cJC3`L`"f!"j3+`a)*E%#)!*iS[m(N!"i1q-+#)!)`!MXYKqYVq3DL`#@`)FV!Q! #a$0#h!BFcl8Z*N`+f!(MK,fL*V`"T()*)!,)!T0cjH`%A-iK''3JeL8"YmJp,!6 )bB@c1V`jDmK$X8i8&U-!9J#(*YVeX[k+&N!d$$9Z@3a`05HbMr)E!$9h!#)!2a! @[mePm5r,1IH)ZGaR#3*B!H-cAJ`"G!!MJ!B3&Yr$9!$48-9@`6'!#k!rB`(3mUi Xi2l#'F!)J!0-d)E3qGc%lX2[&3IG&([34F![,%&,!56d''"#%aCIF"+3!%*hd,a bAM`#Z!%$G"#`kDE28J"PR!4S!Eeb4,cDMJ"jE9KXe!,%3,33684$a$l98+`*T-6 XR$GS%Jc44A6+-3+`!MUd+p"$rp$HB""p46r44R3&-!)3!q8bAMB%00&MG"BGRBd !fJ!9l34BdGmb'He6P3!M!$Z3!#TM!9Ia&2!Y@`'pXMAX$&-"aa`lja4,ZNr!TD6 T"J'k-3NJ!4c,`,%2V3j$d3R!9'Cq8!&C3,F-4EFmQUXm5`+`!'%a1mG!6l5h51C F*+r,EI3[r!+)(Q'a+@hNSY*)-D`m"2M3Xr)j[$PM!HVb4YY'Sm-Hc9K-%cm!*!! Hd%TA`keb%)"+4m3L3(4'!L!#)N"+R$RAd9RdAD3*%-F+!!RJ#B6&a9Uhr"CrZ#5 !AD%JrlK6!$Y-!Y!#SS5Y-!DFSD6b"%!##!2PY'GhKMiNBTJG)$'r!HSa#F!0K-8 )G,rF)eB"'*a*B"PIaBhc!Te)El5pmXT"![!$cE4R@`)!!!1dH6c4cY,%@Z&-6*r 5,63`A!*J!-IbAC02Lh9`X83Y5"[6,E3$8!*)cXD`5TX-Jp43p!NJ!*3!3X!*8"b A!%C!S1[KRU'e,%dL8QX"*XJQ1dqRdb@!f$X2RG1E,$`0@&$$el2`9J,i!Hdd8!h (AJNZ#e&pJKJ!*B!N!,[fVXd[!A!#-!"PamaX9CZX(V"9hHTj`!(!#H!"k!!)J-M -a,kaR1`%F!+S!"*ZpG%&9p"#XZ&F"Z!X,X!$F!,i!(ha&'$dT!&eXQ',rriIK1` *d0%#&RSe!0*AVl+-FpUm!*`!J)Zm3Uq`,),FBTeN1GBV5mX#!G-!*`!IJ#XR(NM !%D!&m0'VK)*i"@5j@3!9!$'2!#5!&e!#V!!SJ&fR!U3!I8"M[!FN!3Bb%k!%4(S k!"r!!p5U6B!2N!!!l""'bap`![!#T33CB!DJ!9ZAl5brL!&a`"e!013"G-"pQpr D!$9!$j!!!p`!,8"[d!@`F9X!Apd!Z,dR`"U`!h!"$SiEd!Di!,qeZC+iVYH*U`[ 3!C`h+`!(X!(S'!6"!)!11JBp3,(,kpi!!)"rZc4%C`"fJ#eJ"pJ&3!!3XPQ(!K3 fh!&m!"BL#X!$%'[''UV'""MB+!!TE%jN2532$1!!m-PL@'Bd-5[@+!"ZF@%E24N f!S!#1#q"$'"K"A`r`KX+`!M)e5aYi'Xdl"6pmPrp9JJ,S-!jkbH2XDY+'#YMcmm "U5REbD)!ZX#I((A-!64efYaL-`0'YPL98pJ"hipI66+m&4%!#J!1'0P54j*YBhY )+)!md!4-GBkXpbYeX('q8JHF'(#iK!95bakFSI*X#N!"(,9T0M)SCZrBCACeHmh 1!Gq`5F-!T!!``"!3jCB"1VCF(CfP!$k!RcdJ+E*@Xj)G!D3!8!!43##GcBMf%jX f*`!TJ"J!B`HqUUd&N!!#X!'&pIG6fF,BjfaN@`4Xf4"!#N!)`0LNmFCDBdrC!8! +B!QNabN!*S"UPmBGm+JpCHrCUJ#Z8!E)`N1eHM%(2!!T!#kJDar%TfeIE!6ifJe !#S!-*%dd0DBpD&X$c,E9E'clfT3fX6*L)c!)3!T38+T(Q'bQQJ)mEMc&E-,*4J! UJ!%`"B3"dSF8kpN"EQ6[L$X(k!!0J!U`@D(E(A!+)55A%MV!!e#kpFP44a2,*0I 8`kd+B!2)e"h`U3)(I-&"YLdV[)d,6IDP$'9AYNTfMq3&k0KNGSmY8`2CF6!R+`' S!,DcM&e`%`B)GmDYfR)KM%!hI(!2PKS`('c+-J!UJ#GJFRr"drDYX(#c!Lrh)Ka TSmeEGJ@J!J!$0AGLd!MIh&)fB,ea@`1'0Ui3D#ID0VB$S!+S!pq2P8"6rmlDV3U J$i!53$I8[GUZ!(,(SqhK0Ye!GpV-!+`!NZh*(A22!ChX#Z!#B0P)0Y)pC5X!cN% 9B(4,(B+f"S$536C+klckEY[F[Lb6V-cQ!3[!#L$fRRG(GX9G"[6GGX!4!&MSf%' !IP*Bp0e$m1%YG56HeYH[[3)i!SQ`-8L680`m0XUm!RJ#UAB+JAQAf9D6h+J"DpP 6YYA%#d3f0,AK,4K$aJl!#X!-K,iTNE4G+82'-1d+`!edf*ZX53[3UYl(YX`G!D` !m%$8SA[6e'0h*mX##!$l#Ha0I2ID[MF,-(##`-G`,!b0'%*P3)16!V!`&!!,`!) !5iM3G9Y+)!hXE,m-'5m!@#6h(Ai2aJ4ZpZd%*%hGGp)%F"[I`G%K&(jMfZ)hJ9X "X!"f30+8#iRCJ'b52G3m!#a!r'(#Q!52GK8LfM%!,!!RX2p@-5$!&F"Yh`%*!!Z J#MMDf!PRFJ#`!,4!%L$+FLB+!![!#cMDD$9RJJ#`!-J!&5"ZZlATUc4JclS"q#` )S-qQXrdX1`[32J([l%#EC'6IlX!,cXrkXqdX$5l3aV-A3!ZJ!2MCI29ME5AF!E4 f92X'f#4-DbIE!SJ!Li("R3Fm*,!`9AFV3!(@&dcE!Y!!Lm(NNm8q*0CXP`%1*`h b,0Jh"*!!YdS`r8h8@"mXl5LK`eA@"@i,%*XJ@Gph'6$AfL5H(C!!+26dVae!#m! )I0PHE$KVp,d!SJ64N!$)"YkCp`,3!UJ#UMILVAM2!BUi,G!A1q+4YaBZ$!$LB6E 4G`FBIBUi0G#)2pk2Z#)Z$NcLS(JPANqi!b%JIX,,aY2cG#GV,A$"C#h,kK`(iXB J%kF"q0"4!!aJ"F3!6B"Rk`+)!%2!'0Y[*l)1q+j!brE&(c,CE3'i!$U!&P"p--P @3M&ZG4$JIM'p@Z#k!!pTVY#!2q!Q3IDK'03V*S&EZibc!8k!0Lk0Bl,1Z29"1%m "EQd%i!)S!V#i[b+,Jl2'S#[Z#F6MU'd+%4V6ifI!!q!#b!+-J#l3#&3L2@*9c"C Ac8`!FqX##!2fl"hJ"JM1ka%mL`jl,@14[i)%6#'VV3[!$BLYC1Y$`SrRidfi1bi 2i12c1*JpVhB%k3!,Xb+T!k01iSSU5!#SJJDJ[klAU)+qq!,!!f$!#`"6#Q5TL!C 3!J3"0B$9NTY`"1V!*m!4T!0'qH6a#YJY'`!Ui)D-)R)[!$!"Z&CQ%BP%"3!J6-$ 5i!SB!F#aj+%51&4hF9DHL%$65i-h-!48!8EYdU!10!(la6DM%YJ$kl)6%%I9a!j !DJGq"!#fJ,*'"@6PkBXi30f"&a-!!5!2)0C1310`id)"Ub`9N!"5UJ#VV"-`!R! %"S!0m#e(J""(,,)%X-AE6-dK"hL$lGcE050bjKhGbNXADlNFJFc,bJUi6B(2ba( -"Zbe5iiX1!Be`(Vpa,cQ!%!GX&i(!Ucj55+EjqB!!"+l0+!+Y2NXN!#i0MLmH6! `R,qlVhN!N!!!*+i#3,UER*FN5d-!8!r-"XKB!)#2c@d"J$e!RA-%T+Zq"JN)!!V !GLi!,#Mk'M%3!"3Ir`!b*J$F!NbjJ)$)THFKCL#NVi%#!8#lLi`0!0LA[XB,#!! 3`(Bq!*!!!dcjla$#`1F%`"2!P'-#irPfAJ#8!dajmES2E1F(`"l!P--$!S!&#jm I!-3!8di'"!$j`(D1!$3!GSX'3!d)!!f!Kbi2-1A-3!"`2m(R#F!e%+,6!Y9#EYk -$1GjhQZq!%JHd6QPB+0h6UP)#j!!Qc-!#&JUmZfqjJb!-$#F``#jH31Ja%ER-8# 56JS-jcY!EZi!m'DTb,ElQMX!3fad,J2NjJ$iF$i$F1PA4R6HlElQeZ&`AJ2NjK# !&M#Ff`"SZLB`R0m!D,Si-*cM!,Pj"%!#$1GRl'XH!BJ#`hN1N!#E5`$L5R6H!rc TM@PdcVQpjK*!,TL+@)q[q36`T%IR,d"Z2J'B!m1j%*!!Qe-!"9ed2J6NjKA!R4k GClZ133@J$3cRPm)r-'8U!!dS4e#M6jN@dh#ZSdqC4Qb22K[!kLL-N!!qUpm&dX# 4IU[(fm0jNfkU!`!0!#d!TGrU$N"(9k86kq$!F,kPrqS2J+A$%AcTc$SZ-*b2k9- Q)@ZQhqS3J"U`TQ2VUX#EMUfIk0%jRIkV4`"81NH3!+G2Q6PMRhkV5`$HM+#qVJm Z9pqkcJ`-jickP$N"#1Z3!2UY2J&i#p'jTIkD8`""1NH`UErQ&8#j(J#!kJ"!"D! 1$1G9`+eZ!B`#`hPNm+YI!,&$+S*86HbK`(#HldhX!(Td2JAFkKK!#M#FBjHr1JE !#!cRB9r*cUqR)K6[Vmi"I)R4ZFAlQRX!PX"`RJ6FkKr!FKkGAlZ[H3L!LU3L5d" Z(J)Bjp%j%b#dZd[4q4(jUiX!lX"`$JANjLL!8*k+2!&31k8HR8F"YhS+8!%-je, !VDi#@!2$149`Ukm!d`$$lV!V!K&lEYjr4HFAZf0`!5!#'V[D[J`-jarlDii"C#L T#-RZ''!!96P(d!6NjKK!KKkGTqalHcF`R,IXMJ%()&r%l,Qj"b"h4HFhqmc1SiY b3RXA-*`(l6fl*c#F'qdp1i1HY1IQ)J!ei,4$lD&6G%ke[qBS3$)`R'2YU$[M%*e hlDqj#Y!,K1fjq3UJ9dAR[F#YhJ+N!X-j[rZDZ`#BBR6q#q6Q,N!X-*cV&Drj#a# E4qI"3'lq!Z3#`lN`N!#E(il(qDd1!a$YU3KblKM-!*[!F$kG[qBd3&+H[HIQ03$ %RVLUlZN&!&!$(!2VY65!aUV[km"kVESV!+'6$E#8,`e@L0i"!1J!BJ(q6J$FkMT !-C!!Z0)""m#Y(J58lIMl"R#V*`(T&#+D!0cU83$-lKM3!4h!VEi&e&(i1`0`UjF "Mm!!$`,FkR-!G$l"PqLr1L#!1q([)F#Y(JPX!1YeIl8BlHp$`(VYGId$kd-Sd-% cjqql+T!!",$AYrSX-!R)m!!!#M!1i3+d1E9N+UBF)N!)X&kRX[Tc1T3$V0I)@!f 3!()i!lkjBj!!!0c$6-#&IF8E3PNm+M%(E2&M3"I2SB(aBRaK33$!`iR"!&"B$`$ llaY`!2cN0B!1I$3!`EF!!!: SHAR_EOF if test 43640 -ne "`wc -c < 'Hqx.3'`" then echo shar: error transmitting "'Hqx.3'" '(should have been 43640 characters)' fi if test -f Hqx.1 -a -f Hqx.2 -a -f Hqx.3 then echo shar: assembling "'MacLayers.Hqx'" '(131047 characters)' if test -f 'MacLayers.Hqx' then echo shar: will not over-write existing file "'MacLayers.Hqx'" else cat Hqx.1 Hqx.2 Hqx.3 >MacLayers.Hqx if test 131047 -ne "`wc -c < 'MacLayers.Hqx'`" then echo shar: error transmitting "'MacLayers.Hqx'" '(should have been 131047 characters)' else rm -f Hqx.1 Hqx.2 Hqx.3 fi fi fi fi # end of overwriting check # End of shell archive exit 0 --- end of part 6 ---