exmh-2.8.0/000775 001047 000144 00000000000 11744621704 012772 5ustar00welchusers000000 000000 exmh-2.8.0/lib/000755 001047 000144 00000000000 11744621551 013536 5ustar00welchusers000000 000000 exmh-2.8.0/misc/000755 001047 000144 00000000000 11744612066 013724 5ustar00welchusers000000 000000 exmh-2.8.0/exmh.l000644 001047 000144 00000105413 11026416371 014105 0ustar00welchusers000000 000000 .\" .\" .\" $Header: /cvsroot/exmh/exmh/exmh.l,v 1.3 2008/06/18 09:48:18 az143 Exp $ SPRITE (Berkeley) .\" .DS .\" Begin an indented unfilled display. .\" .\" .DE .\" End of indented unfilled display. .\" .\" # DS - begin display .de DS .RS .nf .sp .. .\" # DE - end display .de DE .fi .RE .sp .5 .. .TH "EXMH TOUR" 1 "December 3, 1996" "Exmh 2.0" "INTRO TO EXMH" .SH NAME exmh \- An introduction to the exmh mail user interface. .SH INTRODUCTION .PP This man page provides a quick tour through some of the basic features of .I exmh version 2.0, which provides a graphical user interface to the MH mail system. .PP After you read this tutorial you should be able to use .I exmh for your basic daily mail reading needs. You will learn how to send mail, read mail, manage your messages in folders, and adjust some of the \fIexmh\fP features by means of its Preferences user interface. .PP There is much more documentation available on-line through HTML pages that are viewable from within exmh. In particular. \fBexmh-use\fP provides information about using the more advanced features of \fIexmh\fP. If you are already an experienced email user, you may want to just read the GETTING STARTED section here and then skip to the \fBexmh-use\fP man page. \fBexmh-custom\fP describes how to customize exmh to suit your needs. \fBexmh-ref\fP lists each button and menu entry in \fIexmh\fP and explains what they do. If you are an experienced \fIexmh\fP user, this may be the most useful man page for you. .PP A cleaned up version of these man pages appear in the 3rd edition of the book by Jerry Peek, \fIMH & xmh: email for users and programmers\fP, which is published by O'Reilly & Associates. .PP Web versions of the documentation can also be found at .PP http://www.beedub.com/exmh/ .PP .SH "GETTING STARTED" .PP If you are already an MH or \fIxmh\fP user, you can start with the examples given in this tour. If you are a new user, exmh will set up your basic MH environment. This includes a Mail directory which will have one subdirectory for each mail folder, plus several files that MH mail uses for its own purposes. You also get a ~/.mh_profile file that has user settings for MH and exmh. .PP \fIExmh\fP uses the regular MH programs to manipulate your mail folders and messages. This means it is compatible with command-line use of MH programs, and its actions should be familiar if you are an experienced MH user. If you are a new MH user, then the details of running MH programs is hidden behind the graphical interface. The MH programs used by exmh are described towards the end of this man page. .PP When you run \fIexmh\fP for the first time it checks a few things in your MH profile. In particular, it depends on the Draft-Folder and Unseen-Sequence profile components. If these profile components are not present, a dialog appears and \fIexmh\fP can set them up for you. If you do not let \fIexmh\fP create them nor set them up by hand, \fIexmh\fP will not work properly. These profile entries are described in the \fBexmh-ref\fP man page. .PP \fIExmh\fP has been designed to be very flexible, although it will work just fine "out of the box". The Preference package used to adjust some of the settings in exmh is introduced in this man page, and some of the important settings are described here. A more complete guide to customizing \fIexmh\fP is given in the \fBexmh-custom\fP man page. .SH RUNNING EXMH .PP The command to start \fIexmh\fP looks like this: .DS exmh -display \fIhostname\fP:0 & .DE If your DISPLAY environment variable is set up properly, then the -display argument is not needed, and the command is even simpler. You do not need to specify a -geometry argument, although \fIexmh\fP supports one. Instead, simply position and size the window using your window manager. When \fIexmh\fP quits, it saves the geometry information so you don't have to worry about it. It does this with all its top level windows, so you can adjust their position once and then forget about it. There are more command line options described in the \fBexmh-ref\fP man page. .PP You can add the exmh command to your startup X environment by editing your startup file (like .xsession). You might also want to add it to the main menu of your window manager. The details about this vary from X system to X system, so ask your local X guru for help. \fIExmh\fP also supports the window manager session protocol, which means that session-smart window managers will automatically start exmh for you if you quit X when \fIexmh\fP is running. .SH THE EXMH DISPLAY .PP This section describes the main parts of the \fIexmh\fP display. It probably makes sense to run exmh at this point so you can follow along. There are three sets of buttons in the interface, and three main subwindows. .PP \fBMain Buttons\fP. Along the top of the window is a set of buttons and menus that apply to \fIexmh\fP itself. Quit, for example, quits \fIexmh\fP. The Help button pops up a menu, and you can select the entries there to get more on-line information about \fIexmh\fP. Use the left mouse button to select the buttons and menus. A button will change its appearance when you press it, and it will be invoked when you release the mouse over the button. If you slide the mouse off the button before releasing it, nothing happens. .PP \fBFolder Display\fP. Below the main buttons is the folder display subwindow. It has a special button for each of your top-level folders, and these are called \fIfolder labels\fP. As a new user you will see two folder labels, one for inbox and drafts. The inbox folder is for your new messages, and the drafts folder is for messages you are writing. If you have used MH (or xmh) before, then you may have many more folders that will appear in this display. The mouse bindings for folder labels are explained in the \fBexmh-use\fP man page. The \fIColor Legend\fP from the Help menu also tells you how the folder labels respond to mouse clicks. .PP \fBFolder Cache\fP. A second folder display called the \fIfolder cache\fP may appear under the main folder display. This shows the folder labels for recently used folders. If you only have a few folders this wastes screen real estate. The PREFERENCES section near the end of this man page explains how to turn this off via the Folder Cache preferences setting. If you are a first-time exmh user, Exmh tries to guess if you need this display based on the number of folders and nested folders you have. .PP \fBFolder Buttons\fP. The middle set of buttons is for operations that apply to folders. For example, you can create a new folder with the New button here. The More... button displays a popup menu with several more operations you can apply to folders. Some of these buttons will be introduced in this man page. All of these buttons and menus are explained in detail in the \fBexmh-ref\fP man page. .PP To the left of the folder buttons, summary information about the current folder is displayed. .PP \fBTable of Contents\fP. The middle subwindow of the display shows a summary of the messages in the folder. It shows the message number, the date of the message, the subject of the message, and, space permitting, the first few words of the message. Left click on a line in the table of contents to view the corresponding message. The mouse bindings for the table of contents are described in more detail in the \fBexmh-use\fP man page. .PP MH experts: The display in this window comes from both the MH scan program or MH inc programs, so it is affected by the form specification used by these programs. .PP \fBColor and Monochrome Highlights\fP. Both the folder display and table of contents windows use highlights to give you visual clues about the state of messages and folders. Your unread messages are highlighted in the table of contents and the folders that contain unread message are highlighted in the folder display. Pull down the main Help menu and select \fIColor Legend\fP to display a key to the highlights for your display. The highlighting is covered in more detail later in the \fBexmh-use\fP man page. The \fBexmh-custom\fP man page tells how you can control the highlighting yourself. .PP \fBStatus Line\fP. Just below the table of contents is the status line. This has two parts. The left part shows the name of the folder and the message number for the current message, if any. The right part gives feedback about what \fIexmh\fP is doing. After it displays a message, the Subject component is displayed there. .PP \fBSubwindow Resize Diamond.\fP The black diamond to the right of the status line is used to change the size of the internal windows. Press the first mouse button on this target and a horizontal line appears. Drag it up and down to adjust the window sizes. Try dragging it all the way to the top and bottom of the exmh window to see how the mode changes to adjust different windows. .PP \fBMessage Buttons\fP The bottom row of buttons are for operations that apply to the current message. Several of these operations will be introduced in this man page. The right hand button labeled More... brings up a menu with several more advanced message operations. .PP \fIHint:\fP Many of these message operations have keyboard shortcuts that make it easy to use \fIexmh\fP with your hands on the keyboard. Some of the short-cuts are introduced in this man page, and all of them are listed in the \fBexmh-use\fP man page. .PP \fBMessage Display\fP. The bottom subwindow displays the current message, if any. Some of the less interesting mail headers start out scrolled off the top of this window. .SH SENDING MAIL .PP A good way to test things out is to send a message to yourself. Here are the steps you take to do that: .PP 1. Click the Send button, which is in the Message buttons in the bottom group. A new window will open that contains the template for your message. The built-in editor, which is called \fIsedit\fP, will start out with the insert cursor positioned at the end of the first empty header line. Enter your user name after the To: header. If you want to send the message to more than one person, use a comma to separate the names. .PP 2. Position the insert cursor on the next header line. You can do this a few different ways. The most direct way is to click the left mouse button where you want the cursor to be. There are keyboard shortcuts, too. If you press the editor will take you to the end of the next header line. You can also use the arrow keys or some emacs-like bindings to move the cursor. goes to the next line, moves the cursor forward a character. moves up a line, and moves back a character. The \fISimple Edit\fP menu entry shows you all the keybindings. .PP 3. The next header is the Cc: line. People listed in the Cc: line get a "courtesy" (or "carbon") copy of the message. By convention, the message is primarily for the people listed in the To: component, and the people in the Cc: component are getting the message "for information." In this case, you can leave the Cc: component empty. .PP Move the insert cursor to the Subject: line and enter a Subject. The people that receive your message will get an idea of what the message is about from the subject, so take a moment to think of a good one. For this test, you can type something like "exmh test message". .PP 4. Make sure the headers are OK. In particular, make sure there are no blank lines in the headers. The mail system treats a blank line as meaning "end-of-headers", so you don't want to prematurely end the header section. If you have a blank line, position the insert cursor on it and use Backspace to remove the empty line. .PP Position the cursor at the start of the message body. You can use the mouse for this, or you can press twice quickly and the editor will position the cursor correctly. When using the default MH message templates, this will be right after the line of all dashes. .PP 5. Type in your message. When you type in a long message, the lines will wrap automatically at word boundaries. To get a blank line for paragraph boundaries, press . The built-in editor supports several editing commands that are based on the GNU emacs key bindings. If you select the \fISimple Edit\fP menu entry under the main Bindings menu, you will bring up a dialog that lets you view and edit the key bindings. .PP 6. If you are happy with the message, you send it by pressing the Send button at the top-right corner of the window. The Send button will turn grey, and the window will disappear once the message has been sent successfully. .PP If you do not want to send the message, press the Abort button instead. If you want to save the message draft and continue to work on it later, press the Save&Quit button. Working on a saved draft message is described in the \fBexmh-use\fP man page. .PP Send yourself a few messages, or have a friend send you a few test messages. You will use these test messages to practice moving around in a folder and deleting messages. Make one of the messages pretty long so you can practice scrolling through it. .PP Finally, try sending mh-mime-sample@online.ora.com a message. This addresses a program that will return a MIME message to you. Just put this address in the To field with anything as the message body and subject. Reading this message will be described below. .SH MOUSING AROUND .PP The selection is dragged out with the left mouse button. You can modify the selection by holding the Shift key while pressing the left button. A double-click begins a word-oriented selection, and a triple-click begins a line-oriented selection. If you drag a selection off the bottom or top of a window the text will be scrolled automatically and the selection will be extended. .PP Paste is done with the middle mouse button. .I The current insert point is used, not the point at which you middle-click. If you drag the middle mouse button, then the window is scrolled instead as described below. There is also a key-binding for paste, which is . Use or the key to delete the selection. .PP The middle mouse button is used for "drag-scrolling". To scroll, simply press the middle mouse button over the text and drag the text. If you press the Shift key, the scrolling is faster. Drag-scrolling works in the text widgets, for vertical scrolling, and the one-line entry widgets, for horizontal scrolling. The text widgets are used to display the folder contents and the current message. The entry widgets are used in various dialogs in order to enter values. You can change the scrolling button to the right button or to only work with shift-middle. Set this up in the Simple Edit Bindings... dialog. .PP Buttons and menus are also sensitive to which mouse button is pressed. Only the left button activates a button, and it is the event that is important. If you accidentally move the mouse off of the button as you release it, nothing will happen. Don't worry, the wrong button will not be invoked. .PP Press the left button over a menu button to pull down a menu. Most of the menus in \fIexmh\fP are distinguished with a "..." in their label, e.g. "More...". The menu will go away when the button is released. Release the mouse button off the menu if you do not want to invoke any menu item. (In some versions of Tk, the middle button will "tear off" a Tk menu. This is quite handy if you use the menu often. To get the menu to go away, you must click the left button over the menu button. This will reattach the menu to the menu button, and another left click will make the menu go away. In the latest versions of Tk, the first menu entry is a dashed line that invokes this tear-off operation.) .SH GETTING NEW MAIL .PP By now you should have some new mail waiting. Press the Inc button from the middle set of buttons that do Folder operations. This will transfer messages from your system spool file into your inbox folder. You will hear an audible cue if there was new mail, and the table of contents will be updated to reflect the new messages in your inbox. New messages will be underlined (on a monochrome screen), or blue (on a color screen), to indicate that you have not read them yet. .PP To view the new message, click on its line in the table of contents, or press the Next button in the bottom group of buttons. The message will be displayed in the bottom subwindow, and the line in the table of contents will be highlighted to remind you which message is being displayed. .PP To view the next message, click the Next button. The keyboard shortcut for this is the 'n' key. .PP The view the previous message, click the Prev button. The keyboard shortcut for this is the 'p' key. .PP \fBScrolling through messages\fP. If you get a message that is too long to fit into the message window, then the scrollbar will change its appearance to indicate how much text is displayed. The scrollbar is Motif-like. You can click on the arrows at either end to go up and down one line. If you click above or below the elevator box you go up and down one page. You can drag the elevator box to scroll, too. .PP You can also scroll text windows in \fIexmh\fP by dragging with the middle mouse button. Press the middle button over the text area, not the scrollbar, and hold it down while you move the mouse up or down. If you hold the shift key at the same time, the scrolling is faster. This works in the folder Table of Contents window, too. .PP \fIHint\fP. The space bar is a keyboard short-cut that does a combination of scrolling and advancing to the next message. If the message is long, then space will scroll by one screen. Once you are at the end of the message, space will advance to the next message, just like the 'n' key. You can use the BackSpace key to scroll back through a message. .SH READING MIME MESSAGES .PP By now you should have also received the sample MIME message from mh-mime-sample@online.ora.com. The MIME message has three parts to it, and these are numbered and labeled in the display. The first part is a multipart/alternative content, which means there are a few different ways to view the content. This is indicated by the message under the heading \fB1.\fP that there are alternative views of the following content. \fIExmh\fP will go ahead and display what it thinks is the best alternative, and you see the text/enriched content displayed in part \fB1.2\fP. If you want to see the other alternatives, then you can press the right button over section 1 to get a popup menu with some choices. .PP The next two parts are an audio clip and a picture in GIF format. The audio clip is handled directly by exmh, and it displays two active text buttons labeled "Play attached audio" and "Save audio file". Click on either of these with the left mouse button. The part corresponding to the image displays a message about what the type is, and suggests that you press the right mouse button to display a menu. You can always press the right button to get a MIME menu that has type-specific options for parts of your message. If you press the right button over part \fB2.\fP, then the popup menu will offer you these choices: .DS Decode part as MIME Save Hello from the author... View using mailcap rule... Pass an audio fragment to metamail... .DE The first item is a checkbox menu item that lets you view the raw content if you want to. The Save... menu entry displays a file selection box so you can choose a non-temporary file to store the content. This same function is available through the text button, but not all MIME parts displays buttons like this. The next two entries should result in the same thing. They use the mailcap specifications to run another program that displays the content. In the first case, View using mailcap rule..., \fIexmh\fP runs the program directly. In the other case, Pass to metamail..., the \fImetamail\fP program is run first, and it decodes the mailcap file and runs the external program. Again, the text button labeled "Play attached audio" also plays the audio. .SH REPLYING TO MAIL .PP Select one of the messages from your friend that you'd like to answer. Press the left button over the Reply... menu button. A menu with a few entries will be displayed. Select the \fIReply to sender\fP menu entry by dragging the mouse down to that entry and letting up over it. The menu entry has a in it, which means that you could also press the 'r' key to invoke this function. .PP This time the built-in editor will open a window with a message that is partly filled in. All the headers are initialized based on the header components from the original message. The built-in editor will automatically position the cursor at the beginning of the message body. You can enter your reply message like you did with the previous messages. You should also double-check the header components. In this case, add yourself to the Cc: component so you will get a copy of the reply message. When you are done, press the Send button in the editor window to send the message. .PP There are a number of ways to control the format of your reply messages. The MH \fIrepl\fP command has several formatting options, and because \fIexmh\fP uses \fIrepl\fP to set up the reply message, you can customize your reply format. \fIExmh\fP lets you define several variations on reply and add them to the Reply... menu. This is described in the \fBexmh-custom\fP man page. .PP It should not take long for you to get the copy of the reply message. Wait a minute or so and press the Inc button. The keyboard short-cut for Inc is the 'i' key. .SH SELECTING MESSAGES .PP Before we go on to more things you can do with messages, we need to talk about selecting multiple messages at once. Several of the message operations in \fIexmh\fP can operate on a set of messages. You can manually select multiple messages by using the mouse, or you can select messages based on their content. .PP \fBUsing the Mouse\fP. To select messages with the mouse, press the left button and then drag out a selection. This will select a contiguous range of messages. If the messages you want to select are not so nicely organized, you can make a disjoint selection by holding down the Shift key while making your selection. This adds new messages to the selection. If you shift-click on a message that is already selected, then it becomes unselected. If you need to select a lot of messages, simply drag the mouse off the top or bottom of the window. It will be scrolled automatically and the selection will be extended. .SH SEARCHING .PP The Search... menu has several operations for finding messages and finding text within a message. There is also a help entry that explains searching in more detail. If you select "Find in message body" or "Find in table of contents" a small search dialog appears. Enter the search string and use the Next or Prev buttons to find the next match. When you are searching over the table of contents, you can select All to select all matching messages. .PP The other way to search a folder is with "Pick by attributes". The MH pick program is used to search the current folder for messages that match mail headers like From or Subject. You can build up boolean expressions among search criteria. This is a much more general search mechanism than the "Find in table of contents" operation. .PP Get started in the Pick dialog by pressing the "Choose pick attribute" button. A menu of attribute types appears, including the Subject, From, To, and Cc header components. You can type a regular expression pattern in these entries to search for messages that have a matching header component. .PP The Before and After attributes are dates. You can find all messages before or after a given date by using these fields. You can specify dates as mm/dd/yy. Be sure to include the year. Dates can also be keywords like "today", "yesterday", "tomorrow", and any day of the week ("Sunday", "Monday", and so on.) .PP The Search attribute is used to search for something in the body of a message. This will run little slower because \fIpick\fP must read through all of your messages, not just their headers. .PP If you select more than one attribute, \fIpick\fP finds messages that match all the criteria. In other words, it does the logical \fIand\fP of the search criteria. If you want to search for this \fIor\fP that, then you need to press the Or button in the dialog. This adds another set of fields to the dialog, and pick will search for everything that matches the first set \fIor\fP matches the second set. .PP The "Add to Sel" checkbutton should be set \fIbefore\fP you do the search. This controls whether or not the selected messages are added to any existing selection. .PP Finally, use the "Pick" button to do the search. Once the search has completed you can perform a few operations on the selection. You can delete and refile messages as described later. You can also display a new table of contents that only contains the selected messages. Use the "New FTOC" button for this. You can also clear the unseen state of the messages with the "Mark Seen" button. .PP The "Clear" button resets the fields. .PP The two entries in the dialog are used to control MH sequences. The only sequence exmh really supports well is the "unseen" sequence, although you can define up to 10 sequences in each folder. .PP If you use New FTOC to get a new scan listing, it would be better if it appeared in a new window, but currently it replaces the table of contents. You can move around and manipulate messages in this table of contents. However, if you do another pick, it will only find things in this limited table of contents, not the whole folder. (Yes, this is a bug.) Use the Rescan Folder menu entry in the folder More... menu to get a complete folder listing. .SH FORWARDING MESSAGES .PP If you want to send someone a copy of a message or messages that you have received, use the Forward message operation. Select the messages as described in the previous section, then press the Forward button. The keyboard short-cut for forward is the 'f' key. .PP The message template will have a copy of the selected messages. You fill in the headers, and you can also add a short message before the start of the forwarded messages. When you are done, press Send to forward the messages. .SH DELETING MESSAGES .PP After you have read a message, you might want to remove it to keep your mail folders tidy. \fIExmh\fP uses two steps to remove mail. In the first step you \fImark\fP a message as being deleted. In the second step you \fIcommit\fP the operations on all marked messages. It turns out that delete just renames your message files. They will survive until you get another message by the same number and remove it, too. In addition, exmh has a "Purge Folder" operation that removes these renamed files if they are more than a week old. .PP The Delete operation applies to the current message, or you can also select a range of messages by dragging out a selection in the table of contents. You can delete the current message(s) by pressing the Delete button. The keyboard short-cut is the 'd' key. The deleted message(s) will be highlighted after the delete operation so you can easily see the state of the message. On a monochrome screen, a cross hatching will be drawn through the table of contents line for the message. On a color screen, the table of contents line will get a dark grey background. .PP After you mark a message for delete, you are automatically advanced to the next message. This makes it easy to go through your folder and clean it up. Click 'd' to delete, or click 'n' to leave it alone. .PP \fIHint\fP. If you are really in a hurry, use 'D' and 'N' as your keyboard short-cuts. This prevents the next message from being displayed, which can be slow for complex multi-media messages. .PP When you are ready to commit the pending delete actions, press the Commit button. The keyboard shortcut for commit is . .PP If you decide you do not want to delete a message you can unmark it. Use the \fIUnmark (Undo)\fP menu entry that is under the message More... menu. The unmark operation applies to the current message or messages, so you have to select the messages to unmark first. The keyboard short-cut for unmark is 'u'. .PP \fIHint\fP. The minus, '-', keyboard shortcut takes you to the previous message, even if it has been marked for delete. Ordinarily the Prev operation, and the 'p' short-cut for it, will skip over marked messages. .SH LEAVING EXMH .PP Press the Quit button to leave exmh. It will take a few moments to close down because it saves some state information before quitting. The Quit button will grey out after you click it, and you will see a few status messages as it shuts itself down. .SH PREFERENCES .PP Try out the Preferences by turning off the folder cache. This just takes up display space if you don't have many folders. If you have lots of nested folders, though, you might even want to make this display bigger! .PP Click the Preference button, which brings up a dialog that has buttons for several of the modules that make up \fIexmh\fP. Click on the Folder Cache button to bring up the preference items that control the folder cache. In this case there are just two items: the number of lines of labels in the cache, and the names of folders that are always in the cache. Click in the first field and backspace over the default value of 1. Type in 0 instead, and press . Voila! The folder cache disappears. .PP If you like this setting, press Save on the main Preference dialog and your changes will be saved to a file named ~/.exmh-defaults. Press Reset if you want to undo your changes. You should be a little careful here, because you are allowed to Dismiss the preference dialog without saving. .PP Another useful preference item to set is under Background Processing. You can arrange for \fIexmh\fP to periodically run \fIinc\fP so your messages are automatically transferred into your inbox. The advantage of doing this is that the folder label highlighting works best this way. Unfortunately, \fIexmh\fP does not give you any visual clues when mail is only waiting in your system spool file. .PP More details about the Preferences dialog are given in the \fBexmh-use\fP man page, and an overview of the various preference sections is given in the \fBexmh-custom\fP man page.. .SH "WHAT IS MH MAIL?" .PP MH is a collection of UNIX programs that store, manipulate, and display your mail. MH originated from RAND, and it is now in the public domain. Exmh uses these programs to do all the hard work, while it concentrates on the user interface. .PP You can use the MH programs to read your mail. Run them from the UNIX command line like you would cd, ls, cc, or make. They are useful when you are connecting over a slow line or cannot run exmh for some other reason. For more details, there are individual man pages for each MH program, plus one overview man page called MH. Below is a short summary of the main MH programs used by exmh. .IP folder Query or set the current folder. .IP inc Incorporate mail from your system spool file into your folders. .IP scan Display a listing of a mail folder. .IP show Display a mail message. .IP next Display the next mail message. (Exmh doesn't actually run this.) .IP prev Display the previous mail message. (Exmh doesn't actually run this.) .IP rmm Delete a mail message. .IP refile Move a message into another mail folder. .IP repl Reply to a mail message .IP forw Forward one or more mail messages. .IP comp Compose a new mail message. .PP MH keeps track of the current folder and the current message in between uses of these MH programs. For example: .DS % scan +inbox unseen 1713 04/14 foote.PARC@xerox. Have you started blasting cdroms yet?< .SH THANKS To Xerox PARC/CSL, for supporting this work initially, to Sun Microsystems Laboratories for continuing the support, and to all the exmh users that contributed ideas and code. exmh-2.8.0/PatchVersion000755 001047 000144 00000000550 06705151376 015327 0ustar00welchusers000000 000000 #!/bin/sh # \ exec tclsh "$0" ${1+"$@"} set version [lindex $argv 0] set out stdout set in stdin while {[gets $in line] >= 0} { if {[regexp "^set vers" $line]} { puts $out [list set vers $version] } elseif {[regexp "^set date" $line]} { puts $out [list set date [clock format [clock seconds] -format %m/%d/%Y]] } else { puts $out $line } } exmh-2.8.0/exmh.BUGS000640 001047 000144 00000020516 06777127107 014423 0ustar00welchusers000000 000000 Number: 1 Version: 2.1.0 Priority: Medium Scope: Narrow Complexity: Easy Status: Harry G. McGavran Jr. reports on exmh-users that double-clicking the iconified window still refuses to de-iconify. My recollection is that a 1 or 2 line fix was posted to exmh-workers a while back, but I can't find it in the archive. - slipcon These are known bugs in exmh, along with the release under which they were reported. ---------------------------------------------------------------------- Number: 3 Version: 2.0.3 Priority: Low Scope: Narrow Complexity: Medium Status: This is an old bug. The MIME display code misses one part of the RFC's requirements on multiparts in which the number of CRLFs at the end of a section have a meaning that I don't actually recall at the moment. I discovered it a while after I wrote the code. It probably isn't hard, but I haven't looked at that code in 5 years or more. ---------------------------------------------------------------------- Number: 5 Version: 2.0.3 Priority: Medium Scope: Narrow Complexity: ? Status: Not cleaning up MIME parts saved into temp files. Not cleaning up audit logs. ---------------------------------------------------------------------- Number: 6 Version: 2.0.3 + cvs as of around 4/7 Priority: Low Scope: Narrow Complexity: ? Status: Bug 10 was fixed. Someone thought this might be a duplicate of that. Was it? I-Spell gets turned off by magic. Make the magic go away. ---------------------------------------------------------------------- Number: 7 Version: 2.0.3 Priority: Low Scope: Narrow Complexity: ? Status: The "use message as draft" does not highlight the body (not obeying the "colorize multipart" preference?). ---------------------------------------------------------------------- Number: 9 Version: 2.0.3 Priority: Low Scope: Narrow Complexity: ? Status: A URL of the form "http://host.dom" without a trailing slash doesn't work. Subject: Re: exmh built in browser bug? Date: Wed, 14 Apr 1999 11:17:20 -0700 (13:17 CDT) From: Brent Welch We should fix it to use the http:: package, if available. I also noticed there is no timeout on Http_get. ---------------------------------------------------------------------- Number: 11 Version: 2.0.2 Priority: ? Scope: ? Complexity: ? Status: Message received at submit@bugs.debian.org: From: "Thomas Gebhardt" Package: exmh Version: 2.0.2-1 Hi, sometimes I get a message with MIME encoded iso-latin characters with a header like Mime-Version: 1.0 Content-Type: multipart/signed; boundary="-==--=-=-=======--==--=-=--=-===---===----=--==="; protocol="application/pgp-signature"; micalg=pgp-sha1 ---==--=-=-=======--==--=-=--=-===---===----=--=== Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable .... message text .... ---==--=-=-=======--==--=-=--=-===---===----=--=== Content-Type: application/pgp-signature -----BEGIN PGP MESSAGE----- Version: PGPfreeware 5.5.3i for non-commercial use iQA/AwUBNZOc0qMJGtg+zqPAEQKTsgCg7+JhDM/BnXCnoWZebJGyZmMBxzoAoLbP stDjIbtFhQEP+EiReo3uqVME =4ohD -----END PGP MESSAGE----- ---==--=-=-=======--==--=-=--=-===---===----=--===-- When I reply to such a message and use the "Quote" Button to quote parts of the message text, then the iso-latin characters do not show up correctly in the quoted text. They are displayed like "=F6" , i.e. as MIME codes. This seems to be a bug report for the upstream maintainer. Cheers, Thomas ---------------------------------------------------------------------- Number: 12 Version: 2.0.2 Priority: ? Scope: ? Complexity: ? Status: Message received at submit@bugs.debian.org: From: Martin Weinberg Setting FACEPATH as documented in /usr/doc/exmh/README.debian results in a display of arbitrary faces. I have not been able to figure out the logic error in faces.tcl. Picons behave properly if FACEPATH is not set. ---------------------------------------------------------------------- Number: 13 Version: 1.6.9 Priority: ? Scope: ? Complexity: ? Status: Message received at submit@bugs.debian.org: From: Dominik Kubla The exmh frontend can not handle inc contacting a POP server and asking for a password. ---------------------------------------------------------------------- Number: 14 Version: 1.6.9 Priority: ? Scope: ? Complexity: ? Status: [This may be impossible to fix, since PGP doesn't really output any useful exit status] Message received at submit@bugs.debian.org: From: Lars Wirzenius If I change PGP to use some other language than English, exmh loses it's ability to verify PGP messages. This is because it checks the output of PGP to see if it has a message that indicates a good signature. The pattern matches English only. This could be fixed to have exmh support all languages, or to force PGP to use English when run from exmh. I don't know if either is feasible without modifying either program heavily (and if either is going to be modified, it should be exmh, I think; PGP is a security tool, and should not be modified lightly). I have no fix, and the problem is not Debian-specific. It may be good to just forward this to the upstream authors. ---------------------------------------------------------------------- Number: 16 Version: 2.0.2 maybe earlier Priority: ? Scope: ? Complexity: ? Status: From: Anders Eriksson Date: Thu, 01 Apr 1999 14:27:43 +0200 Hi, This is a bug that has been bugging me for some time now. When I use mouse-base cut&paste the stuff pasted into the buffer is often something I cut&pasted several iterations ago. Is this a exmh or tk bug? I use exmh-2.0.2 (no patches) tcl/tk-8.0 fvwm2 Linux-2.0.36 From: Brent Welch Date: Fri, 02 Apr 1999 13:59:44 -0800 This is an exmh bug... ---------------------------------------------------------------------- Number: 19 Version: 2.0.2 Priority: Low Scope: Narrow Complexity: Probably easy Status: In Ispell, when you change default language selections there is often an uncaught error from a pipe close. error flushing "file9": broken pipe while executing "flush $ispellVars(spell_buffer)" (procedure "Ispell_Init" line 52) invoked from within "Ispell_Init" invoked from within ".sedit1.f.t.m.sub invoke active" ("uplevel" body line 1) invoked from within "uplevel #0 [list $w invoke active]" (procedure "tkMenuInvoke" line 29) invoked from within "tkMenuInvoke .sedit1.f.t.m.sub 1" ---------------------------------------------------------------------- Number: 20 Version: 2.0.2 Priority: Med Scope: Narrow Complexity: ? Status: Date: Fri, 23 Apr 1999 11:36:04 -0400 (10:36 CDT) From: Chip Christian The url-scanning code only looks for one url per line, but sometimes I get messages with more. ---------------------------------------------------------------------- Number: 21 Version: 2.0.2 Priority: Low Scope: Narrow Complexity: Doc only Status: The Hook_SeditInit predefined hooks are not mentioned in the html doc. There might be others, review the code and document any missing ones ---------------------------------------------------------------------- Number: 22 Version: 2.0.2 Priority: medium Scope: Narrow Complexity: Status: Found this in Intro.html: BUG: if you have projected a New FTOC, a subsequent pick will only select messages still on the display. You need to rescan the folder to start over. Sigh. ---------------------------------------------------------------------- Number: 23 Version: 2.1.0 Priority: medium Scope: Narrow Complexity: Status: Pgp_Exec sometimes indicates a PGP operation has failed when it actually suceeded. As far as I can tell the problem is that in a [catch {exec $cmd}] the catch gets triggered if the cmd uses stderr. Some form of smarter error checking seems necessary. - kchrist ---------------------------------------------------------------------- Number: 24 Version: 2.1.0 Priority: medium Scope: Narrow Complexity: Status: Detected a pgpMatch failure. While trying to match user@hotmail.com a key search for @hotmail.com was done. The search returned wronguser@hotmail.com (single match) and the key was used although user != wronguser. I suspect having a single match for a key may be responsible here. - kchrist exmh-2.8.0/exmh.TODO000644 001047 000144 00000025361 07537305211 014424 0ustar00welchusers000000 000000 ---------------------------------------------------------------------- Number: 2 Priority: Med Scope: Wide Complexity: High Status: Improve/simplify font handling. See especially the mime preview window and the message clip window (which may be the same set of widgets). ---------------------------------------------------------------------- Number: 3 Priority: Med Scope: Narrow Complexity: Low Status: Incorporate mime-forwarding (is this already there?) as is used by many "exmh hackers" already but with a look at Jerry Peek's section on "mforw". ---------------------------------------------------------------------- Number: 6a Priority: Med Scope: Complexity: Status: Improve handling of slow access to files. ---------------------------------------------------------------------- Number: 7 Priority: Med Scope: Complexity: Status: Improve ability to run multiple exmh instances to the same X server and the same mail folders and anywhere else there might be problems ---------------------------------------------------------------------- Number: 8 Priority: Med Scope: Complexity: High Status: Add ability to have multiple "current" messages being viewed ---------------------------------------------------------------------- Number: 9 Priority: Med Scope: Complexity: High Status: Add ability to have multiple FTOCs viewed. ---------------------------------------------------------------------- Number: 11 Priority: Med Scope: Narrow Complexity: Status: Convert address book to use some sort of real database instead of a dumped tcl list, or flesh out the LDAP support to provide this functionality. ---------------------------------------------------------------------- Number: 13 Priority: Med Scope: Complexity: Status: Put a real menu bar on the top of the windows and move many of the buttons into the menu bar. Those items that make sense as buttons, should remain buttons, but the look of them should be more like the ones in other applications we use. ---------------------------------------------------------------------- Number: 16 Priority: Low Scope: Complexity: Status: Composition of multipart messages is ugly. I'm sure we can do better. Also, it would be nice to be able to control where attached messages get in-lined instead of always putting them at the bottom. ---------------------------------------------------------------------- Number: 17 Priority: Low Scope: Complexity: Status: Display of multipart messages is less than ideal (ugly, but not as ugly as the composition). I (cwg) wrote it before tk had the ability to in-line graphics. ---------------------------------------------------------------------- Number: 19 Priority: Scope: Complexity: Status: Automatic detection of what style digital signatures to use. ---------------------------------------------------------------------- Number: 22 Priority: Scope: Complexity: Status: Generalized support for per-recipient twiddling of headers. Includes ability to control the "from", "reply-to" ---------------------------------------------------------------------- Number: 23 Priority: Scope: Complexity: Status: Support for group addresses (address lists) in the address book. ---------------------------------------------------------------------- Number: 25 Priority: High Scope: varies Complexity: varies Status: Incorporate patches from the New Features section of the Patch page 4.Patch to slocal.c that allows regular expressions in .maildelivery files. ---------------------------------------------------------------------- Number: 27 Priority: Med Scope: Medium Complexity: Medium Status: From: Anders Eriksson I'd like to see the possibility to run an attachment though `file` as an alternative to Content-type. Way too many attachments comes as application/octet-stream which effectively disables all mime display magic in exmh. This should be mostly working already, save some editing of app-defaults to get it to match the output of file. A quick look at the distributed app-defaults reveal that they seem to match Solaris' file. /Iko ---------------------------------------------------------------------- Number: 28 Priority: Med Scope: Narrow Complexity: Medium? Status: Always use "scan" to build or alter ftoc lines. ---------------------------------------------------------------------- Number: 29 Priority: Med Scope: Medium Complexity: Medium Status: This is now in the misc directory. Does it need to be integrated? Add John Klassa's "par" based quoter as a user option (should include user-specifiable path to par binary). ---------------------------------------------------------------------- Number: 31 Priority: Med Scope: Narrow Complexity: Low Status: Add a prompt before replacing the user's .mh_profile ---------------------------------------------------------------------- Number: 32 Priority: Low Scope: Narrow Complexity: Low Status: The html documentation says: Future versions of exmh will cache the results of decompressing the X-Face line in a personal faces database, but in the current version it just writes the file to /tmp/FACES.[pid]. Since it says this will happen, I think it belongs on the todo list. ---------------------------------------------------------------------- Number: 34 Priority: Low Scope: Narrow Complexity: Low Status: Update overview.html to current version. ---------------------------------------------------------------------- Number: 35 Priority: Low Scope: Narrow Complexity: Low Status: Review Exmh_Status and make more friendly to long messages. ---------------------------------------------------------------------- Number: 36 Priority: Low Scope: Wide Complexity: Low Status: Review handling of user-specified file and directory names, allow "~" in all cases. Change internally using glob but do NOT save the "globbed" version. ---------------------------------------------------------------------- Number: 37 Priority: Low Scope: Narrow Complexity: Status: Provide support for editing "named" lists in aliases ---------------------------------------------------------------------- Number: 39 Priority: Low Scope: Narrow Complexity: Low Status: Work over key bindings in the selection list presented when address expansion comes up with multiple hits. In particular, the return key should "do the right thing". ---------------------------------------------------------------------- Number: 40 Priority: Low Scope: Narrow Complexity: Low Status: In the "message clip" and possibly other windows you must get the focus on the scrollbar in order to scroll with the cursor keys. Brent's book discusses how to properly deal with this. ---------------------------------------------------------------------- Number: 41 Priority: Low Scope: Wide Complexity: Low Status: Ensure that all toplevel windows have handlers for WM_* messages. ---------------------------------------------------------------------- Number: 43 Priority: Low Scope: Narrow Complexity: ? Status: If x-image-url fails to load and an x-face is present it should be used. ---------------------------------------------------------------------- Number: 44 Priority: Low Scope: Narrow Complexity: Medium Status: Now less of a problem with the addition of 'Extract Message' Provide the ability to reply, forward, etc, an attached message (from a digest or forwarded or wherever). ---------------------------------------------------------------------- Number: 45 Priority: Med Scope: Wide Complexity: Medium Status: -mostly done, 6/5, slipcon - the last 3 haven't been moved yet Create a $HOME/.exmh directory to contain all the "ancillary" files used by exmh. This might include any or all of the following: .exmh-defaults X resources .exmh_addrs Address book .exmhbindings main bindings .exmhsedit sedit bindings .exmh-images x-url-image cache directory .tk/exmh user library directory .webtkcache html viewer cache $EXMHTMPDIR temp files ---------------------------------------------------------------------- Number: 47 Priority: Low Scope: Narrow (?) Complexity: High Status: In the HTML docs, under "Find SEL", I found this:
This searches the draft for the current X selection. The intent is that you select misspelled words in the output of the spell command and use this menu entry to locate them in the draft. (The find and keybinding mechanisms were stressed by this addition - expect a cleanup someday. There is no reasonable way to define keystroke accelerators for the find and still be able to change them in the Bind dialog. -don't ask...). so...that cleanup is now on the TODO. ---------------------------------------------------------------------- Number: 48 Priority: Medium Scope: Narrow (?) Complexity: Low Status: Support multiple LDAP servers in the address book ---------------------------------------------------------------------- Number: 49 Priority: Medium Scope: Narrow (?) Complexity: Low Status: Allow the addition of entries to an LDAP server if the user has write access. These might include info from: o Email addresses and names from the From: line o x-vcards o RFC2369 list headers ---------------------------------------------------------------------- Number: 50 Priority: Scope: Complexity Status: Add support for RFC2646 'format=flowed'. This will require work on both the display side and sedit/sending side. ---------------------------------------------------------------------- Number: 51 Priority: Scope: Complexity: Status: Look at GnuPG support in pgpGPG.tcl - can modulepath, siphermods, digestmods, and pubkeymods be passed as (null) rather than (deffault), so users who specify them in ~/.gnupg/options dont get a 'already loaded' error... ---------------------------------------------------------------------- Number: 52 Priority: Low Scope: Narrow Complexity: Status: Highlight sequences which are not specified in resources. (I didn't do this in my sequence highlighting code because I don't need it and I'm not sure what the right answer is - cwg) More thoughts from cwg: I think the strategy should be to move the highlighting configurations from resources into the preferences pane and then dynamically generate new configurations for sequences which turn up in folders, probably by picking a foreground color from a list of possible foreground colors. ---------------------------------------------------------------------- Number: 53 Priority: Low Scope: Narrow Complexity: Status: Pretty up the vertical orientation of the sequences window. Columns need to be coordinated between the panes to do this. May not be worth the effort. ---------------------------------------------------------------------- $Id: exmh.TODO,v 1.51 2002/08/23 18:23:03 cwg Exp $ # Emacs stuff # Local Variables: # mode: text # End: exmh-2.8.0/ftp.expect.MASTER000650 001047 000144 00000000775 07323113212 015757 0ustar00welchusers000000 000000 #!/bin/sh # \ exec expect -f set site [lindex $argv 0] set dir [lindex $argv 1] set theirname [lindex $argv 2] set myname [lindex $argv 3] set password "$env(USER)@" set timeout 60 spawn ftp $site expect "*Name*:*" send "anonymous\r" expect "*Password:*" send "$password\r" expect "*ftp>*" send "binary\r" expect "*ftp>*" send "cd $dir\r" expect "*550*ftp>*" {exit 1} "*250*ftp>*" send "get $theirname $myname\r" expect "*550*ftp>*" {exit 1} "*200*226*ftp>*" close wait send_user "FTP transfer ok\n" exit 0 exmh-2.8.0/inc.expect.MASTER000644 001047 000144 00000003327 07323100621 015736 0ustar00welchusers000000 000000 #!/bin/sh # \ exec expect -f "$0" -- ${1+"$@"} # # Script to run inc and provide a password. # # When there is mail to incorporate, echo back only the message headers # for the FTOC. Otherwise, send back all text, for debug logging set timeout 60 gets stdin password # turn off echo so that password doesn't get echoed by tty driver set stty_init -echo eval spawn -noecho $argv log_user 0 # When .netrc exists, inc doesn't prompt for a password. After getting # a password one way or another, inc prints one of # Incorporating new mail into inbox...\r\n\r\n # inc: no mail to incorporate # # For the case of mail available, we want to drain the informational # line "Incorporating new mail" here, so it doesn't get sent back # as output and get stuck in the FTOC window, and proceed to the while # loop, below. # # If there's no mail, the informational message sent back, with exit 1, # so the message gets put into the debug log. # expect { -re "Password (.*):" { exp_send -- $password\n lappend incout $expect_out(buffer) $password\n expect { -re ".* new mail .*\n" {} eof { send_user $expect_out(buffer) exit 1 } timeout { send_user "timeout"; exit 1 } } } -re ".* new mail .*\n" {} eof { send_user $expect_out(buffer) exit 1 } timeout { send_user "timeout"; exit 1 } } # drain any empty line # echo back msg header for FTOC # if exit status of inc is non-zero (e.g., 1 for no mail), # echo back all accumulated text while {1} { expect { -re "^\[ \r\n]+$" {} -re ".*\n" { send_user $expect_out(buffer) } eof { if { [lindex [wait] 3] == 0 } { exit 0 } else { send_user $incout exit 1 } } } } exmh-2.8.0/version.csh000775 001047 000144 00000001016 10166430014 015144 0ustar00welchusers000000 000000 #!/bin/csh # To change the version, first edit the Makefile and # change the version there, and frob the patterns in # version.sed. Then type "make version" # You still want to add release notes to # exmh.README and probably the other html files. foreach f ( Makefile exmh.README lib/html/index.html lib/html/software.html ) echo $f sed -f version.sed < $f > $f.new mv $f $f.old mv $f.new $f diff $f.old $f end echo "Edit lib/html/exmh.README.html by hand" echo "Use PatchVersion to fix exmh.install" exmh-2.8.0/exmh000775 001047 000144 00000010653 10230044675 013661 0ustar00welchusers000000 000000 #!/fs/home/welch/linux/bin/wish8.4 -f # # TK interface to the MH Mail utility # Brent Welch # Original version by # # Copyright (c) 1993-8 Brent Welch # Copyright (c) 1993-5 Xerox Corporation. # Copyright (c) 1996-8 Sun Microsystems # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # and Sun Microsystems # make no warranty about the software, its performance or its conformity to # any specification. # The following lines are patched by exmh.install #CONFIGURATION set wish /fs/home/welch/linux/bin/wish8.4 set exmh(version) {version 2.7.3 (cvs) 04/15/2005} set exmh(name) exmh set exmh(maintainer) welch@acm.org set mh_path /usr/pan/bin set exmh(slocal) /usr/lib/nmh/slocal set mime(dir) {} set mailcap_default /etc/mailcap set mimetypes_default /etc/mime.types set exmh(expect) /usr/pan/bin/expect set exmh(expectk) /usr/pan/bin/expectk set faces(dir) /fs/home/welch/faces set faces(set,user) {local users usenix misc} set faces(set,unknown) {domains unknown} set faces(set,news) news set faces(defaultDomain) panasas.com set faces(suffix) {xpm gif xbm} set pgp(pgp,path) /usr/local/bin set pgp(pgp5,path) /usr/local/bin set pgp(gpg,path) /usr/bin set pgp(pgp6,path) /usr/local/bin set glimpse(path) /usr/pan/bin set sound(cmd) {/usr/bin/play -v 38} set exmh(library) /fs/home/welch/lib/exmh-2.7 set install(dir,bin) /fs/home/welch/bin set install(dir,man) /fs/home/welch/man/manl set install(dir,lib) /fs/home/welch/lib/exmh-2.7 #END CONFIGURATION package require Tk if {$tcl_version < 8.0} { error "Tcl 8.0 (final release) or higher required." exit 1 } # Do this so popups related to user initialization # appear all alone. wm withdraw . proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path tk_version if [file exists $path/tclIndex] { if {[info tclversion] != 7.0} { set auto_path "$path $auto_path" } else { lappend auto_path $path } # Used to have an "auto_reset" here, but that has the bad # side effect of causing Tk's entry.tcl and text.tcl files # to reload and redefine top-level Entry and Text bindings # that we change in seditBind.tcl. # catch {auto_reset} ;# Needed for function override } } auto_path_update $exmh(library) if ![file exists $exmh(library)/tclIndex] { if [file exists ./lib/tclIndex] { puts stderr "Warning, using local script library, ./lib" set exmh(library) ./lib } } # Support per-user directory containing .tcl files. # This was originally the ~/.tk/exmh directory, # but then files migrated into ~/.exmh so # a lib subdirectory there is cleaner foreach exmh(userLibrary) [list [glob ~]/.exmh/lib [glob ~]/.tk/exmh] { if {[file exists [file join $exmh(userLibrary) tclIndex]]} { auto_path_update $exmh(userLibrary) ;# library for new modules break } } # Fall through with ~/.tk/exmh as the default because there # are other places in the code that assume exmh(userLibrary) is defined # Set up the environment if {[catch { Env_Init } err]} { puts stderr "Error running Env_Init: $err" puts stderr "This usually means exmh isn't installed right" puts stderr "Check the main exmh script for the CONFIGURATION section" puts stderr "and make sure exmh(library) is a valid absolute pathname" exit 1 } # For WindowMaker, http://www.inf.ufrgs.br/~kojima/wmaker/ wm group . . # For session managers wm command . "$argv0 $argv" catch {wm client . "[exec hostname]"} catch { . configure -cursor left_ptr } # modified by k.furukawa, jul.1994. for kanji # this piece of code enables japanese kanji display if you use # tk-jp extension and JIS code. if you use EUC for MH processing # codes, you may replace JIS with EUC and you may need more works. if {[info commands kanji] == "kanji"} { kanji internalCode JIS option add *Text.Font a14 } # Ensure the user is in a writable directory for @ links if {[string match /* $exmh(library)] && [string match /* $argv0]} { # Don't go anywhere when testing cd } # The rest of the application is defined by routines in the exmh library # The after 1 trick is to ensure we get the built-in error handler. after 1 {Exmh} exmh-2.8.0/exmh-bg000775 001047 000144 00000015075 10230044675 014252 0ustar00welchusers000000 000000 #!/fs/home/welch/linux/bin/wish8.4 -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module # in the main exmh application. In particular, the time-consuming things # like running inc are done here instead of the main-line. # # Copyright (c) 1993-8 Brent Welch # Copyright (c) 1993 Xerox Corporation. # Copyright (c) 1996-8 Sun Microsystems # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # and Sun Microsystems # make no warranty about the software, its performance or its conformity to # any specification. #CONFIGURATION set wish /fs/home/welch/linux/bin/wish8.4 set exmh(version) {version 2.7.3 (cvs) 04/15/2005} set exmh(name) exmh set exmh(maintainer) welch@acm.org set mh_path /usr/pan/bin set exmh(slocal) /usr/lib/nmh/slocal set mime(dir) {} set mailcap_default /etc/mailcap set mimetypes_default /etc/mime.types set exmh(expect) /usr/pan/bin/expect set exmh(expectk) /usr/pan/bin/expectk set faces(dir) /fs/home/welch/faces set faces(set,user) {local users usenix misc} set faces(set,unknown) {domains unknown} set faces(set,news) news set faces(defaultDomain) panasas.com set faces(suffix) {xpm gif xbm} set pgp(pgp,path) /usr/local/bin set pgp(pgp5,path) /usr/local/bin set pgp(gpg,path) /usr/bin set pgp(pgp6,path) /usr/local/bin set glimpse(path) /usr/pan/bin set sound(cmd) {/usr/bin/play -v 38} set exmh(library) /fs/home/welch/lib/exmh-2.7 set install(dir,bin) /fs/home/welch/bin set install(dir,man) /fs/home/welch/man/manl set install(dir,lib) /fs/home/welch/lib/exmh-2.7 #END CONFIGURATION package require Tk wm withdraw . if {$argc < 3} { puts stderr "exmh-bg requires some arguments:" puts stderr "Usage: exmh-bg interpName libDirectory mh_path" exit 1 } set exmh(interp) [lindex $argv 0] set exmh(library) [lindex $argv 1] set mh_path [lindex $argv 2] proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path if [file exists $path/tclIndex] { if {[info tclversion] != 7.0} { set auto_path "$path $auto_path" } else { lappend auto_path $path } # auto_reset call eliminated } } auto_path_update $exmh(library) # Support per-user directory containing .tcl files. foreach exmh(userLibrary) [list [glob ~]/.exmh/lib [glob ~]/.tk/exmh] { if {[file exists [file join $exmh(userLibrary) tclIndex]]} { auto_path_update $exmh(userLibrary) ;# library for new modules break } } # Set up environment variables Env_Init proc Exmh_Status { string args } { # Just a stub version until we rendez-vous with the front end. # If the userLibrary Preferences_Add is done after we define the # full blown Exmh_Status, then the auto_path_update and its # auto_reset seem to result in the Exmh_Status from main.tcl # being faulted in from the library. catch {puts stderr "exmh-bg: $string"} } # Tk 4.0b3 bogosity if [catch {tk colormodel .}] { rename tk tk-orig proc tk { option args } { switch -- $option { colormodel { if {[winfo depth $args] > 4} { return color } else { return monochrome } } default { return [eval {tk-orig $option} $args] } } } } Preferences_Init ~/.exmh/exmh-defaults $exmh(library)/app-defaults if [catch {User_Init} err] { catch {puts stderr "User_Init: $err"} } proc Exmh_Debug { args } { global exmh if [info exists exmh(pid)] { BgRPC Exmh_Debug exmh-bg $args } else { catch {puts stderr "exmh-bg $args"} } } # Register ourselves with the UI proc BgRegister { exmhInterp } { global exmh set exmh(sendErrors) 0 if {[catch { send $exmhInterp [list Background_Register [winfo name .] [pid]] } alist] == 0} { # set bg parameters returned as a result of registration foreach pair $alist { set _var [lindex $pair 0] set _val [lindex $pair 1] uplevel #0 [list set $_var $_val] } return 1 } else { if [regexp {no registered interpreter} $alist] { catch {puts stderr "exmh-bg lost UI - exiting."} exit } catch {puts stderr "BgRegister $alist"} return 0 } } set ok 0 foreach try {1 2 3 4 5} { set ok [BgRegister $exmh(interp)] if {$ok} { break } exec sleep [expr $try*$try] } if {! $ok} { catch { puts stderr \ "exmh-bg cannot rendez-vous with UI - exiting. Usually this is because Tk send is not working. Check the notes under Frequently Asked Questions #4a and #4b. You can find this under the Help menu." } exit 1 } proc Exmh_Status { string {color black} } { global exmh if [info exists exmh(instatus)] { catch {puts stderr "exmh-bg: $string"} return } set exmh(instatus) 1 # All this code to evaluate something that should be evaluated in # the main Exmh interpreter if BgRPC suceeds - and if we call our stub # Exmh_Status the value is ignored anyhow. # if ![info exists exmh(c_st_bg_msgs)] { # if {[tk colormodel .] == "color"} { # set exmh(c_st_bg_msgs) [option get . c_st_bg_msgs {}] # if {$exmh(c_st_bg_msgs) == {}} { # set exmh(c_st_bg_msgs) [option get . bgMsgColor {}] # if {$exmh(c_st_bg_msgs) != {}} { # puts stderr "Warning: old resource bgMsgColor, changed to c_st_bg_msgs" # } else { # set exmh(c_st_bg_msgs) "medium sea green" # } # } # } else { # set exmh(c_st_bg_msgs) [option get . c_st_bg_msgs {}] # if {$exmh(c_st_bg_msgs) == {}} {set exmh(c_st_bg_msgs) black} # if {$exmh(c_st_bg_msgs) != "white" && $exmh(c_st_bg_msgs) != "black"} { # set exmh(c_st_bg_msgs) black # } # } # } BgRPC Exmh_Status $string background unset exmh(instatus) } proc Exmhbg_Done {interp} { # Die asynchronously so the front-end gets a response # to its send request first. Set a dead flag so BgRPC # doesn't try to talk to the front end global exmh if {$exmh(interp) == $interp} { set exmh(dead) 1 after 1 { catch {Audit_CheckPoint} destroy . } } } # Now do things periodically. We fault in routines from # the regular library of exmh procedures. The Inc'ing # routines have been tweaked to understand the (possible) # split into a separate process, and the above hack to # Exmh_Status handles the simpler cases. Mh_Init Inc_Init Ftoc_Init ;# Need ftoc(scanWidth) Flist_Init Seq_Init ;# Need seqwin(nevershow) Post_Init set busy(style) none Background_Init Background_DoPeriodic exmh-2.8.0/exmh-async000775 001047 000144 00000001545 10230044675 014774 0ustar00welchusers000000 000000 #!/fs/home/welch/linux/bin/wish8.4 -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) # Arg2-end: editor command, including pathname # LastArg: pathname of draft message # package require Tk wm withdraw . # simple argv cracking set exmh [lindex $argv 0] set editorCmd [lrange $argv 1 end] set draftpath [lindex $argv [expr {[llength $argv] - 1}]] set draftm [file tail $draftpath] send $exmh [list Edit_Ident [winfo name .]] # Used to do a split/join on $editorCmd to allow quoted -geom arguments. # But that totally screws some arguments, like # exmh-async gvim -c {cal SetSyn("mail")} # other interesting cases are # exmh-async xterm -geom +0+0 -e vi {+/^[-]*$} if [catch {eval exec $editorCmd} err] { send $exmh [list Exmh_Status "exmh-async: editor failed: $err" purple] } send $exmh EditDialog $draftm exit 0 exmh-2.8.0/ftp.expect000775 001047 000144 00000001012 10230044675 014765 0ustar00welchusers000000 000000 #!/bin/sh # \ exec /usr/pan/bin/expect -f set site [lindex $argv 0] set dir [lindex $argv 1] set theirname [lindex $argv 2] set myname [lindex $argv 3] set password "$env(USER)@" set timeout 60 spawn ftp $site expect "*Name*:*" send "anonymous\r" expect "*Password:*" send "$password\r" expect "*ftp>*" send "binary\r" expect "*ftp>*" send "cd $dir\r" expect "*550*ftp>*" {exit 1} "*250*ftp>*" send "get $theirname $myname\r" expect "*550*ftp>*" {exit 1} "*200*226*ftp>*" close wait send_user "FTP transfer ok\n" exit 0 exmh-2.8.0/inc.expect000775 001047 000144 00000003344 10230044675 014757 0ustar00welchusers000000 000000 #!/bin/sh # \ exec /usr/pan/bin/expect -f "$0" -- ${1+"$@"} # # Script to run inc and provide a password. # # When there is mail to incorporate, echo back only the message headers # for the FTOC. Otherwise, send back all text, for debug logging set timeout 60 gets stdin password # turn off echo so that password doesn't get echoed by tty driver set stty_init -echo eval spawn -noecho $argv log_user 0 # When .netrc exists, inc doesn't prompt for a password. After getting # a password one way or another, inc prints one of # Incorporating new mail into inbox...\r\n\r\n # inc: no mail to incorporate # # For the case of mail available, we want to drain the informational # line "Incorporating new mail" here, so it doesn't get sent back # as output and get stuck in the FTOC window, and proceed to the while # loop, below. # # If there's no mail, the informational message sent back, with exit 1, # so the message gets put into the debug log. # expect { -re "Password (.*):" { exp_send -- $password\n lappend incout $expect_out(buffer) $password\n expect { -re ".* new mail .*\n" {} eof { send_user $expect_out(buffer) exit 1 } timeout { send_user "timeout"; exit 1 } } } -re ".* new mail .*\n" {} eof { send_user $expect_out(buffer) exit 1 } timeout { send_user "timeout"; exit 1 } } # drain any empty line # echo back msg header for FTOC # if exit status of inc is non-zero (e.g., 1 for no mail), # echo back all accumulated text while {1} { expect { -re "^\[ \r\n]+$" {} -re ".*\n" { send_user $expect_out(buffer) } eof { if { [lindex [wait] 3] == 0 } { exit 0 } else { send_user $incout exit 1 } } } } exmh-2.8.0/exmh-strip000775 001047 000144 00000034113 10230044675 015015 0ustar00welchusers000000 000000 #!/fs/home/welch/linux/bin/wish8.4 #(Note - you should also be able to use tclsh with this.) # # Utility to strip out attachments from MIME messages. # They are replaced with references to the external files. # # You must supply the input message destination directory on the command line. # This does not handle nested multiparts correctly. So, if you # forward a message with attachments, the message/rfc822 layer # outside the multipart/mixed will foil it. # # The original message is put into a "strip_backup" folder. It # is replaced with a message containing message/external-body parts # that reference the saved attachment. # # This script is invoked from a procedure like the following, # which is now build into mime.tcl. There is also a MIME preference # to choose the save directory, which is hardwired in this example. proc Mime_SaveAttachments {} { global msg exec [glob ~/bin/exmh-strip] $msg(path) [glob ~/doc] Msg_ShowCurrent } # You can also use this from a small shell script, e.g.: if {0} { #!/bin/csh tclsh8.3 ~/bin/exmh-strip `mhpath cur` ~/doc ls -lt ~/doc | head -2 } # Here are some resources for your exmh-defaults that add this to a new menu. # *Mops.umenulist: repl2 # *Mops.repl2.text: Welch # *Mops.repl2.m.entrylist: save sep # *Mops.repl2.m.t_sep: separator # *Mops.repl2.m.l_save: Save Attachments # *Mops.repl2.m.c_save: Save_Attachments # # Copyright (c) 2001 Brent Welch # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and no one # makes any arranty about the software, its performance or its conformity to # any specification. #CONFIGURATION set wish /fs/home/welch/linux/bin/wish8.4 set exmh(version) {version 2.7.3 (cvs) 04/15/2005} set exmh(name) exmh set exmh(maintainer) welch@acm.org set mh_path /usr/pan/bin set exmh(slocal) /usr/lib/nmh/slocal set mime(dir) {} set mailcap_default /etc/mailcap set mimetypes_default /etc/mime.types set exmh(expect) /usr/pan/bin/expect set exmh(expectk) /usr/pan/bin/expectk set faces(dir) /fs/home/welch/faces set faces(set,user) {local users usenix misc} set faces(set,unknown) {domains unknown} set faces(set,news) news set faces(defaultDomain) panasas.com set faces(suffix) {xpm gif xbm} set pgp(pgp,path) /usr/local/bin set pgp(pgp5,path) /usr/local/bin set pgp(gpg,path) /usr/bin set pgp(pgp6,path) /usr/local/bin set glimpse(path) /usr/pan/bin set sound(cmd) {/usr/bin/play -v 38} set exmh(library) /fs/home/welch/lib/exmh-2.7 set install(dir,bin) /fs/home/welch/bin set install(dir,man) /fs/home/welch/man/manl set install(dir,lib) /fs/home/welch/lib/exmh-2.7 #END CONFIGURATION if {[catch {wm withdraw .}]} { # Stub out stuff when not running under wish proc option {args} {return ""} proc winfo {args} {return ""} set pref(panes) "" set exmh(userLibrary) "" } if {$argc < 2} { puts stderr "exmh-strip requires some arguments:" puts stderr "Usage: exmh-strip msg_path doc_directory" exit 1 } set msg_path [lindex $argv 0] set doc_directory [lindex $argv 1] set uniq 0 ;# for content-ID generation proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path if [file exists $path/tclIndex] { if {[info tclversion] != 7.0} { set auto_path "$path $auto_path" } else { lappend auto_path $path } catch {auto_reset} ;# Needed for per-user override, but breaks w/ TCLX } } auto_path_update $exmh(library) # Set up environment variables Env_Init proc Exmh_Status { string args } { catch {puts stdout $string} } proc Exmh_Debug { args } { switch -glob -- $args { Pref_Add* { return } {*MH anno*} { return } {*Unable to load Img*} { return } MimeTypes* { return } default { catch {puts stdout [join $args]} } } } # We fault in routines from the regular library of exmh procedures. # We shouldn't depend on per-user code, so just hardwire userLibrary set exmh(userLibrary) ~/.exmh Preferences_Init "~/.exmh/exmh-defaults" "$exmh(library)/app-defaults" Mh_Init Mime_Init Pgp_Base_Init proc dummy_tk_window {args} { # Ignore everything done to the window } # Procedure to strip out attachments. # Unfortunately we have to rip out various code sections # from mime.tcl proc Mime_Strip {fileName} { global mime mimeHdr # Stuff from MsgShowInText set part 0 set subpart 1 set mimeHdr($part=$subpart,hdr,cur) {} set mimeHdr($part=$subpart,hdr,from) {} set mimeHdr($part=$subpart,hdr,date) {} set mimeHdr($part=$subpart,hdr,subject) {} set mimeHdr($part=$subpart,hdr,x-face) {} set mimeHdr($part=$subpart,hdr,x-image-url) {} set mimeHdr($part=$subpart,hdr,newsgroups) {} set mimeHdr($part=$subpart,fullHeaders) $mime(fullHeaders) set mimeHdr($part=$subpart,yview) 1.0 set mimeHdr($part,decode) 1 set mimeHdr($part,file) $fileName set mimeHdr($part,rawfile) $fileName #set mimeHdr($part,color) [lindex [$win configure -background] 4] set mimeHdr($part,color) "" set mimeHdr($part,type) message/rfc822 set mimeHdr($part,encoding) 7bit set mimeHdr($part,hdr,content-type) message/rfc822 set mimeHdr($part,HeaderSize) 0 set mimeHdr($part,display) 1 global mimeFont if ![info exists mimeFont(default)] { set mimeFont(title) "" set mimeFont(note) "" set mimeFont(default) "" } set partTag [MimeLabel $part part] set defaultTag [MimeLabel $part=1 part] # From MimeSetPartVars if [catch {open $fileName r} fileIO] { Exmh_Status "Cannot open body $fileName: $fileIO" set mimeHdr($part,numParts) 0 return 0 } # Open shadow output for new version of stipped message if [catch {open ${fileName}.strip w} out] { Exmh_Status "Cannot open body ${fileName}.strip: $out" set mimeHdr($part,numParts) 0 close $fileIO return 0 } set result [MimeParseSingle $part $fileIO $out] MimeClose $fileIO close $out if {!$result} { # No attachements found file delete ${fileName}.strip } else { file mkdir [file join [exec mhpath +] strip_backup] file rename ${fileName} [exec mhpath +strip_backup new] file rename ${fileName}.strip ${fileName} } return $result } # Modified version of MimeParseSingle from lib/mime.tcl proc MimeParseSingle {part fileIO out} { global mimeHdr mime miscRE msg global doc_directory set mimeHdr($part=1,color) $mimeHdr($part,color) set part $part=1 set mimeHdr($part,hdrs) {} set uniq 0 # Skip any blank lines or "ugly uucp-style From_ lines" at the frontend. while {([set numBytes [gets $fileIO line]] == 0) || [regexp {^(>?From |[ ]+$)} $line]} { puts $out $line } puts $out $line # Parse headers set headers "" if [regexp {^([^: ]+):} $line] { while {$numBytes > 0} { if {[regexp -- {^-*$} $line]} { # Drafts-folder message break } if ![regexp {^[ ]} $line] { if [regexp -indices {^([^:]+):} $line match hdr] { set cur [string tolower \ [eval {string range $line} $hdr]] if {[lsearch $mimeHdr($part,hdrs) $cur] >= 0} { # Duplicate header set cur :$uniq:$cur incr uniq } set mimeHdr($part,hdr,$cur) \ [string trim \ [string range $line \ [expr [lindex $match 1]+1] end]] lappend mimeHdr($part,hdrs) $cur } } elseif [regexp -indices {^[ ]+} $line match] { append mimeHdr($part,hdr,$cur) \n$line } set numBytes [gets $fileIO line] append headers $line\n } if [catch {set mimeHdr($part,hdr,content-type)} contentType] { set contentType text/plain } if [catch {set mimeHdr($part,hdr,content-transfer-encoding)} encoding] { set encoding 7bit } if {[string compare $contentType X-sun-attachment] == 0} { set contentType "multipart/x-sun-attachment; boundary=--------" set mimeHdr(0=1,hdr,mime-version) x-sun-attachment } set encoding [string trim [string tolower $encoding] \ \" ] set type [MimeHeader $part $contentType $encoding] if {[string compare $part "0=1"] == 0} { set mimeHdr($part,decode) \ [expr {$mime(enabled) && [info exists mimeHdr(0=1,hdr,content-type)]}] } } else { # Weird no header case Exmh_Status "no headers" return 0 } if {$numBytes >= 0} { if {[string match multipart/* $type]} { # Look through parts for attachements to strip puts $out $headers return [MimeChopPart $part $fileIO $out] } elseif {![regexp {^(text|message)/.*} $type]} { # Skip text and message types set body [read $fileIO] return [MimeStripPart $part $headers $body $out] } } return 0 } proc MimeStripPart {part headers body out} { global mimeHdr doc_directory uniq # Grab a hint for the filename from the part headers # The param,* are parameters to the Content-Type header # and other headers, especially Content-Disposition # The hdr,* are other headers. foreach hint { param,filename hdr,content-description param,name } { if {[info exist mimeHdr($part,$hint)]} { set path $mimeHdr($part,$hint) break } } if {![info exist path]} { # Not an interesting thing - e.g., "vcard" junk or text return 0 } set path [file tail $path] set path [string trim $path] if {[regexp {^\|} $path]} { catch {puts stderr "Bad filename $path"} exit 1 } set path [file join $doc_directory $path] if {[file exists $path]} { catch {puts stderr "$path exists"} exit 1 } if {[catch {open $path w} newout]} { # Cannot save to suggested file name Exmh_Debug "exmh-strip:MimeStripPart can't open $newout" return 0 } if {[MimeSavePart $part $body $out $newout]} { # Successfully stripped the part - now whack the headers regexp -nocase {content-type[^\n]+} $headers oldtype regsub -nocase {content-transfer-encoding[^\n]+\n} $headers \ {} headers regsub -nocase {content-type.+\n([^\t\n])} $headers \ "Content-Type: message/external-body; name=\"$mimeHdr($part,param,filename)\"; access-type=local-file; directory=\"$doc_directory\"; \\1" headers # Output new headers and stub body puts -nonewline $out $headers\n puts $out $oldtype puts $out "Content-ID: exmh-strip-[clock format [clock seconds] \ -format {%Y-%m-%d-%H-%M-%S}]-[incr uniq]" close $newout return 1 } close $newout return 0 } proc MimeSavePart {part body out newout} { global mimeHdr doc_directory global mime switch -regexp -- $mimeHdr($part,encoding) { (8|7)bit { puts -nonewline $newout $body } base64 { if {[info exist mime(encode)]} { exec $mime(encode) -u -b >@ $newout << $body } else { puts -nonewline $newout [Base64_Decode $body] } } quoted-printable { if {[info exist mime(encode)]} { exec $mime(encode) -u -q >@ $newout << $body } else { puts -nonewline $newout [mime::qp_decode $body] } } .*uue.* - default { # Punting on uuencoded and anything else weird. puts -nonewline $out $body return 0 } } return 1 } proc MimeChopPart {part fileIO out} { # Chop up the parts at this level global mimeHdr if [catch {set mimeHdr($part,param,boundary)} boundary] { Exmh_Status "Invalid MIME Multipart" return 0 } # spaces in boundarys can cause line breaks - cc-mail trash regsub -all "\n *" $boundary { } boundary set type $mimeHdr($part,type) set mimeHdr($part,numParts) \ [MimeParseMulti $part $fileIO $boundary \ [expr {($type == "multipart/digest") ? \ "message/rfc822" : "text/plain"}] $out] } proc MimeParseMulti {part fileIO boundary defType out} { global mimeHdr mime set subpart 0 # Prolog while {([set numBytes [gets $fileIO line]] >= 0) && ([string compare --$boundary $line] != 0) && ([string compare --$boundary-- $line] != 0)} { puts $out $line } puts $out $line ;# Initial boundary while {($numBytes >= 0) && ([string compare --$boundary-- $line] != 0)} { incr subpart catch {unset contentType} # Header set headers "" while {([set numBytes [gets $fileIO line]] > 0) && ([string compare --$boundary-- $line] != 0) && ([string compare --$boundary $line] != 0) && (! [regexp -- {^-*$} $line])} { append headers $line\n if ![regexp {^[ ]} $line] { if [regexp -indices {^([^:]+):} $line match hdr] { set cur [string tolower \ [eval {string range $line} $hdr]] set mimeHdr($part=$subpart,hdr,$cur) \ [string trim \ [string range $line \ [expr [lindex $match 1]+1] end]] lappend mimeHdr($part=$subpart,hdrs) $cur } } elseif [regexp -indices {^[ ]+} $line match] { if {![info exists cur] || [regexp {^[ ]+$} $line]} { # No header! an error is about to occur... } append mimeHdr($part=$subpart,hdr,$cur) \n$line } } if {($numBytes >= 0) && ([string compare --$boundary-- $line] != 0)} { #MimeMapSunHeaders $tkw $part=$subpart if [catch {set mimeHdr($part=$subpart,hdr,content-type)} contentType] { set contentType $defType } if [catch {set mimeHdr($part=$subpart,hdr,content-transfer-encoding)} encoding] { set encoding 7bit } set encoding [string trim [string tolower $encoding] \ \" ] set type [MimeHeader $part=$subpart $contentType $encoding] # The following code *does not* handle nested multiparts. # Body set sep "" set body "" while {([set numBytes [gets $fileIO line]] >= 0) && ([string compare --$boundary $line] != 0) && ([string compare --$boundary-- $line] != 0)} { append body $sep$line set sep \n } catch {unset cur} if {[string match text* $type] || ![MimeStripPart $part=$subpart $headers $body $out]} { # Didn't strip it, have to restore original part puts $out $headers\n$body } puts $out $line ;# Another boundary } if ![info exists contentType] { # Empty body part incr subpart -1 } } return $subpart } Mime_Strip $msg_path exit 0 exmh-2.8.0/COPYRIGHT000640 001047 000144 00000002710 07621631725 014262 0ustar00welchusers000000 000000 Copyright 2000-2003 Brent Welch. All rights reserved. Copyright 1999 Scriptics Corporation. All rights reserved. Copyright 1995-8 Sun Microsystems Laboratories. All rights reserved. Copyright 1993-5 Xerox Corporation. All rights reserved. License is granted to copy, to use, and to make and to use derivative works for any purpose, provided that the copyright notice and this license notice is included in all copies and any derivatives works and in all related documentation. Xerox, Sun, and Ajuba Solutions grant no other licenses expressed or implied and the licensee acknowleges that Xerox, Sun and Ajuba Solutions have no liability for licensee's use or for any derivative works made by licensee. The Xerox and Sun names shall not be used in any advertising or the like without their written permission. This software is provided AS IS. XEROX CORPORATION, SUN MICROSYSTEMS, SCRIPTICS, AND BRENT WELCH DISCLAIM AND LICENSEE AGREES THAT ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS EXPRESSLY DISCLAIMED, INCLUDING CONSEQUENTIAL OR ANY OTHER INDIRECT DAMAGES, WHETHER ARISING IN CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION, SUN MICROSYSTEMS OR AJUBA SOLUTIONS IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. exmh-2.8.0/exmhcomp000664 001047 000144 00000001067 10216421043 014524 0ustar00welchusers000000 000000 #!/usr/bin/wish wm withdraw . set exmh_path /usr/local/bin set exmh_bin exmh # if exmh isn't running , start it up and wait till it's there before continuing if {[lsearch [winfo interps] $exmh_bin ]==-1} { exec $exmh_path/$exmh_bin -iconic 2>1 > /dev/null & while {[lsearch [winfo interps] $exmh_bin ]==-1} { after 200 } } if { 0 == [string length $argv] } { send exmh Msg_Compose exit 0 } else { if { 0 == [string first "mailto:" $argv 0] } { send exmh Msg_Mailto $argv } else { send exmh Msg_CompTo $argv } exit 0 } exmh-2.8.0/version.sed000664 001047 000144 00000000040 10166147002 015135 0ustar00welchusers000000 000000 s/2.7.0/2.7.2/g s/2.7.1/2.7.2/g exmh-2.8.0/install.tcl000644 001047 000144 00000063345 10101304331 015131 0ustar00welchusers000000 000000 # # # install.tcl - Installation support # option add *Entry.background white startup option add *Entry.foreground black startup option add *Button.padX 1 startup option add *Button.padX 1 startup option add *Button.highlightThickness 0 startup option add *Entry.relief flat startup option add *Entry.highlightThickness 0 startup option add *font fixed startup option add *Text.c_link blue startup proc install_init { appName dotFile } { global install tk_version tk_patchLevel tcl_version tcl_patchLevel # Work around namespaces issue in Tk8.4a2 and later if [info exists tk_version] { if {$tk_version > "8.3"} { ::tk::unsupported::ExposePrivateCommand tkEntryBackspace } } set install(appName) $appName install_progVar wish [installGuessPath /usr/local/bin/wish wish] {wish absolute pathname} set install(dotFile) $dotFile if [file readable $dotFile] { if [catch {uplevel #0 source $dotFile} msg] { puts stderr "source $dotFile: $msg" } } else { if {[catch {glob ../$appName*/$dotFile} files] == 0} { installAlternates $files 1 } } } proc installAlternates { files isdefault } { wm withdraw . toplevel .config set fm [frame .config.rim -bd 10] message $fm.msg -aspect 1500 -text \ "Please select an alternate configuration." pack $fm -fill both -expand 1 pack $fm.msg set id 0 foreach f $files { button $fm.but$id -text $f -command [list installConfig $f $isdefault] pack $fm.but$id -fill both -expand 1 incr id } button $fm.but$id -text "Ignore configurations" -command installConfig pack $fm.but$id -fill both -expand 1 tkwait window .config wm deiconify . } proc installConfigs {} { global install if {[catch {glob ../$install(appName)*/$install(dotFile)*} files] == 0} { installAlternates $files 0 } } proc installConfig { {file {}} {isdefault 1} } { global install installFeedback "installConfig $file" if {$file != {}} { if [catch {uplevel #0 source $file} msg] { installFeedback $msg return } if {! $isdefault} { set install(dotFile) $file installUpdateAll } } destroy .config } proc install_var { var value {comment {}} } { global install lappend install(sequence) $var set install(field,$var) [list $var $value $comment] } proc install_version { var version {comment {}} } { global install if {$comment == {}} { if [info exists install(appName)] { set comment "$appName version stamp" } else { set comment {Version stamp} } } set install(versionVar) $var install_var $var $version $comment } proc install_name { name value comment } { global install set install(namevar) $name install_var $name $value $comment } proc install_dir { name value comment } { global install lappend install(dirlist) $name install_var install(dir,$name) $value $comment } proc install_glob { name args } { global install set install(glob,$name) $args } proc install_dirVar { var pathname comment } { install_var $var $pathname $comment global install lappend install(dircheck) $var set install(dircheck,$var) $comment } proc install_fileVar { var pathname comment } { install_var $var $pathname $comment global install lappend install(filecheck) $var set install(filecheck,$var) $comment } proc install_progVar { var pathname comment } { install_var $var $pathname $comment global install lappend install(progcheck) $var set install(progcheck,$var) $comment } proc install_sed { suffix args } { global install set install(sedSuffix) $suffix set install(sedProgs) $args } proc install_libDir {var pathname comment} { global install install_dirVar $var $pathname $comment set install(libDirVar) $var } proc install_testLib { pathname } { global install set install(testLib) $pathname } proc install_expect { var pathname comment } { install_var $var $pathname $comment global install set install(expectVar) $var lappend install(progcheck) $var set install(progcheck,$var) $comment } proc install_ps { var cmd comment } { install_var $var $cmd $comment global install set install(psVar) $var } proc installFieldVar { item } { lindex $item 0 } proc installFieldComment { item } { lindex $item 2 } proc installFieldDefault { item {override 0} } { set default [lindex $item 1] if {$override} { return $default } set varName [installFieldVar $item] if [catch {installGetValue $varName} value] { return $default } else { return $value } } proc installGuessDir { defpath file } { global env set tmp $defpath puts "installGuessDir: def=$defpath, file=$file..." foreach dir [split $env(PATH) :] { if {[file exists $dir/$file]} { set tmp $dir break } } puts "returning $tmp\n" return $tmp } proc installGuessPath { defpath file } { global env set tmp $defpath #puts "installGuessPath: def=$defpath, file=$file..." foreach dir [concat /etc /usr/lib/nmh [split $env(PATH) :]] { if {[file exists $dir/$file]} { set tmp $dir/$file break } } #puts "returning $tmp\n" return $tmp } proc install_help { text } { global install set install(helpText) $text } proc installFeedback { text } { global install catch { $install(msg) configure -text $text update } } proc installError { text } { puts stderr $text installFeedback $text } proc installFieldInit {} { global install set install(lastentry) {} } proc installDoField { item {override 0} } { global install if ![info exists install(wuid)] { set install(wuid) 0 } incr install(wuid) set f [frame .fields.import$install(wuid) -relief raised] set var [installFieldVar $item] button $f.label -text [format "%-30s:" [installFieldComment $item]] \ -command "installShowValue $var" -font fixed entry $f.entry -font fixed -width 40 $f.entry insert 0 [installFieldDefault $item $override] bind $f.entry [list installSetValue $var] if {$install(lastentry) != {}} { bind $install(lastentry) [list focus $f.entry] } else { set install(firstentry) $f.entry } set install(lastentry) $f.entry set install(entry,$var) $f.entry lappend install(allEntries) $f.entry pack $f -side top -expand true -fill both pack $f.label -side left -padx 3 pack $f.entry -side right -expand true -fill both return $f } proc installUpdateField { item {override 0} } { global install set var [installFieldVar $item] set entry $install(entry,$var) $entry delete 0 end $entry insert 0 [installFieldDefault $item $override] } proc installFieldDone {} { global install if {[info exists install(firstentry)] && \ [info exists install(lastentry)]} { bind $install(lastentry) [list focus $install(firstentry)] } } proc installSetValue { varName } { global install if [info exists install(entry,$varName)] { set value [$install(entry,$varName) get] upvar #0 $varName var set var $value } } proc installGetValue { var } { if [string match *(* $var] { set arrayName [lindex [split $var (] 0] global $arrayName } else { global $var } return [set $var] } proc installShowValue { var } { global install if [info exists install(entry,$var)] { installSetValue $var set entry $install(entry,$var) $entry select from 0 $entry select to end focus $entry } } proc installVerify {} { global install installFeedback "Checking Pathnames..." set errors {} if [info exists install(dircheck)] { foreach var $install(dircheck) { installSetValue $var set path [installGetValue $var] if {[string length $path] == 0} { continue } if ![file isdirectory $path] { set willMakeDir 0 foreach dirType $install(dirlist) { if {![info exist install(dir,$dirType)]} { installSetValue install(dir,$dirType) } set newdir $install(dir,$dirType) if {$newdir == $path} { set willMakeDir 1 } } if {! $willMakeDir} { lappend errors [format "%-30s <%s> %s" \ $install(dircheck,$var) $path "not a directory"] } } if ![regexp ^/ $path] { lappend errors [format "%-30s Warning: <%s> %s" \ $install(dircheck,$var) $path "is not an absolute pathname"] } } } if [info exists install(filecheck)] { foreach var $install(filecheck) { installSetValue $var set path [installGetValue $var] if {[string length $path] == 0} { continue } if ![file exists $path] { lappend errors [format "%-30s <%s> %s" \ $install(filecheck,$var) $path "does not exist"] } if ![regexp ^/ $path] { lappend errors [format "%-30s Warning: <%s> %s" \ $install(filecheck,$var) $path "is not an absolute pathname"] } } } if [info exists install(progcheck)] { foreach var $install(progcheck) { installSetValue $var ;# Snarf current value from entry set path [installGetValue $var] if {[string length $path] == 0} { continue } if ![file executable $path] { lappend errors [format "%-30s <%s> %s" \ $install(progcheck,$var) $path "is not executable"] } if ![regexp ^/ $path] { lappend errors [format "%-30s Warning: <%s> %s" \ $install(progcheck,$var) $path "is not an absolute pathname"] } } } if [info exists install(psVar)] { installSetValue $install(psVar) ;# Snarf current value from entry set cmd [installGetValue $install(psVar)] if [catch {eval exec $cmd [pid]} err] { lappend errors [format "%-30s Warning: <%s> %s" \ "ps command" "$cmd [pid]" $err] } } if {$errors != {}} { installFeedback "Verify errors" } else { installFeedback "Verify OK" return } if {[winfo exists .verify]} { destroy .verify } toplevel .verify frame .verify.top button .verify.top.quit -text "Dismiss" -command {destroy .verify} label .verify.top.label -text " Verify Errors " pack .verify.top -side top -fill both -expand true pack .verify.top.quit -side left pack .verify.top.label -side left -fill both set numLines [llength $errors] if {$numLines < 30} { text .verify.t -width 80 -height $numLines -font fixed pack .verify.t -side bottom -expand true -fill both } else { text .verify.t -width 80 -height 30 -yscrollcommand {.verify.s set} -font fixed scrollbar .verify.s -orient vert -command {.verify.t yview} pack .verify.s -side right -fill y pack .verify.t -side left -expand true -fill both } foreach line $errors { .verify.t insert end $line\n } } proc installSed { } { global install program set id 0 while {[catch {open /tmp/sed.$id w} script]} { incr id if {$id > 100} { installFeedback "installSed: Cannot create sed script in /tmp" return } } installSetValue wish ;# Get current value from entry widget set w [installGetValue wish] foreach sep {, ` ~ ? &} { if {![string match *$sep* $w]} { break } } puts $script "s$sep#!wish$sep#!$w$sep" # Set up for helper expect scripts, if needed and if possible if [info exists install(expectVar)] { installSetValue $install(expectVar) set pathname [installGetValue $install(expectVar)] if {$pathname != {}} { foreach sep {, ` ~ ? &} { if {![string match *$sep* $pathname]} { break } } puts $script "s${sep}exec expect${sep}exec $pathname$sep" } } # Insert configuration information puts $script /^#CONFIGURATION/a\\ foreach v $install(sequence) { set item $install(field,$v) set var [installFieldVar $item] installSetValue $var puts $script [list set $var [installGetValue $var]] nonewline puts $script \\ } puts $script "" close $script set name [installGetValue $install(namevar)] foreach prog $install(sedProgs) { regsub $program $prog $name newfile if [catch { exec sed -f /tmp/sed.$id < ${prog}$install(sedSuffix) > $newfile exec chmod a+x $newfile } msg] { installFeedback "sed error on $prog: $msg" } } exec rm /tmp/sed.$id } proc installPatch {} { global install program installSave installVerify installSed set sample [lindex $install(sedProgs) 0] set name [installGetValue $install(namevar)] regsub $program $sample $name name catch {exec diff -c ${sample}$install(sedSuffix) $name} diff catch {destroy .test} set numLines [llength [split $diff \n]] if {$numLines == 0} { installFeedback "No diffs after patching" return } if {[winfo exists .test]} { destroy .test } toplevel .test frame .test.top button .test.top.quit -text "Dismiss" -command {destroy .test} label .test.top.label -text " Context diff of $sample" pack .test.top -side top -fill both -expand true pack .test.top.quit -side left pack .test.top.label -side left -fill both installFeedback "$numLines lines of diff output" if {$numLines < 30} { text .test.t -width 80 -height $numLines -font fixed pack .test.t -side bottom -expand true -fill both } else { text .test.t -width 80 -height 30 -yscrollcommand {.test.s set} -font fixed scrollbar .test.s -orient vert -command {.test.t yview} pack .test.s -side right -fill y pack .test.t -side left -expand true -fill both } .test.t insert end $diff } proc install_test { args } { global install set install(test) $args } proc installTest {} { global install # Run patch again with testing library, if it is defined if {[info exists install(testLib)] && [info exists install(libDirVar)]} { set var $install(libDirVar) if [info exists install(entry,$var)] { set realValue [$install(entry,$var) get] $install(entry,$var) delete 0 end $install(entry,$var) insert 0 $install(testLib) installSed } } if [info exists install(test)] { set name [installGetValue $install(namevar)] regsub exmh $install(test) $name test installFeedback $test eval $test } else { installFeedback "No install_test command" } if [info exists realValue] { $install(entry,$var) delete 0 end $install(entry,$var) insert 0 $realValue } } proc installTclIndex {} { installFeedback "Refreshing ./lib/tclIndex" auto_mkindex ./lib *.tcl installFeedback "" } proc installButton {} { button .rim.buttons.yes -text "Really Install" -command {installInner} button .rim.buttons.no -text "Cancel" -command {installCancel} pack forget .rim.buttons.install pack .rim.buttons.no .rim.buttons.yes -side left } proc installSave { } { global install argv0 # Save it installSetValue install(dotFile) if [catch {open $install(dotFile) w} out] { installFeedback "Cannot write $install(dotFile)" return } if ![info exists argv0] { set argv0 $install(appName).install } puts $out "# Saved state from $argv0" puts $out "# [exec date]" foreach v $install(sequence) { set item $install(field,$v) set varName [installFieldVar $item] installSetValue $varName set value [installGetValue $varName] puts $out [list set $varName $value] } close $out installFeedback "Saved settings in $install(dotFile)" } proc installCancel {} { after 10 { destroy .rim.buttons.yes ; destroy .rim.buttons.no pack .rim.buttons.install -before .rim.buttons.quit -side left } } proc installCmd { logProc unixCmd } { if {$logProc != "nolog"} { $logProc $unixCmd } else { eval exec $unixCmd } } proc installInner { {logProc nolog} } { global install program installVerify installSed foreach dirType $install(dirlist) { # # Install directory - make sure it exists # set dir $install(dir,$dirType) MakeDir $logProc $dir if {($logProc == "nolog") && ![file isdirectory $dir]} { installError "LibDir $dir is not a directory" continue } if [info exists install(glob,$dirType)] { # # Tweak program name # if {$dirType == "bin"} { set newglob {} set name [installGetValue $install(namevar)] foreach pat $install(glob,bin) { regsub $program $pat $name pat lappend newglob $pat } } else { set newglob $install(glob,$dirType) } # # Install glob pattern - copy the files in # foreach f [eval glob $newglob] { if [catch { set t [file tail $f] if {$dirType == "man"} { # Hack to tweak file suffix set end [expr [string length $dir]-1] set suffix [string index $dir $end] set newf [file root $t].$suffix } else { set newf $t } if [file isdirectory $f] { installCmd $logProc [list rm -rf $dir/$newf] installCmd $logProc [list cp -r $f $dir/$newf] installCmd $logProc [list chmod a+rx $dir/$newf] installCmd $logProc [list chmod -R a+r $dir/$newf] } else { installCmd $logProc [list rm -f $dir/$newf] installCmd $logProc [list cp $f $dir/$newf] } if {$dirType == "bin"} { installCmd $logProc [list chmod a+rx $dir/$newf] } else { installCmd $logProc [list chmod a+r $dir/$newf] } } msg] { installFeedback "Dir install $f error: $msg" return } else { if {$logProc == "nolog"} { installFeedback "Installed $newf" } } } } } if {$logProc == "nolog"} { installCancel installFeedback "Install complete" } } proc MakeDir { logProc dir } { if [file isdirectory $dir] { return 1 } elseif [file exists $dir] { installError "LibDir $dir is not a directory" return 0 } else { if [MakeDir $logProc [file dirname $dir]] { installCmd $logProc [list mkdir $dir] installCmd $logProc [list chmod a+rx $dir] return 1 } else { return 0 } } } proc installFake {} { global exmh install if {[winfo exists .fake]} { destroy .fake } toplevel .fake wm title .fake "Install Actions" wm iconname .fake "Install Actions" frame .fake.top button .fake.top.quit -text "Dismiss" -command {destroy .fake} label .fake.top.label -text " Pending install actions" pack .fake.top -side top -fill x pack .fake.top.quit -side left pack .fake.top.label -side left -fill both text .fake.t -width 80 -height 20 -yscrollcommand {.fake.s set} -font fixed scrollbar .fake.s -orient vert -command {.fake.t yview} pack .fake.s -side right -fill y pack .fake.t -side left -expand true -fill both proc log { text } { .fake.t insert end $text\n } installInner log } proc install_dialog {} { global install wm title . "Exmh Install" wm iconname . "Exmh Install" wm minsize . 200 200 update idletasks installBindInit frame .x canvas .can -yscrollcommand ".x.scroll set" scrollbar .x.scroll -command ".can yview" pack .x.scroll -side right -fill y -padx 2 -pady 5 pack .can -in .x -side top -expand true -fill both -padx 5 -pady 5 pack .x -side top -expand true -fill both frame .fields -relief flat .can create window 0 0 -anchor nw -window .fields installFieldInit foreach v $install(sequence) { if {$v == $install(versionVar)} { set override 1 ;# over-ride saved value with new version num. } else { set override 0 } set f [installDoField $install(field,$v) $override] } installFieldDone tkwait visibility $f set bbox [.can bbox all] set dy [winfo height $f] .can config -scrollregion $bbox \ -width [winfo width .fields] \ -height [expr 10 * $dy] \ -yscrollincrement $dy frame .rim -bd 5 -relief flat pack .rim -side top -fill x set install(msg) [label .rim.feedback -text "" -anchor w -padx 10] pack $install(msg) -side top -expand true -fill both frame .rim.buttons -relief raised pack .rim.buttons -side top -expand true -fill both button .rim.buttons.quit -text "Quit" -command {exit} button .rim.buttons.keys -text "Keys" -command {installBindKeys} button .rim.buttons.conf -text "Conf" -command {installConfigs} button .rim.buttons.patch -text "Patch" -command {installPatch} button .rim.buttons.test -text "Test" -command {installTest} button .rim.buttons.verify -text "Verify" -command {installFake} button .rim.buttons.install -text "Install" -command {installButton} button .rim.buttons.tclindex -text "TclIndex" -command {installTclIndex} frame .rim.buttons.space -width 10 -height 10 button .rim.buttons.readme -text "I have read the instructions" \ -command install_pack_buttons pack .rim.buttons.readme -side left pack .rim.buttons.readme -side left pack .rim.buttons.quit -side right } proc install_pack_buttons {} { pack forget .rim.buttons.readme pack .rim.buttons.patch \ .rim.buttons.tclindex \ .rim.buttons.test \ .rim.buttons.verify \ .rim.buttons.space \ .rim.buttons.install -side left pack \ .rim.buttons.quit \ .rim.buttons.keys \ .rim.buttons.conf -side right } proc installUpdateAll {} { global install foreach v $install(sequence) { if {$v == $install(versionVar)} { set override 1 ;# over-ride saved value with new version num. } else { set override 0 } installUpdateField $install(field,$v) $override } } proc installBindInit {} { global install set install(key,selpaste) set install(key,seldelete) set install(key,backspace) set install(key,backspace2) set install(key,backspace3) set install(key,deleol) set install(key,delword) d ;# forwardly set install(key,delchar) set install(key,linestart) set install(key,lineend) set install(key,backword) b set install(key,forwword) f set install(key,backchar) set install(key,forwchar) installBindEntry } proc installBindKeys {} { global install toplevel .keys wm title .keys "Install Edit Preferences" wm iconname .keys "Install Edit Preferences" frame .keys.b pack .keys.b -side top -fill x button .keys.b.quit -text Dismiss -command {destroy .keys} button .keys.b.apply -text Apply -command installBindSet message .keys.msg -aspect 1500 -text \ "Key bindings for the installation tool. Changes *do not* carry over to $install(appName)" set f [frame .keys.p -bd 10] pack .keys.b .keys.msg .keys.p -side top -fill x pack .keys.b.quit .keys.b.apply -side right set width 0 foreach item [array names install] { if [string match key* $item] { set name [lindex [split $item ,] 1] set w [string length $name] if {$w > $width} { set width $w } } } foreach item [lsort [array names install]] { if [string match key* $item] { set name [lindex [split $item ,] 1] set keystroke $install($item) installKeyItem $f $width $name $keystroke } } } proc installKeyItem { frame width name keystroke } { global install frame $frame.$name label $frame.$name.label -text $name -width $width entry $frame.$name.entry set install(keyval,$name) $frame.$name.entry $frame.$name.entry insert 0 $keystroke lappend install(allEntries) $frame.$name.entry pack $frame.$name pack $frame.$name.label -side left pack $frame.$name.entry -side right -fill x -expand 1 } proc installBindSet {} { global install # Clear old bindings foreach item [array names install] { if [string match key,* $item] { set name [lindex [split $item ,] 1] bind Entry $install(key,$name) { } } } foreach item [array names install] { if [string match keyval,* $item] { set name [lindex [split $item ,] 1] set install(key,$name) [$install(keyval,$name) get] } } installBindEntry Entry } proc installBindEntry { {list {}} } { if {$list == {}} { installBindEntryInner Entry } else { foreach entry $list { installBindEntryInner $entry } } } proc installBindEntryInner { what } { global install # Modification bindings bind $what { } ;# no-op bind $what $install(key,selpaste) { catch { %W insert insert [selection get] } } bind $what $install(key,seldelete) { catch {%W delete sel.first sel.last} } set bsProc tkEntryBackspace foreach bs {backspace backspace2 backspace3} { bind $what $install(key,$bs) "$bsProc %W" } bind $what $install(key,deleol) { %W delete insert end } bind $what $install(key,delword) { info library } bind $what $install(key,delchar) { %W delete insert } bind $what $install(key,linestart) { %W icursor 0 } bind $what $install(key,lineend) { %W icursor end } bind $what $install(key,backword) { set string [%W get] set curs [expr [%W index insert]-1] if {$curs < 0} return for {set x $curs} {$x > 0} {incr x -1} { if {([string first [string index $string $x] " \t"] < 0) && ([string first [string index $string [expr $x-1]] " \t"] >= 0)} { break } } %W icursor $x } bind $what $install(key,forwword) { set string [%W get] set curs [expr [%W index insert]+1] set len [string length $string] if {$curs < 0} return for {set x $curs} {$x < $len} {incr x} { if {([string first [string index $string $x] " \t"] < 0) && ([string first [string index $string [expr $x+1]] " \t"] >= 0)} { break } } %W icursor $x } bind $what $install(key,backchar) { set x [%W index insert] if {$x > 0} { incr x -1 %W icursor $x } } bind $what $install(key,forwchar) { set x [%W index insert] incr x %W icursor $x } } proc install_html {html} { global install program auto_path exwin widgetText lappend auto_path ./lib option add *Text*background white option add *Text*foreground black option add *Text*highlightBackground white option add *Text*highlightColor black proc Exmh_Status {string} {installFeedback $string} Env_Init set widgetText(smoothScroll) 0 set exwin(mtext) [Html_Display $html file:[file join [pwd] [info script]]] } exmh-2.8.0/exmh-async.MASTER000650 001047 000144 00000001511 10063341412 015740 0ustar00welchusers000000 000000 #!wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) # Arg2-end: editor command, including pathname # LastArg: pathname of draft message # package require Tk wm withdraw . # simple argv cracking set exmh [lindex $argv 0] set editorCmd [lrange $argv 1 end] set draftpath [lindex $argv [expr {[llength $argv] - 1}]] set draftm [file tail $draftpath] send $exmh [list Edit_Ident [winfo name .]] # Used to do a split/join on $editorCmd to allow quoted -geom arguments. # But that totally screws some arguments, like # exmh-async gvim -c {cal SetSyn("mail")} # other interesting cases are # exmh-async xterm -geom +0+0 -e vi {+/^[-]*$} if [catch {eval exec $editorCmd} err] { send $exmh [list Exmh_Status "exmh-async: editor failed: $err" purple] } send $exmh EditDialog $draftm exit 0 exmh-2.8.0/exmh-bg.MASTER000754 001047 000144 00000013012 11743564224 015235 0ustar00welchusers000000 000000 #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module # in the main exmh application. In particular, the time-consuming things # like running inc are done here instead of the main-line. # # Copyright (c) 1993-8 Brent Welch # Copyright (c) 1993 Xerox Corporation. # Copyright (c) 1996-8 Sun Microsystems # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # and Sun Microsystems # make no warranty about the software, its performance or its conformity to # any specification. #CONFIGURATION #END CONFIGURATION package require Tk wm withdraw . if {$argc < 3} { puts stderr "exmh-bg requires some arguments:" puts stderr "Usage: exmh-bg interpName libDirectory mh_path" exit 1 } set exmh(interp) [lindex $argv 0] set exmh(library) [lindex $argv 1] set mh_path [lindex $argv 2] proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path if [file exists $path/tclIndex] { set auto_path "$path $auto_path" # auto_reset call eliminated } } auto_path_update $exmh(library) # Support per-user directory containing .tcl files. foreach exmh(userLibrary) [list [glob ~]/.exmh/lib [glob ~]/.tk/exmh] { if {[file exists [file join $exmh(userLibrary) tclIndex]]} { auto_path_update $exmh(userLibrary) ;# library for new modules break } } # Set up environment variables Env_Init proc Exmh_Status { string args } { # Just a stub version until we rendez-vous with the front end. # If the userLibrary Preferences_Add is done after we define the # full blown Exmh_Status, then the auto_path_update and its # auto_reset seem to result in the Exmh_Status from main.tcl # being faulted in from the library. catch {puts stderr "exmh-bg: $string"} } # Tk 4.0b3 bogosity if [catch {tk colormodel .}] { rename tk tk-orig proc tk { option args } { switch -- $option { colormodel { if {[winfo depth $args] > 4} { return color } else { return monochrome } } default { return [eval {tk-orig $option} $args] } } } } Preferences_Init ~/.exmh/exmh-defaults $exmh(library)/app-defaults if [catch {User_Init} err] { catch {puts stderr "User_Init: $err"} } proc Exmh_Debug { args } { global exmh if [info exists exmh(pid)] { BgRPC Exmh_Debug exmh-bg $args } else { catch {puts stderr "exmh-bg $args"} } } # Register ourselves with the UI proc BgRegister { exmhInterp } { global exmh set exmh(sendErrors) 0 if {[catch { send $exmhInterp [list Background_Register [winfo name .] [pid]] } alist] == 0} { # set bg parameters returned as a result of registration foreach pair $alist { set _var [lindex $pair 0] set _val [lindex $pair 1] uplevel #0 [list set $_var $_val] } return 1 } else { if [regexp {no registered interpreter} $alist] { catch {puts stderr "exmh-bg lost UI - exiting."} exit } catch {puts stderr "BgRegister $alist"} return 0 } } set ok 0 foreach try {1 2 3 4 5} { set ok [BgRegister $exmh(interp)] if {$ok} { break } exec sleep [expr $try*$try] } if {! $ok} { catch { puts stderr \ "exmh-bg cannot rendez-vous with UI - exiting. Usually this is because Tk send is not working. Check the notes under Frequently Asked Questions #4a and #4b. You can find this under the Help menu." } exit 1 } proc Exmh_Status { string {color black} } { global exmh if [info exists exmh(instatus)] { catch {puts stderr "exmh-bg: $string"} return } set exmh(instatus) 1 # All this code to evaluate something that should be evaluated in # the main Exmh interpreter if BgRPC suceeds - and if we call our stub # Exmh_Status the value is ignored anyhow. # if ![info exists exmh(c_st_bg_msgs)] { # if {[tk colormodel .] == "color"} { # set exmh(c_st_bg_msgs) [option get . c_st_bg_msgs {}] # if {$exmh(c_st_bg_msgs) == {}} { # set exmh(c_st_bg_msgs) [option get . bgMsgColor {}] # if {$exmh(c_st_bg_msgs) != {}} { # puts stderr "Warning: old resource bgMsgColor, changed to c_st_bg_msgs" # } else { # set exmh(c_st_bg_msgs) "medium sea green" # } # } # } else { # set exmh(c_st_bg_msgs) [option get . c_st_bg_msgs {}] # if {$exmh(c_st_bg_msgs) == {}} {set exmh(c_st_bg_msgs) black} # if {$exmh(c_st_bg_msgs) != "white" && $exmh(c_st_bg_msgs) != "black"} { # set exmh(c_st_bg_msgs) black # } # } # } BgRPC Exmh_Status $string background unset exmh(instatus) } proc Exmhbg_Done {interp} { # Die asynchronously so the front-end gets a response # to its send request first. Set a dead flag so BgRPC # doesn't try to talk to the front end global exmh if {$exmh(interp) == $interp} { set exmh(dead) 1 after 1 { catch {Audit_CheckPoint} destroy . } } } # Now do things periodically. We fault in routines from # the regular library of exmh procedures. The Inc'ing # routines have been tweaked to understand the (possible) # split into a separate process, and the above hack to # Exmh_Status handles the simpler cases. Mh_Init Inc_Init Ftoc_Init ;# Need ftoc(scanWidth) Flist_Init Seq_Init ;# Need seqwin(nevershow) Post_Init set busy(style) none Background_Init Background_DoPeriodic exmh-2.8.0/exmh-strip.MASTER000755 001047 000144 00000032030 11743564224 016010 0ustar00welchusers000000 000000 #!wish #(Note - you should also be able to use tclsh with this.) # # Utility to strip out attachments from MIME messages. # They are replaced with references to the external files. # # You must supply the input message destination directory on the command line. # This does not handle nested multiparts correctly. So, if you # forward a message with attachments, the message/rfc822 layer # outside the multipart/mixed will foil it. # # The original message is put into a "strip_backup" folder. It # is replaced with a message containing message/external-body parts # that reference the saved attachment. # # This script is invoked from a procedure like the following, # which is now build into mime.tcl. There is also a MIME preference # to choose the save directory, which is hardwired in this example. proc Mime_SaveAttachments {} { global msg exec [glob ~/bin/exmh-strip] $msg(path) [glob ~/doc] Msg_ShowCurrent } # You can also use this from a small shell script, e.g.: if {0} { #!/bin/csh tclsh8.3 ~/bin/exmh-strip `mhpath cur` ~/doc ls -lt ~/doc | head -2 } # Here are some resources for your exmh-defaults that add this to a new menu. # *Mops.umenulist: repl2 # *Mops.repl2.text: Welch # *Mops.repl2.m.entrylist: save sep # *Mops.repl2.m.t_sep: separator # *Mops.repl2.m.l_save: Save Attachments # *Mops.repl2.m.c_save: Save_Attachments # # Copyright (c) 2001 Brent Welch # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and no one # makes any arranty about the software, its performance or its conformity to # any specification. #CONFIGURATION #END CONFIGURATION if {[catch {wm withdraw .}]} { # Stub out stuff when not running under wish proc option {args} {return ""} proc winfo {args} {return ""} set pref(panes) "" set exmh(userLibrary) "" } if {$argc < 2} { puts stderr "exmh-strip requires some arguments:" puts stderr "Usage: exmh-strip msg_path doc_directory" exit 1 } set msg_path [lindex $argv 0] set doc_directory [lindex $argv 1] set uniq 0 ;# for content-ID generation proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path if [file exists $path/tclIndex] { set auto_path "$path $auto_path" catch {auto_reset} ;# Needed for per-user override, but breaks w/ TCLX } } auto_path_update $exmh(library) # Set up environment variables Env_Init proc Exmh_Status { string args } { catch {puts stdout $string} } proc Exmh_Debug { args } { switch -glob -- $args { Pref_Add* { return } {*MH anno*} { return } {*Unable to load Img*} { return } MimeTypes* { return } default { catch {puts stdout [join $args]} } } } # We fault in routines from the regular library of exmh procedures. # We shouldn't depend on per-user code, so just hardwire userLibrary set exmh(userLibrary) ~/.exmh Preferences_Init "~/.exmh/exmh-defaults" "$exmh(library)/app-defaults" Mh_Init Mime_Init Pgp_Base_Init proc dummy_tk_window {args} { # Ignore everything done to the window } # Procedure to strip out attachments. # Unfortunately we have to rip out various code sections # from mime.tcl proc Mime_Strip {fileName} { global mime mimeHdr # Stuff from MsgShowInText set part 0 set subpart 1 set mimeHdr($part=$subpart,hdr,cur) {} set mimeHdr($part=$subpart,hdr,from) {} set mimeHdr($part=$subpart,hdr,date) {} set mimeHdr($part=$subpart,hdr,subject) {} set mimeHdr($part=$subpart,hdr,x-face) {} set mimeHdr($part=$subpart,hdr,x-image-url) {} set mimeHdr($part=$subpart,hdr,newsgroups) {} set mimeHdr($part=$subpart,fullHeaders) $mime(fullHeaders) set mimeHdr($part=$subpart,yview) 1.0 set mimeHdr($part,decode) 1 set mimeHdr($part,file) $fileName set mimeHdr($part,rawfile) $fileName #set mimeHdr($part,color) [lindex [$win configure -background] 4] set mimeHdr($part,color) "" set mimeHdr($part,type) message/rfc822 set mimeHdr($part,encoding) 7bit set mimeHdr($part,hdr,content-type) message/rfc822 set mimeHdr($part,HeaderSize) 0 set mimeHdr($part,display) 1 global mimeFont if ![info exists mimeFont(default)] { set mimeFont(title) "" set mimeFont(note) "" set mimeFont(default) "" } set partTag [MimeLabel $part part] set defaultTag [MimeLabel $part=1 part] # From MimeSetPartVars if [catch {open $fileName r} fileIO] { Exmh_Status "Cannot open body $fileName: $fileIO" set mimeHdr($part,numParts) 0 return 0 } # Open shadow output for new version of stipped message if [catch {open ${fileName}.strip w} out] { Exmh_Status "Cannot open body ${fileName}.strip: $out" set mimeHdr($part,numParts) 0 close $fileIO return 0 } set result [MimeParseSingle $part $fileIO $out] MimeClose $fileIO close $out if {!$result} { # No attachements found file delete ${fileName}.strip } else { file mkdir [file join [exec mhpath +] strip_backup] file rename ${fileName} [exec mhpath +strip_backup new] file rename ${fileName}.strip ${fileName} } return $result } # Modified version of MimeParseSingle from lib/mime.tcl proc MimeParseSingle {part fileIO out} { global mimeHdr mime miscRE msg global doc_directory set mimeHdr($part=1,color) $mimeHdr($part,color) set part $part=1 set mimeHdr($part,hdrs) {} set uniq 0 # Skip any blank lines or "ugly uucp-style From_ lines" at the frontend. while {([set numBytes [gets $fileIO line]] == 0) || [regexp {^(>?From |[ ]+$)} $line]} { puts $out $line } puts $out $line # Parse headers set headers "" if [regexp {^([^: ]+):} $line] { while {$numBytes > 0} { if {[regexp -- {^-*$} $line]} { # Drafts-folder message break } if ![regexp {^[ ]} $line] { if [regexp -indices {^([^:]+):} $line match hdr] { set cur [string tolower \ [eval {string range $line} $hdr]] if {[lsearch $mimeHdr($part,hdrs) $cur] >= 0} { # Duplicate header set cur :$uniq:$cur incr uniq } set mimeHdr($part,hdr,$cur) \ [string trim \ [string range $line \ [expr [lindex $match 1]+1] end]] lappend mimeHdr($part,hdrs) $cur } } elseif [regexp -indices {^[ ]+} $line match] { append mimeHdr($part,hdr,$cur) \n$line } set numBytes [gets $fileIO line] append headers $line\n } if [catch {set mimeHdr($part,hdr,content-type)} contentType] { set contentType text/plain } if [catch {set mimeHdr($part,hdr,content-transfer-encoding)} encoding] { set encoding 7bit } if {[string compare $contentType X-sun-attachment] == 0} { set contentType "multipart/x-sun-attachment; boundary=--------" set mimeHdr(0=1,hdr,mime-version) x-sun-attachment } set encoding [string trim [string tolower $encoding] \ \" ] set type [MimeHeader $part $contentType $encoding] if {[string compare $part "0=1"] == 0} { set mimeHdr($part,decode) \ [expr {$mime(enabled) && [info exists mimeHdr(0=1,hdr,content-type)]}] } } else { # Weird no header case Exmh_Status "no headers" return 0 } if {$numBytes >= 0} { if {[string match multipart/* $type]} { # Look through parts for attachements to strip puts $out $headers return [MimeChopPart $part $fileIO $out] } elseif {![regexp {^(text|message)/.*} $type]} { # Skip text and message types set body [read $fileIO] return [MimeStripPart $part $headers $body $out] } } return 0 } proc MimeStripPart {part headers body out} { global mimeHdr doc_directory uniq # Grab a hint for the filename from the part headers # The param,* are parameters to the Content-Type header # and other headers, especially Content-Disposition # The hdr,* are other headers. foreach hint { param,filename hdr,content-description param,name } { if {[info exist mimeHdr($part,$hint)]} { set path $mimeHdr($part,$hint) break } } if {![info exist path]} { # Not an interesting thing - e.g., "vcard" junk or text return 0 } set path [file tail $path] set path [string trim $path] if {[regexp {^\|} $path]} { catch {puts stderr "Bad filename $path"} exit 1 } set path [file join $doc_directory $path] if {[file exists $path]} { catch {puts stderr "$path exists"} exit 1 } if {[catch {open $path w} newout]} { # Cannot save to suggested file name Exmh_Debug "exmh-strip:MimeStripPart can't open $newout" return 0 } if {[MimeSavePart $part $body $out $newout]} { # Successfully stripped the part - now whack the headers regexp -nocase {content-type[^\n]+} $headers oldtype regsub -nocase {content-transfer-encoding[^\n]+\n} $headers \ {} headers regsub -nocase {content-type.+\n([^\t\n])} $headers \ "Content-Type: message/external-body; name=\"$mimeHdr($part,param,filename)\"; access-type=local-file; directory=\"$doc_directory\"; \\1" headers # Output new headers and stub body puts -nonewline $out $headers\n puts $out $oldtype puts $out "Content-ID: exmh-strip-[clock format [clock seconds] \ -format {%Y-%m-%d-%H-%M-%S}]-[incr uniq]" close $newout return 1 } close $newout return 0 } proc MimeSavePart {part body out newout} { global mimeHdr doc_directory global mime switch -regexp -- $mimeHdr($part,encoding) { (8|7)bit { puts -nonewline $newout $body } base64 { if {[info exist mime(encode)]} { exec $mime(encode) -u -b >@ $newout << $body } else { puts -nonewline $newout [Base64_Decode $body] } } quoted-printable { if {[info exist mime(encode)]} { exec $mime(encode) -u -q >@ $newout << $body } else { puts -nonewline $newout [mime::qp_decode $body] } } .*uue.* - default { # Punting on uuencoded and anything else weird. puts -nonewline $out $body return 0 } } return 1 } proc MimeChopPart {part fileIO out} { # Chop up the parts at this level global mimeHdr if [catch {set mimeHdr($part,param,boundary)} boundary] { Exmh_Status "Invalid MIME Multipart" return 0 } # spaces in boundarys can cause line breaks - cc-mail trash regsub -all "\n *" $boundary { } boundary set type $mimeHdr($part,type) set mimeHdr($part,numParts) \ [MimeParseMulti $part $fileIO $boundary \ [expr {($type == "multipart/digest") ? \ "message/rfc822" : "text/plain"}] $out] } proc MimeParseMulti {part fileIO boundary defType out} { global mimeHdr mime set subpart 0 # Prolog while {([set numBytes [gets $fileIO line]] >= 0) && ([string compare --$boundary $line] != 0) && ([string compare --$boundary-- $line] != 0)} { puts $out $line } puts $out $line ;# Initial boundary while {($numBytes >= 0) && ([string compare --$boundary-- $line] != 0)} { incr subpart catch {unset contentType} # Header set headers "" while {([set numBytes [gets $fileIO line]] > 0) && ([string compare --$boundary-- $line] != 0) && ([string compare --$boundary $line] != 0) && (! [regexp -- {^-*$} $line])} { append headers $line\n if ![regexp {^[ ]} $line] { if [regexp -indices {^([^:]+):} $line match hdr] { set cur [string tolower \ [eval {string range $line} $hdr]] set mimeHdr($part=$subpart,hdr,$cur) \ [string trim \ [string range $line \ [expr [lindex $match 1]+1] end]] lappend mimeHdr($part=$subpart,hdrs) $cur } } elseif [regexp -indices {^[ ]+} $line match] { if {![info exists cur] || [regexp {^[ ]+$} $line]} { # No header! an error is about to occur... } append mimeHdr($part=$subpart,hdr,$cur) \n$line } } if {($numBytes >= 0) && ([string compare --$boundary-- $line] != 0)} { #MimeMapSunHeaders $tkw $part=$subpart if [catch {set mimeHdr($part=$subpart,hdr,content-type)} contentType] { set contentType $defType } if [catch {set mimeHdr($part=$subpart,hdr,content-transfer-encoding)} encoding] { set encoding 7bit } set encoding [string trim [string tolower $encoding] \ \" ] set type [MimeHeader $part=$subpart $contentType $encoding] # The following code *does not* handle nested multiparts. # Body set sep "" set body "" while {([set numBytes [gets $fileIO line]] >= 0) && ([string compare --$boundary $line] != 0) && ([string compare --$boundary-- $line] != 0)} { append body $sep$line set sep \n } catch {unset cur} if {[string match text* $type] || ![MimeStripPart $part=$subpart $headers $body $out]} { # Didn't strip it, have to restore original part puts $out $headers\n$body } puts $out $line ;# Another boundary } if ![info exists contentType] { # Empty body part incr subpart -1 } } return $subpart } Mime_Strip $msg_path exit 0 exmh-2.8.0/exmh.MASTER000754 001047 000144 00000007165 11743564224 014663 0ustar00welchusers000000 000000 #!wish -f # # TK interface to the MH Mail utility # Brent Welch # Original version by # # Copyright (c) 1993-8 Brent Welch # Copyright (c) 1993-5 Xerox Corporation. # Copyright (c) 1996-8 Sun Microsystems # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # and Sun Microsystems # make no warranty about the software, its performance or its conformity to # any specification. # The following lines are patched by exmh.install #CONFIGURATION #END CONFIGURATION package require Tk if {$tcl_version < 8.0} { error "Tcl 8.0 (final release) or higher required." exit 1 } # Do this so popups related to user initialization # appear all alone. wm withdraw . # fonts in tk8.5: short aliases like don't work properly anymore # (confusion with the font face stuff) # recreate the common fallback "fixed" as a copy of TkFixedFont if {$tcl_version > 8.4} { eval font create fixed [font configure TkFixedFont] } proc auto_path_update { path } { # Add library directories to the auto_path, # ensuring that later paths have precedence # and that function override works global auto_path tk_version if [file exists $path/tclIndex] { set auto_path "$path $auto_path" # Used to have an "auto_reset" here, but that has the bad # side effect of causing Tk's entry.tcl and text.tcl files # to reload and redefine top-level Entry and Text bindings # that we change in seditBind.tcl. # catch {auto_reset} ;# Needed for function override } } auto_path_update $exmh(library) if ![file exists $exmh(library)/tclIndex] { if [file exists ./lib/tclIndex] { puts stderr "Warning, using local script library, ./lib" set exmh(library) ./lib } } # Support per-user directory containing .tcl files. # This was originally the ~/.tk/exmh directory, # but then files migrated into ~/.exmh so # a lib subdirectory there is cleaner foreach exmh(userLibrary) [list [glob ~]/.exmh/lib [glob ~]/.tk/exmh] { if {[file exists [file join $exmh(userLibrary) tclIndex]]} { auto_path_update $exmh(userLibrary) ;# library for new modules break } } # Fall through with ~/.tk/exmh as the default because there # are other places in the code that assume exmh(userLibrary) is defined # Set up the environment if {[catch { Env_Init } err]} { puts stderr "Error running Env_Init: $err" puts stderr "This usually means exmh isn't installed right" puts stderr "Check the main exmh script for the CONFIGURATION section" puts stderr "and make sure exmh(library) is a valid absolute pathname" exit 1 } # For WindowMaker, http://www.inf.ufrgs.br/~kojima/wmaker/ wm group . . # For session managers wm command . "$argv0 $argv" catch {wm client . "[exec hostname]"} catch { . configure -cursor left_ptr } # modified by k.furukawa, jul.1994. for kanji # this piece of code enables japanese kanji display if you use # tk-jp extension and JIS code. if you use EUC for MH processing # codes, you may replace JIS with EUC and you may need more works. if {[info commands kanji] == "kanji"} { kanji internalCode JIS option add *Text.Font a14 } # Ensure the user is in a writable directory for @ links if {[string match /* $exmh(library)] && [string match /* $argv0]} { # Don't go anywhere when testing cd } # The rest of the application is defined by routines in the exmh library # The after 1 trick is to ensure we get the built-in error handler. after 1 {Exmh} exmh-2.8.0/exmh.CHANGES000644 001047 000144 00000667642 11744616620 014751 0ustar00welchusers000000 000000 HISTORY cvs repository 04/21/2012 welch@panasas.com Update version to 2.8.0 This changes Makefile exmh.install lib/html/exmh.README.html lib/html/index.html lib/html/software.html cvs repository 04/21/2012 welch@panasas.com Added darwin to ps.tcl "SYS V like systems case Added jpilot scripts to misc, contributed by gerhard.siegesmund@epost.de Added Tar.exclude files used for generating tarball releases Fixed MH references in index.html and software.html Added misc/sequence.patch that reflects my local changes to how sequence information is updated in the UI. This is a non-trivial change, and while it is faster, I think there are some lingering corner cases where it isn't perfect. So, I'm just saving the patch and not committing the change to the code. cvs repository 01/23/2012 az@debian.org repaired gnupg cipher option handling cvs repository az az 01/20/2012 az@debian.org repaired date/time parsing in addr.tcl, which kept address db expiration from working properly cvs repository 12/06/2011 valdis.kletnieks@vt.edu lib/pgpMail.tcl - add code to trim trailing blanks before doing PGP signing/encrypting. cvs repository 04/24/2011 az@debian.org consolidated spell checking options: main on sedit pref page, i-spell specific stuff on its own page. i-spell now an explicit choice among spelling programs. updated all related preference doc strings. updated app defaults to include i-spell whole buffer in the more... menu. updated i-spell sedit hook to enable/disable ispell or i-spell depending on spell checker choice. fixed exmh-async integration of custom spell checker: now in line with ispell. cvs repository az 04/21/2011 az@debian.org mime.tcl: fixed documentation of behaviour of mimeFullHeaders exmh.MASTER: fixed tk8.5 font issue. default choice 'fixed' misinterpreted by tk8.5 as a font face, not XLFD...now fixed defined as alias for TkFixedFont, and aliases are consulted first. still somebody will have to extend the font chooser dialog to cover font faces. cvs repository 09/02/2010 az@debian.org lib/msgShow.tcl: applied Harvey Eneman's patch that fixes handling of rfc2369 list-* headers. cvs repository 08/29/2010 az@debian.org implemented quoting of unknown directives when editing text/enriched mails with sedit (this is a fix for debian bug #175193, http://bugs.debian.org/175193) cvs repository 08/26/2010 valdis.kletnieks@vt.edu Finally found the cause of the exmh Log window breaking - we carry our own lassign that had the parameters in opposite order to what base 8.5 code expects, specifically breaking 'clock format' and who knows what else. So rename our lassign to exmh_lassign. lib/html.tcl, lib/html_formtag.tcl, lib/html_get_http.tcl, lib/html_links.tcl lib/msgShow.tcl, lib/utils.tcl cvs repository 08/26/2010 valdis.kletnieks@vt.edu By default, convert blanks to _ in the 'save as' dialog lib/fileselect.tcl cvs repository 08/26/2010 valdis.kletnieks@vt.edu Heave some tcl 7.0-specific code over the side, 7.1 came out in 1993. Is our core code *really* that old? :) exmh-strip.MASTER exmh-bg.MASTER exmh.MASTER cvs repository 06/20/2008 az@debian.org incorporated a number of patches from debian exmh.l: silence some man warnings lib/mh.tcl: mention install-mh by full path in initial greeting lib/bogo.tcl: add learning-from-stdin for learning ham, too (not just spam) lib/glimpse.tcl: add the -W glimpse option (and scope for whole file) to permanent preferences lib/scan.tcl, lib/folder.tcl: fix the stale scan cache problem lib/uri.tcl, html_links.tcl: make html links clickable in inline-displayed html, and consolidate status line handling for links lib/seditExtras.tcl, lib/mime.tcl: patch from Marion Hakanson to fix fd leakage in internal mime qp/base64 decoder patch from debian: add support for recode as alternative to mimencode lib/pgpExec.tcl, lib/pgpGpg.tcl, lib/extrasInit.tcl: added support for gnupg's gpg-agent cvs repository 06/26/2006 valdis.kletnieks@vt.edu lib/html_dpackage.tcl: Skip over blocks we don't know how to interpret anyhow. Thanks to Don Koch for the patch, and Rick Baartman for asking. cvs repository 05/08/2005 valdis.kletnieks@vt.edu exmh.l: debian bug #309891 by way of Alexander Zangerl Fix a bunch of typos cvs repository 4/27/2005 jbeck@eng.sun.com lib/app-defaults-color lib/msgShow.tcl: Added support for marking text between stars (e.g., I *really* mean it) in a bold font. cvs repository 4/27/2005 jbeck@eng.sun.com lib/app-defaults-color lib/msgShow.tcl: Updated regular expressions for Sun bug report highlighting, added support for SpamAssassin report highlighting. cvs repository 4/27/2005 welch@panasas.com lib/bogo.tcl: Added BogoSetup as a trace on bogo(progname) so that preference changes are reflected immediately w/out restarting exmh. cvs repository 4/21/2005 valdis.kletnieks@vt.edu lib/mime.tcl: Add call to FileExistsDialog to prompt before saving a MIME part into an already existing file. cvs repository 4/15/2005 welch@panasas.com channeling Alexander Zangerl lib/bogo.tcl: add the option to give the spam filter a list of message file names on its command line instead of running the filter once on each message as standard input. We know this works for spamassassin, but not sure about the other filters. cvs repository 4/4/2005 welch@panasas.com lib/fileselect.tcl: made use of the built-in tk file dialogs optional. The setting is under the "FS Box" preferences panel. my fingers have grown to know and love the fileselect behavior. lib/fileselect.tcl lib/html_content.tcl lib/main.tcl lib/mime.tcl lib/msg.tcl lib/seditExtras.tcl Restored/updated calls to FSbox (aka fileselect) lib/flist.tcl: fixed FlistUncache to properly clear the global variable in the bg interp lib/mh.tcl: added calls to FlistUncache cvs repository 3/18/2005 welch@panasas.com channeling Alexander Zangerl lib/flist.tcl: Adding FlistUncache to unset flistcache when appropriate lib/folder.tcl: Call FlistUncache when we commit folder changes cvs repository 3/17/2005 welch@panasas.com channeling Alexander Zangerl exmhcomp: support mailto URLs cvs repository 3/4/2005 cwg-exmh@deepeddy.com lib/seqwin.tcl - Make Warp & Narrow work if you aren't already in the folder. cvs repository 3/1/2005 cwg-exmh@deepeddy.com lib/html_content.tcl, lib/main.tcl, lib/mime.tcl, lib/msg.tcl, lib/seditExtras.tcl - Call tk_getOpenDialog or tk_GetSaveDialog instead of FSBox. cvs repository 3/1/2005 cwg-exmh@deepeddy.com lib/main.tcl: Add 'Source' button to log window so I can read in a new source file w/o erasing what's in the command line. cvs repository 3/1/2005 cwg-exmh@deepeddy.com lib/flist.tcl: Run FlistUnseenFoldersInit in the foreground so that it actually works. cvs repository 2/18/2005 cwg-exmh@deepeddy.com lib/ftoc.tcl: Fix patch of 2/3 so it doesn't break if you don't have a detached message window. cvs repository 2/9/2005 valdis.kletnieks@vt.edu lib/mime.tcl: resolve (or at least work around) Debian bug 294212 as a too-zealous splatting of specials broke some content types. I'm adding '.' to the list, but I'm not comfortable adding the full list of rc2045 chars as it includes some shell metachars... cvs repository 2/3/2005 cwg-exmh@deepeddy.com lib/ftoc.tcl: Reset exwin(ftext) whenever the ftext window changes size. cvs repository 1/25/2005 cwg-exmh@deepeddy.com lib/mime.tcl: Special case display of original message in spamassassin processed mail so it doesn't display by default. cvs repository 1/24/2005 welch@panasas.com lib/folder.tcl: fixed the background folder purging script to properly pick up things from the script library cvs repository 1/19/2005 cwg-exmh@deepeddy.com lib/ftoc.tcl: Really fixed bindings for exwin(ftext). cvs repository 1/18/2005 cwg-exmh@deepeddy.com lib/exwin.tcl: Fixed bindings for exwin(ftext). cvs repository 1/17/2005 welch@panasas.com lib/seditExtras.tcl: fixed exmh-async variation of ispell command. lib/seditSel.tcl: fixed exmh-async variation of ispell command cvs repository 1/12/2005 welch@panasas.com lib/uri.tcl: changed use of "file link" back to exec ln lib/quote.tcl: changed use of "file link" back to exec ln exmh-strip.MASTER: eliminated use of [glob ~/.exmh/tk] in the setting of exmh(userLibrary), which we shouldn't need lib/mime.tcl: fix the exec of exmh-strip to be ${argv0}-strip to handle installations with a different base name. Makefile: fixed the ftpdist production cvs tag exmh-2-7-2 cvs repository 1/7/2005 welch@panasas.com lib/exwin.tcl: fixed up lingering focus and position issues with the detached message and ftoc windows. I also trimmed out all the sedit and pref windows from the saved window positions in the case that the window is "stale". lib/msgShow.tcl: added call to Exwin_SeeToplevelMsg in case the user has withdrawn the message display exmh-strip.MASTER: cleared out the Exmh_Debug messages that leak to standard output lib/mime.tcl: added dialog to Save/Extract attachments if the file already exists. exmh.install: changed 2.7.2 date to 1/7/2005 cvs repository 1/6/2005 welch@panasas.com lib/seqwin.tcl: Fixed a buglet that caused the incorrect display (missing the first folder) in the sequences window in some cases. lib/sequences.tcl: removed some erroneous debugging code. once again I forgot that catch will trap a "return", not just errors lib/mh.tcl: minor clean up - changed "catch {set foo}" to "info exists foo" lib/main.tcl: added logging to the startup sequence exmh.install: changed 2.7.2 date to 1/6/2005 cvs repository 1/6/2005 valdis.kletnieks@vt.edu lib/fdisp.tcl - enable scrollwheel support for fdisp canvas cvs repository 1/5/2005 welch@panasas.com lib/folderNew.tcl: folder-protect value wasn't being interpreted as octal when creating new folders. exmh.install: bumped version date cvs repository 1/5/2005 valdis.kletnieks@vt.edu lib/fileselect.tcl, lib/seditExtras.tcl patch from George Ross to not smash filenames when attaching a file to a message, only when saving an attachment cvs repository 1/4/2005 welch@panasas.com exmh-strip.MASTER: Added stub for "winfo" so I could run this with tclsh instead of wish. Updated comments. Made the search for filename hints more aggresive. Added exit if the output file already exists. Added some safety checking on the file name lib/app-defaults: Eliminated " " from the {Save "From" addr} menu entry because it looks like that entry raises errors sometimes. cvs repository 1/4/2005 welch@panasas.com lib/mime.tcl: fixed handling of non-existent attachement save directory cvs repository 1/3/2005 welch@panasas.com lib/html/software.html: updated links cvs repository 1/3/2005 welch@panasas.com added misc/mafe, as contributed by Andrew Billyard which is a perl-tk editor for mh aliases files. cvs repository 1/3/2005 welch@panasas.com Makefile: exmh.README: exmh.install: version.sed: lib/html/index.html lib/html/software.html changed version to 2.7.2 version.csh: Added comments lib/html/exmh.README.html: Added notes about 2.7.2 cvs repository 1/3/2005 welch@panasas.com lib/exwin.tcl: Fixed packing bug for ftoc window that means it didn't match the ftext lines preference setting. cvs repository 1/2/2005 welch@panasas.com lib/app-defaults: added "Save/Extract Attachments" that calls Mime_SaveAttachments. lib/mime.tcl: Added Mime_SaveAttachements that uses exmh-strip to pull an attachment out of an email message. There is a new preference item under "Mime" where you specify the default location for the resulting files. The default is ~/attachments. cvs repository 1/1/2005 welch@panasas.com (for Alexander Zangerl) lib/pgpGpg.tcl: lib/pgpPgp5.tcl: fix of an old pgp problem where recipients were duplicated when pgp is run in interactive mode lib/extrasInit.tcl: a small documentation improvement for the pgp(getextcmd) functionality. faces(xfaceProg) gains a default (uncompface -X) lib/pgpExec.tcl: fix for http://bugs.debian.org/164210: multiple gpg subkeys and passphrases. exmh would not ask for the right passphrase. lib/addr.tcl: ldap options gain defaults that are compatible with debian's openldap config lib/mh.tcl: add Msg-Protect and Folder-Protect to the default .mh_profile that is generated when setting up new users. (These changes are inspired by a patch from Alexander, but not the same) lib/inc.tcl: use $install(dir,bin) to specify an absolute path to the inc.expect script lib/seditExtras.tcl: use $install(dir,bin) to specify an absolute path to the exmh-async script lib/mime.tcl: use $install(dir,bin) to specify an absolute path to the ftp.expect script. Also changed MimeMakeBoundary to use [clock seconds] instead of re-writing the output of [exec date]. cvs repository 12/31/2004 welch@panasas.com lib/exwin.tcl: removed code that explicitly set ftoc and msg window heights that had been added as part of the detatched msg and ftoc changes. This isn't necessary and causes misinterpretation of the preferences ftoc lines value. (reportedly, this change doesn't fix anything.) cvs repository 12/29/2004 welch@panasas.com lib/mh.tcl: Optimized MhReadSeq to not loop through the mhPriv array in Tcl, but instead use the array command's ability to work on subsets of an array by using patters. This really speeds up Flist. NOTE: THIS DEPENDS ON A TCL 8.3 FEATURE FOR THE "array unset" COMMAND lib/flag.tcl: cleaned out some Exmh_Debug calls lib/folder.tcl: removed unnecessary calls to Seq_Msgs for sequences listed in the sequences resource. I can't figure out what good that was supposed to do. lib/sequences.tcl: Replaced Seq_Trace with SeqCount, and call it explicitly instead of from a trace. lib/seqwin.tcl: added error checking because it gets called earlier than before because of the explicit SeqCount calls lib/seditExtras.tcl: Also allow for "7bit" and "8bit" encodings. lib/utils.tcl: FileDelete adds a log message now cvs repository 10/18/2004 welch@panasas.com lib/seditExtras.tcl: patch from George Ross to fix attachments of plain files with no encoding. cvs repository 10/11/2004 welch@panasas.com lib/mime.tcl: lib/seditExtras.tcl exmh-strip.MASTER: added ability to use mimencode if it exists, because it is much faster than using the Tcl versions. We should also figure out how to use mhstore. lib/seditQP.tcl: minor edits lib/background.tcl: added better debugging for when the background process gets errors from commands shipped to the front end. lib/flist.tcl: restored the flistcache removed on 9/10 because the impact was substantial. There is still a buglet in there where the right sequence of message views, deletes, and arrivals can fool the cache. I think the correct thing is to special case the current folder, but I haven't done that yet. lib/inc.tcl: Introduced the use of Mh_FolderFast to set the current folder because "exec folder +foo" turns out to readdir() the entire folder, which can be a bit slow on horrendously large directories. lib/mh.tcl: fixed Mh_SetContext cvs repository 10/08/2004 valdis.kletnieks@vt.edu lib/base64.tcl - properly deal with trailing '=' so we don't append spurious nulls to the file cvs repository 10/08/2004 valdis.kletnieks@vt.edu lib/seditExtras.tcl - add fconfigure -translation binary so base64 encoding works properly. cvs repository 09/10/2004 welch@panasas.com lib/flist.tcl: removed the flistcache as inspired by Harvey Eneman and Jongki Suwandi. This cache caused message highlighting to not occur in some cases. lib/mh.tcl: patch from Harvey Eneman to fix the problem where Mh_Sequences does not clear the in-memory sequence state if a sequence file no longer exists. cvs repository 08/23/2004 welch@panasas.com lib/base64.tcl: fix two bugs, one with perfectly aligned blocks where there was an "undefined result" error. The other was that lines were not properly split at 72 chars. lib/mime.tcl: properly set binary encoding on decoded files. cvs repository 08/07/2004 valdis.kletnieks@vt.edu lib/app-defaults, lib/editor.tcl, lib/extrasInit.tcl, lib/mh.tcl, lib/sedit.tcl, lib/mh.tcl, lib/html/DSN-MDN.html, misc/README.nmh-dsn Oldie but goodie - merge in patch from Martin Hamilton to allow setting RFC3461 DSN options (originally against 1.6.5). Requires a patched mh/nmh (I forwarded the nmh guys a patch for nmh 1.1rc3 and put a patch for nmh 1.0.4 in misc/ for good measure). cvs repository 07/29/2004 welch@panasas.com lib/bogo.tcl - added Exmh_Status to Bogo_Filter because they take a while cvs repository 07/28/2004 welch@panasas.com lib/bogo.tcl - added catch around sa-learn pipe, as that can raise errors if sa-learn generates error output. lib/app-defaults - Added new key bindings Bogo_Filter spam Bogo_Filter ham lib/html_images.tcl lib/html.tcl - added preference to disable image display in a list of folder patterns. Contributed by Jürgen Vollmer lib/sequences.tcl - changed default for seqwin(show) to "unseen" from "cur" cvs repository 07/28/2004 valdis.kletnieks@vt.edu Clean up 2 bugs from the 07/26 'exec' hunt... lib/preferences.tcl - remove extraneous -p flag on 'file mkdir' lib/urlFace.tcl - missed an 'exec' call better done with regsub. cvs repository 07/26/2004 welch@panasas.com exmh-strip.MASTER: removed use of mime(encode) exmh.install: set version to 2.7.1 install.tcl: removed old unused global statement lib/base64.tcl: chopped Base64_Encode into three parts, Base64_EncodeInit, Base64_EncodeBlock, Base64_EncodeTail so it can be used more flexibly as a replacement for mimencode Changed Base64_Decode to tolerate and ignore newlines lib/exwin.tcl: got the non-detached window case to work for me. lib/main.tcl: changed the exmhDebug default to 0 because I was getting massive console spew lib/mime.tcl: removed use of mime(encode) lib/seditExtras.tcl: removed use of mime(encode). If you are a heavy user of the Quote feature in Sedit, you should check this as there is an auto-detect of quoted-printable in here that I support, but cannot see how it is ever reached. lib/seditQP.tcl: removed use of mime(encode) cvs repository 07/26/2004 welch@panasas.com lib/pick.tcl: Applied patch from Bruce Mah to search over sender or mailing-list headers lib/seqin.tcl: Applied patch from Axel Belinfante to be able to have sequences that are always shown, and those that are never shown. lib/sequences.tcl: Added preference for sequences to always show lib/utils.tcl Moved Axel's "mylsearch" into utils.tcl as "patsearch" cvs repository 07/26/2004 valdis.kletnieks@vt.edu catch CVS up to a weekend's worth of concentrated coding... Bayesian filter stuff... lib/bogo.tcl - Add support for spamassassin's sa-learn program lib/app-defaults - Add a menu for bogo.tcl calls, as the stuff in misc/README.mybogo.html is woefully out of date - in fact, it didn't handle a "range" of messages at all. The grey-out code for the Spam... menu is wonky - it *should* grey out if $bogo(inUse) is false, but that's too complicated for 3AM coding. Also, you can't learn a folder unless you first select a message. Adding key-S and key-H bindings also not done... If anybody cares enough, feel free to fix/improve/add it... :) lib/html/software.html - Mention spamassassin as an optional package lib/html/custom.html - Document the Preferences pane for bogo.tcl, and sort the list to match the actual display order of the entries. A few small clean-ups.. Doc fixups.. lib/html/exmh.README.html - fix a typo in Anders Klement's name, and cleaned up some broken HTML links/etc and outdated info (like an AIX 3.2 bug - if anybody's trying to install exmh on a 3.2 system, that's the least of their worries...) lib/report.tcl - DTRT if user has a personalized 'components' file, or a 'comp: -form some.other.comps' MH profile.. (very important if they have stuff like a From: header needed to make the mail actually usable...) lib/folder.tcl - Change a /tmp to [Env_Tmp] to stop races lib/utils.tcl - remove pre-TCL 8.0 code from File_Delete lib/mh.tcl - remove ancient tk4.2 code from Mh_Rename lib/folder.tcl, lib/glimpse.tcl, lib/pgpWWW.tcl, lib/scan.tcl, lib/seditExtras.tcl, lib/seditSel.tcl, lib/tioga.tcl, lib/urlFace.tcl, lib/folderNew.tcl, lib/getnews.tcl, lib/glimpse.tcl, lib/html_content.tcl, lib/html_cache.tcl, lib/html_images.tcl, lib/inc.tcl, lib/mime.tcl, lib/mh.tcl, lib/quote.tcl, lib/pgpMain.tcl, lib/preferences.tcl, lib/uri.tcl - replace 'exec chmod' with 'file attributes -permissions' replace 'exec mkdir' with 'file mkdir', 'exec ln' with 'file link', 'exec mv' with 'file rename', most 'exec cp' with 'file copy', 'exec rmdir' with 'file delete', mass change of 'exec rm' to either File_Delete or [file delete -force' cvs repository 07/18/2004 valdis.kletnieks@vt.edu lib/fileselect.tcl - Be more anal-retentive in what default names we will accept. Alphanumeric, period, hyphen, underscore only. Also, we trim off leading dots, just in case the user isn't paying attention... cvs repository 07/18/2004 valdis.kletnieks@vt.edu lib/mime.tcl - Same mail as below fix triggered another buglet - we should *always* prefer a rfc2183 Content-Disposition: filename= over a name= off the Content-Type: header. The code as written was dependent on what order we saw the MIME headers (blech!). While there, I also added a few filtering regsub calls... cvs repository 07/18/2004 valdis.kletnieks@vt.edu lib/mime.tcl - fix MimeSetDisplayFlag to properly implement rfc2183 Content-Disposition: precidence. Bug found when I got a image/jpeg with a 'C-Disposition: attachment' and it displayed anyhow. cvs repository 07/02/2004 valdis.kletnieks@vt.edu lib/exwin.tcl - first cut at separable ftoc and msg panes cvs repository 06/18/2004 welch@panasas.com Updating version to 2.7.0 in preparation for a release cvs repository 06/14/2004 welch@panasas.com mh.tcl: Slight tweak to version detection to make it more robust. bogo.tcl: moved misc/mybogo.tcl to lib/bogo.tcl - this is a wrapper around spamassasin or other spam filters lib/app-defaults-mono: removed "blue" from the monochrome Xdefaults app-defaults: added file magic strings for PDF documents force the frame padding to 0 because it is non-zero in 8.4 cvs repository 05/22/2004 cwg-exmh@deepeddy.com exmhwrapper - Prepend the hostname if we're running on the local host. This allows bifffolder to work even if it's on a different machine. cvs repository 05/11/2004 cwg-exmh@deepeddy.com mime.tcl - Don't display part inline by default if its disposition is "attachment". cvs repository 09/29/2003 cwg-exmh@deepeddy.com quote.tcl - In Quote_MultipartDefault, bulletproof against undefined numParts defaulting to zero. cvs repository 08/28/2003 cwg-exmh@deepeddy.com ftoc.tcl - In FtocCommit, clear all unseen messages at the same time. (modification of the 7/13 change) cvs repository 07/13/2003 welch@acm.org ftoc.tcl: patch from Louis Mamakos to batch up the sequence updates when doing large deletes. cvs repository 07/11/2003 welch@acm.org inc.tcl: patch from Glenn Burkhardt to add -user to inc command cvs repository 06/11/2003 haldevore@acm.org Modified misc/mybogo.tcl to save and restore target cvs repository 06/11/2003 haldevore@acm.org Added code, and a README for Patrick Carr's Bogofilter stuff to misc directory cvs repository 06/11/2003 haldevore@acm.org Added code, manpage, and a README for Justin Mason's mhthread to misc directory cvs repository 06/11/2003 haldevore@acm.org patch from "Klaus Elsbernd" mh.tcl It clears the mhPriv(otherpriv) variable, which otherwise grows infinitly, when reading .exmhcontext-File multiple times and writing it afterwards. cvs repository 06/01/2003 welch@panasas.com mime.tcl - add skipping of blank lines to help find the start of PGP messages better. Based on fix by Joel Hatton cvs repository 05/19/2003 welch@panasas.com pgpPgp65.tcl - Added +compatible=off to batchmode flags (Neil Rickert) added version check improvement for PGP 6.5 (Neil Rickert) (added . - and _ to the pattern, too (kre)) preferences.tcl - In the toplevel display, changed row of unsorted buttons to a sorted listbox cvs repository 04/21/2003 valdis.kletnieks@vt.edu pgpMain.tcl - I can't type, fix elsif to elseif cvs repository 04/21/2003 valdis.kletnieks@vt.edu patch from Kevin Oberman lib/pgpMain.tcl - add tweak to support Mutt-generated pgp-sign messages cvs repository 04/08/2003 haldevore@acm.org patch from Chris Garrigues thread.tcl Fix to prevent threading from erasing unseen sequence cvs repository 04/04/2003 welch@panasas.com sequences.tcl - removed Exmh_Debug from Seq_Trace fcache.tcl - removed Exmh_Debug flag.tcl - restored variable trace on flist(totalCount,unseen) exmh.install - bumped date on the release cvs repository 04/03/2003 haldevore@acm.org patch from Klaus Elsbernd elsbernd@dfki.uni-kl.de mh.tcl fix variable usage in sequences, corrects a problem with private sequences cvs repository 04/03/2003 haldevore@acm.org select.tcl patch from Robert Elz (kre@munnari.OZ.AU) select.tcl - Thorough input validation when selecting message by keying message number cvs repostiory 4/2/2003 welch@panasas.com flist.tcl, sequences.tcl - Repaired the change made on 4/1 cvs repository 04/02/2003 valdis.kletnieks@vt.edu exmh.MASTER, lib/widgets.tcl - set a default cursor of 'left_ptr' (otherwise enlightenment 0.16.5 doesn't play nice with XFree86 4.3.0 cursors) cvs repository 04/02/2003 haldevore@acm.org flist.tcl - Only call Fcache_Redisplay if folders being cached cvs repostiory 4/1/2003 welch@panasas.com flist.tcl, sequences.tcl - Fix to call Fcache_Redisplay from the trace on flist. cvs repository 04/01/2003 haldevore@acm.org Multiple fixes from Robert Elz (kre@munnari.OZ.AU) select.tcl, html/guide.html - Select message by typing now allows "s" to show the message or "-" to go to the prior message mh.tcl - Ignore garbage in sequence files main.tcl - Add Disable/Enable button to debug log window extrasInit.tcl, sedit.tcl, seditMime.tcl - add preference item to make insertion of x-mailer header optional and check the item (applicable to Sedit only) cvs repository 03/31/2003 haldevore@acm.org select.tcl, removed fix for non-numeric typing cvs repostiory 3/30/2003 welch@panasas.com sequences.tcl, flist.tcl, main.tcl, exmh-bg.MASTER - restructure sequence searching so it is done in the background process like it used to be in exmh-2.5 select.tcl - fixed non-numeric typeing mh.tcl - added stubs for 2.5 APIs Mh_MarkSeen and Mh_MarkUnseen app-defaults - removed hardwired "unseen" exmh.install, etc, changed version to 2.6.3 cvs repository 03/26/2003 haldevore@acm.org flag.tcl - Applied patch sent to exmh-users by dglo@ssec.wisc.edu 2.6.2 Tarball created 3/21, uploaded 3/25 exmh-2-6-2 CVS tag cvs repository 03/21/2003 welch@panasas.com scan.tcl - Added -noheader to the scan invocation. ftoc.tcl - protected against unfound message in Ftoc_MoveFeedback, although I'm unsure how this error could have come up. cvs repository 03/20/2003 haldevore@acm.org html/reference.html - Expand description of Sequences... menu cvs repository 03/18/2003 haldevore@acm.org msgShow.tcl - change MsgShowListHeaders to keep all protocols and include the protocol in the menu item. This should be made smarter or prettier someday. addr.tcl - add escaped quotes around search expression so it survives as a single argument after the eval. cvs repository 03/18/2003 valdis.kletnieks@vt.edu msgShow.tcl - Fix MsgShowListHeaders to be pedantically correct - it had been accidentally picking the first field only. It now loops through each field and only saves http, https, and mailto URIs. cvs repository 03/18/2003 welch@panasas.coM exmh.install - bumped up date for 2.6.2 msgShow.tcl - added \n adn \t to the white-space removal in the Hook_MsgShowListHeaders proc. cvs repository 03/15/2003 valdis.kletnieks@vt.edu seqwin.tcl - bug fix for brent's previous bug fix. Make sure that $seqwin(startuphidden) is set before we call SeqWinToggle cvs repository 03/14/2003 welch@panasas.com sequences.tcl, seqwin.tcl - Bug fixes for previous submit bindings.tcl - fixed this to properly allow users to override bindings. This is an ancient bug! cvs repository 03/12/2003 welch@panasas.com sequences.tcl, seqwin.tcl - Delay the initial display of the sequences window. cvs repository 03/12/2003 valdis.kletnieks@vt.edu fcache.tcl - Fix problem with fcache listing. The rows would be packed to fit 'folder' and then expanded with 'folder:NNN' for unseen msgs, which could cause it to wrap to a next line, leaving you with (for example) two rows and an orphan on a 3rd row. cvs repository 03/11/2003 welch@panasas.com flag.tcl - Removed trace on flist(totalcount,$mhProfile(unseen-sequence)) and replaced with explicit call to Flag_Trace in Flist_Done. This is to reduce the amount of variable trace firing and speed things up a bit. flist.tcl - Removed some ancient debugging code that was an ancient ancestor of the unseen/sequences window. folder.tcl - Shifted the Ftoc_ShowSequences call to eliminate one extra redisplay. ftoc.tcl - added various debugging and fixes to Ftoc_FindMsg, but the trouble was really caused by a -header flag in a users .mh_profile for scan. mime.tcl - fixed the MimeHeaderSort procedure to use the patterns in Folder-Display and Folder-Surpress correctly, and to work better with non-defaults (Tom Lane's fix) seqwin.tcl - eliminated one update idletasks to eliminate screen updates. cvs repository 02/21/2003 welch@panasas.com ftoc.tcl - Reverted change to the binary search in Ftoc_FindMsg because the new method sometime causes stack traces because the nextlineno computation returns values out of range. mh.tcl - added call to Mh_SequenceUpdate to Mh_SetCur seq.tcl - removed Mh_SequenceUpdate call from Seq_Set, because that procedure is usually called with the results of Mh_Sequence, so we were reading sequence information and then immediately writing it back out. Also removed "unseen" from the seqAlwaysShow preference item. Otherwise you couldn't clear that setting because of the way preference defaults works. seqwin.tcl - fixed stack trace by adding initialization for seqwin(folders,$seq) cvs repository 02/20/2003 welch@panasas.com folder.tcl - fixed Folder_IsShared parameter definition that conflicted with global variable. cvs repository 02/19/2003 welch@panasas.com flist.tcl - fixed the Flist button, which was broken by the flistcache Also fixed the autoSort feature in Flist_UpdateUnseen cvs repository 02/18/2003 welch@panasas.com flist.tcl, folder.tcl - oops! botched change related to Flist_UpdateUnseen described below. Repackaged 2.6.1 and updated cvs tag. cvs repository 02/18/2003 welch@panasas.com Makefile, exmh.README, exmh.install, version.sed, exmh.README.html, index.html, software.html 2.6.1 release cvs tag exmh-2-6-1 cvs repository 02/18/2003 welch@panasas.com mime.tcl - MimeHeaderSort fix from Tom Lane so that it displays headers that appear in Header-Display first, before unsuppressed ones. folder.tcl - Eliminated call to Flist_UpdateUnseen from FolderChange, which does a little too much. This means that exmh now keeps track of the "unvisited folders" better for Ftoc_NextFolder ('F' binding) html.tcl - added Http_stop call to Html_Stop app-defaults-color - changed unseen sequence back to having a blue foreground. mime.types - added "pps" for application/powerpoint cvs repository 02/17/2003 welch@panasas.com extrasInit.tcl, pgp.tcl - picked up pgp(extpass) patch from Alexander Zangerl flist.tcl - FlistFindSeqsInner added check to eliminate calls to Seq_Set if the sequence information for a folder hasn't changed ftoc.tcl - Changed msgtolinecache and linetomsgcache so that they have no entries for empty ({}) mappings. I was running into a mapping for the last text widget line that didn't contain a message and ended up messing up incremental folder scans Ftoc_MsgNumber doesn't cache anything if there is no mapping Retrieved FtocShowUnseen from exmh-2.5 and use that for the unseen sequence instead of the more general search main.tcl - a slight varition on the fix that slipcon made to the millisecond time stamps. mh.tcl - rooted out an "array unset" that doesn't work in Tcl 8.0 thread.tcl - fixed call to Flist_ForgetSequence (changed to Seq_Forget) Minor HTML cleanup, including pointer to the Wiki. I added comments to several files that identify old exmh APIs, including flist.tcl, folder.tcl, mh.tcl, msg.tcl, cvs repository 02/16/2003 cwg-exmh@deepeddy.com msg.tcl - Only call Ftoc_ShowSequence in MsgChange if we have a valid message. ftoc.tcl - Bulletproof Ftoc_ShowSequence cvs repository 02/10/2003 valdis.kletnieks@vt.edu exmh-strip.MASTER, lib/aliases.tcl, lib/background.tcl, lib/busy.tcl lib/buttons.tcl, lib/editor.tcl, lib/exwin.tcl, lib/faces.tcl lib/flist.tcl, lib/folder.tcl, lib/getnews.tcl, lib/glimpse.tcl lib/inc.tcl, lib/mh.tcl lib/mime.tcl lib/seqwin.tcl Add greppable text to Exmh_Debug call cvs repository 02/10/2003 valdis.kletnieks@vt.edu lib/fcache.tcl - Put in John Beck's fix for extraneous 'folder:0' in the fdisp cvs repository 02/10/2003 cwg-exmh@deepeddy.com scan.tcl - fix lineVar and line references to linenoVar and lineno. cvs repository 02/09/2003 welch@panasas.com Making the 2.6 release, cvs tag exmh-2-6 These files were updated: COPYRIGHT Makefile exmh.CHANGES exmh.README exmh.install version.sed lib/html/exmh.README.html lib/html/index.html lib/html/software.html In addition, this tar file of handy scrips was uncommited in my misc dir. misc/mhutils.tar.gz cvs repository 02/09/2003 welch@panasas.com main.tcl - added microsecond granularity time stamps to log messages msg.tcl - added Msg_ShowCurrent compatibility routine cvs repository 02/07/2003 cwg-exmh@deepeddy.com folder.tcl, ftoc,tcl, scan.tcl - Call Ftoc_ShowSequences in Ftoc_Update on the new messages. Cal Ftoc_ShowSequences in FolderChange. Don't call Ftoc_ShowSequences in ScanFolder and Scan_Inc. This both cuts down on the number of lines we call Ftoc_ShowSequences on and eliminates a timing window that was generating "Cannot find $msgid ($minmsgid,$maxmsgid)" warnings. cvs repository 11/07/2002 valdis.kletnieks@vt.edu mh.tcl, flist.tcl, tclIndex - add new function MhGetSeqCache to speed up flist/sequence handling. We now only call MhReadSeqs once per folder, and skip over sequences listing in $seqwin(nevershow). Also, migrate some code into new function FlistFindSeqsInner so that it can be called with BgRPC to make exmh-bg happier. cvs repository 11/1/2002 cwg-exmh@deepeddy.com seqwin.tcl - prepend sequence names with "pane" when using to name panes because a pane can't start with a Capital letter. cvs repository 10/30/2002 cwg-exmh@deepeddy.com mh.tcl - When compacting sequences, don't compact if it's already compacted. cvs repository 10/29/2002 cwg-exmh@deepeddy.com msg.tcl - In Msg_Show, if there are no messages in the sequence we're trying to show, then show 'cur'. sequences.tcl - Minor cleanups in Seq_Trace and improvements to debug code. flist.tcl - in FlistResetVars, sort array names so that totalcount gets cleared after seqcount in order to keep it from going negative. mh.tcl - When rewriting the sequences file, don't expand the other sequences. cvs repository 10/28/2002 cwg-exmh@deepeddy.com msg.tcl, editor.tcl, folder.tcl, ftoc.tcl, main.tcl, mh.tcl, sequences.tcl, thread.tcl - Remove message checkpoint code which was originally intended to work around an mh mark bug, but which now seems unneeded and needlessly complex (causing messages to not get unmarked in various contexts). cvs repository 10/16/2002 haldevore@acm.org pick.tcl - Adaptation of Ted Cabeen's "catch up to current" code cvs repository 09/23/2002 cwg-exmh@deepeddy.com mh.tcl - some bulletproofing in MhReadSeqs. cvs repository 09/21/2002 cwg-exmh@deepeddy.com ftoc.tcl, msg.tcl, pick.tcl, scan.tcl, thread.tcl - Remove the $folder argument from Ftoc_ShowSequences and Ftoc_Update because it's always the current folder; break Ftoc_ShowSequence out of Ftoc_ShowSequences; add an optional argument to both procedures that specifies the particular message ids to show; and change most calls to Ftoc_ShowSequences to call Ftoc_ShowSequence or to specify the optional argument or both. cvs repository 09/09/2002 Robert Elz via welch@panasas.com ftoc.tcl - Fixed reference to $L cvs repository 08/26/2002 Robert Elz via cwg-exmh@deepeddy.com pick.tcl - change the order of the arguments to pick to get around nmh bug. cvs repository 08/23/2002 cwg-exmh@deepeddy.com Intro.html, Search.html, custom.html, exmh.README.html, guide.html, overview.html, reference.html, tutorial.html - Documentation updates for all my recent patches. cvs repository 08/22/2002 cwg-exmh@deepeddy.com mh.tcl - Cache sequences so we don't read the .sequences files over and over and over. seqwin.tcl, sequences.tcl - New preferences item for orientation of sequences panes. seqwin.tcl - Fix "Hide When Empty" and possibly "Icon Window". sequences.tcl - Speed up Seq_Del. pick.tcl - Redisplay sequences at the end of PickMarkSeen. msg.tcl - Don't use Ftoc_MsgIterate in Msg_Mark and Msg_UnMark. cvs repository 08/21/2002 cwg-exmh@deepeddy.com flag.tcl - Don't die in Flag_MsgSeen if flist(totalcount,unseen) is undefined. app-defaults - Msg_MarkUnseen is now {Msg_Mark unseen}. msg.tcl - left a $ off of $mhProfile(unseen-sequence) ftoc.tcl - Needed quotes around argument to Exmh_Status. cvs repository 08/20/2002 cwg-exmh@deepeddy.com app-defaults-color - Change default colors of ftoc so highlighted sequences will appear better. seqwin.tcl - New File; Replacement for unseenwin...more generalized. sequences.tcl - seqwin hooks are in here. flist.tcl - Initialize flist() elements differently; Flist_FindUnseen is now Flist_FindSeqs and calls Seq_Set instead of doing it by hand. ftoc.tcl - Ftoc_FindMsgs replaces Ftoc_FindMsg and handles lists of messages; Ftoc_MsgNumbers replaces Ftoc_MsgNumber and handles lists of lines; ftoc_NewFtoc now takes an optional argument to specify the lines; defaulting again to ftoc(lineset); remove Ftoc_MarkSeen as dead code; New function Ftoc_CurLines and rewrite Ftoc_Iterate to use Ftoc_CurLines; new function Ftoc_MsgIterate to use instead of Ftoc_Iterate in several places; call Msg_Show instead of Msg_ShowCurrent and Msg_ShowUnseen; call Seq_Del and Seq_Add instead of Mh_SequenceUpdate or Seq_RemoveMsg mh.tcl - Call Seq_Add and Seq_Del instead of Mh_SequenceUpdate; Seq_Expand moved back here and named back to MhSeqExpand; Seq_Modify rewritten, moved back here and named back to MhSeq. msg.tcl - Merge Msg_ShowCurrent and Msg_ShowUnseen into Msg_Show; Call Ftoc_MsgNumbers instead of Ftoc_MsgNumber; Call Ftoc_FindMsgs instead of Ftoc_FindMsg; Call Seq_Add or Seq_Del instead of Seq_RemoveMsg or Mh_SequenceUpdate; Call Ftoc_MsgNumbers or Ftoc_MsgIterate where it's simpler than Ftoc_Iterate; app-defaults, background.tcl, inc.tcl, pgpWWW.tcl, user.tcl - Use Flist_FindSeqs instead of Flist_FindUnseen. bindings.tcl, folder.tcl, inc.tcl - Msg_ShowCurrent and Msg_ShowUnseen are now Msg_Show. editor.tcl - use new Ftoc_FindMsgs instead of Ftoc_FindMsg pick.tcl - use Seq_Del instead of Seq_RemoveMsg. print.tcl - Use Ftoc_MsgIterate instead of Ftoc_Iterate. scan.tcl - Use Ftoc_MsgNumbers instead of Ftoc_MsgNumber; call Ftoc_ClearMsgCache and Ftoc_ShowSequences in Scan_ProjectSelection. thread.tcl - Use Ftoc_MsgNumbers instead of Ftoc_MsgNumber; Ftoc_FindMsgs instead of Ftoc_FindMsg bindings.tcl, fcache.tcl, flag.tcl, flist.tcl - use $mhProfile(unseen-sequence) instead of hard coding 'unseen'. extrasInit - remove UnseenWin initialization; change topten reference to unseenWin to be to seqWin instead. cvs repository 08/08/2002 cwg-exmh@deepeddy.com sequences.tcl, flag.tcl - move flag handling from Seq_Trace into new Flag_Trace. sequences.tcl - code cleanup. flist.tcl - Don't unset totalcount, it breaks Flag_Trace; set to zero instead. cvs repository 08/06/2002 cwg-exmh@deepeddy.com folder.tcl - Mark display valid when we change folders. unseenwin.tcl - Change folder if the display isn't valid. cvs repository 08/06/2002 cwg-exmh@deepeddy.com app-defaults, fcache.tcl, flag.tcl, flist.tcl, ftoc.tcl, inc.tcl, main.tcl, mh.tcl, msg.tcl, pick.tcl, scan.tcl, sequences.tcl thread.tcl, unseenwin.tcl - 1) Renamed flist(new,???) to flist(seqcount,???,unseen), flist(newseq,???) to flist(seq,???,unseen), and flist(newMsgs) to flist(totalcount,unseen) and generalized many of the functions which referred to them to have a sequence argument. 2) Reorganized sequences code into its own file from mh.tcl and flist.tcl; involved renaming of functions which is why so many files are touched in this patch. 3) As a result of the above two items merged Mh_Sequence and Flist_UnseenMsgs, which once generalized did almost exactly the same thing into the single funciton Seq_Msgs. 4) Did most of the prep-work for generalization of the unseen window to be a general sequences window so that now all the needed data is tracked. The next step will be to use that data. cvs repository 08/03/2002 cwg-exmh@deepeddy.com unseenwin.tcl - Reindent all code to be more standard. I was having a problem with emacs reindenting this as I worked on it and making it hard to tell my real changes from the indents, so I'm formatting the baseline more "correctly" so that "cvs diff" can be useful. cvs repository 07/25/2002 welch@panasas.com lib/app-defaults-color: added "urgent" sequence so it shows up in the Sequences menu. It has -foreground purple by default. lib/exwin.tcl: added "raise" to Exwin_Toplevel so that hidden windows have a better chance of coming to the top when they are opened. lib/inc.tcl: sort the MyIncTmp directory before processing so that messages get ordered date correctly after filtering. lib/mh.tcl: fixes to turn of regexp special characters from folder names - contributed by John Farrell lib/mime.tcl: lib/uri.tcl: Added way to display defered HTML inside exmh. Contributed by Tomas Gradin lib/msg.tcl: Added Msg_Mark and Msg_UnMark, but these are not used. Thought I needed them for Sequence support, but the Sequences... menu already works without them. lib/seditBind.tcl: Moved the SeditBeautify binding to the correct bindtag so it doesn't fire on the main message window. lib/widgets.tcl: Added catch inside Widget_ReEvalCmd cvs repository 07/26/2002 cwg-exmh@deepeddy.com folder.tcl - Call Msg_Change with skipdisplay in Folder_Pack too. cvs repository 07/26/2002 cwg-exmh@deepeddy.com scan.tcl,ftoc.tcl - Found the bug in ftoc.tcl which was causing the current message to get lost. cvs repository 07/25/2002 cwg-exmh@deepeddy.com flist.tcl - New proc Flist_SetUnseen which can be called instead of Flist_AddUnseen to avoid calling Flist_ForgetUnseen. Call it in Flist_UnseenMsgs. Also remove some ancient dead code from the end of Flist_AddUnseen. folder.tcl, flist.tcl - Move ftoc(autoSort) test from FolderChange to Flist_UnseenUpdate so that it will be called more in more cases. msg.tcl, folder.tcl - Add new possible value for second value to Msg_Change of "skipdisplay" which says to not change the message display when changing messages; then use this value in Folder_Sort so sorts don't cause the message display to rescroll to the top. This makes them much less anoying; pretty important if it gets called automatically by background processing. scan.tcl - In Scan_FolderForce, call Flist_UnseenMsgs instead of Flist_ForgetUnseen so that the folder doesn't move in the unseen window; also call Ftoc_Change because the current message can get lost somehow. cvs repository 07/22/2002 cwg-exmh@deepeddy.com scan.tcl - In ScanFolder, don't try to scan for only new messages if ftoc(numMsgs) is zero. cvs repository 07/22/2002 cwg-exmh@deepeddy.com ftoc.tcl, msg,tcl, scan.tcl - Eliminate optional "line" argument to Ftoc_FindMsg, not incidently removing *all* the code that between the old location and the new location in my patch of 7/19; as a result, also remove the optional line argument to Ftoc_Change and the msgid argument to Msg_Change; also, of course, change all the callers of these functions, and remove the dead Msg_ShowWhat proc. This gives us a net reduction in code and makes it all somewhat clearer. Let's see what I broke by doing this. pgpMain.tcl, pgpOld.Tcl - Call Msg_Change, not MsgChange. cvs repository 07/19/2002 cwg-exmh@deepeddy.com ftoc.tcl - In Ftoc_FindMsg, move the cache check until after the processing of $line. cvs repository 07/18/2002 cwg-exmh@deepeddy.com scan.tcl - Don't clear the "+" from cur. cvs repository 07/15/2002 valdis.kletnieks@vt.edu pgpExec.tcl - multiple fixes. Added a second call to CheckSuccess to both Exec_Encrypt and Exec_EncryptSign (and a 'file delete' to clean up beforehand) so we actually *fail* if the second try doesn't work. Also, fixed the regexp in CheckSuccess - it failed to deal with multiple lines of output, and I added gnupg 1.0.7 support. cvs repository 07/15/2002 cwg-exmh@deepeddy.com flist.tcl - in Flist_UnseenUpdate, don't push the folder onto the unvisited list if it's the current folder. cvs repository 07/15/2002 cwg-exmh@deepeddy.com folder.tcl - Gratitiously change the name of the 'f' variable wherever it's used either to 'folder' or to 'file' to be more consistent with other code. cvs repository 07/13/2002 cwg-exmh@deepeddy.com flist.tcl,folder.tcl - Completely back out the fixpacksort patch from two years ago that hal installed because of the unseenwindow shuffling that occurs and besides the Flist_ForgetUnseen proc is supposed to handle this case. If there is indeed a problem that occurs, we can fix it in a way that won't shuffle the unseen window. cvs repository 07/12/2002 cwg-exmh@deepeddy.com flist.tcl - Remove call to Flist_ResetUnseen in Flist_UnseenUpdate so that the unseen window won't get shuffled all the time. cvs repository 07/12/2002 cwg-exmh@deepeddy.com scan.tcl - Back out the removal of Ftoc_Reset from 7/3/2002 as well as yesterday's attempt to fix some of the problems caused by that bad idea. cvs repository 07/11/2002 cwg-exmh@deepeddy.com scan.tcl - in ScanFolder, we don't know what the last message is yet, so we need to use Widget_Text_End instead. Also, call Ftoc_RescanLine if need be. cvs repository 07/10/2002 cwg-exmh@deepeddy.com ftoc.tcl - In Ftoc_ClearCurrent, if ftoc(curLine) isn't set use Mh_Cur to find where we're clearing. cvs repository 07/03/2002 cwg-exmh@deepeddy.com folder.tcl, ftoc.tcl - Don't call Scan_Folder in FolderChange; properly initialize ftoc(displayValid) to 1 so that Scan_Folder will be called when needed. cvs repository 07/03/2002 cwg-exmh@deepeddy.com scan.tcl - Remove unnecessary call to Ftoc_Reset in ScanFolder cvs repository 07/02/2002 cwg-exmh@deepeddy.com folder.tcl - Call Flist_UnseenUpdate just before calling Scan_Folder in FolderChange cvs repository 07/02/2002 cwg-exmh@deepeddy.com scan.tcl - Remove bogus call to Flist_ForgetUnseen cvs repository 06/07/2002 welch@panasas.com lib/mime.tcl - Move the modification of application/octet-stream MIME types up a bit to be before the decision is made to display the type (patch from Diego Zamboni) cvs repository 06/06/2002 welch@panasas.com lib/ftoc.tcl - Fix to Ftoc_ClearMsgCache for unset vs. array unset buglet. cvs repository 05/01/2002 Hal DeVore lib/sedit.tcl - moved calls to SeditSend hooks to much earlier cvs repository 04/30/2002 welch@panasas.com A whole collection of patches. If marked with ** then I've lost track of who gave them to me and I apologize for that: exmh-strip.MASTER: added pref initialization to quiet errors caused by changes elsewhere in the main body of exmh install.tcl: fixed errors that occur when you try to display a dialog box (e.g., the Verify window) that is already displayed lib/addr.tcl: a new set of options for configuring LDAP (Mark Bergman) lib/extrasInit.tcl: help text updates about the uquoteAdd resource (**) lib/faces.tcl: fix for space-in-pathname problem (**) lib/fcache.tcl: New Feature! display the count of unseen messages in the folder cache. (Paul Menage) lib/html_get_http.tcl: trap errors from bad http: links lib/inc.tcl: tweaked feedback about inc'ed messages to do case-insensitive grep for Subject: (**) lib/mime.tcl: for for space-in-pathname problem lib/pgpExec.tcl: eliminated Exmh_Debug message that could dump out a massive keyring to the log, taking many many seconds (**) lib/unseenwin.tcl: fix to tolerate space-in-folder-name (I think) (**) cvs repository 04/04/2002-04/17/2002 cwg-exmh@deepeddy.com various files - some more code cleanup and a whole bunch of sequence related code tuning. cvs repository 04/03/2002 cwg-exmh@deepeddy.com lib/app-defaults, lib/app-defaults-color, lib/buttons.tcl, lib/exwin.tcl, lib/ftoc.tcl, lib/msg.tcl, lib/pick.tcl - Added 'Sequences...' menu; some code cleanup and a few bug fixes from the last change. cvs repository 03/28/2002 cwg-exmh@deepeddy.com lib/app-defaults-color, lib/app-defaults-mono, lib/exwin.tcl, lib/fdispColor.tcl, lib/ftoc.tcl, lib/ftocColor.tcl, lib/help.tcl, lib/mh.tcl, lib/msg.tcl, lib/pgpMain.tcl, lib/scan.tcl, lib/thread.tcl - Generalized unseen handling to display other sequences besides unseen. cvs repository 01/25/2002 slipcon@mercea.net lib/html/ppp.howto.html - fixed postfix instructions, via Kevin Oberman again. cvs repository 01/26/2002 valdis.kletnieks@vt.edu lib/ftp_get.tcl - add a 'catch' in case an FTP dies early, so we don't throw an error unsetting data(fd) if it was never set.. cvs repository 01/26/2002 valdis.kletnieks@vt.edu lib/app-defaults-color, lib/main.tcl, lib/html/custom.html - drop the need for c_st_background color setting, use same scheme as lib/sedit.tcl to propogate the value. The 'background msgs' color stays c_st_bg_msgs cvs repository 01/25/2002 slipcon@mercea.net lib/html/ppp.howto.html - added postfix instructions, using Kevin Oberman (oberman@es.net)'s diff cvs repository 01/24/2002 valdis.kletnieks@vt.edu lib/sedit.tcl - missed a readonly/disabled issue for Tk8.4 (status field) cvs repository 01/24/2002 valdis.kletnieks@vt.edu exmh-bg.MASTER, lib/main.tcl, lib/app-defaults-color, lib/html/custom.html So there *was* code using c_st_background. That color specification is now c_st_bg_msgs, and exmh-bg no longer tries to lookup a colorspec but just passes 'background' to Exmh_Status. cvs repository 01/23/2002 valdis.kletnieks@vt.edu lib/app-defaults-color, lib/html/custom.html - Default for c_st_error is now red, and the default for c_st_warn is purple (be more consistent with usual meaning of a red message indicating an error) cvs repository 01/23/2002 valdis.kletnieks@vt.edu install.tcl, lib/main.tcl - Do version test as per Jeff Hobb's suggestion. cvs repository 01/22/2002 valdis.kletnieks@vt.edu lib/aliases.tcl, lib/background.tcl, lib/env.tcl, lib/error.tcl, lib/faces.tcl, lib/flist.tcl, lib/folder.tcl, lib/folderNew.tcl, lib/inc.tcl, lib/main.tcl, lib/mime.tcl, lib/msg.tcl, lib/pick.tcl, lib/print.tcl, lib/scan.tcl, lib/seditSel.tcl, lib/source.tcl, lib/thread.tcl, lib/urlFace.tcl Clean up red/purple/blue hardcoded values for Exmh_Status lib/app-defaults-color, lib/main.tcl - clean up dead unused code for c_st_background (which is used as a *foreground* color gaak) c_st_background is now the *background* color for the status field cvs repository 01/22/2002 valdis.kletnieks@vt.edu install.tcl - tkEntryBackspace handling for Tk8.4a2 and later namespaces cvs repository 01/22/2002 valdis.kletnieks@vt.edu lib/main.tcl - add new procedure Tcl_Tk_Vers_Init to do per-release tweaking of the environment. Currently used to re-expose commands moved to private namespace in Tk8.4a2. cvs repository 01/20/2002 valdis.kletnieks@vt.edu lib/ispell.tcl - fix old syntax error finally caught by tcl8.4a4. cvs repository 12/07/2001 kchrist lib/pgpExec.tcl - Fixed "GPG silently ignores untrusted keys during encryption" bug. Thanks to Ben Escoto. cvs repository 12/06/2001 kchrist lib/mime.tcl: Do not call viewer if mailcap rule has needsterminal attribute. When using Mime_Magic to replace application/octet-stream make sure to replace entire content-type and not just the "octet-stream" subtype. lib/seditExtras.tcl: Fixed a bug in SeditInsertFile that caused text to be lost when quoting. Previous code assumed headers were always present and had to be removed. lib/pgpMain.tcl: Fixed the "Always choose the sign key." option. Fixed a clearsigning bug. Modified interpretation of app/pgp header to avoid hang. lib/pgpExec.tcl : Exmh can now parse the GnuPG options file and lib/pgpGpg.tcl : identify the "default-key" (same as "myname" in PGP). Added "--status-fd 2" to args_decrypt so that the output can be parsed with Pgp_InterpretOutput. cvs repository 11/21/2001 Brent Welch lib/main.tcl: Moved WM_SAVE_YOURSELF registration a bit later because it has an Exmh_Checkpoint side-effect that causes exmh to forget the current folder. exmh.strip.MASTER fixed #! line so it gets installed right. lib/mh.tcl: Plugged file descriptor leak in Mh_ParseProfile Fixed ParseProfile to handled indented continuation lines lib/seditExtras.tcl: Tweaked paragraph formatting in Sedit to honor requested line length and the anticipated repl prefix length. custom.html: fixed m_tagnames documentation software.html: fixed uudeview URL cvs repository 11/15/2001 Valdis Kletnieks lib/folders.tcl: Fix typo in function name cvs repository 08/23/2001 kchrist lib/pgpWWW.tcl: Comment in switch statement causing problems. cvs repository 07/13/2001 Brent Welch lib/exmh.install.tcl: Changed release date to 7/13 lib/html/index.html: Changed release date to 7/13 tagged and released exmh 2.5. CVS tag exmh-2-5 cvs repository 07/13/2001 Brent Welch lib/mime.tcl: Fixed Mime_WithTextHiding to catch errors and returns from its uplevel call, fixing a file descriptor leak from Mime_ShowMsWord cvs repository 07/11/2001 Brent Welch ftp.expect.MASTER: inc.expect.MASTER: Changed to a #!/bin/sh header with exec hack to be able to insert the -- flag to expect install.tcl: Changed the expect patching to match the above change lib/pgpMain.tcl: lib/mime.tcl: Changed MsgTextHighlight to Msg_TextHighlight lib/msgShow.tcl: Added Msg_HighlightInit lib/sedit.tcl: Added SeditBeautify from John Beck lib/seditBind.tcl: Added "highlight" virtual function to sedit bindings lib/app-defaults: Added binding to sedit to beautify it. cvs repository 07/10/2001 Brent Welch lib/editor.tcl: A -- is passed to the exmh-async script to turn off any argument/flag parsing by wish. This means you can safely pass "-c" or "-geometry" arguments to the programs spawned by the exmh-async wrapper script. exmh-async.MASTER: Removed a split/join construct that screwed up attempts to pass arguments like {cal SetSyn("mail")} to editors. lib/mime.tcl: Fix to highlighting text range from John Beck. lib/msgShow.tcl: Tweaks to highlighting from John Beck. cvs repository 07/09/2001 Brent Welch Makefile: exmh.README: exmh.CHANGES: lib/html/exmh.README.html: lib/html/index.html: lib/html/software.html: version.sed: exmh.install: Changing version number to 2.5 exmh-bg.MASTER: exmh.MASTER: Fixed initialization of exmh(userLibrary) inc.expect.MASTER: Fixed !# line so it gets installed right lib/app-defaults-color: Added resources for message highlighting based on the jcl-beautify code. lib/autorefile.tcl: Contributed code by John Carroll lib/fdispColor.tcl: lib/fdisp.tcl: Added use of c_unseenBg and c_movedFg color resources for further refinement of unseen and moved messages. lib/inc.tcl: Cleanup of Inc_Expect lib/mailcap.tcl: Fixed bug in mailcap parsing code that didn't quote & in rules, leading to message corruption in SaveAttachments code. lib/mh.tcl: minor tweak to variable unset lib/mime.tcl: Added highlightText option and calls to MsgTextHighlight. * lib/msgShow.tcl: Added MsgTextHighlight and the jcl-beautify code, with minor changes to separate the bug reporting header highlighting into a different hook. There is now a "message show" hook that operates on the whole message, a "message highlight" hook that only operates on the text regions of a message. lib/pgpMain.tcl: Added call to MsgTextHighlight. lib/pop.tcl: Fixed Pop_Dialog so it works right with multiple hosts. cvs repository 05/31/2001 kchrist lib/scan.tcl: Allow arguments in scan-proc configuration. lib/app-defaults: Have "Use message as draft" call Msg_CompUse. This sidesteps an internal bug in MsgComp. To fix the bug MsgComp needs to be drafts-folder aware like Mh_CompSetup. cvs repository 05/18/2001 bmah lib/extrasInit.tcl: lib/pgpBase.tcl: PGP detection code now tries to execute a program (e.g. "gpg --version") and parse the output to determine presence of installed versions. Former versions only checked the existence of files. cvs repository 05/16/2001 kchrist lib/sedit.tcl: Make sure exmh($id,action) survives a 'Keep on send'. cvs repository 05/15/2001 Brent Welch Makefile: exmh.README: exmh.CHANGES: lib/html/exmh.README.html: lib/html/index.html: lib/html/software.html: exmh.install: Changing version number to 2.4 version.csh: version.sed: Scripts to help with version changes. (I don't think I ever committed things at this point - hence 2.5) cvs repository 05/14/2001 kchrist Fixed a bug in which a corrupt context would prevent exmh from starting. Problem was caused by direct calls to 'repl' instead of wrapping them inside a (context-aware) MhExec call. lib/main.tcl: Moved nmh-vs-mh identification to Mh_Init procedure lib/mh.tcl and replaced 'exec repl...' calls with 'MhExec repl...' calls. Note that MhParseProfile is called first since MhExec may need $phProfile(path). cvs repository 05/11/2001 kchrist A bunch of changes having to do with making sure exmh($id,action) is there when we need it. Also... Replaced Sedit_Mailto with Msg_Mailto (extending Ovidiu's patch). Replaced exmh(ctype) with exmh($id,action). lib/editor.tcl: Set exmh($id,action) in Sedit_DraftID. lib/error.tcl: Call Edit_DraftID instead of EditWhatNow directly so that exmh($id,action) gets set. lib/html_links.tcl: Call Msg_Mailto instead of Sedit_Mailto. lib/mh.tcl: Made sure exmh($id,action) is set when comp'osing and reset when done. lib/msg.tcl: Turned Msg_CompTo into Msg_Mailto as replacement for Sedit_Mailto. Made new Msg_CompTo. Removed exmh(ctype). Set exmh($id,action) in MsgComp and Msg_Edit. Moved DecodeURL from seditExtras into here and renamed it to MsgDecodeURL. lib/sedit.tcl: Don't check if exmh($id,action) or pgp(version,$id) exist before using them. If they don't it is a bug we should catch and fix. Modified call to SeditSetIsigHeaders. lib/seditExtras.tcl: Modified parameters to SeditSetIsigHeader. Replaced Sedit_Mailto with a stub that calls Msg_Mailto. Removed DecodeURL. lib/tclIndex: New one needed because functions were moved. lib/uri.tcl: Call Msg_Mailto instead of Sedit_Mailto in URI_StartViewer. cvs repository 05/10/2001 Brent Welch exmh.MASTER: exmh-bg.MASTER: Removed auto_reset from auto_path_update and add exmh(userLibrary) to auto_path very early. inc.expect.MASTER: Code cleanup and fix to ensure that the password is not echoed in the scan listing. lib/addr.tcl: Adopted patch for LDAP searching lib/background.tcl: Removed extra call to User_Layout from Background_Init lib/env.tcl: We only chmod exmh(tmpdir) if it does not already exist to avoid setting permissions on /tmp, /usr/tmp, etc. lib/extrasInit.tcl: Added utf-8 to possible set of text charsets This is used when setting the initial type in sedit. lib/main.tcl: Removed the exmh(userLibrary) preference setting. This is hardwired (the code is in exmh.MASTER) to be either ~/.exmh/lib (a new, preferred value) or ~/.tk/exmh (the old, historical location) The first directory that exists is used. lib/pop.tcl: Minor tweak to focus settings in password dialog. lib/seditBind.tcl: Added auto_loads to try and avoid loosing bindings when Tk library files are loaded. cvs repository 04/20/2001 Ovidiu Predescu lib/uri.tcl (URI_StartViewer): Invoke Msg_CompTo instead of Sedit_Mailto to correctly support external editors. lib/sedit.tcl (Sedit_Start): Better check for PGP variables so we don't get a runtime error if PGP is not fully enabled in a particular installation. lib/msg.tcl (Msg_CompTo): Accept a generic mailto: URI as argument, instead of a simple email address. Modify the draft according to this mailto: URI so that it has the right content before being passed to the editor, which may be an external editor. cvs repository 04/10/2001 Brent Welch exmh-strip.MASTER: extracted code from mime.tcl into a utility script that strips attachments from mail and replaces them with message/external-body parts that reference the extracted file. lib/app-defaults: Added mappings from utf-8 charset to iso10646 fonts lib/env.tcl: switched from TMPDIR environment variable to exmh(tmpdir) so that we don't pollute the environment with our choice of temp directory. This confuses some programs, especially gnuclient. lib/mime.tcl: Fixed message/external-body for the local-file access case. lib/inc.tcl: Added guard against undefined exmh(slocal) to Inc_Init. Cleaned up check against stray files (e.g., "++") in the MyIncTmp directory. lib/folder.tcl: Added Folder_Cache calls when setting the move/copy folder so that the folder appears in the folder cache. cvs repository 03/03/2001 Brent Welch lib/inc.tcl: Eliminated the use of the expect wrapper around inc for the "presort-multidrop" and "multidrop" cases. This interferes with folks that have set up their .netrc file to have passwords. lib/fdispPopup.tcl: Eliminated noisey Exmh_Debug command lib/html/exmh-faq.html: Added #24 about scan .mh_profile entries that can cause problems. cvs repository 01/19/2001 Brent Welch lib/main.tcl: fixed test for MH version. Released exmh-2.3.1 1/19/2001 Brent Welch cvs repository 01/19/2001 Brent Welch lib/env.tcl: fixed installation error that was due to the addition of Env_Init to the installer. Only showed up when you installed without the .exmhinstall cache. Released exmh-2.3 1/17/2001 Brent Welch cvs repository 01/17/2001 Brent Welch lib/flist.tcl: Added catch for file system errors that could cause Flist to stop working - both when hitting the button and from the background process. cvs repository 01/15/2001 Brent Welch These files embed version information: Makefile exmh.README exmh.install lib/html/index.html lib/html/software.html lib/html/exmh.README.html lib/extrasInit.tcl: Moved POP3 mail host into the top-ten preferences. lib/html/exmh-faq.html: Added FAQ about using a POP3 mail server. lib/bitmaps: added a contributed set of bitmaps to replace text buttons. You'll need to set up your exmh-defaults to get these. See the lib/bitmaps/exmh-defaults file for an example. install.tcl: added call to Env_Init lib/env.tcl: Fixed it so that it doesn't chmod /tmp if that's what TMPDIR is set to. cvs repository 01/12/2001 Brent Welch lib/env.tcl - fix for symlink attack. Exmh now chooses /tmp/ as the default tmp directory. You can also set TMPDIR or EXMHTMPDIR, which was true in previous versions of exmh already. lib/pop.tcl - improved the password prompting dialog. inc.expect - fixed this to deal with the case where inc does *not* prompt you for a password. cvs repository 01/03/2001 Bruce A. Mah lib/pgpPgp5.tcl - Add +force to correct a problem with verifying the signatures of PGP5 clearsigned messages. From Dave Tweten , via the FreeBSD Project. cvs repository 01/03/2001 Hal DeVore exmh.TODO removed item 24 - support for nmh 1.0, already done removed item 33 - change name of /tmp/scancmds, it's already dependent on [Env_Tmp] cvs repository 01/03/2001 Hal DeVore lib/error.tcl - Remove file [Env_Tmp]/exmhErrorMsg if it exists prior to writing to it. Addresses a bug reported to BUGTRAQ. cvs repository 12/13/2000 Brent Welch lib/html/sedit.html - Added explanation from John Klassa about the Filter mechanism in Sedit. lib/folder.tcl - applied a fix for auto-packing folders from Chris Keane (I think it was Chris) The bug lead to incorrect scan listings when you used auto-pack. cvs respository 12/11/2000 Hal DeVore lib/sedit.tcl - removed duplicate SeditSetHeader proc cvs respository 11/22/2000 Hal DeVore lib/html/guide.html - Corrected a couple of improperly closed tags lib/sedit.tcl - patch from Chris Keane to eliminate the removal of charset in SeditSetHeader proc cvs repository 11/17/2000 Brent Welch lib/glimpse.tcl - Grouped some expressions with { } to avoid double-substitutions on file and directory names. If they had $ in them it would raise errors. cvs repository 11/08/2000 Brent Welch lib/inc.tcl - Added the option to use an expect script that wraps the "inc" program and deals with the password prompt. inc.expect.MASTER - the expect script cvs repository 10/25/2000 Anders Eriksson lib/mime.tcl - Headers are now displayed in the order expressed in mhProfile(header-display) cvs repository 10/23/2000 Brent Welch lib/ispell.tcl - replaced some debug "puts" with Exmh_Debug lib/uri.tcl - trim white space off the URI that is matched to handle the funky Visit links. lib/glimpse.tcl - fixed glimpse -V test during startup to handle both old and new versions of glimpse. cvs repository 09/21/2000 Valdis Kletnieks lib/glimpse.tcl - Glimpse 4.12.6 output /Mail//folder - the double slash gave a regexp indigestion. Fix to accept / or // after Mail cvs repository 09/21/2000 Valdis Kletnieks lib/pgpExec.tcl - fix 'set result' so 'PGP Get Key' and 'PGP Generate Key' work. cvs repository 09/21/2000 Valdis Kletnieks lib/pgpPgp65.tcl - fix a stupid regexp problem so it finds RSA keys cvs respository 09/15/2000 Hal DeVore lib/inc.tcl Added code to allow the use of procmail or any other mail-fetching-and-filtering tool directly from exmh. Original patch developed by Carl D. Roth, code updated and merged into current exmh by Chris Keane. cvs respository 09/13/2000 Hal DeVore lib/html.tcl Fixed preferences item spelling mismatch problem and solution pointed out by Ben Escoto cvs respository 09/07/2000 Hal DeVore lib/addr.tcl Fixed problem with some address book preferences getting clobbered. cvs respository 08/30/2000 Hal DeVore lib/seditMime.tcl applied patch from Chris Garrigues to prevent flowing of mhn directives when running sedit with formatting on send. cvs repository 08/28/2000 Valdis Kletnieks lib/html/software.html: Document 8.3.2 as most recent Tk/Tcl. cvs repository 06/28/2000 Hal DeVore lib/mh.tcl: added -noheader to "exec scan" in Mh_Forw_MungeSubj to prevent breakage when user .mh_profile specifies "scan: header", problem found by David Chin cvs repository 06/28/2000 Hal DeVore lib/folder.tcl: Got rid of a hardcoded path to ~/Mail cvs repository 06/27/2000 Bruce A. Mah lib/seditExtras.tcl: Add an "undo" feature for sedit shell, from John Klassa . cvs repository 06/27/2000 Hal DeVore lib/{mh.tcl,msg.tcl}: Add upward search for components, forwcomps, and replcomps. Add search for distcomps also. cvs repository 06/26/2000 Bruce A. Mah lib/{extrasInit,sedit,seditExtras}.tcl: Add the ability for sedit to filter the selected text region through an arbitrary UNIX command, from John Klassa . Released exmh-2.2 6/23/2000 Brent Welch cvs repository 06/22/2000 Valdis Kletnieks lib/receipt.tcl - generate proper Final-Recipient: field cvs repository 06/22/2000 Bruce A. Mah lib/html/exmh-faq.html: Added FAQ #15a on folder-specific template files. lib/html/exmh-faq.html: Added FAQ #23 on keeping sender's address from appearing in the cc line, written by Pete Gelbman . cvs repository 06/21/2000 Bruce A. Mah lib/html/custom.html: Updated "Preferences Sections" and "Code Organization". cvs repository 06/21/2000 Valdis Kletnieks lib/main.tcl - fix MH version for UCI MH users - was using bogus variable cvs repository 06/20/2000 Bruce A. Mah lib/fdisp.tcl, lib/find.tcl: Add a preferences item to allow finds (control-s in default bindings) to start either in the FTOC or the current message. Patches from John Klassa . cvs repository 06/20/2000 Brent Welch lib/exec.tcl: Put catch around the unsets of ExecCache. Errors can occur in Pgp_Exec_Init if the path to PGP is wrong. cvs repository 06/16/2000 Bruce A. Mah lib/html/exmh-faq.html: Add FAQ #22 about giving preference to displaying text/plain over text/html. Fix minor HTML glitch in FAQ #21. exmh.CHANGES: In a fit of anal-retentiveness, fix a typo. cvs repository 06/16/2000 Brent Welch (By way of Jacob Morzinski) lib/extrasInit.tcl, lib/faces.tcl, lib/flag.tcl Generalized the "slow display icon" preference item to give control over using color icons for the Exmh desktop icon as well as for the faces icons. cvs repository 06/16/2000 Valdis Kletnieks lib/app-defaults - missed a PGP menu lib/pgpBase.tcl, lib/pgpExec.tcl, lib/pgpMain.tcl - handle missing "pattern" which caused PGP 6.5 to not list private keyring. lib/pgpMain.tcl - after changing PGP version in sedit, wrong PGP version used in 'select key' dialog. cvs repository 06/15/2000 Valdis Kletnieks lib/main.tcl, lib/sedit.tcl, lib/seditMime.tcl - output MH version as well as Exmh on X-Mailer: line lib/pgpExec.tcl, lib/pgpGpg.tcl, lib/pgpPgp65.tcl - make PGP Comment: line track the Exmh version actually used... cvs repository 06/12/2000 Brent Welch sedit.tcl: Fixed auto-sign bug having to do with {$t} in app-defaults. Makefile, exmh.install, exmh.README, html/index.html, html/software.html Rationalizing version number to 2.2 Released exmh-2.1.2 6/8/2000 Brent Welch cvs repository 06/08/2000 Valdis Kletnieks Support for PGP 6.5. Added new file lib/pgpPgp65.tcl. Added PGP 6.5 config to lib/pgpBase.tcl, lib/extrasInit.tcl, exmh.install, lib/app-defaults, and lib/html/PGP.html. Fixed a check in extrasInit - it assumed a PGP version was present if the $pubring and $path for the version were there. I added a check that the 'pgp verify' command was present. Otherwise it thinks that 5.0 is available if 6.5 is present. lib/pgpWWW.tcl - provide a working default URL. cvs repository 06/08/2000 Hal DeVore lib/extrasInit.tcl: Corrected help text for Play Multiple cvs repository 06/08/2000 Hal DeVore lib/extrasInit.tcl: Clarified wording of help for Play Multiple Also added help about globbing for sound file paths lib/mime.tcl: nearly lost this change from Christopher Hall: proc MimeParseSingle reads the first line of the body _before_ Mime_SetFileEncoding is called; therefore the first line is in the default encoding for the file (guess this is us-ascii). The first line of the display will be in the wrong encoding. cvs repository 06/07/2000 Scott Lipcon misc/RPM/: added and fixed 2.1.2 RPM generation lib/sound.tcl: added ~ glob to sound file paths (untested) Forgot to update exmh.CHANGES, sorry :) cvs repository 05/30/2000 Bruce A. Mah lib/seditMime.tcl: Fix a bug introduced in last commit to this file; when creating a multipart message, don't assume where the separator is, just scan for it. cvs repository 05/09/2000 Valdis Kletnieks exmh.TODO: remove following 2 patches from #25, add RFC2646 as #50 Also, removed line item 8, it was already in the CVS tree.. lib/inc.tcl: add preference item for 'flist-at-startup' lib/exwin.tcl, lib/widgetText.tcl: add preference item for automatically scrolling to next message cvs repository 05/08/2000 Valdis Kletnieks lib/html/software.html Document Tk/Tcl 8.3.1 lib/uri.tcl Merge in minor fix from Hal Devore, lost somewhere around 2.0epsilon lib/main.tcl Timestamp the logfile cvs repository 05/08/2000 Brent Welch lib/app-defaults, lib/sedit.tcl: Restored the use of { } in the Sedit app-defaults values so we can tolerate spaces in the drafts folder name. Changed the uses of "eval list" to "subst" in sedit.tcl so the bracing trick works in those cases. lib/html.tcl, html_images.tcl: Added an option to disable image loading in HTML lib/html/guide.html: fixed minor typos. cvs repository 04/19/2000 Brent Welch lib/ftoc.tcl, lib/folder.tcl: Added Ftoc_LastFolder and Folder_Previous so you can go back to the folder you were just in. lib/flist.tcl: Added "force" argument to Flist_FindAllFolders lib/folder.tcl: Added Folder_CheckPointShared, Folder_IsShared, Folder_FindShared to support the notion of folders shared by other exmh users. lib/mh.tcl: Changed to use mhProfile(sendproc) instead of "send" lib/msg.tcl: Added call to Folder_CheckPointShared lib/seditMime.tcl: Tweaks to handle proper positioning of the insert cursor. One for --- header separators, another for when you delete the last character in a part. lib/seditQP.tcl: Took out extra Mime-Version header cvs repository 04/19/2000 lib/html/software.html nmh 1.0.4 is out - vkletnieks cvs repository 04/18/2000 lib/seditExtras.tcl Add better support for composing RFC2017 URL external-references Still need to add better support for displaying them - vkletnieks cvs repository 04/18/2000 lib/app-defaults, lib/scan.tcl, lib/seditBind.tcl Handle embedded blanks better - vkletnieks, patch by Jacob Morzinski cvs repository 04/18/2000 lib/PgpDecryptExpect, lib/PgpExec.tcl, lib/pgpGpg.tcl, lib/pgpPgp5.tcl Use ASCII quote character - vkletnieks, patch by Jacob Morzinski cvs repository 04/05/2000 lib/html_head.tcl, lib/html_links.tcl - Use app-defaults c_link, c_alink values for links. - vkletnieks cvs repository 03/29/2000 Updated lib/html/software.html - note *actual* latest versions, removed some dead mirrors, and added a note that nmh 1.0.3 is recommended due to security issues. -vkletnieks cvs repository 03/23/2000 Some work on the FAQ a) Added new question 2c, dealing with RFC2047 encoded headers, with a cross-reference under question 18 (FTOC). b) Did some minor markup changes to question list c) Did some markup revisions to 14 (mailing lists). Also added pointer to mailing list archive and info on digested exmh-user list. d) Markup revisions and additional info in question 15 (templates). It noted 4 types of templates but only listed 3. Now it has info on 4 MH plus 1 new nmh template. -haldevore cvs repository 02/29/2000 Applied patch to speed up pick -Dick Wesseling via haldevore Applied patch to allow parentheses in address book entries -Mats Bengtsson via haldevore Applied patch to limit encodings to one for which we have fonts -Marc Boucher via haldevore Happy leap century day! cvs repository 02/02/2000 Fixed hard-coded '-wrap word' -vkletnieks cvs repository 02/02/2000 Fixed hard-coded 'config -cursor xterm' -vkletnieks cvs repository 02/01/2000 Fixed regexp for glimps version detection -vkletnieks cvs repository 12/6/1999 Added character encoding support to LDAP lookup -iko cvs repository 12/2/1999 Applied Burkhardt patch for specifying POP host with -host flag Fixed "double page up" bug in HTML by eliminating redundant bindings Tweaked error message in install.tcl cvs repository 11/08/1999 Roll back 11/04/1999 bug fix and re-implement it in a different way. -kchrist cvs repository 11/05/1999 Removed app-defaults assumption of PGP use when treating multipart/signed or multipart/encrypted -kchrist cvs repository 11/04/1999 Disable PGP sign and/or encrypt when doing a redistribute. -kchrist cvs repository 10/29/1999 Fix bug introduced with previous PGP options change. -kchrist cvs repository 10/28/1999 PGP options were not being preserved on a re-edit. Fixed a crash when not-enabled PGP versions were selected in sedit. -kchrist cvs repository 10/27/1999 Quick application/pgp support fix. -kchrist cvs repository 10/25/1999 Added a dropKeys pattern to pgpGPG.tcl. Simplified PGP GUI by removing "detached" signature option. Problem was that MIME+standard includes a copy of the message being signed in the signature attachement. What really should be used is MIME+detached. Decided to overload the meaning of "standard". If the format is plain, standard means "binary". If the format is anything else, standard means "detached". Less flexibility but better chance of "doing the right thing". -kchrist exmh-2.1.1 Released, 10/15/1999 cvs repository 10/12/1999 Fixed a bug that caused a new sedit window to bomb if the PGP selection for new windows was not supported. -kchrist cvs repository 10/07/1999 Changed documentation string for quote file name to indicate it is created relative to the exmh startup directory. Fixed a bug in sign+encrypt processing when composing a MIME message. Added a couple of bugs to the list to remind me of what still needs to be done. -kchrist cvs repository 09/29/1999 Fixed a bug in the shorten output processing of GPG. -kchrist cvs repository 09/27/1999 More PGP changes. Consolidated passphrase entry to sedit field or pgpExec routine. Made the pgp-sedit field aware of pgp(keeppass) and pgp(echopass). Moved pgp(keeppass), pgp(echopass) and pgp(grabfocus) to PGP General Interface. Fixed a minor bug left over from my previous GUI changes. -kchrist cvs repository 09/22/1999 Changed the PGP interface, basically the stuff under the Crypt... button. The hope is that the change will help make the different sign options a bit clearer - kchrist exmh-2.1.0 Released, 9/17/1999 cvs repository 09/17/1999 Fixed RPM build, and added spanish support to the RPM, thanks to Francisco Monserrat -slipcon cvs repository 09/15/1999 Typos in getnews.tcl - cwg cvs repository 09/03/1999 Allow (again) spaces in address search strings. (addr.tcl) - kchrist cvs repository 09/01/1999 Fixed text/plain to application/pgp hack in mime.tcl so it ignores the format parameter of text/plain. -kchrist cvs repository 08/25/1999 Fixed some problems with not timing out PGP subkeys (e.g. DSS keys for PGP5/GPG). --bmah. Eliminate last vestige of PGP passphrases showing up in debugging logs. --George Ross via bmah. cvs repository 08/24/1999 Importing keys from email keyserver queries now works. Attaching keys to an email message is now RFC 2015 compliant (content-type: application/pgp-keys instead of application/pgp). --Kevin.Christian@lsil.com via bmah. Made reply-to-all invoke repl -group if repl claims to support a -group flag (i.e. is nmh). Adapted from Debian 2.0.2-7 package. (iko) cvs repository 08/22/1999 Fix a few bugs related to email PGP querying (queries now can go out). Use Exmh_Status to let user know what's happening during an email query. --Kevin.Christian@lsil.com and bmah. Sanitize PGP info out of debugging logs. --George Ross via bmah. Delete More...->old PGP->Encrypt cascaded menu, due to apparent lack of need for this functionality and difficulty in getting it correctly implemented. --bmah. cvs repository 08/19/1999 Change address book expansion to NOT insert new header lines as this broke the "continue lookup" feature. Also changes to allow address expansion on ANY header line (doc changes still to be done). -Kevin.Christian via haldevore cvs repository 08/17/1999 PGP without seditpgp works again. -bmah Wheel mouse support added, enable it in the Windows + Scrolling dialog. - slipcon cvs repository 08/13/1999 Don't try to coerce text/plain PGP messages to application/pgp unless PGP is actually enabled. --bmah Really fix problems with 8-byte GPG keyIDs and keyservers this time. --Kevin.Christian@lsil.com, via bmah Rudimentary support for LDAP --Jason Day and cwg If we ask the user for help in picking the PGP key to use for a receipient and they cancel the resulting dialog, generate an error (instead of asking the user ad infinitum). --bmah cvs repository 08/12/1999 Fix a number of key/passphrase management problems: pgpsedit now manages PGP versions, keys, and passphrases on a per-window basis. Decryption now works when no passphrases are cached. One timeout parameter controls passphrases for all PGP versions. seditpgp UI slightly modified. --bmah Get rid of "PGP Preview" menu item in sedit left over from debugging. --bmah cvs repository 08/10/1999 Properly use [Env_Tmp] in the below patch -cwg Ignore high-order bytes of key IDs returned by GPG for compatability with keyservers. --bmah Properly process PGP/MIME messages that have boundary characters containing regular expression special characters. --bmah cvs repository 08/05/1999 Prompt before executing buttons on html pages which are either non-local or in /tmp. -cwg cvs repository 08/04/1999 Fixed problems with not providing a password under pgp2 -cwg Renamed the *.n.html pages and rephrased links to them -cwg Got passphrase timeout to work yet again -cwg cvs repository 08/03/1999 Display the body of a message which fails to be decoded by PGP. -cwg Finished to reveal more buttons that do the installation.

The installer has many fields in a scrolling list. Each field value is used to patch exmh.MASTER in order to make the exmh script. Most of the settings are file or directory names. Make sure the file system pathnames are correct for your system. The fields are described below.

The wish pathname is for the program that runs exmh. Tk 8.0 or higher (e.g., Tk 8.4) is required.

By default, the program is installed as "exmh", and it also uses related scripts named "exmh-bg" and "exmh-async". If you want to install it under an alternate name, use the "Name of main exmh script" setting to change the base name.

You may not have some support programs or packages. In this case, just delete the default value and leave the field blank.

Recommended Packages

See exmh.README.html for pointers to these.

  • The metamail program that handles unknown (by exmh) MIME formats. This also includes mimecode that handles base64 and quoted-printable encodings used to transmit 8-bit data safely in mail messaegs. This is highly recommended. If you use 8-bit character sets, then you must have this package to properly encode messages.

Optional Packages

See exmh.README.html for pointers to these.

  • The expect program. This can be used to do FTP transfers of MIME message/external-body messages of subtype anon-ftp.
  • The facesaver database. Exmh needs to know the root directory of the database and then the set of subdirectories under that which contain directory trees of face bitmaps.
  • Glimpse is a search tool that can help you find mail messages by their content.
  • The play program that plays audio files.

Reminder

Check out the optional slocal.patch and folder.patch files. These are optional - see the man page for details.

Field descriptions

  • Wish absolute pathname. Exmh is a script. It needs to be run by the Tcl/Tk shell, "wish". Enter the complete, absolute pathname.
  • Exmh version number. Do not change this so that automatic bug reports properly reflect the version of exmh in use.
  • Name of main script. This lets you change the name from exmh to something else, like "exmh2" or "exmh-solaris".
  • Error mailing target. Change it if you want to see errors at your site. Otherwise I'll get them, which is OK.
  • MH binary directory. The directory that has MH programs like inc, send scan, folders, etc.
  • MH slocal program. Use for presorting mail. This is in the MH library directory. Give the complete pathname.
  • Metamail bin directory. The home for metamail and mimencode. These programs are required by exmh for MIME handling.
  • System mailcap file. This file has rules for metamail that describe how to view MIME parts. Exmh uses these rules, too.
  • System mime.types file. Maps file extensions into MIME types. Used by Exmh to set the mime type correctly for attachments when composing a MIME message. Also used by web servers to work out the MIME type of files they're delivering and web browsers to work out what to do with file:... type URIs so your sysadmin may have installed one (maybe in /usr/etc or /usr/local/etc). Default is to use the one which will be installed in the Script Library directory.

(The following are for optional packages. Leave them blank if you do not have the related package. There are more required fields described after these)

  • Expect program. Only needed if you use the "expect" method for FTP transfers. This is the most reliable method.
  • Root for faces. The facesaver directory. It has subdirectories that correspond to different faces (i.e., picons) databases.
  • Search path for user faces. This is a list of directory names relative to the root of the faces databases.
  • Search path for generic faces. This is a list of directory names relative to the root of the faces databases.
  • Default domain. This is used in faces lookup to fully qualify addresses.
  • Faces file suffixes. These are the file extentions that are used in your faces database. Narrowing this speeds face lookup.
Faces example: Suppose you have a directory /usr/local/faces that contains these subdirectories: domains, misc, unknown, usenix, users, and local. /usr/local/faces is your "Root for faces". Each of the subdirs is the root of a directory hierarchy that mirrors domain names. You'll have domains/com, domains/edu, as well as users/com and users/edu, for example. The databases are split into user and generic categories to help find real faces before more generic icons.
  • PGP bin. The directory that contains the PGP binaries.
  • Glimpse bin. The directory that contains the glimpse and glimpseindex programs.
  • Audio play program. A program that plays .au files

More Required Fields

  • Script Library. The runtime location of the exmh .tcl files.
Note that the "Script Library" and the "Install lib directory" are usually the same place. The script library is the runtime value of the library directory, while the install lib directory is the install-time value. Ordinarily they should be the same. If you have AFS, you might need to set these two differently because of read-only volumes.
  • Install bin directory. The place to install the main exmh script.
  • Install man directory. The place to install the man pages.
  • Install lib directory. The place to copy the .tcl scripts.
The "Install lib Library" should be private to exmh (unshared with other apps). In addition, it cannot be the same place as ./lib. You have to let the install procedure copy the TCL library files elsewhere. The Verify does not check for this, and you'll get an error on audi.tcl as it removes itself before copying onto itself...

Install Commands

The Test button runs exmh and automatically switches the script library run-time value to "./lib" for the duration of the test.

When you press "Patch" the configuration is saved in the file named .exmhinstall. If you save this to an alternate name (e.g., .exmhinstall.sun4) you can use the button to choose among ../*/.exmhinstall* files.

After you set things up, then

  1. - apply site-dependent patches to exmh.
  2. - compute the auto-load library index.
  3. - run the patched script.
  4. - see what the Install will do.
  5. - install exmh.

More Exmh Documentation

} exmh-2.8.0/Makefile000664 001047 000144 00000005314 11744615131 014432 0ustar00welchusers000000 000000 # Create a tar distribution for exmh # To change the version, # change this variable and type "make version" VERSION=2.8.0 RELDATE:=$(shell grep '^set date' ./exmh.install | cut -f3 -d" ") SNAPRELDATE:=$(shell /bin/date +%m/%d/%Y) SNAPDATE=`/bin/date +%Y%m%d` # Don't add "version" to the srctar production because it may # re-write files we've tinkered with by hand (e.g., lib/html/exmh.README.html) srctar: realsrctar realsrctar: htmltar find . -name CVS > Tar.exclude echo ./lib/html/Tar.exclude >> Tar.exclude echo ./.exmhinstall >> Tar.exclude echo ./Tar.exclude >> Tar.exclude echo ./html-\*.tar.gz >> Tar.exclude echo ./exmh-\*.tar.gz >> Tar.exclude echo ./exmh-\*.src.rpm >> Tar.exclude echo ./exmh-\*.noarch.rpm >> Tar.exclude echo ./rpmroot >> Tar.exclude echo ./exmh-$(VERSION) >> Tar.exclude echo ./exmh-$(VERSION).tar.gz >> Tar.exclude echo ./html-$(VERSION).tar.gz >> Tar.exclude rm -rf ./exmh-$(VERSION) mkdir ./exmh-$(VERSION) tar cvfX - Tar.exclude . | (cd ./exmh-$(VERSION) ; tar xf -) (tar cf - exmh-$(VERSION) | gzip > ./exmh-$(VERSION).tar.gz) rm -rf ./exmh-$(VERSION) clean: rm -f ./Tar.exclude rm -f ./lib/html/Tar.exclude rm -f ./exmh-*.tar.gz rm -f ./html-*.tar.gz rm -f ./exmh-*.noarch.rpm rm -f ./exmh-*.src.rpm rm -f ./lib/html/exmh.CHANGES.txt rm -rf ./rpmroot/ rm -rf ./exmh-$(VERSION) rpm: realsrctar mkdir -p rpmroot/{SOURCES,SPECS,BUILDROOT,RPMS/noarch,SRPMS,BUILD} cp exmh-$(VERSION).tar.gz rpmroot/SOURCES/ sed -e 's/VERSION/$(VERSION)/g' -e 's#RELDATE#$(RELDATE)#g' < misc/RPM/exmh-conf.patch > rpmroot/SOURCES/exmh-$(VERSION)-conf.patch cp misc/RPM/exmh.wmconfig rpmroot/SOURCES/ cp misc/RPM/exmh.desktop rpmroot/SOURCES/ sed 's/EXMHVERSION/$(VERSION)/g' < misc/RPM/exmh.spec > rpmroot/SPECS/exmh.spec rpmbuild -ba --define "_topdir `pwd`/rpmroot" --buildroot `pwd`/rpmroot/BUILDROOT rpmroot/SPECS/exmh.spec cp rpmroot/RPMS/noarch/exmh-$(VERSION)-?.noarch.rpm . cp rpmroot/RPMS/noarch/exmh-misc-$(VERSION)-?.noarch.rpm . cp rpmroot/SRPMS/exmh-$(VERSION)-?.src.rpm . snaprpm: make rpm VERSION=$(VERSION)_$(SNAPDATE) RELDATE=$(SNAPRELDATE) snaptar: make realsrctar VERSION=$(VERSION)_$(SNAPDATE) version: ./version.csh ./PatchVersion $(VERSION) < exmh.install > exmh.install.new mv exmh.install.new exmh.install ftpdist: scp exmh-$(VERSION).tar.gz www.tcl.tk:~ftp/pub/tcl/exmh scp html-$(VERSION).tar.gz www.tcl.tk:~ftp/pub/tcl/exmh scp exmh.README www.tcl.tk:~ftp/pub/tcl/exmh scp lib/html/exmh.README.html www.tcl.tk:~ftp/pub/tcl/exmh htmltar: echo CVS > lib/html/Tar.exclude echo Tar.exclude >> lib/html/Tar.exclude cp exmh.CHANGES lib/html/exmh.CHANGES.txt (cd lib/html ; tar cfX - ./Tar.exclude . | gzip > ../../html-$(VERSION).tar.gz) install: srctar ftpdist exmh-2.8.0/exmh.README000664 001047 000144 00000003123 11744615131 014606 0ustar00welchusers000000 000000 Sun Jan 2 20:56:42 PST 2005 welch@acm.org exmh is a TCL/TK based interface to the MH mail system. MH can be found at http://www.mhost.com/nmh/ Version 2.7.2 requires Tcl/Tk 8.3 or higher - works with the latest (8.4.5) All the docs have moved into html and are viewable from within the installer as well as from within a running exmh. The exmh home page is http://www.beedub.com/exmh/ Exmh builds on many related software packages: http://www.beedub.com/exmh/software.html Exmh sources live at SourceForge under http://sourceforge.net/projects/exmh/ To install, run wish exmh.install You can send me email with the word "exmh" in the subject, but you may get better response from the exmh-users mailing list. Subscribe via "exmh-users-request@redhat.com" Send a message whose subject line reads 'subscribe' and whose From or Reply-To line contains the email address to add. Thanks to the dozen or so folks that have write access to the CVS code base who continue to add features and fix bugs. You see these folks listed in the exmh.CHANGES file: cwg Chris Garrigues iko Anders Hammarquist haldevore Hal DeVore jbeck John Beck slipcon Scott Lipcon gruber Markus Gruber jrennie Jason Rennie valdis Valdis.Kletnieks@vt.edu bmah bmah@CA.Sandia.GOV (Bruce A. Mah) kchrist Kevin.Christian@lsil.com jmorzins Jacob Morzinski aer Anders Eriksson stanton Scott Stanton exmh-2.8.0/misc/RPM/000755 001047 000144 00000000000 10000654350 014344 5ustar00welchusers000000 000000 exmh-2.8.0/misc/Par150.tar.gz000640 001047 000144 00000133325 06714625434 016032 0ustar00welchusers000000 000000 ‹w¥1Par150.tarì €rQ.®ƒ|B#JÒ8óY"3"Œhú åÃ,ªŸL|Ÿå¾/ÇÝɄ֊LÓiv ýV13ˆaý0AýJY CÃ2çA8qôòÙ3ç\‘¤±¶v¾h·D¯…ðÆXíÇã£ó§§¦ê8•r-ÉÓ–ó@F~0šðXſøtI{oD{¤Y> ßtI ÀÀ~Úm¢Ác`2¾F•È)Œ…†Âž¨îRu‘2„›º7™‚Þ[ ŽŠéäU‘-cS3r„ÖÖd›—…¨˜&©¼ â"ëâŹ"$xˆýz(Uº&c¦Ú °ve€¥~hXYçY‰Iê8Cé“yǰ/ŽÒ@ ü5_®ÕÞl= ˆ/ZòM·ƒß!Þ2ÿPÌkœ¨RºúZìŠþ`S<*e 낵ÖÏ¿›-«ò&5†áz ”н5mß›V‹QyÓPñãçLSCÃo4ZûØ×ˆû©F‹ä–$×KfkL”N\äñx*§ÔXˆK°Ú"YIãKÞ)Ô•r¡ÒìVÆMÏŒÙå{eÁô­2$xËt6¥¤àPÞSàR(@)ËJ1dT¤¨[6-)n˜¦žhÒ)ÎBq›‡e«½U¬ÈÆI\8ŠEQ(mñt€WšÎ[—•.UĦr¾¶À󸀪ÉVRâk ¦’T#šÑΧ KQIdMt„~= B©b.Cƒ’Þ¦¦0"¶POÑG¡lp-]Ú2ò`ÂŒÄ ¥›Þ>ZŒµ¦‘žÃ9l[z5¾kIª‰[IƒvÉ,Ì:ä¶ä–Î/²6ÀÜÜf(æ¦W©6UF*ô‡N)VÖ@w+­٠x4óó><Ñ•l‹5Caj»L€[‚{'Ëcc0ounµ<Æú¸±>øy§~më ¸ ðŸ3¦¼Ñ"”­ÍŠ)ú¦"qõ–¶õ1å5;S¢ßhÕ(H¥€HpLÑåGÇ´4\-@¥*å;‚E×[‹äè›oªÈ/1yðP‘ܘ;’!Òr¼ZfØPÃÈ[+¦¼ÎY¢ûsò^ÝÛho¹]®¨*ºÜ¨¹„X©®é°®Í£;kkî–Í¡]V‡VÕøã°KeŠ'ðôN“u¬ž«Vdnµµâ>/2¸ó2™VDÑ ÛÇÊ  ”áŽX$À˧ãÔâ}*¯Á_X8ÇÔ<úÙäs”be–#spìXÎUÙعàªNskžeJ,¯4´”¿ÚE»*¡-ƒhý-ÈÔ¦‘&¢•ˆ›‰¥Ù_#y³ùôWÄÿ&Ÿ!þ×ÛÜØÞTñ¿ÁFo[Çÿ¶¾Æÿ¾ˆøßäËŠÿŹ| Uâ ¯ED»LøÒ a9ë 2€à°{áÃZ+ÎE•4¨ºáµ;Ã(›çIéw0žvøÐœ–îùDÎhqœ¸Y…Wnˆ^nzYLA²n=€giµàÛœù8[AþùÀå6Y%IÙÄÔU5”ñ€e¾Hb˜¬¡ôÿLÜ€ õb ˜p“8ô3å—‚ÃJó¶†Þ5Í”>-(€–cª×âTõK‘™8c7‹TvMèsÙâL«ú˜ý¢Œ50qÆ)ð'Ëb/psà…E5Z¥Ë©;ÓxÈGwLD@éòÀ?èZÑØ¥«,Sí9Rx_Z¦sŒÔ0ÝÆiÂÝ?%o.04{ëPÑ2™WQ$C<·'1³éw6B³{_?uÿ×H@ëO“pËþÿöfGûÿƒím®·µùÕÿÿ¼þ¿‘‰/Êÿ"=]ú|¾RG\ÃTçF«9ZpÖ;¯æÏ8›<ØÚå]ð=ÒŒ§»TÂÐl(ØÏÌáLíqš¡}Ie‚V l ™&=vœbâ‚­Ndop F­ œXš\Ó¸ˆØEÐ>ŸÝ«Åþ) G7-ÀC€º8…O“0à98ÇÔ‚)‘&[y“(J,J1Ь|ƒî’oag Ôò ìÄјè°,;a~×ZVyØç¢”„ÛRü æÙÇO]ÐK¼y‰»ðuò²qè‚_94¹ Š!âÀT…@ú¡¢ë¾‘Iœ²øÉ®žÉ‹Y dPC›¦ž)O2_±™éè (\pÁ  Ñê`nú  Spë*Jõ^ÀØuD6tÔBÔE: ހ쬨…§¦¨ÀŸlØ0ÌH¨ñ¢rÊ›ž-æH†1&_Ä´8Sž´b$ÁûJÁº]+AoºÇ`ä®QïÕÀ„\™\?>]EWóR~JÛcBŒ¼„>‹ iIæjYyl)LVyà©Å ¡ÅþÙë—û{g¸wÞQ‰J­pEZ$¸ñ\°f¡Ì™5 u`=S° °`dïëÇßÏq›¾–/½VÂ.ƒ¼žÒÐ D.vÅ·Ã*,$>3¢g¯ìÅÈ+:EƒˆCž^T³êd¨ÏȽP顸xh…1lŽ+2¨‚·¼‚ÖägÖõÜ ù›P09Fn#ÿÝ'’ý^Æw=ñð!ço’®ÁOÇS[@Ö&ò¨•£“«QÅIAë‚r¢baÅÐØÕ4WX#å‘0šõ¾/£R*²B“å²è–À¢U0vÀK`Ò &ñnnmï|ûÝÞ“ýž®”A~ÏlÚ¬÷1Ö›éjÜDTƒwÍkÙ{ü‰ø;ü¯[}=&(j‰¨§nWP ƒÊ~xÐb•™H—{« ˜ìH˜ÙÞ— FCìPˆJ ¤%±±kÃîPæAô àj}—à,îýê½²1ðcÄàM_‹ ü³Ãáäo‚ z¾ç\ =•´üUwk5‘^°ygÚzøme„¨u™Ç 5ºx¿A•.C)3Ï?yþ:½}q³¢wía¼`à{0Ô3”7!V©nk;ã «V¹U‡õîžZ“@õ2·†{YÿAÍ5»êVÏ7Ö訜ͯN}P¨FdMÒh§ 1¢mªá¡÷•„ƒáj'CÜ@NZ&© `ÂêëÕr7žÛ›þ¥áBêW¨Þ²SäU@‚Ñ•(dBgõœ™jbYµ‘©vq±º¸ÚÛ²Úê’j/Êj+õj *BU»YEõ±Æ(Hª m “_û¯¬Lª3˜«3¨ÖAdÖ÷`êq¯‘[Á]ÉÆ‘ë#Û¬V„s–ŒÇ7F¼õ'ßÀÔY–¼³Ù=iÙÐ,ÑûcWMr5jØc×ÑTâv½IEíŽId-ý[ëª.J{È®9dÉëXÌc·±Ñ³åzȨ5jfÒ;+3¤2¨ í’Nn·ÑŒìÉÄÚC_Ίåàê†É„™=+Î|«mKÜ’ˆŠÄä–xf³D™-O§ÔiWzæ¦L5j™%°‚ÊÇÚ´Š•'®o¦ˆlåîÍcñ·n;»ˆVÌ„B1íu1/]'ZÍtaëØ˜Ù K†å M°šO-‰Ï´¶g-•…¢ºÑÔT4•¢a¥ž²ÿ•Šºl¨óïž:ÇË`¦!9çÇ>ŠÌ(n¥·Ù©0ÜÒ4:BÜo¨ª1ªxÃà®Õ­ÆÃÒc‡ÇAF:øLsn4ö5×ðeÙP;[wkÈ~=5$7ìÎ Ù‰‡†÷˸RÕϵ¨ZøkÊ•(iÞo,Ì9=N«î$ôÀ( ‚¡…(5EA)èL9ÅzáXúùª•Œ<©Z®×Ú-ÝÕî³5BÛë ¢ÒíêÐb¾æ†‘†r‘ýºù jÐu‡|²¨Cz®-)Yq7'«¸»…L©8Yés•*àÌ€?,¸©¸~E³çW”ŽðÖÌV3ùðý@Ý7­Mך<ÿ¶›#˜e½WÊ ík̆æYßz¦ƒ8æá@?Ì7ܰž™†ÚíTÃ¥šCnþ Ý‚ç²Ižhifˆ¢¶Õ1®k[•ªÎ«n£é¦l$J#¤¥,@­|0g)7·ߺUñˆ”Wjµ:ådMÂ:?ù/r*5ïн«ø#5¤îŒKýŸFÊ©R<Ô6á}ô¦†Õ‡©)Ÿqo±÷„Sªm HawWH^×}%B¦â,q‰†Æ}T*¨¢Š?U(ðu×§¨{>…r|Šºßc!7¬®ìá ÎSkb꫸%4£ö;ÜžëÖ:ƉîãöÛ[Ü/§ßd {k¢³ê´jhmˆØÔ{MptÒ6¶Í®ÝÙÆhß°ÊP {Îú$`f|*ü­nQÚ¸~ ”D¦ovÅïʃáïžx7t*²`ØæÅnj™‹®<Ž:U+ô¬b£óð)n£ç+]40E) 6ïœÿïûÿ“¿~ÿ¿·±¹³Uæÿî|ÝÿÿÂöÿ'_óïœÿ[OõÕ&Iý?g¬úÃ=`ƒ\GAm³Ñ¥É~þžd‰¶S%8§¬7#oR¸){ý=°×*÷A®d‰1·©¨žK«>©»ßwñË•lK˜<ø*©¶ætçÿJ"©òÿÔö9ÞÿϽÒÿãz_Ï}~ÿOËÄtþ«ÁçºûK“ØGtÉaÔÓœåu)óªcÞblÄÊq‘[ùš&±44 ¦IœeÁ(ƒ|Æ-+Eþ®© ¦Ä£Ãh1OBéRRP§xÒ‹¡^ýÿ,ç?û;ƒ¾Ñÿ~ŸÎnÂÿWýÿ"ôòEéÿ˜wNOŸŸýôúg“‘k SdoS÷·7*Éûqo‚i1µŽYË%ZÒ!5=h~“北r—õ«º Ý4ˆÀ¼À=îÀuUËC(’WÐ ¡õžâb P ‚9Ú0Õêg´º¥Ì3@{"]LD¡ì.;o£¡d£4¾¿ZyÅÙª{°öÒkhµhÎÉ’òé1^ïÖÝ5Êúô)m]aÊÎŒœ; ÕÇm/ð…)‡rM%Ð"hñe-õ®5•GŸ¹TT†â)TÀ—tqŠ7nÇB')ذ”'Ø*³èG’¶°Š!ùªÐ<ß4-T:pâz²{ëÑ%y|Ä’‰bȾäüTA·¯ÌÈÍJ78ýÃì?®öûŸìý¯Ëì?¸zƒ-öÿ¶ø`‡ü¿Á`ã«ýÿ >Ý‹•FKìà õ«JÁæ~Ð0 ðƒ†YÀYÖ9þ{¥ñx,Ö§`Ö0+Ãܶxvàç?#¢/Vú}ñTŽÒÂMg„ÇŠXÑØÂå˳ƒS±üüùÞÑgÐîìgq´÷üÀÁÆëh^1C¤³9S7'#ÝËÔM&59ûåèøäìðÌéú™8ãÓ_/Æ't·w¯øNŠcøyr(.ÚÇâââ?úø5€Ëö¾ÓÌÏODw+€*ØÓ\§{|¦>LèBMtýDÄ Vº>±®_X×ì—å ,H`$Á.J±Lˆts]”aQVŒ­ZçXtîŽôý5Þ_~>Ñ%#,ÅþLxX้¾÷ñÞ®ôýÞ¤©¾—xç—B]2Ƙlõý%Þ_0è’ß°ä7P[]b¾ÅS¼Å‚·EœK]rŠ%§d3uQŽEy\x<šÞõ‰±?œíŸžœ9Ý&v<}!þùO§+Cu³²b={)VWͳ—ô ø~xîtŸ8“Õõ‹ëUäü…X-ÔÊ~mà×&~má×6~íà×·øõIȳ-€TòÉóµ:ÓЋ“‚¦9¼Ù î:¡éuðÀ4É+ ìkòÆ“ ¾ô:Ÿ)£#´43fôF]§¢t\ÝhNFF#(\žI|˜KßµÇbt, _NäFoø ½ ,à¼d˜Ýq¤fc ûsq~púüðèøÙñO¿8úM¼¨„äÏÑÛu3õžß8Á;ÑÌñeà (²/ЉrZáY Ÿßáê(õvL >Ó=µ˜Î8D¦]9R´@—2’46sˆÖ0'gIùì›TÛÀ´Í²ÇN÷ôŒ¹xx.ú-p»Ì+&Žê0!D6sœNõÆï  n]4hÑi#¨èâ¸éd ¨mc £ä\Ç©O$V\A 1o[ aƒ!p=dào1í›E ràb !yd3¹ž ÷Q±… i“!ñ`$ç±H†Œ‡õsø0@¢Æ¡ýj]»£PT'·2™æäl:P}Šo°vi@ªñІ>ãåNqíÓ¨Kºüâåáþ?ÄÙùÞéyM"‰Þ§›áŒÏVÊè§”ó‡{Kדüöl‚QdÒAÿ:•>îO@!"LÁ}Àþ3ðß@á@#f'{§‡G` dt¤qDõôêŽBɧ¾Ìi1:·Ârxâ¤ç£Ë·§âÉn÷ï¯÷^»âÅîëì‡?hçÚwR½»Hr=uSP°Kz%BºNÇC Öa˜Arp”C1‚ù–" ›#@`Æg÷øõÂ|žt+uÈtòKRX´Æ³¸á„9)d¤P=<ÌÕâgÚ5¸ù±GË—_‡Çb/'È pÕ”/"`f^DDH]ók¼Ž®.#óB^`ë:PýÝ;#‰¯zÆC|Y9:‘ëú@‰À{Î Ù-~‘õ:uûbÊ” {¤–ýçáéñÑóƒ£smð4¾|‚úR‹ «·ƒÿÞ{~òìÀ“:°Ô@êŒ\ïÚÔ¨ØÝ[ƒÕËÐxD–p>Óõ©"ÉEûEBçï.í—ø¾ ÄÄ’Dì2k9'n§¨“þO{oÞßÄ•å÷¿^EáLƒedaÈØCH·{H @ºg>áS–Jv©J¨$ÏLæµ?ç{–»T•’î™_<=ARݺë¹g_§g<Ï Îyž$MmŽlêËã“'µÍª-½’{® +ø&¯tÈi‘!¥DeC‹'Ï\x²Ú·:ÇÉ…dUqAlXVÚbÖLA5X®Ä³Ÿ¨ŸntðÓÎŽÕcÜÁ½+$ÑpŒîíÂîö›.“àBoKqˆì$,âç.Ò‰#;${š!·È,ŠÌ_{íª¢S‚‰Kö¬jΨõÍ›×É!†ôóß+þ]pür*¿â*â‡Î“í×YW½ÓÆ:”ðO¶oèÃïäá°\œú‡[úð˜¶F‘JƒÔ4CC¥Áž5ˆã=åáO¯G'ççÄ*£Q^F0v4‚q~Q6ÃÑSr~ÞÙŽHƒneºtqü´ºBzNQE£>‰U;Pœ.æ Ú·Ø0 -vjæ7?íí¹Óì3€³2ƒ •ò@ÙÂá•]V„ŸfÔb•ÿùÛ§/^žÂF~÷=Ma“ |O@5¶ãxy9l0WDÆéDd öU`ø ^ÓuW“®Ð#çXšÉˆTÐꉠ)žeQ‘žrŽ[£<¤mžN¾Á´Î²qVtþLgY÷E, ý3¾èÐ27ßdã§1SØ“ر8c¥Ù„ƒwI¥”A¯ðAÿözÉtL Í`c–@W0éÈ-Åœf_ˆ©2…íÔ‘F.xQËuVd]žH8ô¾ ͽÆà|Ю ï~Ë6™;8Ð(ƒñëhº®hXh“Ù}) :ž® “®‰ÔÜa1Ä¡äõ¤uÁ[&p1˂طc'Y郎}ªÇ^ŸÍóä¡ä'Òè¥5ÒÛ'‚ºÐ "ÇÄCŠÊ8Ú9Ó–Œ¬Ã ¯Œ¿yÛ£Á ë`(Ҡᙂ¾ý’ÞŽab8z¡1™ÏÒ|¼)@²<Ùŵ€€„†šØáò'p$-À±)x«¹Åïõ*Wi…EÅ´Ó˜+øÐp^Þ:Òex ¤®Š±€ÞF@ìÛ€á­íÏNÁp[úín1g¶ì©V”¡òê^ Èm7¹®Íɳž.$á{Ã…u*䆃cf²Ã uß;ðõj÷£Ùm§µNO0VôÜ×ïÚ>õ~FÌ£A;®‚ÑÀŽS©l›†Ä­¯¦K,xJÌR?òØ\ø ¹éUÙ“ÈÚ¸QÆ&mÜu4aÄ7nƒ?•*¾¼’óÓ1u°Ý_¿«LÚ‚[@ÓŸú–ሑC[u¸0pp䪞óDîK*b—P]¢¯9ƒ.óŠ<ø®°ÅsÙ\¤ÅÜ]ÝhÝŠêofoé¦Z9óí’¾žßÈÙH‚q*S)/ W\Ѩý8ÏZPó \k'¼¿=ÆÖ4îÿáÂåÂë ÃÓl~Ô; ЋF„f ®O®çSL«u.Wu§Dp_ogNeè¯ã°/“·ì" ¥4^t!ê^Å<Ïxź Šó\14{ p$P\>ÉÇél|‰kîœ'$²qåb^j”ITu–l¨ ˤ ÞÐÎÒ Mêj£(úêÄ´ÆL +¶Ómƒ'ž•‹iíÔÁDÙèp|€à=Y«jxÛÍ«C«vn%Æö/YÛðÅu›'#×FÐãHS4ï«ÐkÚ¹=ir,l3 -é4Ÿk2q<Ûê´)P¨•òœiRCE­«ÒqäÏÚ5š½?é´·ñYýzN'„êìH…v÷ÒÍŠiQlicÚ& ¨†m°ÞÒnœÿ`1ãúF²]Ç2\QK“¦ŽN„ue¢ô¾Ãáê;q¦¾¹šº•uµ$½ŽÊìÂW-ÝíN¨<ò]©ŠAúR0yñ·b€ ¸‰H‹íü*óÃ.Ķ IK]T6 o¿ÞízÆ‘~)ÅðÏìˆ0®›ˆzC%ÝxôêmÎä£SèDSè%~õ\¶–ñ «™H³ÂžH´Oø¨¾Húí¡þû,Qs W°VAjXαR2Š=tReã÷Ì‚¿|–ì³ »==b³7ïæ;]JÇÝŽ|[v©±ÛDŠŸŽ“ûšÿ(³ê’Š_R:vÔÇãt–g#"ÎìÌòS“¾lšm>0\ÐT1OóʺòTåuüTaÓU×´×;ß7gªÞ(Ãi[ÌDkWbÊ—¬ÀwÌmZ –z–ÎlÆ'Þyì„>ˆ `°á1‰zïÂÂùnA· ØÙ>ìre´›7»*‰1Àê»âÃ<`6×D6l 3uxGgÙ 55}s”Y³âGo àK‰ŸL]h‹Æ2nùy÷Z’zÚàQo¼(¦þC¢.·ÌAg^Þre5²ŸˆGg-Zë̯lΟâjÁ=t60Ú<ÞâòmÊ^4©†ÿº°*€³KÃÇ<±™¸M`þ­ïÔ’C;2—ÿânsjÓšý)6ž‹| ÷´yÙ ´ÍUùa¾ûÐa:Aìh‹¶E|)Ž£«jËæË®ù˜ÕŽIòŸ7qÒžÿM~F‹ÓËVã$O²ªÍï2J/_à½ÀdŠAÏX‰O€‘B³îL­D5: ãjÜÊòÕ*š ’º]P{ÖL©`¦ÒïsÓ§w{bRÇÙh3/¢)Å7 RÚ(Ç|ÅX5«;ü9ÚïYùS>¡–É Øvm;rá‹&(UcòëFmq%‰üü8w~æ™ýjGz7¨ó eøéñê€ù¨š/ù¢ÂZ/Üùò2=5¢Eߨ§•¾›(–Í-ý·3†›˜âH.~“Iï>ܽv’œÃ˜'/àÎ7jpc“x¥‘hÑAŠ–¡ýÈú¯¤1“=¯ê±tÌV¥pdeRU:2rëHBhÚÍ ø%eŽmKÇUiÝMŠWFÅÁªé¥œò¢ÔËŠÕ2÷Xwà ?z OŸµ#ZÝ‹(mBOKVC8lX½;µ¯›û3!9e}ãL’÷&ˆàU ”Ý´º`Æ(4”Nk¦ý^>Vg…stàÓõì#»ÚIÀ5šæPXÑ,‡ª¥E€ÉÌ9K `87`x× 3u 0…mS_Õ4xâp*ʼnwƒãÚ ³ÓÎg -K傤X6µ*x`Îóq› E”ÞÁíï0vÓ3(Ã9×n§š2”†{‘‘vjùuœ]é:Þ^w/ÌYÁï{Åû®^úv ÞM|‡?ì®ìäpÕÄݸ‚Þó˯`'²)9=pÛÅ«6»xÞ}û—\¼Æ±¿äcG$Ÿ9Ñ®&»*qÓúNèÊ_i%š9½LtuZ‰ŒÏÿô´#.Ó`<¾©s Á}?Ú“—›»n÷縻¥]ðÒ$¨‹û¶4WƒVeÕD€%/Ejvá[£˜L5=u,À¡¶¢Ï¢%]\iIŸ}Q[“2*ž»$1m6Ç™×9 äã ê§aþ^?=žÍôÇÆèg„ Ê'އÑÏ9 ö™MÀò‘`ä£ðÁòYb`Þ‡#`¼Š{ü©Ò¦«“žr $=&cËýÞì7ŽÛ¸£S>qò”#ô0ƒ·%ú±ÃL‰5ÉŠ×ã#Ú^5—¤Ú›ýÎöñ`¾… s9}3 ‹.YôDô2nï2“’nÎKÖ`•ãò gUÕ?özK‚'jKé¨u>+!¶q棘6¹K6à-GX–ßq¯ìãÀ (ûUÛlèØ}eC#˜lJ‹LÀ;¥dSoÔ™a³¥“òä#æ'GßtS˜~‰GÅ)ÄÞÃÎAÓý¨iκã0†^©ÂœÀBØâå="ØSI-Î7`êNç0+d’Š}ŸŸ$ÛHú¿ß%")\Sóÿ‹2D%Y» 9u)!O‡0» }©~–'º¹"‰iJŠ©ž±¾5}í%Ûþ˜·¡x~Ûé›î¥êÍ*S² Þ Ùfwe¯½Pmò‰¦Sn‘õCÔ’]Ÿ«®Æ‡Nm#ñÝÕœ¹ ³€ˆ¬ÐWÝœ<\¾„Œ— у~ü]—Q·Ä ˆ§Ó̇Çý8Û’‘F<¢ý8ôG1•p¯­ó瞉êC"¨b81„yÀnåºÊÇÒ g1ÉR(WÓ· jÚK‘Ò^^07QgNÜÅMîâŒ'!–~yü]·‘íSð~óáSƒó²¬ŒLNé¤ÞÂÐÄ@dÅõîA%ªìç˜4½„IM‹{ÑH‹—¸(;Õ”$pÀÓÓ\H€G_Q°[ÚQ§‚‹†1ÏÊO²Ù™a T¦ÉZy¨%‰èAå'ŽvX©sfi™F§1ØIQ‚ÜŽ4ؾ^´CWb1Ëjù£nÙ´(ü]§¥7G›×ÀvÎÇÏ\Dpüü=<þÈ"Äå1Nˆ<ªö5t:øÞW-]ØOAÐܼNêY~|¸Ä0­Ù¼ß5ÁûG^Ç ûåÙeÝw›Ž_òQ®¹/žÂéý–œMWŽÙÂ9ò¥v¯YÊ•›ì9Õí@bwÖSW4½°ðî+$qV­.couµˆèc^6GEûeÛPû«pTjd%Oé´:ŽyÅÒV-°w< ÇöSñàbΪâàÊT܌ؠãvPÀAAX3ôÚP¹‚µÌŒÚiYòÀ9)üI‘‰š~L¸j\ã ¾özÏœöÒátüìwÓp/Ùv34jBâU2,/ 3ß:ñ42cözŽ3ÜæÏ;¥cMöfTKhÇWŠãÔ ç<·@(Áô\)P} X¨”…q**¾ëNˆ×"ÉC±R»ª§±¢y¤`û9‡Rò d ÆÄ 8Al¿»jbÅ4%H¢ÜÐa`¾ðا „¼¡¡µE›ùÌE Æ&•žÓ*w®(!|#ðÝpV#míIHfû{ OÛVÆQaAÌrÄýæ’h»Á[è®»À²pýÍØòW’0úÏ´(Ùø«Ld”oa½5lèí–suÆNÉ®!=h´¥ÈÀU'ReÀt… ?˜º±òs¹ _Ð7O•èS"EAÆ!tS eO‡ífWPßèuå'zñoÏÄÓè°~çïâáBlØ—¼{–:'^O«­Åâ#k'Õ0…GšÌµ›m½.ÙïÖn×íº„Q¶Ï³ÎPl0EénÉë¶y?±Nì¥wy-’í£® ¡ÀõV‘ ÿí÷O¢¥ÑøIíˆùB¶¸]ôém½Çivf‘l~¢"¯ÀxÄB4ä¨w¢[•n _ÚÇ×úT!«çðlwëü+B•–ÝDkÌ_ªL¦aëÌL§ƒ·錯ӔØbI9×× HbÇZž8½‰%8 Wz¨„5o2§mwÂ^Àô¨KT-‚^”óF6˜øó EE¯IÜBi;©›‹‰ó¦xŽ3¶0cCG»ÍÁüµ>Õmœø“eÝïÄÁ<¡#­µeîåùB„]uKC€» &ïó ªI\x·ê`ËŸÅ¡ÁŽ˜kI¹íQ™KûäÝÚà@B æÙS™íÒrò {Â2ynÞ—„H…q q]§%ƒÔbæ’¥v;½Že«yhÃbyÇ¿d6©]år‹ÎÏF·c­ ÎE@M‹+DÒvâqK{Év´ Aìª&ºxªjÀf;žÙÙ”Æ? \Í6¹ù,-*DgÃŽ$±t!MUMQ£ˆ,¶§+»[‡™e*óö _þé¥Å«Ô±Lä–T™5}LhËŸc|ÆÆq\€è«3yï=]µD¥H2ÕôRãÛ|wk½O@Çù$ìà÷z½Úx©ÒJ9EÒÑ’Å^‘1` ·œ!ª³˜Ó6m˜³!:¼1,’ —8F®5`CBø8ÎvòÌ~Ä‚Ø eY+»‘[R´FX[&º6%PÃΪ´jI-K™å²5Ï/ss¼ÍÈ9>‹kßS» _Í }Êã‘“g*)k¹•¦§Ifâögéüêbÿ|9dã†iÄ•¹4zë<—ŒXïÄ V¿Rt@Ÿ9 &Ôš Á†…š‘mkf^]à”7_'Í9´Ú¬³Ÿx$»¼uBÕ°¸›]ý%ç@–—Ogå[¶€Zº$[Òñëª%N;xJŽfÈ3‹ÓÝXÆqC ƒGTŠjc¹H½Šß ÷l ›ÌÆRJR*úd´¦|Eä Ó]ðObg|Ò9ôBßëÝh^ïÖ¤>‡“¼öh/^a”3.*$*›ÅT"Âà;ŽÌ$n‘σEvÚÆ B+¹±Eʪlö^-MP†"~°¤t›ï_^]*½ºà1àQ–H烮f‘m‡å¨EÖ÷åµÓÕÙÉÔWœkD+ß±«-¹+âo+§Ü÷Ö„m¦Ðñ»¤[¹¥h4?”f4¹ft‡$clT—#_¹&ÐR*ar¦\ѧU"t˜Ô©£èVŽó6Á(£{ÝB½©!ksÒªãˆt…~äœLe°l1_&.‹£B뜤]útšÉjópi{®0rKÞ7‹h3ô>U‹‰¥Þ-èÔöûä÷Á4.¶­u‡Ö/¸—ÝÖx:wεæ®3Èôj‘a™iÙ63òK‚0]Ìj]©ncÒ€·eÌ;”æ¥Uun“»2$âî„D¼K×Y*S.¾mX7æb¾™@E·€½ N APN6_”cúó0!gl[{—;*wÖÍMn±D“ÀGÐÄ·‹hÇ,Óæ„žš Lüšeg)và7Á·†CšWp)*·Ì_N•¹ËDä,^\/ùâls*‚°Ž3ù0O®·!Ü=!Ì¢¾8[ÐLlW»ÞXzõ¢uœàõ+çpÌǹn h¹n— ¶’ïs2K€Éùº¼GXo’ý7øE¹gÈO§ e„E!Ê¿ì$”ênØØ¨Â;àêÇõ1[óЦÅ\òÂ;×q3 ó-(/%z–t~ƒ÷§£Ê7!Þq]«Îã\^–‡Í¬r³ª$ÇZ'A¦ ¹-¯ÝCÔ}iR tD ³ñŽÚqx)ÌŠzZâNÙn†³jÊ ƒÌŽ¥E.ÁäNMg)p)Ç9å‚:Vc;\8õé(q9f—¹¸lðù7‹fYÖ©Îh1ÏÇœÔѵ^ÍnVêNʪAßdÀ>2æ©hï‡%ç8(Ô·›nt6`زы&ƒw9âQåo/XØ5! _~!^ywÚé¿§èßA•I1F&·¿Øø(]=ÒeGé÷4:R¿8×ÀŽ´~”~ƒ#­¥kT;Òð(]›ú‘ÖŽÒµk9RHKnóW)ÍÞ·[r¤®Ax´+wyùÑvú¾I¶€On±õÏÐ5i¹–ÿ¬gèk¿–›žá&×ò#áK³«QEFæL™SK¤Ž¨*ƒZHõ]Z¨êNæ\ùñGWbÓjDÀN¶+u¼À@²¹{*sJæs0|!‰¹fïÊsþø·~箽E<6¤LÓIŸÑEõtâ„ÀÒ[Oô朞lÞàœºêeé÷+•„Å¡<*šv9®hõ:/ìº4Õ¤æt¹+1:_ˆlR$æ'w9Í:Â~íì€ù"Žze5²8ëö¡€Do¶M°qÙ‰ÒdÑäz‰ ‰íðu"=v´GìM7шAKÞŒöaÍÚȲm|ÓgfüB×Iä“]ZË®x‰Mó\Hœ9 ¬¯4 WfXTY—39‘ü°µ°ò½Ý/OÍŸêæñïà­ÍX8T| ÞÙŒ‘«½Ôdç½.gêjM×°vÍÖK¼ZÓõl^í…5Ì^­õ¦,_íµuŒš/aîÖ„OœæhU‰Ã™lpì~Yñ»ËØ…v6!~wÙA·m}ÎK¿ÖÃM®x¼þ@›{µæˆãm¯½ÛrÆ«+GÛñ?Y¾I£_éÖ׿¹s«øFÆK+aÂÁÀÕïû¼l\‚Í âC ¡öÒò•óÿ/CÁ²®€óíØÛÞm…ÚÙ'KÆ]M h›s\4!¡uÜÈb5hßqÀ/Áɇ†Ö«³í¿*ñß Œæ{ ­à¹!$´¾»!@´_åÍà¢õÝ Á£õÝ ¡¤}ΛK’|8Ì´¿»èlA?¶ƒO?è[Z„äðÍH.'!L¬`$[áÃ儘<,».2õøäë{þ+2’?ŽWÀ@Ò„ÇÜ.#Q›' Áƒ)!½*9~×ÐK°7, .<`lˆB® KʽÈá±GM.$†•ˆÉôðÑÌ`ÔPF05Üð‘8‰6•Á3$I‚¹ñÊæ5¦~ÿ¢ÕÔ®[]c"ŠÿVŒâ¿ÌGñߦƤÆ[ëMKñß Mñߦf§øo [ºlŒe¦©øïj†ªÃœßÞú0h[eØ:bxÛÌòÿ­µƒÔ6q«Hü·‰$þÛÄbÒ<Û5ö“Ú)4h[±Ž ,-ñß hkCgÉþÕXrpe;vr{5jº³)Bº{4ôé¦È糫¡œÏ¯€h¾ø÷þÞ/@_L÷j,ʆçžitÖ±§Í3½lÆœ6®ýd#góï&*³ÜÙEÀ²–%]rY?K®Æ^¬¼ŒGôÑaEOV_L´¸âÅÄ++‘or1ÑpÓ‹y¼õl“ƒ=ºÊõ<Úør­¥üGëTÖW¡ë[«Ïy饌àŸmý<£æh¢ö|¶m´øh£+Ë>–þ•Í.ìœhðʆ7Yzq×]Û+_Ú•Wvà »ñueôÿ™k:ÜZ}¬¿Åa®¸£W»¡W>Ìÿ{÷ò„ô­?Á~ðÂA¡œë1|çv?y¼ù9~R‚žîôqB+®fÐönÕi†½~ÚOŽ7¿Ÿ¬—¦ÃÎ?ë'_mÈ冯}ÞOž~à=½ýÙtÿöð|k³£Ž×õçwp5 ˆßý¨¿½)xÄo] VâW×1ÕŸ˜2ç§¶1Eqa‹[;›þÝúgñ j1­Ðõ®Ò{G Úäïc¼ój­Uû‡öwVZ¯ÚÞÙ@6l{mÙ¢íu?|„­ûµ©Zƺ¥X‚¯ï̶®vÑ6¹_mÛ²\©ÑhºÒf»é½k9—W8ö_ÐtéjƒÕV%Kû jåÛ›.¹hmM[¹ÉåW¸vý–Ýöqó6¿p›››®äæv•[¸ÊnI×/ûýþý~©~Ù¥ú¿wSÚXÀ¿–YòlA$´Yåp”ü5-2bY³–GGË>'(ý„hÎQnùsi»G‹B2@W$r”þN¡4¯þ´òÍ—’(’ßæt(„-Æ=ìCŸ×Û‹¢$ï‡î¾•PV¿ÉŠgËYÆ ì½ÛZ·áíxë>¬Üí¨]ëÎÿg°áÖûíÁ´o½k³îZ(ÂÞ»ìcÃo¿ù+·üŸf£ó­‚Y¿ëÿ4Èæ78ˆì#Äo³ãíóo¸§mÔÉahv祄ƒÍ¤dç¾(ƒ®‰øjFäÉFn¸˜0Ä^ÎçiÆ¥ýdOn¼GF¤J?G‡’†¤BÆE¢ù¯ª|ðÃRþÞÙÖ&Ú×ÖOPfæ^X6Ãx‚-^„{gƒø$k³lç„΋ôßK¾I‘”¼ñóÍä¸H‰Õ«ò´õéQò—!{×¢_é7z-üM~I®ó8þÁ3Äþf¨ò»8•ôÅÉ$Ó\ãyñ±åRžã»›÷n& ¶#XÝÚåm¾Ðõ‹^½Ë·â÷¢íhÓÉàˆS8ZÒ䇑ljÓY>Ig9ç|&A¢I>?_åÐNÔ½¬æ—"ºR_qCɃz-4Ãi9åÔˆñù,E¥Û;û<4r !—x?z=î뇷âVL‘|/ÏQ€«äÜU³Í7Ï99 î$¯Pí+٢߷§¸š’¤kÃúò~ªY—–BàÃÃþ›ã7)ÝýÓ‚Úô(âܹ|Ô£¨½ð‘Î%nekßÖø…•§Ä]Äí7?¦I^<~œ?yñ4È(Ж~öä䛓—Ç’ÂYc›}JUM ßš†””È>€ˆd¢®ZÜÏ…”×éæ n ­ï¬ îk$DO¸Töð6*°ô“a~–ÏrŒ:~>‡A‰A-gÉiÙ\:˜ËNI0üëït<„xsú”ëÄ"°O]©•Ѳ&ÁoN\&욬›ø<¨k*“è,‘ Aé‹yTTÓå&ަÍzú…ÇÅ÷¨ Jkç…à¯ô}™*˜[X¿ä÷E§·‰¼âÐ⌒ M2 Œ¶Ô‹óóY¹8;wI*À¼uµRsK­RºeÄ[^JZU”RÆ<Ïiî—œP5€ZË7³þk&JUYK$Æ~ß§_yÑûË‘³Óž•ZÇõ"Eq™*§ì⨳2ÌÜ‘[ hk:AÆ1NY…Ä \ÇI2 æså{%“q‡+5Óù,fÙ$J˜”ZlÉ^í'© ˜¶OD+‚ÜñÅ0¯¦„K‘‹…°ƒo‹*R”ÍV”°•€p’|É(*’튻‰þ½½Ÿ<Ì´\RnÞ‰šßÝCóý}bRNÑüSÎsº8«,á)&ã‹J2p¹cT´ÔéÑ­™3.ZDûº ½ ‰Øâ9 Ž0¬×¯¸Z‹TMšÏÁµ*+>KZ À2¸}N îPIQZù¼j›C×q7Ÿ#ï9¡±mWº—ÎÀCŒÔìCëy¹Ks¢—:¾ù(Í‘_K’¡à«KÄåGùÙBê9¢ÒíyAdfHøå$+Âx€î á.Š#å„è'=­¦#à'ãzzùªr,öÆsDHÒùà\¨5“à·•&M'zÃQz%+0"½ƒAù„y3ä'â\Y7Åà?JÝò—žk5¨ò”ÆÍærÇÍgÔõðû?»œ²'42ÉQZ;ңߘ8aZŒÂ&Þ¦gÀ.OG—4,>ÅÆ÷ä„z¸¤eÐ Ã%WðL_,©m&#Êr¦eebHê2—¦ÇÆ5½ÐCµ8C*uA:S™s…œUJàç¥Ï·LSDý\º^Ð<¼3M§@dõ÷BôxH3û¦Ÿ<‚Ý„œÎ#âUò°ü‰®ÛþÝÎßÓ ÉœÎçû"ç9¿ì<%@y8+K0 ôYt`OÊ*}ó4ùôöþí½Ý;ŸñEçûÇ>ï($À„ÜWNŠÍrKÔzAZ™µ¶´\1ì´Ö/EúPŸ¼Ø†ËæîrMõ\áyÖúb’ –n†Oz5N¹ L€±@‘õê=m£6­VôwÂCéÜïåù|>½wëÖÅÅE?<Š[ÿC‡s‹:¹åÖï³©Š WPe†·™Ý#%¹öM¸'ñgPþ²ŠePf,"ф߳æškSr9#Ö üîÿ÷ëøÿÑ‘îßÝ»MÃà¿ÒßÞþÞÞ§{{ØÛÛ¿³ÿî}ö©üKŸîzû³?Ð?{wïÞÞûôÓÏÐîöí}ú÷¿Áßh›†$ø^Ù®š/P|nù"éïàö]]ÔÁþ—üÝZO­LÔ+4eƒè舛 ~TN/…aǽe“ßë¨YÛ·‹XAÿ;þöÅIòˆð8g<ë|bxuK ÷Ï·è9É¢«Ò¶•Íf“ꌞò‹þµÓxay«ù2±³Qÿü¨öšñþôb0 4ÏKjý„Œžõß4¿{ðÛ9 ñSç“ñð#”^}Òù„>*àK²½Íê¢n²×Ũ#4ûêé·/¿~þø±k d{:Ÿu;Ÿ‰$)µÓ©@R‘5œÉŽ~á|ã´1Éagëu±ÕÙzjå³E¡yäÿpr‹šG~qÕW ¢^³Ëz‚Î¥´Ó»îÈqÉ\—/»xÏ?æqô¹qk´ð ãž>€Â÷ˆ•€sÖˆ¹ ¨NCõûðA9=z@ uá_‚‡·nÞÚõŽÊ›æ€xÜã±-ßh^¨xÌÉ”CÓpK«²Üæ(ËŽL› ;x@"õ‘„§sÁ$¢ªZÚ¥í|žŽóÿ̆õqƒ½ ;+[p•å ó÷üÊ‚9Ÿ¡“-Xʶd£3÷™ßæ¡Sørå2ÍÆ}üàñlv$Ii‰Z»<ýÌŠ“ð-~×6 /?^]a¡Ù®KC‚oÒ¨ËC:h?!æn´o6äèÁ(—ãP]„×9popyÔBnì°Z²!oóiròìF•ìSý'¸Ù°gXp”¬VÓÖ!   ¦t¤j;€€TÞlØüWÉ¥aÏ1šå¤Uõ!€“îˆÇ>Ûud×ÌTQ§ûãø"YêˆÑe >á±f¤ü05ÉGVü‰V‰°bÆŽ5~€ä¿G`ƒ‚Ʈޙ*ß¹ÈBcg]g]ãN´ñ ßéÎ%š|7®ä¬‚<Z=ìtdõb?|[ƒ<Zßq®7¯€HˆäÔ0ÎÈb_>x™ž âaö¼œVªy–'ƒr¼!= •S”‚øŠ¹ó²ÜåÒ˜ŒyÜ ¿•“ô'«`Á²™_øfãÎp±±#d-yTÆg£¹'¬/²Ì {‰PÝþ~² }„ñLµ¼¬¯Ë a< f¸.îw˜MzÁ5!Ø<2 5ŵ }0-Ýh¤ï1;<Å¢PÍ'ó ãÑ8={3¿ïŸkqeô„¾“ÿ¢Ýࢣɴ—T÷MîxÕPÓ;Éq.G¬¯w×%Yüõ"U|T\/K¦½ácÃÓ6êÅÕ# ŒPèÃ*Vïû^tÝ þÁ¢¨Ç­øåªÐ§Ù¸¼èöÛÜŽy gƒûÁ\$ õTÊ)Õç£íp“¡^~v[}ŸúkÌH`"½ö¥>19шó³=yóðéW'O¿x‘À.«+klB²jKéïÉ›“oÿvÂi|QÒÝœXQóf?Ë»ùúäù‹—ÒÍéæk6‚Š>dĦžýݼøþÙãç_s7ŸËq½¨Qã~4Ç1ç•íú6ö¯›l'òa÷ˆÏ>¹žìw]kµŠÉ’µÞ®·>è&×Á¤Gï°ewé;wšïä•°Kßù¼íAäöNcmׯ»ÅÍÉáar#¹Ñõ2Ðã0?›CϲͰ;è2Ì=—²U¾b:kš²JÊŠÖRléÉ€¯ëî>Hã Ñ∩<ä¾…Â&ˆ5žŽpkoÿàö»Ÿ~öù[÷á\Dm_tµjuŸ~œRKÂFƒóÙ¶¼Ùtñ»6¢çÉŸðß]ë8¹—ð«¿gj1f%ó¥½6 ö7önxlSþ´$¥Ô ƹ]Åìäj±û»Mì¦xT²#a=·ubIõušóò,c½»E¨p «ªä¢_Äø¥—ZÌ—UjÖ W+кÉ\ŸÔNòÕà_øü4+w¾¢t;@ã2‹ࣿ?óÍñ¿õ7 ü9&:"‚Ãl°ž8ÇÞÌéä ®GeA”}^EÕ6•b”LpØm!ÑJ·j+¦^ÙŠd ·yI*5rÏPžÜˆ…@S¤ºœl?ŸM¸\ƒ–dÓ^öÅÍd§ª®Ö wí– ïƒ}üê•ê É=‹Ý×Î…Þzñ ¼L_ÔeÐËô·t\¦~{ø1¦q¸lØë‚® 1©C†ý!}q×|§â;ƒ 6L>±{ ÷dX2—ErD4coÏ7Ú»ÏÑýþÝã"¹‰A˜Ë‹F¹ySÆù'[Ú}íuy¬î0)ø³=€%V}L¡ãIggÛ5B?@AMaŸUSÐKT9”ì@´å/î7[ÄÍøA²Ã¬©þ¨Ó¾Ûgåå›ÐóžîõÎTX{Jüª}dæÒ¾`:ö™rûHâ3乑Lk¿³´i_F€HùȲ™}aÒd_€n|W-ì /ξ{lߘií%¢2{3×.òö¦rfÎla…6øvñq¨Ó‰˜{¹ t¥ê{¶O |+ÝBr¦Üg5¼©ˆ[§KÑOôX%ë¦*›zï1M$FvâQuq.hÔÑSƒ.w`¦6´²”Ûj!RUú GPJÿ½¯œɂȎ\K{””ƒûvõÄe©ƒ¯÷n8š¶ÃÒ»7ºÉܹ͛‘;¶Ét›÷“p[Ý®^FÝ’Ãd_îš\¾_í¯ëªÃl#Vuâ¦÷ðFòßÿ¸¯Ïâ¯ßÝH¬_Ñ¢&Iø*Ȱ»|±'±lxÐ/“ìàJFmé”ÃAwn%‰¿§ô\¢ûhX‹ß VéÆ!õNPâ~¸Yÿ§pV³.º>Ôfu(HûJ¸nßnJ×'ímCø7þó»yHÃP¿Uu‘N·€ô¥ûúÉÁY|7õt8Œ^éEãë›ÑFíòF *q™[ù2ÔǶÀhF?/ƒ¼bòÈótÀeð§´ŸAðzÑmÙ[¡*ÁÍVRàÖ¢XÓ~å‘Ácmß¿oã)I©Í%®yCü¨×Jb'YqåIØîþý¶ùsG«V #Ð^ŸóÅÐ/ÓðË솃cÿc¶x~¹¸Ñ@n®àÛ…Ä“0aÞ£«S€ÅÝo@‘›¼èöÙ6ºÙt¦M…´5Ǹ½ìÅJ_T1Õ/µ)ȤmŸ7`Úm Ú£ñâg_„@Ë/[ x›`>ÇÝ Àsã„›pz£«ô›§½tnG´=YÝnÈíˆð¯i÷˜ÛO°¦]Æí˜aXÙnÄ툗XÓß·cFce»œÛ1²²ÝÜŽ¥¡•íÆÜŽu¢+Û½ãv¢L\Õî9·~gU»9·cN¨Ù_>~6¬dè±#O9t§b¥ãh[-Qâ‡$€¿t/ùcŠGÇoUùf$îJ,”°Œ€Cz°Å›ìÀ©™{àŒ^ng‡¹(ð´Ž‘aŽ%bx#>§•ñuìkÀ[*ÿØÊ$>§Ù¨ýC½¨æCâ ÉDÉã§_³~@¾¥A![ÖÉI ?'Õ,A"Mñ¯`›<•ØI„<ï(ï_s]EïOÕ¹ùÍ—…椗œ zøI7š¤ÔÄs]Yú5³(² kÙϺjŒK ¨éZR¶ûîªc7{L³èO¢¯ã•ƒ®À÷¾Ï‡ ’ˆyï{,7³c²¨?ó™›Rçò˜µê4Vû^Y/âŽ$*xZé¼v$&•rð@æXƒEÁÚEñÊLm"Ë­¥ß‰•ŠÌVÏÜu¥<:«62‰-:ãwf‘Î Ó§÷…ÔÁrÀÅþæ~ÛK¯IQ¥8_™Êtèp“-D“î\Ò{ò‘Ú_ "h$tŒòlÌ’¼º÷î|LEºí…n'~ª{]Yƒ¯¯gX[M@!N˜NðוÀ»Ï$+ñÊ…ÂGÁÝ`OÔ°Ön»ë¨ÂÕü†ètà§ÈÇ ¤1Õ ;(H+’ól?Y“¨Äß‚d%ú@È Oi‰ãøÛÔ5j@{?™"û_ÅžÄÉÈ¡¼«à Lç5ÊGÑt¼Ì‘ðŸ;‰ Ríθp#‹ñ˜ˆHFñ ß7™wÓ¬º$;4Fоrÿ t™%þó>l·#í×äî=ÿ÷0ù/LYþ‡¹$?ÓÄ—=2õ¥[0¯}\Èů ÌIüU›%Ió"Ÿçbúï'^ùRÃdÂçâgËBh ž»ÄiÏÔ{TôN3 ìöºÈKÖ_3JOg»SJHÂ"è>]Ìˉèw¬(fÝhÀFôåžÚ¥ºß.RèÙVãìœçômƒÄ–"¦Íº‘øÆò–~2?³[ðbʧ¶ª§dçj}M—uf°q…îL â;B ½:ô·„’Ž/¦ÓOgóÛ¡è ö‡ht$¹7^±T²Í#ùŸ§^·=&úN®LÂþŒ1OàJ„d²3‚|¥7²&S¯ÝL6‰ã¾ Êé%:¬¤Ç«÷‚&LÂ5ñÞÚE÷kº yrý:IØ“ NIÛŠ6ÕD·öÒÍ›Ü$ø™Á}ç÷ÊjŸP軞ÆÝ¢«iÐCö>ß {ªr²Ìø{FÓæo¯v÷0{P²»+“ð) ;h ÷&˜80c,ÆF÷놺)I]n«J|sè“~Ùî”ÓÆ{´¾ý§œF{È3Úæ—ÂN]¯ÝnÔ¿ ’ Œ`žZÐîʧn¼.{ɵl>E˜&õMv8¿Ž?€Â•¨ABåô+Ôu»pÀõ¤¶›ü?9ʉ®ì݇—o/§F뽩××B¶_o}9ár‰…ð¹= }Ä‹áã²Óu{ÅKÜïl:ßµsý9²ÇD¼ÒfœÏÚÖr=k{XwG7›‚¿Ÿ›ÜÎ5}ò–Õæe¢ÙUxl/ ø’i]OWÉ-è!ê ãZß³ƒ–ûYºŽ[ð”'=–_Üs~˜QxÆËÔìÞô#„ÝŽuk¼›tRÇ,ï‹pÚoP8=ëîg›a!ÓÇ›õ{÷ã{þÕÛñ¹÷¦-_3x±ó^Ýž¯_vTÒöˆCCS{Øø¡9ð6öéL ÞÊYñ{Þd/êKu3®" ‘¸ PŸ‹)K¼‹9«D$~ƒã¡eB}Óšü“/IÊGÍ×4Œ™Ï'Fú¦~ŒA¡q?ÝExq²¿!²K€¹æµ8Í2$'•¡m×)‡#ü7Â<'û‰M<™@5eïœ ±Ÿ,5‡#¸µÇç@ÿEPla?…§È>þs`­BuŠöîß>`À‘ÀÙC=@˜°¾»}áß›XŒÁ Žºš1;X•kÒ¯?†,pÍ W¼AÝàe¾xJùåTn²HÍ?=°]dq,‘D8ÚfODÿÀ–çW`RÒ¾ô&2Ñ> EÓƒ ‰Cû‡¦ze•ý߯¨ß ?‘*éãQ0hBj¶»K ®©[`+ëÂlQp˜áL |°wÀH2¶ â"»²pôÜN¢ÒâÒÅ/° º¨œ?›q‡ŠâºÞ^ÞÞ@´K‚øðÌ÷ý¿-nà~øJ2†FýŽi8ìUs]ŠøO½'v'’à Ès¯¼Ç×ùãõŠybÝÃÙ20O‚Æ¿:Ïâ—höƒq?xÍ¿6ý€ôí()hP=¡À!Êž¶ñpüu,šÃÝngÊžñN@ÆaP«kQm_S7 ¨‚ðºüæX€pדÿ©/2`Iêêjš =Äúƒuݯь­‹EQÄñ~ĘK#“àœ BÐefÌôJ8G瘆w¸Cظ«¡)€§uÓo›Ð2I(ZÚÝ×Iˆƒ£]t ³&!ï^r‹dF(˜õ+2oÞ´7{úYÛh#£nÜÂ5õ—SI_Q$Ü\Ò¸]ŽJ—¢¯5§Õî_KCn„jï®>cÁ™ô˶ æ¯hYŽC¸_÷È×fq+ü+µÝÍúü®ºuh¦´„Ì$+˜qW° ìëRYáøQ-6LCÕ9E¡oÎùÚ"wÓì²Ôl:.ÄÖíÃØ Çœ"œ$/WÀÙ£ò‘ÌV0‹ÄPÌ"'0E¦a…›‰‡‚Xñ~åñ¨,{n@YŽ Iú´•\Oäßáb2¹4’BߊŤ—Lè¿Þ–¼L—Š%CÝÁ†iK¡Q6\0#O –&šŽig':þu7û_oއ B”Iô<)eéIí®-dKùxÞËS˪ˆ|¢Ã¼8ÿ¶.UN!X†ëÁöÄlM{Ã5iÓ•÷c:i»[ëlßè×ÏIíV´i þ²[W‘-j·»·\äXïèƒp¼4"Þˆ.ú&¹XšQÕ°#ÎÉ‚ft-ªòëy>ÝEuqxq‘œ<ë'®ûA9e]mÖ·õ•†8§+ ²‰Ä™UîjìÖEëV-㨠dŸÌ<Ç8+²dã\K0µû-U¤'^ÍÉÈ\Üè™ßUçî#¾½ª$’m¯§.:ÔÉ3£t1žk$)Id[òQ.áy[ê¾·Õ_kèbÛ$y&ý~=¾”ñ 7yš`ׯñcÛÎ/þA²Çá-¶(vç@é刡Åq¦ … ;ï› ªË¥ qêªKŒh|'&Û˜úJ×A×—}7ØW%ÒjNCW”¤î0bHGÙa1ùï¸ I„ åÕ‚-êj‘þÂ^øµíÑ`žŒÅ +è)Ø\íIYÚ4"ÒӨŤà½Õ-Z-'ˆ(§Gr£Ô9åË… œƒb€y•GýXù¾ÒW‘DàâŒÝNLA?be^'¶Åˆ…EM3X* ¹Ã·YÖž Ú‘/=yßuWC½Æá颽è ïª5‹ÙÝï%.Öc¯—¸ð z 0»/§ °xœÏ”å „9Hiþ^> P?H$>:Cº#1üQ¼ ø#Gð'fÖø“ø óGçÀïúW} àQµÍÿ4}kKá¸Õ_e¡~¤åE¦Ÿà*J°Ò1ª¢?¸æÝ<Ãø4ï,ê#ѼETqP:ƒ_¥oËE;îž{WQ‡.vv'×È uÇ 3;;åb^ïÃioøÈŠ÷^ÇÃþÛ6Ó­äõèuñzözþúýkÀc¯~öA5×Ó:c ËÓmÑ }M|-ûjÒL%ƒÅ³Y9À±ÓœòYYpä¨ó½§nŸôP|éÃöÖ³ãçÄ!ÿû–³8^£Ÿ»Úh‹§žS©‡¥/³ø S²˜z¨›¤3zöüéËÇ^®šT R~›y}÷=ÍkɬŽžW«¿Í¬N¾= ¶Šç¤Ò³»æ]Fh¤”Û¬p1ãÅéÛžo_ãRÖ2_Sâè›ÚcëSGþr@à[÷Ø_"m¥1;n2.f]"%>ýº Mx‚zTNìåpÁ×…¯¸n¼×uSÑ_·°óëÙ©wq]cϯ óq#ίs°ùuŽ2¿®æ×9¶üº„•7zÑ  ë[~]‚ʯk<Ðu %¿E‘'m.3à°’è_ÝnûáÔöŸÑMcó½ß‚>ˆQ¯‚g€„ZÙ2®ŠC@Cˆ•SerûÁçú‹Oõcœé/:Ñ8O§@cv) tSã{›lIž¯PTÚCÒ«îj´ƒž…`®Ý041,Nвr¢r§Ï¬|3FA4ïü+@夗åÔ BLÞ‘€‹¯r,¥G®ö Ÿß{ʼnÌ&}ozÛ'áÁÐ÷7ò…»Šça¼®ýØ“È&QÓÍ/d5<åPÇíJ‹V^¯—ØèeYü5Ahbõߺ•~€h lŒšT½ãŸWC4¼2¥¹ñqKÞi™×Uåg o¾ÆWò%Œâ*—zË…`Y‡TÎ0A.qº³©|áÎ[Üô@ýTj¿zåQ=”© yjQh£vjŸ&èhÇfØnº6ÅË-ihªâ¨z4†ƒ½2^¡Õ¾]]®­øU&¹ÉLã‘Cd§’s|ø¦¶#÷B·n‰»f¹Î|6íxLå²”´Ä‡¨åÒÍ·Ý| ¬¢(p¶_P´Œ§<¨êÁÆQ00Þk†»ÄŽ=‰L®5$€@µÚöÝEƒZ", {‹ä¼.i­î7ÂV4_A=x¢YžO¦eUåRC§w·3°„µj‹ŸÐŽ·œ¾Õ‹&ÛK–,>ð/à®.àµIØMŽ´Û²Åbeޏ}«C o 0ë—´}zp©@ýåúVP} )?Ì6êô6 =‡ã]N= úKð‹ßºQ’Ÿ` ùGªüBŒp»‚WÕdåËu¨ì=,K‰¸$¹ClétÚ(äaâ»Ñ˜Ë–¥yÝþã°‹¾\ö`þáfâÒÞâ;44ºPÖÛfZ›èÒûæ`Îëm:>å·¤wý5©ù†êºì,â…ôl})šï²8¡‰ÇDn±Á¤…HXX0Ñàdb…©íÑ©GÈ¡­> 4ÁÖç*bm™% ¤-€½Ü_À¿ØpðÓˆÙ¨:H®JÜOA,µúÝrÁÞ1ÊÝ;œ¢aÄîGm£'Ö<0Dk!­Ü³)`·X>•¯lß Ú´êÖw€YE;¾ö#]%¢ÊY×ü'ÍôžÜÃV7Ö€näñ=îIý[N}ïu¡ä.ÈÄÒˆ6q‚íˆáŽ_Gá `éÓ5…,Üå“å¦VkÁ7ó1&Aÿ)yüo'/ß|}|òäûçiüõÅ÷±—ÓÏ_Ýÿ/¨ÿ2,ÿ€ú/ûwîÞÝ“ú/Ôrÿ×ùtÿà÷ú/¿ÁŒ -°º,å—Ì¿·€áß[ Àðï-`:ËÆíXU"éqZß,Håík¤ß”j1˜& ¬õýïÇ.ŸzrŠ¢ÑRñª½-r«h¶ßª\ ­¿¹SCä»Á½ßêÓ앨€0¯dîJyx’Wsþö!NÏÙ)H9õ\kR=â̾2ö‹Ë‚a.¿Ê¤¢©>Üùn‘Þ¢tÓL:É–Ér\žI=k-ãŸ{‹öE›6Ö~óô¬ SÈÚVj¥Ê—'²SßÑñØ|.ÎhÑ¿H™m‘;,;'ÚøÕ·‡9쥧‹¹%œqx å…økEj©çVSÇôõ΃ˆU©4hüâÛh! Aýß‚ðGßÑ7à\Rçå7éÛŒëàÖ¹¸àE_0(ø‰‹±DNzÙ= ˜»»æ~|' ³S[Ͷ*”ª¿N @´+Èié7¤ª–N眽éY´7º³¡sFå*‘VxQO—V_·Ùò·’CZrYÎOÌEðlgöYV¤tÀ°ÃÇþ–,ÛÝÒÚ•¥Ý†˜) º](Í=´Zó®ô!Öh™ŸKhMd¹ÍHáþM—ßí‡shG=õâ/Þg—ðÏ£®1Ùðñ¸k¾2\v9¨Ó é¡O‹yöpÊö´Z•3õ"œ§%­ ‹Æ°´`›UH$ÚR¤_«æâNƒÑ¾æßpO]¹äôE)àÄAYs?†°¨š¸šb`¦Ém³´5ɶºz 'ÉÙ é»\aä)ðRÅ€G§¦Ç+›"—Õ»D bœ#¸#¶ü¸8}2¿@!O žºÃ ûÝä[ñôD*+\¸Û²p¥îd¸0™»…é¾;i‘K{_ºÐåëBN"ïÀ·­Q#“¬Û;™¼Ï¾LÁ¥“Ù¸aÛfÅÙÆ—-÷œë&Y¯®gkâë.Á(ñjxt¨\<˜Œ![‘{@ù„DegélÈÓág’;YÆ!àb§!'@¥KàJ‘Êm€GÐÑ5tQ9q;ìûƒršË¡s‚lq66d„»8/CPp€àqauŽmêÉ‘¢6+aÿËžv犖¥¼vÙVøSªãÚ&gR® óRª’W»»0K¤D2¿rÅ×yMZ«¾c^8‚6ym=öÑÓðl Ö ªoË¢x)k»kð^9üÎEq¥Ä,Wrfñ%X+棕H¹t. Lke[nUœ-Rà¸pI1xH*/†…”„æ‚Ä(˜‰7S© >39ö¨E îzcöÓtÍUæë–ÚÅ™,«´4h@Ï=¦Žœ^—+!iÒhj_3sPD„ˆ}6y9kE{þq†V¹†îÌõJ—°Èf\GTð§æWãíÄlpÚoÚ…Œg¥ù„ƒÝ´-Sp"SZ$—Ž ÙÔï”!ö¸¶«óÔÑT‹BDÄ)”eKÐÔÀ°ìnI+4­k„y’¥…N€Á8&âph?˜”lKá™s³ä @&Èõ"Äiÿœƒïà"Û,n Ž$€¯.‰nMØ Un÷CȪ\@ƒVKKiLÅ+@ëÆ§Zd–©:³ œSıYîÙ0§šìrÛ\…ÝCÚ’œÍF‰”c†ýG®N6)g—³ˆßÇD^AðCòJ/}ò% é˳ð‹/j÷ƒCì¯Î_I¡·¨Áô•é7ñmöÊê—á[õÊtøöò›Ý:ºx¥ÊR“ZÂ.$±}T󧻪úl’¸]¡.‘~“W:·´ÈPHA¡Zμä«K…Ÿ"Cá1D{L)‹â` °Bž”±4¤¥²£.ø6ds_’;û‰^áãÁºª*R‘qW¡´-½»t.]ƒìôÈhûMWcÀä¢D}¸¡DÿnQž„Tc“]9—} }¨¹HN!hqHÖ<ˆ4Áß›7(8T³lm3ap¦õç§ü [užl¿î¶¶{'ýäÌäH¼Åöö¦ßqÓa¹8õM·Ú›£)€šK˱ô?Î pV­ÍSm>æ{±¶ùž6·jp"”7›¾ùé~ Lö]Þú–"†P6˜iK+½jµ9êt[åI§.«¤Ëíçßí4€Ùöý4œ«ƒßfYèJ/c7µÌ®…'”tUœ.ôÍO{{¾úPã­â°¿¨P 3‡æj, MEULbâl¨]êfçt!h$ëäý±bÁÓ§ôôiS ;¾º6ÙêrrZš»>_S¾p-WÙƒDÇ”×i¢~„áu‚ŸrðšÚ_ÞCµjZ¯ù4#Bš—³P‹g&a¤µ•c…a€RDºZàVE¾æQ7ZŒ¬¯¯——S)×ë1\€ Ò1*ÿõi nïRѼn½æ•â*ÑÍ öß‚oé>ÑðBSz7Pº”$u·JÃwâ$Ämœ“cù[ÈuWÙìrhâ{[‰^]80£M½¦È/^œF­_Ÿ üšÎ:˜›/Dÿq¦Å@WšÔwÍIiÜãxé¼ÎòrØàW‰ÔŽS1‚H†6âã£Þkrmý®ƒ¦qmõÉ(ƒ,ªÒ.ü’ˆM|(z(Ž¢oLïZ±ÁÅ˜mµ’T‰–¼º†M“/Ž‚RºKɃÁ®=—Y‰z±r¦¸úØ–§|AP‡zÑ«€ñ¸NËS• g™Žæšfb,ÌŸ³¾ !*‹ÁQì B³š;ù(ª‡Dã.żOt¯³¯ŸVp•êi+¶e˜nƒÅ^ÖPάi^Ý‹SöÕCF&Á+hxò¬gî ôºó,ð^,eŒûÅw•Mɬ‰3¶ q:.ok7ÜÜœêsà¶< õl~î®!îèÌç4­_¼!¦Òó“5ÁBį ²cÉE‚yÒn šz©¾HYŠªÛ0kµG · E6ÝR ~®3ï:—(‡T´¦~ º-Íœuɨoäpu ø<pò¬í¸«d"w;e‚0=°êÒuÓ‡bE§Á Iáò4/”9/‹¾Ç„cÅËS¿­âZÀkšŽuŠXãX« P^@ZF1m HB)ˆl\òà™ä³ôZ!ÝQ9ÚfۮשTøfU &Ö>§¶ãZ'šhÙÙ)¬¾(vIQ~MÒcxýÝ8ö­!(’`'¬‚]³®²¯Qa>sRj‘ï5/)®çÍ0x'¶NH X«gáG%L×jœ¿v§‰WˈӃ·Gþ¶Ü–“ ¿}¶´lôþÒs•Ä Îñ`t£ìÕA’¼€Ñ¹ÊêìŽØöR‰-:C:7839F.LR'â)c§î2"ñ už=¦ »îî×ÃdŒØh ‡ „LÒáf]„b¡» ·À,•òî7 ]k ø rxpE¾{ðŒ5º d]ì±úæ£èVåœ ØxT3,:]Ä üæ$×k»œ9RÔ®n2K¹Ê »ÿ™ÍJëι0{ÞLÕ*âH'8 ;^×ï<Ÿd°‹¶ySÞÊ“·‘cÙñœí\U p¼»gVãMŠ^Tf½MXr·Ûd ¬Ç9µLòáP|CÈ^6äΤÍR½ºDÿªÖ|œ›MŒ{ú6+'PGk\ÿAŸ-•Ekˆ&Þ5A`õŽŒ¢ð,‚^ƒ$ŽÍ®Ÿ• œ±.¬mªÊâ8 äɨ£DïŽó¬…B͹™5¥ãmæVß²J<îC(˜GÒ‚:¯i™Åý èð_«Ð ÄY¥àêbT¸Sjƒ!¶fw—}¦œuGÙEVÍëÂØ®—˜Ô•Qìdm°œsdAßvU ~Æ–¿( 6W÷+.›¾(ÚJP«Lt˜qE^Åz'Ï’mÄUB‘kYLyˆ[—%›q6šk3šTO]x!ës —9³¦vVw÷nŸ\;é''If k´i®±pŠp_ZAý‚Žzס09òçà,Ð¥Ì%."V{TùOÁþô pè¹e÷œZ¥çV/ƒ§J0CÏÉàš›œöÞ9™K ;Ñ’ÿÎÜÅ>Búh[”<% ÌàDÌ^C.Ì38bVgGÔf›t»Äo2Üïyåȹc;+¢–¼4ðÅS,Zz‹%Õú>óNœX3ÇÙ¦ãªlE}’M¾r(LYÚ ˜$RIéºb½”·ëÉ>}Ö¤‡³Lâ!×ü•¶ÒŽÈ—?10¶(OçÅæðaÞÜ÷Õ¹ÌæÖ8MÕ µL$°È3¯ûÒ ë%ïaÇOD—0éG™§²(ðDñÕ,¾Îøª Yî|ØÝ›ñŠÅ€çÍ5§C5ЕC°kÎršBpÝ»:Ð1KÌX´ªek2³¸¾·U{“s¸Ú 3°Êg ÝŽm0Ë$(|ÖÂøØÃE1ÏÇm¦U5I)âé7ºxÉ\ ¦§Yë«!µdÖõ| åýr2ûEäö•È…9“é!¡f¼hÕ>k¦­ƒ8VõùÏŽ7¼Mä‹7–” ±Eõ`äN¥ [8ìÐÊá-Ç1„Yø¢•+hJ¢‰É~š²öÍÇÍ5! åYä¥Îˆ)™Vª;’äÄ”Öퟦ¸ÑÉ^í6îûm|YßF¿mnš·ñóè6ÊøhM§Ã:WOŸ1Ï£Š¦@]¢o¬ÇzµÚ7¬\w.VØÄláª?;ð˾øEËþì‹–uû:™_>›ƒÔDì"ûWõD+Hÿ b•þA´ªr‰¥J¿!B•þ‘èTú ‘©ô£Ré_ŽDí™+}ÐTŸE£Pë|¦ª ö Å€ •O+S«ë¹™`´Œ“ p‘¹I‹3™Eña.8IƒÐ1¡¢\F0ŶtÕèÁ|Sk=áæ QÛ1:Éé›K~T·Õ ˜)(‚ÐǸ7à„v/.; ]uS[‚´úÝ`çÚ&²×[Ù¶­èe•†C¢é„ZÓB«Uï”ït– >Ð3Ð]šë6¹ x)æŒÂîs‘ëÆšåÃÐýÙ]Æ’)[¸M_tÓ˜–‹O×)DNÞ>GN\Ëý&þ Þäšy§Q`ìɳ*ŒÐuÎMH®;!„Þvê°*~47*+ÁØ‚È÷…TUÉ6 rs¿[wrIÍ_}Ïû¥5â11ËEÜ×ÑÍà Ÿ‚´JkK—äÆFdí¦(ÓS çFlï m'iüv’ø¢À§ÚcWŽa‹É6‡ ¹¸è±[ï KAc‰°ò]J@RÕÕˆœÂ)›Jª÷ÌÒ 3îˆØ´l=F$—¨ÏB Ë’/º°º%_ŒÛ´ÏZ6¯ƒ©›ÛF³4¶‰øÂc q`:b8aV³<Òn-b‰”s@)g r€¢rGZ¹ü-7Ês\’ƒ4ŠN½)íúsZµU5ÎFŒØ5F̧våËÝl6H£V¦…nÎ˲rü7gÛoaÆ.‚¸Ë¬”‹Bid`Sl ùœš¸fÞcÿFø”T.fæuÔ£KÇIjq±õn”j£­ÇÅQ€¾3¨çJÑ*!vméXfg†áئÊ6BN—×ìnRP…‹Ç76ιöÛ§ÙÂ_ÓŽmhŠÎ䞦Áé4ÇE(ÓÍtÉ}œÓI4†ìp;ÃÝ2”cƒV]7Ÿ=DàM¾„ðy®‰y5å(ïc»¯© ¨C\©ûª™®Ÿšºe„Nê»69¸ŠÄ2-^‡šëî]í¹Œ)Šo‚Ùƒï>àSx‘óxÔª)':–¦csk¸ˆ5-‚}š;i™¶ÙU’EÕ™ùhÞ—n|²­RT¼½d,L騮.r¹bt7Ü0ûKÐmPx‰¢(×ò%ÕÑ­KW-OŸ¯¦žj5g†ÇIÀòÐ-.I{|baHÄæ’Üõ$›Ê«943-¡*Ü_‘‰¹lL¨v\㯾VÓ@ËíÏÙY3þH \³ÈË[W³œ¤’„ Ë‹BÍýXñ,3cÁ{õ¬z®Â/©åØRÁ~-ìiÉhÇÎ{êºÿN¤šç3˜FZ M"HŠä¸jÑž²#Ç¥sï >["Ò(»GI5wØ9¹F×ô;œ(’óT¹ó§Úê4ðå]vcµPjþ¢¼ÚÐÝ]fÔ¦©ò¡ŒÍåzUŸ5N² Éò^j6 ­&WÅ’bÂÈëè!ÈÅ`¡_ô>JÄCèT3*V¾b‰ÓéyÙ¦_yr„Šî† w½Þ|w© ¨K¸Áy±P ž—pˆnrÜìæÃø„Æ' =w8¹-î»è)@[-wÒ¡1Ÿ[+IþR/ÆåzÕ jž[a22e‰]Ì%$¦E¿ÀØ4ërÇ}Wû-‘NËøêªU“ï$|©#¦^Ö—­X‡çYÃÿrÎ8ùés†dX`¢´Ž±F…HÝH+ÕÖaùd$e«Õ‘Šå¾JùÅ@y–ÎCÔš 3샃«.š½h¤ásÎfÁ¥8åZ™ORyyY·0Çîò¦¡YÛ¼JBFs`!i ÁüšùyA®ÔŒ+¢2®[Ò]ž…ØÒj¶a¯3T¾cžjÎ|Ì-käxæÆk hÛÊC&ë< (9'è’-™›+ã@¼"ƒ°öˆ/;Ϲ0s·xl¨+ŠÑY¥üÛ…àãÓîã¢)JÚ¸–Ü%M›ô¨y*DQRÅÊ3*,ª6]a›’ÍW½4Yá_s7ZéTÙ²ˆò2 í»}@ú-Ä¸ß AR:\RÓQØŽ0yW‹Ûb>ç.*ÉM¤Šó= Ùó½8°×z¡ë_]âì+6Á¯X3L4N~•ÓM/vkJ~ñaÙKÎËñ¡§Æé(Z w‰Ï§/½/™üÊ8EѵۤãX8Ö„Ö3¯%ÛG]ËÿÙœV$ä\Ködî­aÉV³žYÒ-Ýhì&ÃN€ øZ#³»ùcúì­Aÿyy&©ž]ê ÀŸ5ÈÕÈõð8U »µ„3¡jKÆw)¡C—³×ºœE,Á¤ƒ·éŒ/ì”Ä)^ÖGM©R • Í”`§%ªÝ)‚‹Â7›T$ž,zžÖ(‰ËQ0¦Gþä”è{+"«|¡xqYIR7)Óæ˜•& †íxþŒÐ ç‹ÍGq¿úD Ö²ï»ÉøhÜ0ÌÂÚ³`ýò|!ú m¤óW=÷û<ƒÒLR±a jÙ“+‡Z„öw=Ø6°Ä»¼¦òƧäfè æÛS9úÒ’K{"ý{ˆnP¥ùúØõS¥8ñçSÉ´eH]Ì\ZLÑ š¦Ì›£˜cž‡¶cׂ7Åö»K }q”üÑû—u]æÆ vÀã+¦‰Ç-=TÒb€)$ˆP9{6‰Ç¯Ô+.˜Ûø‡APSÃ Ž”ËRíØB}¤qú“ÚY† q”{¯G¯ ;+$z†Ç\0šƒ¢‡Ñµxi£Ï’R>R®éðÆ3îõ{Çájb`1–>PZ‘¼"ÀQšæé7GCM1°Æ·¨Ý—¨ãc?—ù­÷rµ8""·÷k¬æܦ4DÓŠpFdhDnšefºvºO˺ÐP|F ñ2Dd‘ÁÎÂÖ,8ºˆ°%LÕÂKšœ<ÓÜ=ê3¥»•ívuLÞ{çÝ2Z²Ú9ûÿ0\ÃÓ Â^}v^>•Ü»¯š¯k¥™3d6.r]Ü—-ƒ´ÉsÉgʸæä™j $5|Kfb+ÕÙ¥Xò¥Q˜–¸±ò´eõŒhQÊäÞWKc9"ŸªNá3_­ €`pI€,™¨%œ›e¹W€£¦VQ›h AAèLU(M©ÓÊ*×ü@PD‡µm]'o5w٠ƬƒÓYù–,sÂ!K琢t¡¦‚ÔE›¡ÄÍOì]\-NwùÑ­îzGv3Nw šŸ gº÷Ö">糕ù±COj™ŒeUåVÁ²’_˜“Ò£}ÑyûÜllgÍV›b+em1šm/^ á”Q]’1»ŠdŽ“å=b–dø‹Ó`³Vzc0 œêsö^É-ôÕˆ·ïI²} vdŸuJméØE=;Xo5üy@`½0—á@¬?kJóøh5Ü'°~šj¯R­}$;HO^Ï\9£ŽO±‚*аíÄye¥^Ž){ëYfp”Ûd Ê# ¶zªV~…Z^¥]­î–¢qDŽ ¬UÕÝNýFW³šp”²7_‡³Ðç®#‰ÔœµW¡ÕÛê ÕíH~_ÔŽp§+0='*t»°)y°ö=6†®V*†+‹^Þ×+X-&N€ã:­»å÷×ÙoüÔfŽvÛmf;Û²±áE»ÒKo‡i\#C]¯f/CEõ~"FP,?Õ–§‹2¨TªL°1iÀÛ2æ „ŽG6WX¹|#ÁIκ.b—R^ë1W€@).Öò¸1“ð¢ËUe’I€/â‡Yæª]D_]íN í¬WCeq5!Qƒðt òÅ%â4Kë'Ð)8ÐæÕŒË;™ÄÔ¶BA7 ÕnNÛXúF<Ãg|‡8ý.S«³tº MÄõû…Nî’¯Þ6§*Šús>Z.!o°묨 måb c«lz·K-»âõO¨‘¦âJw·Ñ~½{{Éà.%\?š›^²¼6Bý &ù8øY¹}__,….)‡L §E¿I:)k™7k; >ÁÅ„{‚ iÎCà–€w€ƒ·ÝÚòê)(ê¦t~CˆJÅÍj†¸¯VçN¯Ô¬¹}ŒêïÜÔVØ!c;‹—@#¹ÞW¸ŠÊ ° ëb,‚.”ô]xmäÇ„l63?17¢g—9d©ýµ¡Ç½Ð)Zñ%S×*1Í‘èä"âêt\!Q ºLŽ*ö©I‘À¼¾Öq¯+Ç)ë‚[§«KybëxYÖz‰7lš,ýi¥k]rFáä®i2°µ¥=âÈ-Åãœo°jæl„n8ö¸Y5a–kR…݃6cG¹”6¤UP¦5¬‰ÃÎbÍ*ŽzqÀxÕ¨S&n\„¹Ù£Â9­Yøh€y(nåuG¼ýGº7œMPžQgµÁlŸ6's»6þB6(˜•Hc$ªo3ô  |~8æJ›™Ôãâ7ž~/63„*º€Ëp¢VᔎŸÚÕh†`õëðWSó¸w×€ào ~A^âvÁ,>ÀÖè9o“ÿðöu^ø€Oª,Hdh0§<Öœu‚F¥*8±° ºX‘%Ÿ|•<þ·“—o^|ÿèÑã/Dÿð šÇùiÿü¨Û¯õ÷{^¯e¹VÌO5PœÊ66lLAfðõñÉ“ïŸ?öF)õ €Ô;Ðú$ì’¡QÀÐh&_³1øÔAÝSq§ûä”–.ÒŠõ‰0ûôÅ犤æEà¤ïB°§<7;äšµÊ"¾ãrÀá(œ›F<Úµ*ÌÄi_øñ½-‘ÿD€¹Ô¹ÔÉãæLp-™õÊ’•­%‡”½ÃG³œ.ëÀâD:NVâü=ê¿Ô|Äú/‹t’°j°ÉDêž¡ÕùD3¤Ãˆž©Ã‡¶ÍÎlæA[d.Ðh2ïZ-6i+ÇäOÙ™Ÿ‚§VëØ3¼(Ñ­GäÉTè"õ¹UÒ ¤×¿ üO³r:v^=ß\¡ðÅ…W{Ô¡i;é@!¦p¥æ—¾f¿8’^Ê ë!9‚4¡c>…=±ßüáQô„­q$OÁ Þ ñÂârf¨+æ0A•µ›ÈÊ3-|8Fõµ¶oÄž«Ù`¡÷–ûJQ5¡9Hy@–føEº*~UÚ¦¨ >‹æ7äü´"ù ƒÕ¢ÿG°päóEæ×¶»øñ˜³¥‘ÝÃ`(€>CÖ>'‡Éí/6;D×FsÙ!úÝŒÓ/Ë5°Ã¬b'(Gà³~ˆš_­fxˆ®Mý0k‡ä.lf¨ ]u˜4û0›rëaºá¡®Üåe‡Ê˜ýö[Þ?úÛäø¢v-2XM²öõñF‡¶[qžQ«Î4·ý’bÙQ»•‡´[uYÃvËÏ8i9ð #¿(ODBå£rõâ±$¼æXÂÚDÃÔ*íGå>'´&‹ÑbÌUåËâG%]Þ‘ Ö»]©»Ë¥¾³‰ÞœU´w˜ÏÁ³…tèšq ¼–÷¹T¥d#•ÕEö.»^ê*­r1Í~öÓlÀ…ÄØÞâÒ£K¸“X¹Mh~§„Øîu”üððÖi^Ü 0ÍVГø è¯y ÍåÐ÷9I§ÉÎNò_×~¦æÿñÍÏWêrYÿñ·D{LÚœÍ,þ[.Z 1öÝ)B줰î\êm›üÇ7Ü€Æ Pg—Y-Ñ`>ïÊsþø7f#+$)Ö xÕDŽ k{…ôY†] Z­j/-¿ßûøÕ…VsÄn§Ýön+ÔŽû·Þ˜ èúU ûš?šï}ØÉ·ã†Ðúî†pÐ~q7‡Öw7„ŠÖw7Žö9o#Iòá Òþîf³p~lƒšlÐ¥`­:ä4HÝ?š7\N#BPXÁ¶ÂÀ‡sü1 XvKdêñ×÷ü×à /=ú¤yøŽM]*Z¡9Ñ'‰h¼Ö8~×I°% <È–×rcÆ0[Io–¬r­ª¶w›X­Zsì´aÕr‹/]VéûV=×DzëØÀÿ-²þJö¯†µ’ƒ+Û¥“Û«qÑM1ÐÝ+àO7Å6Ÿ] Ç|~ÌòÅج÷÷>_|1Ý?ˆ˜ 5<Êèˆ7â;›Gy;ÙŒëlÜó;ÉFúÈæñÝM6Ô@¹#‹`d-¯¹äv~–\XrûàPSôdõMD‹+ÞD¼²âøøñ&7 7½‰GÁ[Ï69Ò£«ÜÇ£oãÑZÚ~´N±¼åÞZu¼Koa|î¿øHëÇ5ß@5µÿà#m£¶GÝѨ€Íц7ô2xeíMM–ÞÔu÷ôÊ·tåÝð†n|?%÷Æÿù{9ÜZuš¿Å®¸”W»’W>ÃÿKñÄÛ­?»~ðÂAæýõǾs»Ÿ<Þü?©I4aOwú8›w1h{·¿êÃ^?í'Ç›_ÇOÖKÄaçŸõ“¯6d\Ã×>ïÃùjóögÓýÛÃó­MN8^ÎwÜÁÕÎ>~÷£Büö¦P¿u%‰_]Ç'bz˜€—ÚÆ|ðÄ}¬A·v6ý»õÏâ±ÓbÓY¡š]¥Ž´ÉßÇxçÕZóíï¬4-µ½³ ×öÚ:ãBÛ;ëþ~ø[÷k9.µŒu…KQGÐwf[W¹_›\«¶ÝX®˜h4]iGÝôºµÇ —Š+œö/hºô*µè×ﶦ­ü`{Ó%÷«­i+¿¸üæ6|Å“«Ü¼>|_W:llº’[ÙU._«Q‘n]öûµûý.ý’»ôì‚4X½¿–YòlAS$´Y?p”ü5-2bJ³–GGË>''ðZ¿1OF¹W´Ñ E!‰««@Ö8Jž""B’·¤g´ƒ×®]kS“oœpܤF'_§ð™WZùæKÉÉos2„„Žãö¡ÏëíEÑF’‹ˆƒYßJ<§_‚$³å4HþÞ»­Õû¼ÑF·.å&GíZ7ü7Øú wÜov¾}Ç]›•;_Ãü{ï²»û¿ýž¯Üéüþæ[ÿ(,²~³ÿi0ʯ¹ÿÙG9€ßf£7ÚÞßj+4ð$a®ê¼”ø©™Ô˜ä<eÐ)‘ö¯fD$Zㆋ¡B”âlpžf\©ÔOóäÆ{d@îôst(É6*dF$þªÊ?4ì{g[Ï+4x­Ÿ—LȽ°lbÁ¼jz{gƒðÜÂɵð1çE¾ï%ߤH;Þøùfr\¤Ä¢UyÚúô(ùKŽP¶kѯô½þ&¿$×yÿàâa3ÔCYœJîád’i:ˆñ¼¸Ñ²É1|wóÞͤÆ4‹Z»ªÍ×·~­«×½|>d g™NG´xjÙ:ãD2…Mgù$å’y˜A†ÈƒBZü*Ç8¢¬j5¿ÁÍO‹JÆT‡¡¹MË)ç  –¢úó}‰½¼½÷õŒÃÒqÄ­£Xí»¿°òp¸‹¸ýf§Óy‚äTRC»Ð]Ë1ªÁñ E¶ü2,"²ñ¶DµP¢‹”ŽÐõ n ­”ô¬ `èkä"—r‚ØžÛ¨ ÒO†ùYîBˆQNÇMäЊ4j9QÎ…ÎiC¥l•DŒoé0[ g}×,¨È›W„¥O%Õ’T­™®LÓ5Y9ݹ•®•\=t,êGdõbÕ.u‰{ýlÍX»ÅãmÅÅMQ,>/û¤ïË|˜ 8ÀÜÂÒ%yW\+}[O¨–®•ÓrI¨üQçH 8?Ÿ•‹³sI´vªkI9}b½~,]bø.%¿'ªvc®ç4ÿK,²žo˜ŸUYð*“-b¥úÉþâÇ1n9ÌqúÕ³R‹ð^¤ Ú˜%‡ÃKÚndÑfÑ)[ αä½â$IÈ0À5œ$Ig>WFTRøÚ1N´ð W3ÀãtŒÒ#—Qq Ÿì Aó|Ôéi%!ôVùÝ]šK`üŠ lGì¾Êçb¼ 2j}¾}–üƒf—NS)&%Øa´`<£¤]P ˔ì¬åo6¹?Ðù¡xLΉ–é@ß‚†O!Uä– Ôœ’‹‚&]ÐvìñÅm­3Á™›5)ê„Hù@p–RÙ[Š­ëWoïÅ)Dât~Bõ¤ìƒÔE"FƒÍÆRÅV+é 3Á+àehç´H©Sàb¸Oßk!‘W“(CF4ÝÍsõ¨ÊUH¦¡ó!*¹i!!Ì^PX2Azá(Í JòòÉ:GW9ŒÓ–3Eû¥\FÏ.õ ”"„ÐJ·lÑÙÄŠeqåì'é‡'F28eEp† šE–ÊÂ04ªlȾ»k=·ìâ3Þs,Çï B±0~5/ø,fÙÄ|2,‰T â¼5R±Ë&lI‰¶ODëÇÅ0¯¦„“‘¤ÛëX:li¢RŠÍ­ŽõûJKúÊ ¼œ“ˆXIcXŒ ¸½Ÿ<Ìü\RÍú+ÔüîšïïÇsŠæŸöôЭ8«,¡'&Ôè„sï':Oºaó1òÐ#+ Ód(YH$ÄË'ŠñÌ +é+.¶¢åM£6ü\nsì³”3zÕy?FBEi)õñ¶mÝÞÝ|ŽTào]éKNt.1DI?¼1/wij»(Èæ^¥92QI:.Tkis€¿eIùÙBÊFª³ízAôkH¸é$ãÃøƒ..p#Å è|'=-#0*Õãzr[µêÇXÌ8Œ*‰B¥óÁ¹ðLëßt™æ(j@•¬`6oDC nÉ'Ì "¿WOdW˜ÒÈ#-¯'öZò©<¥±³yfmmú{H âØ¡šIaZâÐӣߘèav}™Þ¦gÀL>¦uì M1ò:a$‡^.iEt{H#V^ÀIðý²±™ÖÍeŒ‹4©EʺÌ!æ>W’+3W-Îd\0ÖT&_!ß“ró2b#Ò*O@M3Îå:l¼u<¤‰}ÓOÁ2H‚”î"ncQ%ËŸèjîßõÉðÒ ŒÐœŽíû"ç[8 >%xz8+K0(taA2¶~ò¤\ öÐ7O“OoïßÞÛ½óù_¸ß¿8Vá ð#žwb3ÝòµFd¾âz[Z/®pUV}2ÅöœÄÓgö5Ìãs s*+3Áb«”&iSé6ÂÂ8åz/.{&àÒ÷´½Œ'µæ×ß ¡¥ó`·Ïçóé½[·...úáQÝú:¼[ÔË­zÒ2laCªÌHsÀàã$O= …o”èŽg ­‘\ÊÚFT,™±GS~ÏÊn®rɵŒ Í?ŸÿíÉþݽ[(õZ~Cä8áùoooïÓ½½?ìííßÙ¿ƒ÷>ûTþÅßÝÛŸüaïSjt›þðy¦ôÙ?ìýá7ø[IÒ +ÛUóʸ-_$ýܾ«‹:øÃÿ’¿O’Vó~‡~O" þ݈6sÁïÊé%óØ|1 »Èïu¨í[Çít>ÁŸü—d-)‘Ç ,y@o*-`,N Ë¿–êÒ7ª’¼OIƘw}Ú;d”„ž’‘¸O’± QWwŒÉi ¹C‘䆥²Ö‚ˆ…@+–Aûê„_’ê¢I¿ä¯š=HVÊHUÒTP+aæù¨Év÷ï:Óa)¢õp…Ò¾fÞÇJTïwVòôUßgÌá'ÀÜšM¶xÞ‡[[É¿ìpÏÛÇc©Ö˜³`5Ë+ÊŒ¾”pdÍàt†ÊÀþ ´fÔ {ÔBCaüÒá{K‘*Ü* ‘ÌD°ºr(gUª’] NøœÁtˆ]²,k4“忘¶öã[÷¨,˜É6Þ]»¯p”ب`”ñØ€Ù~ô †wƒ¾ë¢Äîvüí‹“ä‘3c£·¸é–¿¥”9òË­>õcÉXCu0¿*ù" ŒÆ¥hM¥z IÔ$9|â@™˜âΤ…\‰¤¾ñ7 Ðåóí®KˆŽ£XÌKê ©)iÁ_W|§' ¼HK´÷šäsÂßè}fÏS+ Š{`E¬+Å v•çe)zäù,%ž+…ZET±Ùh” `±ž€ ~¥ånÑ’¾zúí˯Ÿ?~,KÖîÉ6€ëE9†•ôSÊ‹gÇÏéš“G]º8ÑÄ>Ù}šìVÉî¿Ñ§¯¬×NÇ7à€¯+ߌ@Á-.öËò@þ¹MÿÈÓ~ÊÍ7«:0T ôöV?¸OÔ‡‡zÝãUE[A>ß„ ¨dôJ9 M¼¾ ž®¼¹²M²}•~? ï»e§ãŸuŸÝ?ÿfÅ®>ÿF¶”7”·“ˆ"\‹¶ù­³ÛìÊ[§Ÿ¡x£Ëüë .PK«ÅaUœôfÕQæ·„ÚC`&ÔÐá!ƒ9< ŠJ-ª]…‘1mQôòSZC?ÜïÇ«^®A:xÌC˜óÏ‹9I¥žPcË,1/ÂÒ§$–w ±bÝ4‘Óiÿò”m‡U6§OÙl6©Îèµ§ÿš®ð_žv:ýÁ¿<½×ùÿáþ˃NMß³mĽuú‹¿hܲӱñîéÈ„LõùÜ?ïtÜdîÙ¼¨}ò Ý«ŽMúž=ÝñBî1¿³²·V¼ä×íõ¥ôºoÒ6 †Þ!ÜÀ™ßM·ó‡ßÿèOå?¿¯¿Â«å¿ÛwîÞÞWùïàöÁÁnwûàîïòßoðwk‰w÷­ð®yñ[­âÿÞ"þñï-â~_âUN/°yšþ§ã „Ï:Ÿ˜vjËßþ-vló^‰-ç"»Á¬¸Ò'gµê¡‡{íï–Š»Hzn™å]¹ì-C0[<? Ã7[ÚEüÊGÖ??ê7RÖ¹>Ð(/©Mü“” ~ðÌjÍPä¿u>Y4Ròí÷Ožt> 5×d{›½ vºÉ^£ŽÐÌqvÖœíöt>#¢”܈záí¢P+Ður1§goæ÷ýs­aÏe8ÿ«“HY{i¼38ŸU÷ý?m˜åÁ *Ž©Ê,?#éeûÛ§/=KÍLÁ×{7ºýf0E8·bsÞ÷Úæ‚y¹Âýe!ú¤§Ö^X¬jöÐÚKmE/ÓiY9S&OWÜ9̤ßï/™ Ô°÷5¶$˜MTô]æÆµ ¤°´Õ  †ú•¿Y-aσçPiªTÔV$†Üûõ^žöݼZ²-Ò‹BT‚ªûQ/ß–Ân%o[z¤^~æï÷y„ÅŠÍÌÏ/ò*Û}ú>@åYÆ,¨ 'ØI2a°y´wÙx(Žèö^|q+Ø æ:yZÆßß¼øËÉ×/%ÞL‰¡1>ÕÚ¨Ù!¬‹kå×ZAá̈æâ ®ùüFøÙѺªºóèûç'O¿KỹK3 3èRáœØ°t£UêãøÙÉËã'ÔÇûõ>Òi>OÇùÂu£µFoŠXòª:ÏGtM·/ºÉvBÿÝ=’]¾žìwƒf:5n¶5#–õÚ!°WÐXæÐÒøŽ5vXçªgî%Æ]œýs-ý·1gç"G·>Ôƒ› µz[¬ÍRàÉ [z²Í¢%? >¤®XžöÐ{Qθ¥Ž/§½d‡ðï})@e·§t»GÀ£=®Cr˜L“›øÉ]¼iò€Ÿ\¿ž\Ë«t\,&Û;Ó.=¹y“þé$V\0nH÷#›qÃÎÏm›eDZf³ ¢Òko—ߨږ´l›-i+¦˜=ÿ48÷{"FÍ`_°Iòc}gŽäwú¼»;í2yB‡ØÅW»û?ÜLJQ²m78ïvm¿öüc¼r˜ÜèßHþû¿ýò§ð˵ð˽]qTC?cÞècŠÂœ6Íýp”O‡e4›ÌÚµÜG‹‹s(5¶ÝÒºüºï«v–bǯ9=Ës.ð"Ÿçi>îqÃ'ò*çt>bÕTUnÒÒö"×kÅ{V·NÒŸò ݘßcYIëê9'ÉQ[fòîb"É»}3Zár®W^‰ö'æG8kÐŽIQqiüÏlVö“7X¦” k臋Ʉ•¡f¬„µVú‹›º*BÒö%«„Š q°ºF`±h¶v3ŒÇÄü¢]ˆV¯y({Éî¾jX´¦¨œ ¬ÒõwÆÚnU›<á;ôÄ¿©UM¹ÂP}¾\½ÙD«v.î+S€hàžp÷ v¯a7w°Ÿøy–À’v€ë¹ï®¢‘6jGÈ™O†5¥kñÄ5±o†¤cŸð(‚N… îãÞ»Ñìšã^½ÆGù'÷Î=mŒ‰¢f8MwgyeÉýpÖòÅÏ¢m¨ÝýûÎñe»m7ˆ&_è/û¾'ü­;’Ô—ì ‘FZúA£ë;«ÿÒ^lvx¢G«1H#?ËÒ¬ëZ냰­<::ôköƒ4öSàÊ?²~£HY²ŸmÛº<À¹ ¨EšòßXq›è•èm”Ï=žë©ÚˆxOùÐé^ñ5XõNb["·¥j gÞþ²83D]ÝÓ㘺ÁñPòàºc#xzIÂ,¾wІ9ŒÉ2C,ƒ*o$“àèÊÙ{ˆŸôŒ…=æAw“ UãZºC[%múØ÷Ñz5ã W¢í6|¹³MÜ`ý1nš«×ýçBÊ£mžuÆÓ,ûºy86ùo#Æ££îæún‘Î2 rì :LÙ&srª‘ÂKX“À‘Eeí~5b!3û¸CdÔ8jÄ@n1β484¦e Ò“ ýW£Ýž_#†77ì^ ¤1%;r Áh$ŽhíuÒIß;òo<º?,¿<¾¾ö` \IWPA¿Žp=×p^ÁÿY!(àAÀM,ð¬J×ñn JÊ7iý=:è6I.HØ•î¯@gõV*¹]Nf÷=™ý˜tÕFÿ0Aa%%‘ï,VŽP*¥ß‘òÿ —Êü Í®L@#Î’Wj²—‹£“|¾È‡Àl H§5Õ ÇñY_ÀÇ!§‡OÏ9°D>³ÏSø_žçÉ â±dpè5 ¶o1²%Í©¨i‰€ù:›4=O+>Ú¶ÍØÙ‘åe•¢ýIÌ-°4€›8{ÃÎ;üðîíhP©Üî1ÏŽyÄž1ÀÊû†<8P¿ôÁ½ bs›LLì`k´¤ÉËñ}æ&õ  0˜ˆü(Æ/EoÌÏ Q¢®s üÎ; Ô%àAØ\¡È¨°4xp¸¡œ}G ðY‰X·û[-¦ž«o¬Ú99µ…FÃãl‡â4þÔ™Væ´“TDÑKb‚#î:Á5{±{ ,G“l²fÂ/Ô¼l–" ¨×¹y+¸¹3ð$qÏ7õ5t_)Ús}¼ëw4’ê0q—ºbp±a#΂¹±î¨åŸ †`èß®7Y¡Ñ®4"ij TQñÁÖLÏ[OðÒ‡*Ú«ÍáLýˆ–ö@æ)‹ZÝÄð‰˜²zW1¤A]ÖsXÇ0ŽÌÍpsót óŠƒ}¥µËV±É”“ÇïÛÆÐP2NÀ}Ý¿ïwÀìhûÞ(ºƒ·éò%7º0î‡Ì<ÂÇLƬTÜ4@`!­Z:5öŠ^ƒK±É„“=õ±É:ºÇäJ/]žJ¤R¼v±iBV]—e‡LO‰pU3¢pÈ¢ŒdÄ„ÜkûáK°êFÛê¹cü|€k=‹ðŸÛlÛ™æÍ›B nÞ$˜‰è¸^Å‹]EÑ#!tÐÌÂA£¸޾ i9FÌNâµnx_ùLTMrÉA0(8«ÒÁRÖ\lСYþ Ûåv²ôÿ>ô~á9õ»tèþ€Wé°Ö‰8~ÄBjà±ßíWܸ6œØ+J?BÝI†Æ9`Ü$ŒŠ‡17—b xèø½û– (6R³‚_Ⱦ5x(<ˆèÒmßö[¶¼¾[NÆñ ¯&ÿ³¤¥ X9¨OÑ´¶d·¾‹ýnøëϸ§Æž,þçà>é5–›û³º ˜IÊ…²Ü…!¥y;„9ì—cÉX~9Jž„hÐÆçXAl,)p$ÛÏB°öýÔ[‚^LB“­¿yÓÂÙ‚t/ùc§Aôü«ƒùÍð*þëÎgó­ŠIÆò½ZO(ZIÅÄbÙ²BÐ HF]ewö ~gía Õ¨ÝöøÃu,áPÈÍÈÞQ›'qsý}·ñBƒ5ÐGŒv÷–¡’µ8äçÎL²f¬\±x‰Ù+ï#Ý}¤¨oÑ·Xbc7´&x @{^ UŒî"cØriý ¡ÒT·Œ2}Žëâ4ø‘õ24£/S”„+¸Æùb‰Ì±„k»ýÄC€#ú¡Ïiüñ¬0ý-Sò•¿v)?¢ÇW0ÿÅÈ£Í+„ñÆ“¦7ˆò,÷k6bÎEÏ^×UTöMåà"»ÉØá•çLO°Á&ª °ýnÙmÝkm÷€Õ`†üæ ÷Ò "Úr§jX¥¯½Ê¹üreíýNLŸ4ªj×iTE·iíeÚá3m¯¿OÎæRöŽäëgJ–ÕØp ÔÚHåž*éÊuÒqoÜ3¾ÇkZY¶t_¹K Í4¢;i}<_ÏxUP7ö˜§É„´úšM9"Ù¡V/Z:tûS—j\WuDÀ3r:ÿn|UðPy×ièµj¯Á˜ó¿4þ÷ü7ÿÝ;Ø»{×ÅÿîÝ=ø=þ÷Ÿ,þ÷üŸ0þ×Eäþ?d5ºa×rAq)’t6K/9Ç^`·’”}ºÜÅ”ÓZ,æìD Vwî[É™WeíýÄuÍéâÔPÈ.lxó4Cf­tÜ÷Æ{uSŒHË9Éx ©¯¾Og9B8½¯5²|øOZEÝ 3©ê0Œ”ýÄAá¶;>wT|LtDA7rLu“  ‰‡„B4;è$Ì—Q: Á»A²;…¨›ðH4/²ìo˜›³¶ÊÑSÖܺiø@VÓlòAj¡uá†}dµ‰fƒ¹œÅç¤á±Ev–"È7eâàqä!%⌴`ÜÍïé2þïæÿà|`tͳê7¦ÿÈúÁôÿîµ<ø”Û}>àwúÿ«ÿ%Kò0ÒïI–ç1Y’ÿ1Y’ÿ1Y’ÿ1Yšÿñ1|Ñh§g@Mãò‘†Jó±VšÍP+¤HîÍØïtdf{{®¬Krp×'jwIf%Œ^Û¸×öÃ×4Õ«ïk’u†qMNDì5i'E˜6å„ã:[Q—‰0=%q ¨¼™$(÷´£µå£KÉŒõ€i ¨µ8dôƒÚgQ¢NfÔ I«(¿»Í#Ç$rsoôy:¤0«Dĉy©ù,•Ü·J„‚”Ä’gò}:·.W0g¶@?–b ä¥ü{D|Z²ƒøÊ.üº$¥Šö½¥­[Œw‰íÉ Ù˜æÒîk úÀ²ûr!4ÌRË3~̉â¶ôï÷âÍ%îAcleñî?;~þðéWÿNü>Ÿ•’Q;vÈ·üÆRêÛî(E¦m…ó”0š_T ¤³3Nm-<×ÔhìЯ½à8¯\âð‹š?…‚ F%y ¯¶¶p0¸Œ/€”¨R¥F+dä\x„èíìYÆŠ9+)h‘zpâ<ìsZ2Áõyº°üËž»\Þ\õX¢Ë¹Ø Š3pê7«·¿Z¢éÜzlÕ8›Í%í¼£4¾ÁÏ.lyœØ_Ê $xï ¬iж|Àå£rR œNøxx-j]†êR„V ñýôŒÓ:ZÍŸ‘Ÿæ‰;8̑‡‚\Cg'Øõµž¤T´LSŒVrÒ ûZ…/kp]üé#ëòÅÚô¹®'ðEdSd§»PEˆ+CÖÜ*举P$§Ÿø< …ðü-ãÆ€ñž+áAìfØQ<ÍÐÏI/iVÄ`SÛ AMЉrÁIÛÄeÅøñ½-‡¥,M»Ž¦_0yp½e§ .ÇÑ“¢ŠÌ¹b} )ÏØ„m€‡MáªÃ0 ºg®Œ†ð_Xq¹™ïÓAZ81ΡÞÓqZ¼ÕX××LðˆûHG¨^ñ RŽR€ü¤HQå †îèípG?_¹£²£œs|hå0û’ÖµêOòjÐÓdþ²³˜‚›&*’ 3ú½­{»žÜ"¾”-³|8‚à]±"Aò,UñTÕsiPd=+ÚsŒQʳlü6ûr°»ÿY~6í_LÓÑi?ѺÆÉö#»ä_ÓÙ8ùj1¤Ìâb:QWŒ#@±$?2ˆ·N&"9 ‘¿Œ ÍÁ¹– šZŽ fòŸ€¦ÇnnåGàXËâåÙš<{NŸï~ÿΞcw@إħ]AÏ!qÅ!b’–çà°M•*½/ïJ‚‰_.Ë”Vu«‹@ZxD!õŒ¤„aŒøÒñY9£û0éùÔ„[®„Ʋ¸g)ƒãE>ÈÏÊ G\¢Îã î²ñ—)±"e¶8ëDS¾â“]T #4½l&ˆQ}l†xãÒBbâúo~R ¥Š cõ]½Àó˜:ù\ùü-’›¢tÓœ~÷ hõ˜ w@12sâ¦óÅ¥«Ï f­ø#š`uYÌÓŸÉWH¿Á•0CGtøËl0‹Ý6Gݼ >ô>«ãUT—Žvîa/y&Hã;_ÕL$’*ÊŠˆ× ðbÏ•ûtLž!ÞB\CQÞ*Cî'š…¢^êu˜³,lÅ3{QÅtœ¼¼!õx :6.ÃÏýÍi/yóNfÿæ»$ƒ"ʼ[Hf .ç)é—u£ëôH1ÙŠÛli¾ª3½Œ’x²ƒîf+0w¥(fŠ„€yõ->æq6â‚zz(5^Ñ¥‘¤§[X¼&àäZôy‚ ÑÆ9‚±Äz ‡ ˆãaÕZ³ÓñLû+NÑüD@zðö…ÁsV…ñ\ûÝps¨šÖ-5ÅSD]¬Ï$Qéú"ìá wgZQEÔUŒ64« ¿É®8oP©’x$U²Åè¬sÚª+Ò7eŽEiåäã®åsM—õ$·LÅèL+QÁl jr×Pµš+.¶Þ?uÚ‰çá+ñ•©bEJ¾ŠjÅ̶tîéb<— 0ì› ŒÜN+-­ åI·ç—(ÊTÎõþç%XK–S ]©S "«åн]½Šäé³êªâqî„Έå:Mg¨/ûe–õŰŸúÿ™¢ìmÍCyTç²² Eäy>ùò4+úÃAžMúCê|ÆBòË|"®iÖõQf ÝßÞ^¢Q»N¿nŠ6âLÁtSФ ýšöÔðþYŽ¢*‹) ²h)1f8¸„×> ¡j0N‡é88at]$'Ï„3®h[†º›ªü‹º‚j9›O^ê*µƒ…¬:Ç£îã†hò#Ax?…~†µ©Ð©Ó¿ã¥ñ\…—­$i»]œ‹?âêç“ô̪x{•WÈ–‚43[YɈ'’ˆ×ib>¶J¶bLL÷39Ë ( 4¿AXºñžoHXårÊSÐÄ•ѱŸi+ñs@j¡ ÍÆt52Ø'WQÜ^à‹3çz_R2§SCÉß-réçÖzæžX|PX¦ã,Dlõ™%ϵú×·lÙ J£)e‹SYü¢`ýå¦ Ùc°ä*n´Ã@s·Wó˱Sš0-Þ›ÝÑðiL>†´Üìò˪Í/ªúåì d¹œv}ÜO¾âÇÝVæšAU0wÀg§à¿v´½üë«Ëã6Yíð>h†Î:j™ãÂØµ~{ Þ•s' 1á+¯&ؘ¸ö¨>h]…ª|q Ø[¸KuðåEÝ*#ü¢‘ªqT5hŽt8 ‹3åLéƒód›ZŒAdÈ aŒåDQ1ŸÒ÷Sb’6»†akã´.¡ýr6¯Îú“r.*­sVYü+¨ÁJñËÕ^Ž…qƒÑ&`øÂ‘ƒT Sk– ¸þœjì W–½ÜþZbÓÚÇí´6g?}IÂ>@¿LýÇô#¡—ù‚ü|cÅh]¬÷Ç[GkÑÔU=‡Ä .ϳjŠ+möÓ6ÔA˜uAb×8Äí€g²ŒÕˆ•pð$3y`«\YÂPý©EÖÆ¡®uÈðn(¹ø²çWä^¶ŸË?.Š·Ùìˬ¬úçù| àø×¼ÿÊêÜÉiÄ exmh-2.8.0/misc/README.bifffolder000640 001047 000144 00000001472 06716151357 016711 0ustar00welchusers000000 000000 README.bifffolder Script to cause exmh to recognise that new mail has arrived. Purpose of Hack --------------- When new mail arrives, look to see if there's a running instance of exmh and if there is, tell it to rescan a mailbox What You'll Need ---------------- I use it with qmail. I haven't thought about how to make it work with sendmail. Also, requires that the exmhwrapper be in use. Instructions ------------ Add an additional line to any .qmail file right after the rcvstore which pipes the message to this script. The script takes a single argument which is the name of the folder which the mail was delivered to. For example, .qmail-important might look something like this: |lockedrcvstore ImportantStuff |bifffolder ImportantStuff Author ------ Chris Garrigues exmh-2.8.0/misc/README.cite000640 001047 000144 00000012043 06777126437 015537 0ustar00welchusers000000 000000 README.cite Instructions for Adding a Supercite-like Quoter to Sedit Time-stamp: <1999-05-07 13:07:33 klassa> Purpose of Hack --------------- Allows you to quote a message, in a reply, in the spirit of Emacs' supercite utility. Example: --snip-- >>>>> On Thu, 6 May 1999, "Hal" == Hal DeVore wrote: Hal> *) cite Perl script and info on using it Hal> *) John Klassa's cite-lookup and cite-update and procs and Hal> doc to use 'em I, unfortunately, have been messing around with these and don't think I have a "good" copy of any one of them any longer. If somebody can come up with good versions, I can try to write up some instructions to go with 'em. --snip-- This hack adds the ">>>>> On Thu..." and "Hal>" text for you. You can also specify arbitrary attributions for particular email addresses, which are stored persistently in DBM a file. What You'll Need ---------------- You need perl (which is available from http://www.perl.com, built with DBM support if you intend to use the arbitrary, persistent attribution mechanism) as well as the "cite", "cite-lookup" and "cite-update" scripts. You'll also need "par", a C program which does advanced text formatting and is available from http://www.cs.berkeley.edu/~amc/Par. Instructions ------------ Put the "cite", "cite-lookup" and "cite-update" scripts somewhere in your path, so that exmh will find them when it attempts to execute them. Likewise, build "par" and put the executable somewhere in your path. In your file of exmh hacks[1] (which should reside in the directory named in Preferences->Hacking Support->User Library Directory), add the following. proc jk-cite {m t} { global sedit set res [exec cite -w$sedit(lineLength) $m [glob ~/@]] $t insert end "$res" } proc jk-attr-update {t c} { catch { exec cite-update << $c } res if {$res != ""} { tk_dialog .citeoops "Cite Update: Oops!" $res error 0 "Ack!" } } proc jk-add-attr {t} { set w [winfo parent [winfo parent $t]] if {![winfo exists $w.jka]} { pack [frame $w.jka] -side top -fill x -ipady 2 } if {![winfo exists $w.jka.l]} { pack [label $w.jka.l -text "Cite Update"] -side left } if {![winfo exists $w.jka.e]} { pack [entry $w.jka.e] -side left -expand yes -fill x -ipady 2 } if {![winfo exists $w.jka.b]} { pack [button $w.jka.b -text Update \ -command "jk-attr-update $t \[$w.jka.e get\]"] \ -side left -ipady 2 } $w.jka.e delete 0 end $w.jka.e insert end [exec cite-lookup $::address] } proc Hook_SeditInitCite {d t} { bind $t "jk-cite -f $t" bind $t "jk-cite -nf $t" jk-add-attr $t } [1] This file can be called "user.tcl" (or whatever.tcl, really). If you don't have one already, copy "user.tcl" from the exmh library directory and use it as a template for your own. Also, make sure that Preferences->Quoting->Enable Quoting is turned on, so that the message you're replying to, when you reply, is available by the name "~/@" (the "jk-cite" procedure looks for it there; the "To Do" section, below, touches on this). After you do this, run a "tclsh" in this same directory. From it, do "auto_mkindex . *.tcl" to update your "tclIndex", then restart exmh. Usage ----- After you've restarted exmh, you can use the new bindings for Meta-c and Meta-C (note that on a Sun keyboard, this "Meta" is actually the small, black "diamond" key next to the space bar; it is on my system, anyway). In particular, once you have exmh bring up a "reply" window, you can hit Meta-c to have the original message (now nicely quoted and formatted) inserted at the end of your sedit buffer. If you use Meta-C (capital C) instead, you get the same result but without formatting (which is handy when the original contains text that you don't want to have wrapped, for example). You should also see a new region at the bottom of your sedit window, with a label that reads "Cite Update". When you reply to a message, the address to which you're replying will appear in this region's entry widget. If you put arbitrary attribution text after the equals sign, then hit the "Update" button, your attribution text will be permanently stored for the indicated address, and will be used whenever that address is encountered by cite. For example, if you replying to "John Doe ", the "Cite Update" box will contain: john.doe@nowhere.com= If you put in "Uncle John", as in: john.doe@nowhere.com=Uncle John hit "Update" and *then* hit Meta-c to bring in the original message's text, you should see something like: >>>>> On Thu, 6 May 1999, "Uncle John" == John Doe wrote: Uncle John> Hello, nephew! Uncle John> Hope you've been well... To Do ----- Some kind of an "undo" facility would be nice... Also, using the preference setting in lieu of the hard-coded filename "~/@" would be nice. Author ------ John Klassa exmh-2.8.0/misc/README.comp.pl000644 001047 000144 00000001002 07114264762 016146 0ustar00welchusers000000 000000 This is the start of a script that lets you use netscape's mailto: links with exmh. It could be extended quite a bit, and is pretty rough right now. here is the basic instructions: - install muttzilla, http://www3.telus.net/brian_winters/mutt/ - put comp.pl somewhere in your path, make the changes to the paths at the top of the script - I use the following for my .muttzillarc: mailscript=mzmail.sh mailterm=None mailargs=mutt mailprog=comp.pl Comments and questions: Scott Lipcon, slipcon@mercea.net exmh-2.8.0/misc/README.exmhwrapper000640 001047 000144 00000001502 06716151357 017143 0ustar00welchusers000000 000000 README.exmhwrapper Wrapper to keep from leaving stray exmh's running on other displays Purpose of Hack --------------- I run exmh on various different displays. This gracefully kills any other instances of exmh I may have running before starting exmh. What You'll Need ---------------- Nothing in particular Instructions ------------ Make sure exmh is in your path and call this script instead of exmh when you want to run it. That's all. Limitations ----------- As written, this will not work reasonably in an NFS environment because the display may not be properly identified and even if it were, you probably would not have permission to access it. A solution could be worked out with rsh/ssh, but I'll leave that as a further exercise for someone who needs it. Author ------ Chris Garrigues exmh-2.8.0/misc/README.filter000640 001047 000144 00000005564 06714623676 016110 0ustar00welchusers000000 000000 README.format Instructions for Adding an Arbitrary Filter Facility to Sedit Time-stamp: <1999-05-07 13:08:17 klassa> Purpose of Hack --------------- Allows you to filter a region of text, in your sedit window, through an arbitrary Unix command line. What You'll Need ---------------- Nonething in particular. Instructions ------------ In your file of exmh hacks[1] (which should reside in the directory named in Preferences->Hacking Support->User Library Directory), add the following. proc jk-shell {t c} { set res [exec -keepnewline sh -c "$c" << [selection get]] if {![catch "set tndx [$t index sel.first]"]} { $t delete sel.first sel.last } else { set tndx [$t index insert] } $t mark set insert $tndx $t insert insert "$res" } proc jk-add-shell {t} { set w [winfo parent [winfo parent $t]] if {![winfo exists $w.jkf]} { pack [frame $w.jkf] -side top -fill x -ipady 2 } if {![winfo exists $w.jkf.l]} { pack [label $w.jkf.l -text Filter] -side left } if {![winfo exists $w.jkf.e]} { pack [entry $w.jkf.e] -side left -expand yes -fill x -ipady 2 $w.jkf.e insert end {sed -e 's/^/> /'} } if {![winfo exists $w.jkf.b]} { pack [button $w.jkf.b -text Filter \ -command "jk-shell $t \[$w.jkf.e get\]"] -side left \ -ipady 2 } } proc Hook_SeditInitFilter {d t} { jk-add-shell $t } [1] This file can be called "user.tcl" (or whatever.tcl, really). If you don't have one already, copy "user.tcl" from the exmh library directory and use it as a template for your own. After you do this, run a "tclsh" in this same directory. From it, do "auto_mkindex . *.tcl" to update your "tclIndex", then restart exmh. Usage ----- After you've restarted exmh, you should see a new region at the bottom of your sedit window, with a label that reads "Filter". Put together an arbitrary Unix command line (one that'll act as a filter), and enter it into this new region's entry widget. Select a region of text, in your sedit window, and hit the "Filter" button... Your selected text will be run through the filter you've specified, and replaced with the result. By default, the entry widget should come up with "sed -e 's/^/> /'" in it. I use this to put a leading "> " string on a range of lines, for example. To Do ----- Some kind of an "undo" facility would be nice... It would also be nice to add each command line, once executed by the "Filter" button, to a cascading or drop-down menu. That way, you'd be able to go back and apply and earlier command line to a new region of text, without having to retype it. The history of command lines could be made persistent, as well. Author ------ John Klassa exmh-2.8.0/misc/README.format000640 001047 000144 00000003727 06714623676 016112 0ustar00welchusers000000 000000 README.format Instructions for Adding a Text Formatter to Sedit Time-stamp: <1999-05-07 13:09:38 klassa> Purpose of Hack --------------- Allows you to filter a region of text, in your sedit window, through the "par" formatter for beautification. What You'll Need ---------------- You need a copy of "par", which is available from its authors web site at http://www.cs.berkeley.edu/~amc/Par/. Instructions ------------ In your file of exmh hacks[1] (which should reside in the directory named in Preferences->Hacking Support->User Library Directory), add the following. proc jk-format {t} { global sedit # the stuff after "-r" is options to "par"; change at will set res [exec par -w$sedit(lineLength) -rTbgqR -B=.\?_A_a -Q=_s\>\| \ << [selection get]] if {![catch "set tndx [$t index sel.first]"]} { $t delete sel.first sel.last } else { set tndx [$t index insert] } $t mark set insert $tndx $t insert insert $res } proc Hook_SeditInitFormat {d t} { bind $t "jk-format $t" } [1] This file can be called "user.tcl" (or whatever.tcl, really). If you don't have one already, copy "user.tcl" from the exmh library directory and use it as a template for your own. After you do this, run a "tclsh" in this same directory. From it, do "auto_mkindex . *.tcl" to update your "tclIndex", then restart exmh. Usage ----- After you've restarted exmh, you can use the new binding for Meta-q (note that on a Sun keyboard, this "Meta" is actually the small, black "diamond" key next to the space bar; it is on my system, anyway). In particular, you can select a region of text (in your sedit window), then hit Meta-q to send it through "par" and have the result put back into your sedit window, in place of the original text. To Do ----- Some kind of an "undo" facility would be nice... Author ------ John Klassa exmh-2.8.0/misc/README.lockedrcvstore000644 001047 000144 00000001670 07452375074 017646 0ustar00welchusers000000 000000 README.lockedrcvstore Put file locking around rcvstore Purpose of Hack --------------- This isn't truly an exmh hack, but it's more of an MH/nmh hack. Under qmail, it's more likely than under sendmail that more than one email message will arrive at the same time. This adds file locking to exmh. What You'll Need ---------------- I use it with qmail. I haven't thought about how to make it work with sendmail. It also calls 'lockfile' which comes with procmail. Instructions ------------ Instead of calling rcvstore in your .qmail files, simply call lockedrcvstore. lockedrcvstore provides the '+', so you'll need to remove that from your rcvstore call. For example, .qmail-important might look something like this: |lockedrcvstore ImportantStuff any additional arguments are also passed, so you can flag a sequence like this: |lockedrcvstore ImportantStuff -sequence urgent Author ------ Chris Garrigues exmh-2.8.0/misc/README.ns-exmh000644 001047 000144 00000000212 07114472443 016154 0ustar00welchusers000000 000000 This is an alternative to comp.pl/Muttzilla, written by Larry Daffner, vizzie@airmail.net. Instructions are included in the archive. exmh-2.8.0/misc/archiveoldmail000654 001047 000144 00000003262 07376643305 016644 0ustar00welchusers000000 000000 #!/usr/bin/perl -w $MHPATH = "/usr/local/nmh/bin"; $MHLIB = "/usr/local/nmh/lib"; open(FOLDERS, "$MHPATH/folder -recurse -all -fast|") or die "Couldn't read folders: $!"; while () { next if (/\/old/); print; chomp; $folder = $_; open(OLDMSGS, "$MHPATH/pick '+$folder' -before -60|") or die "Couldn't pick messages from $folder: $!"; @msgids = grep !/^0$/, ; close(OLDMSGS); chomp @msgids; if (@msgids) { foreach $msgid (@msgids) { open(MSG, "$MHPATH/show '+$folder' $msgid -nocheckmime -noheader -showproc cat|") or die "Couldn't show $msgid in $folder: $!"; while () { chomp; last if (/^$/); if (/^Date:(.*)$/i) { $date = $1; last; } } close(MSG); $subdir = `$MHLIB/dp '$date' -format '%(putnum(year{text}))/%(putstr(month{text}))'`; chomp($subdir); print "refile $msgid -src +$folder -nolink +$folder/old/$subdir\n"; system "$MHPATH/refile $msgid -src '+$folder' -nolink '+$folder/old/$subdir'"; } $exmhdisplayfile = "$ENV{'HOME'}/.exmh/.display"; if (-f $exmhdisplayfile) { $exmhdisplay = `cat $exmhdisplayfile`; chomp $exmhdisplay; if ($exmhdisplay) { print "Telling exmh\n"; open(WISH, "|wish -f -display $exmhdisplay") or die "Couldn't open wish on $exmhdisplay: $!"; print WISH < in the while loop (below) does the right # thing & doesn't attempt to process files named after our command line # switches. :-) # @ARGV = @files; # # Grab information out of the header. # # Initialise date. $date = localtime(time); # Some Perl versions (such as the 4.036 I'm running) don't do # localtime in the scalar version... chop($date = `date`) unless defined($date); while (<>) { chomp; # # If we've hit the header/body separator, bail. # last if /^\s*$/; # # If we've got the "From" line, extract the relevant parts. # if (/^from:/i) { ($from, $attr) = &munge($_); $attribution = $attr unless $attribution; } # # Pick out the date, if on the "Date" line. # $date = $1 if /^date:\s*(.*\S)/i; } # # Get rid of the time at the end of the date, and replace days of the form # 01,02,03,... with the single-digit form. # $date =~ s/ [0-9:]*( ([\+-][0-9]*|[A-Z]*))?( \(.*\))?$//; $date =~ s/\b0([0-9])\b/$1/; # # Grab the body & do the attribution... Work into a temporary variable # so that we can check return value from the use of "par" (and take # appropriate counter measures, if necessary), easily. # $ATTR_HDR_PREFIX = ">>>>>"; #$ATTR_HDR_PREFIX = "==>"; $attribution_headers{"$attribution==$from"} = 1; $out = "\n$ATTR_HDR_PREFIX On $date," . "\n$ATTR_HDR_PREFIX \"$attribution\" == $from wrote:\n" ; undef $curr; while (<>) { # # If this is a previous "attribution header", write it out as is: # # "Canonicalise" some well-known attribution header prefixes: s/^>>>>>/$ATTR_HDR_PREFIX/g; s/^==>/$ATTR_HDR_PREFIX/g; chomp; if (/^$ATTR_HDR_PREFIX/) { if (/^$ATTR_HDR_PREFIX\s*On[^"]*"(\S+)"\s*==\s*(.*\S)\s*wrote:\s*$/) { my $attr = "$1==$2"; next if defined($attribution_headers{$attr}); $attribution_headers{$attr} = 1; } if ((!defined($curr) || $curr ne $ATTR_HDR_PREFIX) && !$count) { $curr = $ATTR_HDR_PREFIX; $out .= "\n"; # don't increment $count } $out .= $_."\n\n"; # Make sure there's an always an extra empty # line! $count++; next; } # # If the line contains a >, assume it's from a previous attribution. # Attempt to extract the relevant portion. For example, in a line # like "Bob> Tom> okay, go ahead", we want the attribution to be # "Tom" and the text to be attributed to be "okay, go ahead" (i.e. # the "Bob" part is irrelevant, since Bob was just quoting Tom; what # we want to keep is the notion that Tom said something)... # $tmp = ''; if (/^\s*[A-Z\d\+]*>/i) { /^\s*(([A-Z\d\+]*>)*\s*)([A-Z\d\+]*>)(.*)$/i; ($tmp1, $tmp2, $_) = ($1, $3, $4); # # If the attribution is blank, use a '+'. # if ("$tmp2" eq ">") { $tmp = '+'; $tmp .= $tmp1 . " " unless "$tmp1" eq ""; $tmp =~ s/>>/> >/g; $tmp =~ s/ / /g; } else { ($tmp) = $tmp2 =~ /(.+)>/; } # # To make the -w and 'use strict' happy, make sure $_ has a # value in the event that the earlier split caused it to become # undefined. # $_ = '' unless defined($_); } # # Clean up the line by removing leading/trailing space. # s/^\s+|\s+$//g; # # If the attribution has changed or there's a blank line in the # text, and we haven't emitted a blank line already, do so. The # intent is to separate logical portions of the message without # allowing double (or greater) spacing. # $out .= "\n" if ((!defined($curr) || $tmp ne $curr || $_ eq '') && !$count++); # # If the line isn't empty, spit it out. We make sure that there aren't # any lines with words too long for par to handle (by splitting them -- # no, it's not nice). # @sline = (); $tlw = $linewidth - (length(($tmp) ? $tmp : $attribution) + 4); while ($format && $tlw>0 && (length > $tlw)) { $count = 0; $spcidx = &max(rindex($_, " ", $tlw-1), rindex($_, "\t", $tlw-1), rindex($_, "-", $tlw-1)); if ($spcidx < 0) { $spcidx = $tlw-1; } push(@sline, substr($_, 0, $spcidx+1)); $sline[$#sline] =~ s/\s+$//g; $_ = substr($_, $spcidx+1); s/^\s+//g; } if ($_ ne '') { $count = 0; push(@sline, $_); } foreach $thisline (@sline) { $out .= sprintf(" %s> %s\n", ($tmp) ? $tmp : $attribution, $thisline); } # # Remember the attribution, so that we've got something to compare # against on the next pass. # $curr = $tmp; } # # Do the actual output... If formatting is desired, use par. If not, # or if par fails, just emit the text as it is. # $use_raw = 1; $erase = 0; $SIG{'PIPE'} = 'IGNORE'; if ($format) { open(PAR, "| $fmt > /tmp/$$"); # failure case checked later... print PAR $out; close(PAR); $erase = 1; unless ($?) { if (open(INP, "/tmp/$$")) { print (); close(INP); $use_raw = 0; } } } print $out if $use_raw; unlink "/tmp/$$" if ($erase && -e "/tmp/$$"); ########################################################################### # max - returns the greatest of its args ########################################################################### sub max { my(@sorted) = sort compare @_; shift @sorted; } ########################################################################### # compare - subroutine for the sort command above ########################################################################### sub compare { $b <=> $a; } ########################################################################### # munge -- Rip out the good stuff & format the result. ########################################################################### sub munge { my($line) = @_; my($attr, $addr, $name); $line =~ s/^from:\s*//i; $name = ''; $addr = $line; if ($line =~ /]+)>/); ($name = $line) =~ s/<[^>]+>//; } elsif ($line =~ /\(/) { ($name) = ($line =~ /\(([^\)]+)\)/); ($addr = $line) =~ s/\([^\)]+\)//; } $addr =~ s/^\s+|\s+$//g; $addr =~ s/[\(\)<>"]//g; $name =~ s/^\s+|\s+$//g; $name =~ s/[\(\)<>"]//g; ($attr = $name || $addr) =~ s/@.*//; if ($attr =~ /^(\S+), (\S+)/) { $attr = $2; } else { $attr =~ s/(\S+).*/$1/; } $attr =~ s/[^\w]//g; $attr =~ s/\s+//g; $name =~ s/^\s+|\s+$//g; $name = length($name) ? $name : $addr; # See if some other attribution is desired... Hashes tied to dbm # files don't seem to support the exists method, so I create a # temporary hash that isn't tied and use it for the initial lookup. # I guess a "defined" check on what's in the tied hash would have # worked, but that may auto-vivify they key I'm looking up... I # suppose I could check it out, easily enough, but I'm too lazy at # the moment. my %lut; dbmopen %lut, "$ENV{HOME}/.cite-lut", 0600; my %local_lut = map { $_ => 1 } keys %lut; my @result; if (exists $local_lut{$addr}) { @result = ($name, $lut{$addr}); } else { @result = ($name, $attr); } dbmclose %lut; return @result; } exmh-2.8.0/misc/cite-lookup000650 001047 000144 00000001171 06714623676 016111 0ustar00welchusers000000 000000 #!/usr/bin/perl -w ########################################################################## # cite-lookup / v0.1 # # Do a look-up in the dbm file(s) that map email addresses to attribution # strings. # # John Klassa / March, 1999 ########################################################################## use strict; my %db; dbmopen %db, "$ENV{HOME}/.cite-lut", 0600 or die "Couldn't tie to '$ENV{HOME}/.cite-lut': $!"; my $did_output; for my $addr (@ARGV) { if (defined $db{$addr}) { print "$addr=$db{$addr}\n"; } else { print "$addr=\n"; } ++$did_output; } print "=\n" unless $did_output; exmh-2.8.0/misc/cite-update000650 001047 000144 00000001310 06714623677 016056 0ustar00welchusers000000 000000 #!/usr/bin/perl -w ########################################################################## # cite-update / v0.2 # # Update the dbm file(s) that map email addresses to attribution # strings. # # John Klassa / March, 1999 ########################################################################## use strict; my %db; dbmopen %db, "$ENV{HOME}/.cite-lut", 0600 or die "Couldn't tie to '$ENV{HOME}/.cite-lut': $!"; while (<>) { chomp; die "Input must be in 'address=attribution' format!\n" unless index($_, '=') >= 0; my($key, $value) = split /\s*=\s*/, $_, 2; die "Input must be in 'address=attribution' format!\n" unless defined $key && defined $value; $db{$key} = $value; } exmh-2.8.0/misc/comp.pl000755 001047 000144 00000004370 07114475755 015236 0ustar00welchusers000000 000000 #!/usr/bin/perl -w # Arguments to the script: # 1 to # 2 -c cc # 3 -b bcc # 4 -s subject # 5 -i body file # 6 org use FileHandle; use strict; use Getopt::Long; # set this to your normal components file my $comps = "/home/slipcon/Mail/components"; # I have two variables here because I run netscape and exmh on different # machines. If you run them on the same machine, you can set $usecomps to # the same value as $newcomps. my $newcomps = "/net/mercea/tmp/components.$<.$$"; my $usecomps = "/tmp/components.$<.$$"; #my $usecomps = $newcomps; use vars qw($to $cc $bcc $subj $bodyfile $org); use vars qw($haveto $havecc $havebcc $havesubj $havebodyf $haveorg); $haveto = $havecc = $havebcc = $havesubj = $havebodyf = $haveorg = 1; $to = shift @ARGV; GetOptions("c=s" => \$cc, "b=s" => \$bcc, "s=s" => \$subj, "i=s" => \$bodyfile); $org = shift @ARGV; if (!defined($to)) { $haveto = 0; $to = ""; } if (!defined($cc)) { $havecc = 0; $cc = ""; } if (!defined($bcc)) { $havebcc = 0; $bcc = ""; } if (!defined($subj)) { $havesubj = 0; $subj = ""; } if (!defined($bodyfile)) { $havebodyf = 0; $bodyfile = ""; } if (!defined($org)) { $haveorg = 0; $org = ""; } my $infh = new FileHandle; my $outfh = new FileHandle; $outfh->open(">$newcomps"); $infh->open($comps); while (<$infh>) { chomp; if (/^To:/) { print $outfh $_ . " " . $to . "\n"; $haveto = 0; } elsif ((/^Cc:/) || (/^cc:/)) { print $outfh $_ . " " . $cc . "\n"; $havecc = 0; } elsif ((/^Bcc:/) || (/^bcc:/)) { print $outfh $_ . " " . $bcc . "\n"; $havebcc = 0; } elsif (/^Organization:/) { print $outfh $_ . " " . $org . "\n"; $haveorg = 0; } elsif (/^Subject:/) { print $outfh $_ . " " . $subj . "\n"; $havesubj = 0; } elsif (/^--------/) { # end of components file if ($havebcc) { print $outfh "Bcc: $bcc\n"; $havebcc = 0; } if ($haveorg) { print $outfh "Organization: $org\n"; $haveorg = 0; } print $outfh "--------\n"; if ($havebodyf) { my $bodyfh = new FileHandle; $bodyfh->open($bodyfile); while (<$bodyfh>) { print $outfh $_; } $bodyfh->close(); } } else { print $outfh $_ . "\n"; } } $infh->close(); $outfh->close(); system("echo \"send exmh Msg_Compose -form $usecomps\nexit\n\" | wish"); system("rm $newcomps"); exmh-2.8.0/misc/mafe/000775 001047 000144 00000000000 10166430670 014632 5ustar00welchusers000000 000000 exmh-2.8.0/misc/lockedrcvstore000654 001047 000144 00000000200 07452375074 016677 0ustar00welchusers000000 000000 #!/bin/bash PATH=/usr/lib/nmh:$PATH export PATH lockfile $HOME/Mail/$1/.lock echo $@ rcvstore +"$@" rm -f $HOME/Mail/$1/.lock exmh-2.8.0/misc/netscape-remote.tar.Z000640 001047 000144 00000123516 06714623677 017756 0ustar00welchusers000000 000000 nÊЙ3& œ2-ä”ió†N™"JœH±¢Å‹3jÜX 0nÔ¨ÀcÈ6b”4ƒ•&cz,iƒF4PÚ€¡ÒcK<äH´¨Ñ£H+Ö™C'Œœ•kʸA“ãÒ2O«Z”9Óg 5µŠK¶¬Ù³<˜paÇC¬Lx¶.Y E’4yeO–.aríZófN;e¬licÉ¡v#K¾¸´éSQ§Ö½šÕìàÅ_ÃNMºôè´ "TÈÐዸs¥¼ihº¶Džk¾äëWpË݃aÌèÙ¸È7bÜXl|gIÛÐÇVv U*Õ³œë~ö öeôïàÃxÆÌœcÚ˜yGÎ5eÆÐAogŽû† ÄëßÏ¿¿ÿÿ(`D¨­µš[®Áö‚eÀñÆiÐñ†y hnÝwRJ¾ 5çØq9)·˜ ÉÙðœ…âMw ™]gVvgmÇShÞ±¨£€ä™‡žz칟|ôÙ7Û|ªÖVkeä·ã“PF)å”T†—$[¬½õš\/ár¤QÆU^„¡n0õÅaL¿ “qÄÙ„“N0(æSJˆ­Xæd.V§vs`¥W u·ç¡£½Æ†˜_^‘†.ŒñB .Äðu”‚u¸‚ 4€ œ5Ì Ã ¡ÆC7¼ð‚¯=ER$qTLê /4ñ†§œ²ñ)¢â@j §Ú ꪭ¾úB¤õ¥q†>D© ½þºiÂÊ@¬ 2è@C:Èò¬º kc°ñFAl¸Ð ºZê+°Üûi¸ã’ª¬ªé:;ƯfH[‡B.<ª+¶˜jì§9€¢<‘1ÀÍÂ*EAÑDºæpi¦ÛvñÄ0±«û•e|‘¥C‘ÖËëeQ23À 1²!‹nƽ†UÁl”‘°ºâp)ul†§1Ôð)²ªZŒ®Ó¯á$¢`#ó’ZB á´Õ†}ÛW¦Ù›M3 nHkò„ç^joÆu˜Yç· 5Êh}'žkœ‘„d”‡ t´«ÀÀn|ÆÁMb®¹ îžq9ÁÒºð7KžyéF“M]ÒM*nûí¸ç®ãØ3?ä¹Á )Ž¡^nçíSÜ,ÉPw *‚U÷ 2à¢zÇ`" ºWÕgàÎhgeÙh½¡Ù—?Ñ!€ð‚ φ ŒÂ™Î1v„ÁFý ˜1!sÈSÒ‚ÈrR¡þœ’†0ˆ!i÷›šÎÆ 08±;Z è‚øÍO*X±`Î@†:H¨ L¼Ø,åQg ¡ ßE0üaBÚ’A¥|æÁ!¼yÓР@ !è’ @ƒ,14xb ž¨,#(DSSxƒèp§hÊoèRø«%>n ©€†4Üïw›S)˜8(Ðý»"µÈE/îtx¬X,ò±‹r£Éèž! v“ ݰ¨6Dh„‘ƒ%í—mIâÉàF0¥A &Ô”AÀRš¡…ê ‰0»²a :P»¾ð:6À¡ºÃ"g[Òá í™]ðЃ,E/p¼<7´0 d %:é†û™Á=m%é⨴Går—½ü¥H€Î2øR A Zp‡¡¡•c{… P ñ)"Ÿ µsMy Ù.q®.ŽŒ òéÇš )A0yéNu²S˜é„§<éiO|®aŸýüg@š‚JˆBM¨J‡58Ts‹èD×PÑϹ/£MgÖÙÎwÆsžõ d ÆÊô`C¦°Ò@%M>âl6ˆ•¬¢r XT@@ðÃmþj-ªGÕ*R¤–”©O}B &A +§Uã£Ài•«rä\¨´‚´£Cý(G:Ò¤ÞS¬Q‘C˜',á®Uu'_Ãú¨È –°e0ìb×zXƺU©l CYç0Y"H•ªÝ+V!ÛU¿~UgbÕTY¹‰Ö "–¨¥…C[IªÔ1ÀÁAvdí …×êU³XõëV“Ød¶ç]cšÃÿl»ÊÜ’ÕŽ¼Õ¨¡.JšÒn4•¿09‚ÄÐÂÝž5 `#{ø^I¢! ‘¤ ç†õ‚À –dîHÝ‚÷¬Kt¬Çè>Iºnjgá'ň•ÜΡƒ¨Ü zà„'8¡—c×ë¾@»¸=ãŒ”Š›$¹ø S!cf‰O¬4<ˆ$61Š©õ –A„À¤µìd™ á€™Ì7Å×=ƒ |ceêXÈ Èò–Ûð…9ÔÁ VÞ1–Ý£e.ƒijsðŸ&¿€àõö`,ÀCžY %íKÀ„C-‡1 ˜–É0Õ¬€HÊA *0ñð…Gµ«‘c-£)½(1l9Lcº²Ø¹–öà$ØC…Yåeöa}:AŸI}hT«6n5^=R˺ӫ®uªWÝå¿ظƒ¬ÇØaïA×¼þ¯Bd@‚ÌÙÐ~@”Ýgiçìt93µ­³í×_¿KàÆ6Ž]ý‚öþú”Î&v¶;-kKï/rêöò«íé2Èú ©å7¾ÅíLû¼@àþVÀ£ü—ocÄWg'8ÏZð…0´@Ah`Ђt¡ñ®:@°ƒˆôñAÿ‚äåpš×^¤cbáå¦6H V¼V'Ô”/`y˜ÖÓáÈ9¨óv‰ÚÁ4UO‘2 h  óà ¾ âÏ|Ô9¿ø¶Òº¥éûëùy¾?þö”ÎêßRã¿ÿi}—{s7´g{G5Ž÷ ¨ ¨i°€üGk(Rùçx¸R ¨~WÇy¿ç~u b 8‚©U‚„‚%¸¥wo×!v‚¿—€&8b85ˆýg‚:b=X8€18bÈ{ h{mÕ:¯Ó´óJˆMÈOÈ„)(…3F… À"e…®…Nx…_Ø…aˆaø…NÈ‚ñä‚>÷„,ÆU˜„WØb78RS(‡c…¤ƒu¨…ñÄ…Khzx…ƒØ……ˆ…8ˆz„+ņ-V„gp„„W@„MðÇÌf‰ô7R™HJÿ׉ŸX‰¡¨@˜hH€{×3(O«(Ys8O¯¨ƒ«H‹•hƒ£¶d}¸…œ¨‹7€³‰’ØV¤D`&×±X@nÔ_ÊxŠ»dG†: Ay–7Xv§y|(:Óšz/ ŒÇ茱(? 2$ Tg’HDBrD- wi 3ÆÂBrýu` f~+v€4& ÔfWy®ƒÑ8œãyÜà8z¦‡zªÇz9ð]à*g {j·tm—W{׈yÔ§:’ràrP’Š%Ä9%ù(ô¨3,IšÂŽœ>`2ðG’!¢òG}0€ƒ—wÂ4“œc +© Á#Ž-ð_ðiŽnw˜'ýõ©–-©}ÐÔRŒG¥•ɸŒf™4Ï8€^I“HyyÙuÛ8BÞè硌i‰±'Oßx.¦åxŽ Ž›ÅŽ ö_ äEÖ ´(öØKùÈ_&Çëåc7’Kù•eà” 'z¤‘©·z­w‘T©‘k÷:¹R’"0’eP’X’*Ù–.©xn“ýÔ5™`7™“; ’xà“1”B™lY”¾ù–Éœž švŽR™šVPèwxqÉMìךÕx¸×Š+…{‘gG“—’$ž I`c0€o§?Y‰`&Ç•{€›`yjqyu'@–|™l- kÿ'oë†êŸÊ«öŸë–…¾8O Ze ª)j ›è ¡cÐ ú‡#µjZ ÐÈj©( ^ö†ei¡^¦ƒ&jeh©¢.ª¡Z0 è‡2Ze,ª¢9*¡í±£úK/*¡5Ú Þ˜l;š£ŒP-ºL‰Už‰ÆŸ-p öRz?ü'¥TzŠòób ]IãtURUÚA+åX_P¥=€ž÷‚G•Nÿ§ü×KqZZ O`I ¤^šò(!&,ÿó] pá`QÇ`ƒ…BQ±tœEvt?i°|âg`¦%?l„G•I`¦xŠ:Xîb©Ÿ%ª@¦Dªâ¨AðU€Æ] O ysP’[@LÆ$©žâiìAB[ÔU™FGÐÚ¬=<Œ”KGµTqÈU=`uUye«b˜™  fvKÖ:Hí:\pú®üºRíá§Æ©Ù~Mr®Ô²TtAýºRªµ˜}•°ºeBp`BýÃUs0\q0‚±Dóäg į + ð¯ÎÇ`Ð…c°0ä,{¬4°v±çêhR¶°ïJ²È'H4ËMd¥t%$!ž#`ïhd"4AãÄ9 @-ÅWUu2醆i®#¥kü´1ì «ýú(ƒðè:—$œÓú× R9ÎG;÷ V›X0€6û¶ÉªXÔÊ-ǤkÍz®: =Pj[W{™ÝÔ\ë^ë`«D¶t¶«›ºÚ·Wë¶p»°[@`6¥v;\ HI€WoËÄ&Ô_÷ʹxµ|»¶Xknp·#Õk(Y¦û¶Õæá„M–ä)«6º&Wº›¬©ë·lû°ÛºÃ…lñqh³Ë¯bV`¡;¼ _«:»¨ ¹Ã‹¼cາx‹¦¶¼ [AdпÂB]ÛF†K“b‹@d¶ ”‰Žkº’;¹üºÖ»ºîãEÚÛÕæ9Êû»ü ¾âKI-T©g –(äµcå¾Óû»ô«ºÚV9ù{¿ AéÖ½þO­v%—4åûµè;¶ëû± ì)ð+¿pÛÀ»º~•¿Ò„nMáý빕Á³lÀ*ö(š2 @½õÛnNÁÂðfÁ2¼°„ªŽâ9œ…­ æ»§¼WM§”¿Ãý: ð:ØÔUhû¾ ü׿GJnpi'»OX¬Å‘X] tJ¥Låŧ[pÐÆÃµpo`Å6«Çõ.uu/̳ |º` qù;qh\ÄýúU ½‚Q…œ¬?üU\h|l³Vɧ]3’4É[ ›,XÿòùÛ¼m0£LZ¿#«ë ®üIZ+¸I£3ªL™c2\ª¬¿gfeSPFð·ËÁ<ÌlûYµ¬?·üÊoÐfád˜¼Ìfc†O[ÖMr¶ÊìXµOpRM¿&¼RrÐ)Ÿ'ËRÐÍßÜdåuË̘DÍÎ+ͻګx«¹ZÏ €?6~!µö—ƒBPuEoKÊ@7„ ¥-]ÐÉÚÐL@=€O0T¿Ë dmÑ“‹Ðÿ³ÑT¬›“]9“¿‰&=@A GP!ݯX*ÍÒ.¬3ÝÒT0Ñ}Ñ `¾A`ÙJ°Ñ:\㘌FÀ1TP²ƒ%²7HJÍÔ«J÷ã ò©–IíOT-–oÀ‚ZíŒ]½Ô³=°ÒG€¬ºiÆ_4ÕM½j½¦c’¿ŽÕý4KsE€ÖjÍÖñ$¦y½×-¬sͦvmOaDxzÍ×Ní° %ËŽMØU}Õ$”ÕÄuOƒÍ×`-Ö-€éëÖ¬å½y«QÝÅŠYÈÃ%ÚöibRÚiP°úÚNÑBª-G¬­Ïÿ(vYv˜§Xé´‘l'¹°9Ö“¹J§E†Æ:¯ññÌ3…^d ÂÝQxPC©¤Å©@>ã¦ò”ÑqÚÏsú á=¢h×àÝŠ-Ñ:ÈÞ˸¬íýIOìMŒoØVU|‰#•ß:Ú÷nÿWÅ^ÆÿÝ¡nƾ? ~àæ=wü¢òÄß:(á˘ßNàý†‹ü‡pCê¡ó$p~i!Î!>ßmý߇fßÞ¾ §ßq5à-.ã{Lã2Þ੨Ç1®Þ:njã>Nã¤tá Gäòýれÿä’¥âHxTãüå.ÞTþQŽã/Hå¥Þ\®ƒ_¾ŒTæðfâ_î䓈½R>Rj^åmŽå§lpnªÉfàSç¸6ç’£çZîsmÞå(ONætž¼A~ç…nh|¨çɦálŽçñÑáŒ.ibŽç„Né§8èhÞV-ÌÜßþéX~nžþÂ>夞nvÎæ©nê£/§óê.²^ê«>O¡^ë²þê£Þç=ꦾãnå­^´‡Îê°ìÇŽëÅËŽêÉ^´’í³>hbÞì`^ìÙžìÓŽìè¶íúîÛžífÞìáÖäùi„÷}TŠüíÎçî«ïS#ïîîëí®ÞЬƒû¾ŒÇïðSæïÀèî&¾ï›~T™ÿ·ð owÊ¥^z¨a*~˽ØLµª}öÄb¿D-ë^vo€°ÓH¡#u°D{Aü‡ò Ûð#O´.Oò·N/ßß(ŠD–ò’Ʀ!Oóm½rP³+?òPô<;ô?eóE!3°MÏô¢kóD/ºR?RÏô8ÿ23õRF×múäò4ÆÎdágügïÖžhö‡ö#d£nOÆn­öoàsÏovO÷Â’÷e<óg¿÷i°÷v¯ö¾¾ö(ΊÎø¾ìâ{÷‰‹‚÷C¾ŒŒoÝ>O—Oé“oÆ:ÈøŸù¡O÷™ÿød<úÏ>RcúŸo⛟âé‰= S; ÿ×j·c¹oòóÔ·ïëªÞT»ŒÃ¿û4Jü8¦ƒÉ¤ü’Ï@zŠT›ðòÔË´ßûò¼ÊÕ¯ Ï\͸ïü×?£3OýräýÛ_` šûåýÀýŶL®ýÐÌÊÌ„üé/ÿÌ_ÿ­Vúâ?;÷ÿËOÿþ¯ùÕ>ügâTYûc&ÒþU33ƒfÜù‹ 0Ç ?øËß\€¿,ü}?81`4s`ý¥¿2S ”ðÛ€%°ÿaÀ8ÿ>à*‹€‹Nî @ ˆfT <36ð!¸ ûƒ0öA©^öf°Ù„Ðf ÆZ38“ÍR”Ö¯þÁ8s`8¹€æo 6A£¥à5£‚š„ )A-X»`ü#ƒšd ~A `\ƒƒ ®2-h«ÙTƒõ® Š™%¨Ç „f_ ’vôþˆ  ƒÛŒ¾A&Xa\„F˜¸#!ÔßO$J¨ 1¡d„š„BOxá (d‚¤Ð~ÁS8ðêà…œÐŽ@AHgL“:æIÝ­¸8€2–˜ E#ÅÊþ# ÿ/4†QƒÞ:å|ø3†‹«x g膨!8EÏìõ¼âµæ:–r†÷êŸÿS¼È!û0‡¾Ž*¾¶¢ 7Œ]:HÆC ´ŒŠWéƒ]óÐĵÃ[¨{r¡ì[qìÛ(»þ)Ø@$‡ÞÆ »™WU3Lˆà!z… õDl ñ"JÄ f¥^WB܈¼Ï":…ŒHëb:¼ˆÆбC”èìÜ¡Häˆ1²Äpsg¢£ëX3Q&NÄÓ¡abÁkƒ ‘D ÖsFQì‰5±à=D}hMM4!*’Ñ/ÉûƒŠñð’dE^„ µâSÄdUÎ>(:‚É!&3‹XÏÊtUâQ‹‡¦¶Åx颡±‹tQÎŧ(@øWXì‹×æ/Z›ÌÑö^`$Œäð0* x£µqŒiÑ0vÄŽ•Ò¡bvìð2:¾ý]"g$Œ©2F3põ—b¼‡‡1FÕHX£jÔ‡šÝ9©ÔóNZE´ÿç¤åÆ«³ûFä?tÀ×áFõfuPq\F'Í8Nä蔣q4qÅ1Úüãh øá?Õ1ÒüŸì8[@vÜŽXA œ"î¸óÒ“ØóŽ7ä蔥-°czŒƒë1=‚Ç wŠ`)Ë0aËÀ°ùrMfHÐbžB‡|…ëOzwëywm%È7Ô2ŒsRJNŠ›Ì¥nԗ‘ ¸k{©.£¿˜V :*HÌ0 ­ÄoºG‘ɽL&ôñ0Óoƒ"À Á%žÓ ?Ó9{H£éô”&Š„šªqcM’ë5%¥Øt´H’I²M’ÕÔÈ—´›8.«‘º,8é$ž´Ý~J+%»¥!%™²ÖƒT,B­Kf镪SU@Ù)¸EÈ_Ñ$xB"ê)ž'\˜h´¡z >íé*Á'€¦º—\+,¡šÙÈ{ö‚Tl&DýÇ‚ñ”\ ú“^RF>§~(—’†¼KQ2¶™©ˆ,LýhD£šd"ä¬r')rƒý¦ÊÔ"}Ù‘’2I"“I&EišH­Ç"a$ÕÄ‘‚$H’²‰6¤ q› e†a’¼)LÊOe“D…p¢’Æ 9eIåD”f¥˜”4±LÒÊy—̤ìqOX‰OvÉ<É–j(þ4$p4•¢’D€³JRÏ 4xÀ›ax' 2¡Àâ92“â_³c<Ðj!N†R‘‚‚*–vqdÜ@‚ ÒST¸¬s!DE €òø¡o&ìÈÿX +—ÈŸñ7 ‡SÐbbÑr.šPÊã&¤„úN ¦36' ¹Xòc|œô"@l×ý@!õå€(ä3X^@ä°/€”N*®‚Îð$‚d ÔHƒ©@„˜DY ,•Eªä Ër/Ë~5§åÜêÕ@ð VCº–8 ¬î‰$8ÔSÀÐñÌŽ«l$àršÃ¦pgGQ6ÀXÑ·ó2¸Pî$PŸ:IM@ PƒDÕðbi耰I m*oâ†JÐZU§…tª9z]È@e:ƒ¾d•érC´OI  œ¹ÎCdÓù$¯TgDTr‰ªR:¤ŒQ)VRJdG‘’'ÔƒLSÂðÛÉ«y%ŽÎ¨çõxVöi0-$d1&^êB45ñtƒ%c½…X:?ßȯ) E¾¬¦pa¶Œ|¸!d—ȦÒÃ{XÐÙ%Wç{¾‘’&Ïm\< œŠ˜§ó(jËCz0£Ê‘6Èò(*œväè ½ošôŒ^{$©Moé!½”úôªžH½z¦^½¬·R?êíá<"@ð @NÝ©[€ Õ.Àüu‡ x.`¸€ à(€ ¤.°¸@àX•pÀxð\à¼$P3'A=¬åì Ô«s?¥0ÑO’HNBa²V *?¬«hUVÒÆVä=Ág“ð N€ P70‚L;9ä °ø¢@`Ž8t” /˜ø,X éð5À~Ñ/â§ TÉfªë$ÁÚ„›0³bª ‚˜YÌ €4Ñ…p?8LÐk>dÀƒ(Këx*E½—2¢J è ãsìÉJY-ë t ,RÆêH{ëd­¬Là©PI!ëuµ¬dð$×Tã[Ÿ«@®…æ@×êê[µ«vã®5<Ö?O ¨ü€ æÁ!óêÑý¨h^¥»è°°"Î@ á,zê0½#"à·¨J÷!N ,gt* )Áp 7…˜|˜÷A|’™qaxî"PÜmQï‚Ám\û,*Ù@ªOr¥°ô%“˜L¸¹¥ƒ„$a#¨~E¡ T¬?“;EÈXËs°<¢, ÖQl …˜O’| Ó‚)îh‡ÞWâ‰GE„i#®CûpŸzç.Þ€M:Ÿd“}QŠà"üÁ#ã$ñ•€*LŒ,’ý ’ft=&)€¬ åd&ŒM¶–@jaQGûL)‘5ÂÐ`Ö¤W©‚››•ç³#í’K;Lj Ý2ŠlJ¤h*,+H¬lA)0–˜,? ®èÀ1eMSô~5…ð%0•Þyf=€À‘RVA£dÁŸ$ê™MH»T§x]` Û×CJ@ ø–ñD^¹Î Ú§ë´½µ²Ï˜€Üã% ¦º´¹¶×’Æ–v)H A)]Ú Xìl¦À³Žt[–%x”S&-X¹‡Óέ[b©(UNãÝ–DÚÙí.q·1ƒvÄÛÃinÏŽ¾õ´ü– L×FÚ+]Ó¯\›ÁòHÂÍ+²Ôìùd¡ÌSP[_KV ËŠžÄ)ZVÏééðmú¼¸ë3ãúÎ’Äq“Çõdƒö^ܱˆrç­·ÿ¶ÏÌÅX©\/-z­•%ª*[d+U_€ h¶\ <[säA Žé*’,ŠGKÈ—lÙM™Î²MVHg½*ûQyšŸñyz‚[Tqìê|)¨@È´åvÒ¶Îשkfgí¼7 ¼Ý¸;wënH,º†xycQ¤" H¼Û†ñú”KrÝîí¼¶¢ðÚ]~¸oëÖ€R¼^Dò–Ç»K:ï|`’bBÅë6xZïÿØ´—Ï:.€yå.ݵ»¤è0\½+O‹Ã½´ïº!é.,©’Š¡…*Åñ,pô÷:ç týªø4·év8"®"|a.æ)¾d¬˜Î¥´}“Æuƒ£$ üÒ˜– |€eÂZ(OˆüÎêOxlú¿´#ènÉdÚ“ü8Gæ€*ɶªêq™/ñ¡„X¼3À±žÀÙ6pT1‰,Þôa­Ï}Ù(?-( ”6pž²¦¬þ•¤ŸöTY*c È¬G{?pf..¸ $ Xø/ê¬!X˜@–|‚™Š _7E^µ`˜#€i/ &ÂT…D´|agp ÆË—²ª‚“L¾¾6e&ÂÆÀF I1€(‘€D<–i HÒ+ZIñÑÂòc›ÞÐeJÉ–SÀ HPq†Al¶Êjeû„†HÐi„:âÊÈ0AÏäŒ:€© Ibp [*ž””Âð.Ãçì.1 <À4âO¤X OR,JXÝpàÝ’t†æÔS£\Ö.2' È–«I«å”ƒ³8÷ kyañ”á¶§¦ Ûba2Œ ¨±"o œÈ¦¥’ÀtVädi°€éx-†Æ  /@œŒ@1€FĈº 0Ê6;okŽ8}^éôUf¬wzRv寖3÷Ÿ.Ë:…êøÒ§õf3)-:n3êøà¨s´±Ø¿oîn}nkç·’üùErêàMœEwή)<û¢jp ‹163Þ °j_-¸?u¶ÕÀvçj`²5îï¼ÛÍ{oìRve5²VÖ1¥Yíè‘¥uÊžÒCSlÞ ¼C·úæØ&0ðq ÊuVkÕÏf@umÇÚ5¼x×ñz·áz©uïeÊ×Ám_ƒmQ=½‘w^ñßûD{l€°G–ÂfØå9 é,±§ôþ–Wý›M_ïOí­=6}–¹ï³$‘ìajsO6å.’…ekœðb¿}n̆ÝT` Ðì‹}ªáÿ΢Z·ßµÉž…v+hY‰m[‘´§´HaÚZÜiƒµuÖÎÚ@vím¶»Š¼d*«ÅE·mÆǓˢ¶ÑtÛw7æ]dšÊøÑ|[H^Åm¤;^•h3c~ Uœ !Š{,7r(0Ur­âV '–Lžs”R$—Ïøv’Wò »ŸÏGÑgûc=¶½Ù0ÞÓÝxGW>ÎTùé^¯ƒüo‡»ÀmȽ°HÉ%t+çiÈ¥%÷óÙ¥€Lçd1Ÿõ8/gÊLÅïbžî;^ÿs–éãÒœƒÚ,m7(\f3ؼx74ÍÿõÇfŸÃJdÃÍ)Ш ÆÑ£Ôå½oBvÃìWFæñœÙž%Lü]%`âšH©Gá^¶Êœ¸úù BÍ}yµº›û'ÿ¶ ì¹I@QÝlúš3ÒM•Á€UÒ©[V®n>ݺéêXN诹Ү“ª½Í·mÔf* õñXÌhð.±Á¸JŸïrxÈæ¡%~D5ö©aõ«FQ0Ròô«P8Î…< €D>’B Fž '€E¨:Øa&L| 3€D@á›'Øž?rÕFVGNú }¤KŒ•BR°ìéä" È”‘H®„®Ã'ÅYˆ ÈI€ýJ¾á\¨)¬…ÍT¤œs>²§üö¸´%gi|Ž z‡ÙÕsð(ÐÇÞ­˜‚ <֜Õ•>ÄKÚjõ›?3lN¥×ggícY~ä7ƒU’OÁ¸­Ú‡!÷,Ìs¢ùD~±õ®´Òº\F sGî39‰äBÌT*órfȹ–% s{¹Û(M>É Y™cn“>¦•ŽOÆ<{([t5Úg;TáèsÚ£ò®XFzêÓÌ<' d@ÍvÏsÕ~Ãíý Pí…ŽÛápoåË‚Ä/æz´<IfÒ±°Û:§Ï,™)s¾ÅΕÆ<$ÎüG$3k”Ö«œ`»7¿1î½µëqI{[û†M·½ÊŸtØåƒö}~] §t·kå¯n/Èìâ W,àn“‡{lòÂǽ¯$÷SÅÜ“ s/¨¹}I÷ƒ2¬»MÎîµ]¤_i™ìÝ.xOÉâÝO7óˆŽÞ'ú™¾<Ÿ{MìkþÞ´ééWÞqó=}ßKz‘Ùò󹿓ùîàü&oí~/«y_›¼£zð \¤xx ?™7’$^3søjܘ?shͼ6Ø x… ŽúmköÚ0~öžø?6€Æ|lnñ-½6›šÛüši<ŒWξ¹T'o]ã±}x?Ý" ßR1€¼pŽØ×œØóP»ËÀß!¬.wÈK®RÛ£¹ä ò,\yÊú^q½’×ã`œ«ûª3é˜xÃògO¢Më ÍЫ*ùæ‰,M[¬Ù>6ÖÑL¶¯ó\ô|Hn!OžÒ‘â>ÂÎÝöËW~D)îö¯>÷YV§Ê•H#Z»¬G0'ŽÊá?å¹ñä?Û>ŽÆÐ*ÿr˜ÒK†‡MääãðµE=áZ¥õ  ï$?~;ÙHº*ôÏ¢F+ÓOú ÆnúvK:dW¥Ò·md‹ÈÛèþñÕ¤iNÎ7Ñ7 ð|K¾ÚÎ;ÞÔ¯ºt™|Ðuòô^Ê‹zܞ驸—×ò¯{>wùEþåüHqöˆŸ6OöòÝ«A»eæi2ͱ¡ VVUÝQ͇ö)½Ýýfgã)ZÌŽJ²PŽ€¨Ï'ÑçwÀ“Í{™vôý¢KzŒ}Í}<|¿ô¨»ð«n=ͺ½~õ¶JÌô&\Ó±^NçUB4Îð¾€ë¯“õ ˆ”F?ÊVØQq]é|¤[L!xð@Á?Ø]Ñt:)NÀ™ëçÝ®‡l2JRPfÏ¢¯ßàÀ~ÞñeŒ×VP”ÄeÀ)ÆóÈk¬ÙwØyR^FÎùx`ògªAyèoù}^}æž•z>žæfn…|àcðÍoص…Z(ßÇÉɶܥ†ËQoÞW}gú-¨ßÙ–jô`)XÐùm+QŠìçº-z¶ç†û©wºÈT¤)¿Ÿ|wËeeŸ 'pz¯~÷€ÚPfôW2 U·ÌijX6ƒµ'l—JÜ€çŸ&OÄK…Øü€1@ê9€³—¦D€€š(Lô r2Ú©tÀi§-~ÐV€G ìÓÌõ6¼‚§Åª1ØP¥ÈOÀó•ÐA‚šœÐT‚ÒY(»™€ Ýã÷Û(W+à`Ëi‡çQ J‚‘ˆþUÊ©qXZÙ–úÉK´…)£¢µr‰R-xÇÍm²œÝÆÇÕ‚§ u•Ë€$×ñÔ‚‰œáÇøE4–œ.ÇŒeÌ 1H ê`ÜD4œTÐ[I4U^xeo)r Ñ×¶òI(aD@˜÷ žrmÜ-xפq+Ç(傪…Ëñ‚uï%©1eð`r ¾€!÷Ìgý "7ÅÙv^Þ†„ `Ò w@ƒD@$ØÂ B˜süÔÒØ Ö€nÜíöaŃ´TqÜ=x£åƒÝ-Gúƒ{Û(ÈkaCXd¬„áϦ †ƒØkÑ NƒÏ`|–Rr3ÇDH z`™ ¸`Bá3(‚öÙO8UƒÅÝ¢¨¼`ÍP¨z2 1GèÅ>ßôISŽ c]¸ Œý0!ø€ä]3·¥x S@§€g,QÏ“$aê2ûvjå(¡yæv1.n¦3¬t|á¶a„SÞŠ·á]ŒÞC6¢iëF7ésXøÑWé÷³ß~'¾x«+1Z•V«Šj1Fq0òÔØ±D0Z0iX¼oak¥€i +1ˆb¨Õbu)Ûê°ù)J– ‘A(Ì*A –)çñô¥lƒ˜"Ma*ƒápˆþÉw—m¨X9*N@€PKÄÓ¸+ÂTÑ—Ä4xîA0D8*ðVzŒ,NÁ÷Àg’M×Gvááxøaa*òÇÚtÂNÇètÞœ è9qÔ uøÕ†5 Â= Àu`ìðÔMyÀ—(EÀûþAä_pW`ë~øØ`à¯uˆ‹FÿÕuII°äÞö_}–ÿ‰~bÇÿa%þŸa'#VO7ÝIByœbÞ‘Câ€*À ಈ&„9b žµI÷ÅØqyà`’¨†Ya"…cÇžvj sñ™á€éŸ<ñf¤V¿‚þ0Â×M}ØvˆO˜ñüõ*;Ý€•€?Ý®v Ö=D5ª u¢‚h?0ˆN!Jˆ¢…¨Ïdˆ"ÃC&ÞtP˜*ƆÑk#"óÇþ•ˆ À‰ŸÈ@ð† zÿ§ÿýu3â`—!Úˆ Ž˜êˆ`8?b8$*Š.Àbc$b_+^Žˆi-vKa“x’pˆ]”N$¤]dW%BÍD§A׸þv¢Ý­˜+ $TâHéY‰€!°äyÍ¡"Èãñ… ½Ç,…Ïb˜å†ñÙFA`H#ÒCÖ.uñ˜à¼\ˆ€ƒ9$Õßð-Y†÷©B¬M±×–Ou—›ñGûa`ó×eFµaa³øi‰azÇlƒp%Hž4"ÎwM`Væ ž@ÖÌj\‰7ÍmSÛ!S÷(T @ Põ‹Q0…cȈ­¥…¥f¼Å[ @`2Ê’`À2¶*Ø 0ÊÒUÈ8x¸{2Ý}X&&ˆû!ô—&ŽP„Õ rob'æWs"RW'Þ‹â…Ø«Šj‡ˆ*!"¢x؉íY£˜…¡ˆ—G°”Ô0@‹h)ˆûߨ¨)2c§˜Ø%®âŽËÈ£b©($Þ‡ªbaèö}ˆ³â&%‹y §\µŒðÌxÞ‰ÿ™Â(0Œ–YyPõ–W°86ŽGF9–’c®%›]ø^(+bZOâ O ŽŠb²x9&Œ™ãÂÈ|uŽcI°h,N‰ Uøô÷팎ÙE2âz3ã@0ÙAÑ©w˜ãó8ºUœ£4¢^jcÉ•.Ã#cXzƒE¤7=ºŽäÃèÒw/ÙeHÒ鋚á|–1«Š6—Å}c2ŠŒtÕî3àã ©2Vl‡#Î(ÍpÅM̈E¶6ãÐ2új½cϘüŒbâòÙ9a„¢™X4¢‰ÞÛ D- AÓ0="X÷ð5Ežø'ÂbÖ((nq¤¡8¯)€>Øh"ºÂ¤¸«élƒ±P)fˆ—â(Ø 5"87î_ ¢¨è#‰{#ظ*âf­â§ø*^¨ãiÚÁdð†8žnx€â.ýãë.v±žåxK²ŽÆãæh=zŽ-èè°ÅŠ7¡“X+žŽ·b…E;H¿dÀæ8 “°#˜';ÊÇâ+i}ÝŽ6äÉ82ÆþbïˆC.Ž#¤÷äM“Õ£ä¸<ÒÍceø<šÑ£9‰Kº‹ºäõ”evÛöHsÔc‚÷ÈZqbÄXV>à#@Ùù‰\Û£û¸Ÿjú üH:Òö£¶‡E¢Œ !éP²^¤ßføO~y „øX@žëÙÃ)6Ejc±<`Û i@NúÒ¡t`|݇È:Oa‚`^`dcF„¡)ˆVdGÔçØøÜÊ‚‘ñb Á2P?å°TDcÓéBNûbÁ¸š“cÀFW%•B$¦W’ÄßùBòwvñ ÌES¹A@àÁxÙlb¥ý@²_m¤Ð˜Hž‰ñC "Ümâ°¢G*1|¤Q§Hun€ØÖ*(  Ö%úŒ£I¦ˆ![h€,\’:Xg‘IvŠ›¤¬TØy’[öeO¹’ m†”RŠ¢ôd#JpôZhUI%XS-Êp¨åXú}£•:þelצµ•hE|†[–•# n±–¸eㆧ•[¡×&_Ñ]ÇœãXö¡OeZxüI•;dîÇÞ“šãR§lXzJ V ®Y†£è\î‹€Z\9(懅"]y4j _Á 1à‘AÔ'ˆ~¥{Yà(utÐiä‰ò%ÀD_޼~™Ô1bÝ¥R5æ—J `_ âS7HBåŸ!)W’—ÊiÉH:’bce)I¦s_À"B– f0Y&v•e'¹~’uc¨x7öˆ¤")y*r–©b‘è7"‰#+ÙLf“}`°'M¶Ž£uùV*~£#­%2“½™,Γ:fLÍŽ„#ÀGdÖ—Xψðáa€E¸ €¹²!ª…$!²Dí‚b²^´*@vxO}#Ù`q\&„x‰HB˜D#8`%{¹WðeÔø_¦*¦‚ ýYb‹ã¥5²˜e"Û8bvÀÇ)&|™®éØ52’ `àµ$Îg­diWcêxE0Yd.TÅ"6I;ê_ãÓ9‰c–LfZIšyÕXqõ)¸0€ PB-u÷%–y¬Ý[f|eÉßD!!f~ dægqf¦™Aãxù!–—sd]ùfÆ@A^) ú‘Nc9g&ˆ¬æ)!Hî™JGeé`úšü— ‰Øš’¡YkžN‹&ײROàÚ£‰oEšºâ8M^š×dn–d¾p¿§ii†šN&©Éº”{ŽK&ˆ6Sfªi5(°æ¯Ðœ™ DétȆmå$©°~¤J g¤y!··[Âshe¼nÆzj& 9W›ç¥¨Ðˆ²É²ÙWÚ™u¢|`:á—Bœ¦LLÀpÜ^ e. @s´œÑÍ)s:$zÀ €Œ%g~ñTÌË9¸œ'gʹrJ4çà.Ë QМ ̉D”$-çÎÙsbOÒˆõ.' p‰!´Y€@Âb`/ñ~N4A€P|ð~–‹ý§ahÌCD ¬l@°dÄ·U`Üx@ xèÒ)  –p+$JÀÀ4%¤ŸKp`Y€0€ÆtÊ÷YÔ‘!æeωÿù¡Å'ÅÛ “d8ˆŸƒÇ6Ù~ò¢Ž‹‘µÔýXEÇýItµ û' Ñr¢ëbYýÃå XèÉJ†¨¦A•µê†*ñdÙî~JYDb—“¡1‘ÝeÅêá[èƒ74š—u¤¹ ,È™+(ymȉË&Ђ¾ E@'ƒR›…b·Ù-à ,¦J{^˜ä% .<–¯'!ùafŠœ¤:b"'%æª7®˜hß…ºŠÝúJB“{’zò’]h0ªLþ˜óÊŒ9†®Ž¨æx†Z“i¨ ѵ¡Šá*OÆ¡ô¤I‡F”(úÈuä#ÀÖ‡v£€¨ Jˆ sÝ("ê(¢ÄD#úˆF¢“h%z‰f¢›èÿùAz¢ ¨ß2Š–¢§h*ºŠZ4U€+ ‹Ê¢×èu²}öXÞg.ªLŒ»hTê‹BZKú7ÚgÃè¾XŒê{ðÃåŒPŸ‚ •b؇žCü…«€ŸFc~ÑF°R AëèSÉW‘³ -3†wH¯H…ÃlâAd&÷XFáµËB°G,Åœ7«LDQHR™“Q™Úq«)ÓÂQÕØÑo*W/h !GWQ𶿇KI‘¥Z¡é˜À™æaÄt¿uÎÇ'4Ks5@QÎ C`üáÆÁþmmB@:UÞš»hq?ôžŸÃ?çÆ_´Ÿq_½_ªÊ¡tø$Yænšr‘›UæˆÆY@sú`áqØÒ"?$óÄB‚±+v…æ¬ b ­#óa {ÊU¬&ïˆáAœhC ñTŸ–m^‡œ‡èžÃÊ¡|Y+²é5/61Kßë0ÀxäáŒ_ÄBQ ¦+$˜„ɵ5ð…C,\ÀL9SÅTæ„_¨^/ÌηX 5„˜á| < •%HH¨‘©ÒabsEÖ`xóAA¶ Ÿ…BNcšNT·Ä½9«˜Vw@˜0v|K]mBGuð[i5Á û±ÆB¸§ttå¶ã!ûpG8kOêøÕ„t 'ÆÇuH ª£Ò^˜V@À)ž |ÉG—˜çÁR…l·’iR‘¼¦ª#áJ›êS•П¥¨úÆtGªu%c2À ðj€‰ŽÀ}>!’VzÀðè/òW éC OÈð »±]|Óý¥«N¨¥l2y2ð×ø%¬®Áš”¡fñ—ý¥~…oó‰yˆ,Çj Aªt iê¥ù)«êF™n’v´ªµe P±å”—JP÷Q-¸T%GlP3–…¶Lk„i U5¦£ ;æeÀcjF´GµÈ-åà´¡É_ÖµJ,)“ƒÕ¯’ +À*dD{ k m`ć5‘Ùt‚Ìga¨f…ÇUp?´…žBÅ÷IOÏK*ñ™ V¡¦@hÌhˆ £Ê¼Â-Œ Y?קȧ’ÍÔoàIÇÒ¡ÛÔ…4+Ĩ2ÙNiciƒÅtÊð|ÉÕëtiÁc.€iiÀ)Ç©ñx[€döz|¬þе&¯G léÌ–%kP‚i5;Ò^[œí¥Ò,5Vêˆ¯Š …龺FBÒØ?ê}ò†=Lƒ…_X]oV~4kd‡>¥°v<ˉæ†ì.Û©ò6!å Qu¹ç 1Ð.„ìЄ0îq"Ô0®¿¯‰˜¢ŠÖ÷©ÏÌ%Ï9—j JWi‘X$rê‘P$‰¨ $BUðªTU´DÀªÊÈ%€èÀºŽ­`€0^€  hWÀìû àˆUISU¼öI×½šÛ+ëÊtßkøšt5[$@³%:è3¡èÌXJ4¦ ºÖ™Ré .› ¤CbŽ‹¨k¥µ%|š’£Ò½Ùu*}¨aE×¶ª€¬@‘Ú’˜*‰ ·Î]sk0s §£W‘:%ÞEªÀ­bëÕLG¦¦ Â^Í{˜v'læ•ÂÒ­m¦Ñ˜>Ì›"šüp€úÑñ³Dc)„ÙŨƒ!˜3Kdšd97UòôÐ|@,#ñY=¦va±¶¨É&:Ôâ?à#{žáAh àö–ÑB|€çÑ)$AÉhiƒö=çL €2”¡kýcf[µµù6Ÿ)#±P,µÔ-5BèRÆhá› =ê Cx}l—å)`°—JèÀPú$= S`~``d% å ‰¿J ÕM°/¬›¬d©––†¬Œè‘IÕºl²ëMGÑ,y¥Ùçô+€ŒfÙáQw¬I›‡nÒVh©± ÿA˦,ÿÇ-›Ëv²»l˜eËÆ»l.[ I”ªUwH°!,]VXVQ ©¡xåŒ>Ãȵ«Uš ËNS.•ÒÃ&¹'uÎ1[{Í]æ'3KâÐ, ÔQ³$UE…Í–T5‹z ÍG#Õ<ÁÁ³P|ôÌGàÑv4ÌRqßl&KUàG!Ä~¤Kí°ÿÑ{ í–`•ÔÝ ;rÊÝÔQÔ)hìó–¶°rëÃö*—kᚘl®=e°Ð­óŠ´@D®Ì:™Ž)ÇÕ›6^¬Gš¼%ðbíqÅYû˜µ`íPwŒµgÀZ«>n- @¼F˜ `Ã8_òA%wVr K&(TR‡X/Ðj>u¦¦À<Ê–`ADcybŸ1È`=Z°jÁ7Q‚'bÐZT²ÿYU,Ç9ìMr4(pð€¾ƒ¥§POt¨V…°uÈZ]EU ì £¬„ʰ2 Z „0€,óM(ÀïʧˆÒÒhEY-„ -çN<ñ,»Ê¶X·R'0+×ÊÝrU. œšÍ‘ðé2À’ÍXé²[ˆ¨Ž£J ¡qÐV[G·"ÔËŒë´ðÎI@b&’.Ë ‡Øã-ÓÊ/¬»Bs ¹¶0 B.GcÑ2?,œË sK*g ¡'"xvbÌsk €ðs[. XÀ ë,ë{ášI”N3@ì* È sȼDÀ7óa 5‘¸Ì b@˜N|FÌȯ˜ìòaÌË®Ö6·/§Jsyð§(Í™HÇ|ÁIìòÈœ+ŸÌKŽÒAsÊy€©œZ ÊÛr„áe™Ë5³?!2ÇËÑf°pŒÌ Çé¶+§Ë[s¬p°§ƒ q,³Ì£r©üK½ŸÚ`Ìl6»4s­\-»Z×l¨-3ßÌ5s82«Íáòò-ßMó¬•@4ί2ߤx-c³T0w#ÀRÆüÍ´Öè|/Rrç9û3íòu¬<ÅËgËD/ ö²ÀŒ[ü úò%5s+Šê¬;ƒ³¶\‰p΢²nâ5K 3CyvbQ@¦@!Ê…„à<3os˜³Ò¬9kÛè 8ÎN³÷Lk¥ZsÉ ¨0ÏB Ýiw2ÏçVÜìY>¹Êé|*K¥§ß x~u!cÊ,<Ë@sw•XÏâ³T°¤]@áÜ0ç̃ÎÌ3ÍFs<á3÷Ï¥ÓÐ|(ÍIó6Ç4+ÍO³3&… 5cTs%z&–XÖ2vͧ[í Ð]@º<8ÕWêóé†wºÍ™CÍ ?*týüwÂÍ5ô×ì7ÏÏeÙL<Ñ,´2[Í»—W†:ÓÏ €j{Exý˜äÐt³ùìΘ¶GP"«Æ•q’‹s.À_Çûqo‹Æ>§|ÇÆª±c, RÀk¯Ç´q€ÜÓÔ]º1UáãBV? ËÃñJ#ËÇrì0Ç&†s ·4Ó1PÉØq ‡4tvõ+á±0ÿÑæ±'ëq{üÆÏÌA÷0÷qK“ã)²MGȶ±¹L ïÈ'r‚ìØ0ÈAr‰ü GÈØ¡ÏY!çÈòÉi+YµÝF?ÇŠÕl ®ÁÆÐ1| ¸ƒ¬!€ÁÂìôt4@óC"Á €0!ÁnppŒ08€w<> ãtî°™]cδÇ`+sc.ÀÅÀ,|c­‚8&1cõßÊ c& ?T‡j’ïÎSŠ…²] 6ÿ7©ƒ…madÕ‡šBaFPSÁ•`Ð&Â3üž‚K€6ÈÏ*ĪÂÄŠ˜zà¸r@¼€`Øx¡%ÁâP“®‰ê–ÖPÜ.@ ÀP+Sf–_ìÞ.€ ÀPƒS¦AG­Ý ÀTí3ðÜÔv'“]@ ¦-ðZ¨]².E öýC”Å[9¦LæJC xD5ìVÛ¹ÔHƲÞÄ{Ó [Z÷Ä AÀ:€«àc¬+õæ}dPmÀËpcÙ³ñR_¾¢Mï ýHúÐ\RàßȤ®Vïv‚m.óÍ ¶o ·#–vH6QOT…Y=l7õª­ÛÜP,’í۱߻r ñ%O MAÌBVh|=·¾<‚ÝL‚“›ž‡'Ò r¥/K*„It À²}X%Ùuáy{K[×2¥ú¬;· Á| SqaÈHhR‰vCFX *ÐöŽ›V8””F$Pî*®y² @—­iß.Ã7p|wÝ*#%­¯Lš×†ã#-„¿•Ül ‘˜à#²Ä“Mœ‡ÅÄ!áB8(sà¥wÐý„x‡7¬l=¿á„¡=_ÛÔ³ù¸B¼Ûõ)Ƚ´Ù¢J×öެÛ-D#Î7i 7Kq-φBÈ(ÔnDøEÖe‹â²d¬I«4–•?TßÕxµRM\ë&[‹°À áíp•í’¥öÉ{ûÞ’wðí¢ñ©g[ݹC!Ù¦Êo-Œ…™1^|ßÉ÷òÝ.ßÎ7Q˜ÁÞSÃì½Z)µ÷dŒk d5|U+àÇ€egÞ¹Ó1VžÌ'QPPì9îÎ|e2’7›]%·AY—Ú[fÄKÄ(@5tKöpXÞ0‰™Åeà{Ö[ð]q†mAÀq‘G Çü0ÄBµé8üvœ"ªeŠ›*䀪ÄO³éE –²¾„‚jj—WøÈ2O&Æ è½)¨#–Ò!4 ^ü¨ál½‡é’üÄQ¯’¬jñk=Ûû¬hê[ ”3å//»-!*¤ ô¶i×O*LÞjq<\‹˜’|è1š„$Õ2ßpÄ¿_|m먄¿²„beˆgYç¡_µDš²ç¡7QÞœUP9Í} |2b²n+÷C)^-1¹¦>’+,ù_~‚°Î Ò÷@H½½¸Êý˜ÓL¡¸ÈQHh|Sjâ Êão6a{Caõ}á@,Ãã9LùDJnGd1SJ4î)\6%¾WÙ)†§—OT¥øÞäuxáQC•ÑUèR18l.àݼ²¹ä€›Úå ž… ¿¦¼¸-ÏXàwª0n™Çã@q=Þ‰+Úɇ>Î)T0DO\ ‡×¼=‚Ä#yï?ü ÒîvçSêƒ~ æua¾ÃЩäKa&€_ì”"9ZWÎ0j¸{“,±žïç/†žÕ;˜ •¯’ãâ`9ažëƒ§ã̇©ÙDyÑ% *Ð è­¢ŽJFy=²[ïMÖØTއEØÉ:@÷¦ïícu;'&¤ß!c-.uÎÖX«mîHüydqv ª×û>’¸sÐŽŠ(^pWÙ÷)¾Ÿb¢xã¾oÐiHs s™“ |Ò²ÇH}HSLÉŠûiÉ›; X$°ø©.¶íÅ!øíÛe(×î Äín/ ¢øÂ×££îεÎ"™p0"@{QÀšÞ*“ª–JîþYëõça¬_*¾{\èM§Ä;‚Çtˆß4+ Qs{S@Ç¡™[ÊÔ’ús9˜Ð;S^`lƒG Q|ñjᦠï!ð†Þ»ùnr+>ƒÇ^AÐá³ óᾯ‹M¿nV{ï±î¾<Á/6!€ï~Œ$ÎÌéK¹ªÈxš®?dÞƒ»š Õ~ðØrÏ’À3ïŽs,÷Ã.î.ºìlÀ{ÖÍ{=¢dCïŠÉ=Gb‰Är3"ºÏ&ö#{F 8ÑûDΤ'âi²y>±oÃz ¹n pÛº`˜J7º ®Ì@R¼n]”Ÿê’:`4s( VGtãä0+jc»»s÷ìAµ¦àÞ;áþ¹—â,ü &K$RPº4d¼­¨†àY8“.*á³v÷½/ÚÍûâ.*»Å½nÈx0 {<ÝÇcuë©…ý±”ÖË»_®_ßË!_ÈÇNŸã¬Èóíé ,ñ8ø]üÀYlËÛö¯`”×ñ!¼«,É?íö~zÛŽ ,/%WÔ|s/Ãïc»r#ÿ ñ <ÌÊ¥ò”\»¦ Ã¦Šœ3¨ÉcTŒÎ©sÏ»• Gñ?71¿V+.À®ü¨ìP À@#sàâJõ@°Ïà™8ü¶F%ê‚ü;KXµ¦Šó?Ä$‚̼c7Ô‚WHl‹æ­#`ó38€DÅ·ÛDu kK6fÆÅçY' ÀB˜7,Î !ÊLA—ƒöM»·õÛD ÓA@3–ø±Š?½!œÉïRÒ52üØ;Éç¶aŸ&ã}(¼^K¤0À`,ÃR{ #uàâÔB ñf¯m§0{“pæÒ ¶®Pö1…wÅÒõa‚]¯-T ý¡"N8ö¢°@ÚwítuoÝ_÷ؽ]À;XÁEƒ‘4, ]0Û€&ðÆO€<° ¥Â^€°ÁÁ Ð3œàßÝ[å´ì=ÐÁáƒ:#Ì÷Šƒ!?¼Ó% ]îeÑÓ,êà4ð“‚Õ`.P’äB pŽY—°R²µ…¿‰^?Q¡YN¸MAzsßú¸†¶µ¥ºð•×vÄD±ôâ.£F€­ÿD\Z@€Ðå÷®ø0õc1åá O4Ÿ¡¦pfbr ÐÙ†¹@ÐYÔ}Î úø+î…›áY´Ä&³Ë´¯4Û¢P=d~Ûtßà…ÉE‚J о"íjëã÷Ž@’o⢸HX™ÿã¹^ô’‹è¶øþGš'=8¥FTÒ …)Æv—& TGùI~‹[ã²-p¾ÚÒ͈%ñùþJ@PˆúGÀq5XxõY0AW¡33*É£ŸÎDú$ €çSÆ{þuXøù&Á88mn9`¶š~7“túŸ¾ž¯Ûòù£>ÝUêgú‹~£?2wúMX†äúS„‘pþ©«úl@¦é¿úž>lœç‡ú}¾­ïŒÌ°É©ÿ@ç©>ô$ÂúÎ>¨?ë‹ú¤þ´/=E£ý8ü)¤Š¹DÐéC¾~)(ì³`<üÀAM éþˆAa#­>§ßì£Å²>z îKûg:]?ï»4W½2jÀééøeJ=3ؘé Áv®Þ}íÀß Û=“ zec‚Ú Ma°yoMß 6Ý`7H!Á‰"4?EPßwePË…;ò d%!ËtÚ@%3Ü„8wþQ q&»¶”!~ ‹åÊWáØ\äN@Ý…Hè‡ýЉ OVC[,í_ª>[NÎô´¾zOƒcú4Ê`ŽýÓ~@­”tHÍI™ýù–5n×Þ!€²Ö· "šÙÿôC‘ª ݯ΀3ÜQ|O6?‡¦h¯*‚ª’­õNx—ÖUó,MV†1÷¿Æ`.ŽÛ´Å]sÊÙ1g’UÜÊ÷ ôyö±Ÿ¯*’w‹–ýŒ¿^Ó”…qÿÑ/ù£íuù_þA–¿,fƞħáMlÔ%Kî¬x_ö=°þïæÎõÝœÝîn:­þ±E#WPm–¿Üö¸¬îM~#ˆhËêô³+‡ô`~v ,'Õ¸D¼gt ópÔ=KŸ±”k“HÙQžl …I A ”å…¥Aú\ Ù?÷Sÿ¨ÿõ~îúÕöŸÄuÿQLTþ+ã?æÁüW± )÷2ë¿’ûo¥dœˆÿ•ýl~Ì¿5À±-° \B[ýÊOç§»‹ü´ø3?‰þìw…)€UC€0:lX ? Ž ˜~B(£êKú•  âŽµŽˆ ,` xÀábqô fLa¨F„#ÂÜoDf†¿Ø½ŠŸ–à·W+¸P„â½/ØÛ0ðñT vÛ´€ mÔÓadÓ–؃™_D`å'#hù}0¿ÃAŽ@ ¸'¨ú1ƒ{Ø!zš¥eÀõc ‚u°ßT ÂG€¤ö{4'×lYR©Ml{‹úœ°€(–œúRd äÞB,ѲJ¨³ÅŸ’nа\Ê£àÊ—Íx fødš’¿’?Ìñ¦­Ú:È”b~2\†{ 7×Y{GŒêpb¤ ÔŠÜ®›°©Û) r ”O‰$P¹—©ƒYá\ qI»a\”M¦à¨p Ùž{ª="Bß´Gc»„ñ:S:±Y ÅQqłƎ]¦šÛ N CÐ’õàk$±U©x:7òXw9A‚1P(Ý[¯-bO2•Û3P LT ÅÖo¤ºA Ê¢ LâõÌo‘ J ä`"fÊHý]°æ… +°ˆrÖ+µ|£„EHBÞ1ˆÜ …ƒ {Á\#Èà&àc~.7™ØŠ¥]ð†)úÈcg4РωÏ`èŽm i¬1 E£î’sWžsµUZrL Лl}ºz+ 7Ú˜JC†JSiˆÈŠcé ÜØ§ËYWhÓhƒ–1» _ è„KC"P4VN>µçCàF–<¤á)‚dŠAþXÖ 0V"ó½ù 2—-Í:¶K»¥-,µ‚ÙtðGX##å1ƒûÁëXà@YhiD¹pdRgE0-9†DàÓ +Ö1ÅàYŒGè,‘ÙÈxƒf¸ Ua.H$¦IÒú‚Œ@êGcÁÈct—ÿXm,Aˆý(ØÇîƒ- êpPH(,”€®c_ªrÐ.ÐøE§iS@1˜›À+àù‰”ÖƒÀ‰À% ß’ÏihÀ˜@Ìo h(Œh* ‰¿¨Øl®ì³DxgQ v-)/µÞÊ«FƒÃR~IöÖ>lßln ‡µó ìÝ0:§Vê‡cu°:¼n‰–¿Aw¥¶ÒMÁÝÉZ˜‡Tá$a Ï‹eÅäªcª+ÐÐíJ%?H Ã>«œ¯ð¶Ðpc¯±çÌ%mÏ—‚N~€–#»˜SzCïˆTaÓnƒ ,(­ÈþvXîB³‹aUA¯pì> ÞB(‰B Þ6.” |¼eD½Ç”lj,Wc¹ÜUÓ;MCɘjY:x¬vè¡ !$#&+Läå²rx!øÁ·Ð .Ô0ýÒd”%Êà˜O€4Ìy¨LXŒãd8OI~uö4CÃÜxNg°è òÔvLº>€Ð°YQ*, K…ˆÂ‡» Ó!/ " 6~低_›€+P5¸xÓ,…©:p@ (@ù±?…s0tÚX@|°ß;B ”6¿ªßÒÔÑ4D„Q ÎtÀ|Ú·€_ÐàSÔÔ1>´¡° ‹``ètœ~J¢Œî ÒóˬþÐ~ӿÑK€Â|3¤±4#@ Ê…K["P,› #ðª;¸ Ë:µÑ’²™‰Œ¤9tM½f¿˜Ñ tˆK#¶ pQ÷`¼G â:!È%è*%lï?öKÌH…¨„émɘÃèá¹€Cô)'G?Y€ÈeYˆ–Q )÷ªŸ  €–¬,1G 6¿ ÀHoç9غD®®²¦á`©ƒ°؃=<&;•§„2¢³ÏmÅÄoì²ÏEoWbyŸà¦e]€°CÑô'_á>"ƒ,<â`‰°@êtŸ¨?3¡ýÁµ,uàP;ŸuõŽ:Þ3€Pî×Et@(|ÄQ4:›ø¡í$ “ UÈ83^ѪEݰd8&ˆÈÕ=P!ˆ LóôdhDÓIp0Ç ’Ž…£;FYm%“*sͶ´Ä@M„(m!!ê“0'D˜‘/)%A”vä‡ôC^’åH†8L,CÅDdbsä¢äC yŠf4)Œñ˜M¤Ž%Rr¿boë®âA !Z_È~r?"ñƒ8NÒ!‘£xH‰'yDAt ¬“Z™w’d¡OüÏ̹‰óC{â=©ã•Áö쓈R@ âdåx(wi Ç€€[ñ‘üo ¤Pü0¿E&DQ|4{(L14 —$".‘ðD× ¿Ä<Ԁƌ6…9 Úuˆ•—Àׂ†ÈB¼æÙÒCqq¤(ÿÔ‘‡ED×CqégsQžDŠ$€ÀÀGL*.ˆƒêáqùG¶aîAå. Ò?ß¡ßxØ=ý=þl|Ä­ ‡ÆÌb/ÚÙ|åÔG?µÆÀE†Èû!åøˆçŠ»ÆÀ¦÷²Š'4åR-4ÃïD§pUü)ìõxÀš}úîÐèZŠÊCÍØ¥ÊùWûã&ÈÿˆŒ¿â1t£±aŒÿd7ÀÍ@â(—»™R”{7+#>Î\ÑeÔ±ÑÔ`pöAÍ ¨Æ¬ÈÁ9Þ O6Ö››Mg{ƒ¾‘-Žd5&ðÍ@i\¶P*ÞÒH'\¢hQµHâƒ)¤ó–5[9g kZóQÄ…)‹H9Žk±#qA\UpÎ5§Óé€àvlTÏÕ¬ÚSP„&ôý5Úž жf¶8Â)áÐjt‹@žcÄÆ®¨ï‰*žø7à®ÓÒh±†xù)Ê]~‹Y§KÐã²@ªÜh „8ÒÀž"ç)³Ä©O°–F‹:6ýæ}à@ë-6…Šű“úˆcTùã 싇þ_jn}ø+0þVYr¿£ßïÐ <œ¬œþ(µ—°â҆èú)8y \U‘B° ðD@¸¾|:ÆÉŠ‚è›qõú‚Œ4®c‘‘jóaA알g>A2 €*žý €UEGWNT“UÌqIYŒ]EÇ鬘¬+vmVHF MZ‘¥±V¼‹íàpE´ î¦ISW´+‚ r4…Î^1ѲS˜0ê‹fÝ›&Í`1JcX¼(&™‡ÅÿAçïÄØº0,ˆƒ("‚¨_TßX5™ÅBÍfñvã¼1*y w ºÐb QXóEš._µÅN#¨&ŠÓ¯Éy'@8MgÔX©ùÞ,l¨UñÿâÀ\L5þoŠ‹î››:Yña5Fåš‹Í'1Ïo#†Si¤áÐ’Lº»R†ãâºX@@×h; ëƒCwÛø]œÆâq.•`@ÈlÆŒ¿&ŽÀæ‰Snì× /ŠE G1‹S{ù0*'¬Œ¬?¿‰1¦²hÜ3QRŒZÅ/c‹Ãõ˜ü%qbŒeÆ#ÅÑò‡d2úy\ '£‘ÇhÑx9~eŽIÆšãþÊ%åBtá]Ž;G+×Ï‘æHdrµ¸È\UF ëOÈr=ä6í¦«â- ¨æ:”¢) 4С‚¬uȘyîÇb‡?§Cï°Ë¸b9Òÿ¬ŽØ?)€øíGÜMAŠˆÂ; ×tË>ðFΖě>EfóuŽžQ1€h‰%€jKÍý *@Åâ´"+§B¢ÉLߤC8‰†”EÊ9$©ŽFÉâ¤Q%9’FXÿ'Kfƒ˜zŒ¬»I4£Ö£Ì!‚Zœ%•ºLb$Ö£EÉŒ„3B#áŽÔH?£ "äð_¸TUÊDÒCÀN±øèE¢%Ù’ˆ‰5) RíqrÄ…’!fÓQŸ&-5qðäa"ž+M6©ûÓ7±vÔ$@''J½GÒ wÔN|@½+:ó¤t’òÈ*Ã<ó8ö$Ð#x"ò õi@Ú“ø1'ÅâAÑÕ+©(B1ŒEõÑG±r¤kŒ8.7Œ¨" ‚ …Tœ”Ç) qãCi‰V¸±)J‹RÿC³S$˜ Ž›¡$òR5@#Ô¥-ªI1üÇTŒ[ÐžŠ—cõp·s‡]‘7¢Ž»äCHíÑ€ oX và@¢ÃTñueD°`ažhe1ÆiÅ‘­8àq.ÈýÈPÂò.FD¼,àÎlȈ†r ùO >Î!/)öÇ+£Ò´²î;"dìT9=‡]“@ùÇ…DC.kF¹ [ñRÅTØ%v­äŒp…¨Â\¡]ÁȈ/ ]‚Ÿ…«Àcqßxh<h 4>³uá¾ØÍ!çdèGÔ»M©'š#ÎÑæpsâG«ÈSä>I&TÎ)Õèyž>PãÙŽ—"®y5iâê9dˆ{NO—±ÏÑYĘÂአÂHè8yL‘âªÁd‘(i¤4ò~T;‡01ä%%Ú¢âõD{^:yYSfúHY("öïLL§Nm €³ ë˜uÐ_i@I‘·xXü/ö‘N;œËÎ8$³3!ØìÔø\ä3Ó5r¶³ÚÑò8y|à mGÌÈ0Vy ‹¾2Ä(,Ðúðúˆ9œ-hÈ'YD ‘qÈÊ‚y]a3."W†IGd\±¤P š,ˆ$1 ±è‚A´aì’CÅhâF¡“tñ PØ éâ6(×Uðq’ÆqPçe*„Ò%‚ˆOÆšã ¢AöËCR$ùAÀ×BFú¥ÊY-"õB¤“`ˆ|-$)+&I7ã(ã’„Dúqž j.ØÂsá9ŒÑyŒ7É}£R”CUxäì$y|:¡¤Ð–¯(T òä8ƒÂv|ÉÀSò’•ò%’zCÞŸ|á"ÙdüCÞn B¬¤XR‡A–ŒCº€BgIµâI3Ù–¤Õƒœ rH Pfá© ²KXð’|¤$ð¶ÅúKÞ¶vB!ýŸá6¹˜œû¹o[É©¢p²"9™4"0´’–É»ÆG(¹ð•Ü "·cI4äq49þKD¶ÿ ŒHšÐ±Bü·’,.h'Ÿ Óɧ%r³0Œ aÌB²%¬ga¬›ü<÷’áÉ Ð_rÎ…›¤M”zG†IžPØN®¡—ÜAι BÕŠÏB (œdLÎ{Œs®å× 24ô¿1éüs‘‚=ÔÐ#@Mƒ|üzKaˆ §ƒ"X ˆ¢z‚™Øð¾'6 ñ`fCӞгƔ$r†JƒC=-0Üúµ z?ƒcÐàn(P±(ùsÿ ÖÁ|3ÏQYNxŽ îˆŽú6~cQÆ£-žµ.›ÈŠEù£ì ™çzFÍTÐIÙ¾ã䀂ɇhH̯ñ4d±:;/:(Ö—¢¶²Y`Ú~n½ƒ]Ëá%nûQ* Í….· R·v]( Ý2 […ÓÛ>é`¯KÐéá4v5;å û`¸"¶S.2&1†‡8Üa ¸m”HæGÙ ð¨”cJ…‘íéàáuÎjw_J¯M—-û€ñŸÀoJmö8fÆòÞF‰Ó#@qÈ™‚Jä€(•ªŒ2Rà6¬Ô(ÓàeÅ h"Ð’!Ä~$µC÷§Ô HìG1›H€ì² ¥,©óÌÚ ˜’:¤eS)Û”)ÊD–$’%À[Y5â„ý(9Z­º§­!ÐP%”euJ_!ìT)šÃ>0Û0>ž†AÖ˜RÀ;“°Â†;:K°^¤ ÚÆ ÃBzÕ4a¨ÖÜùì[†³LZ>˼| ·l™€ŒozrYŽ)¡_àÛn—‡¨l¬•Î bj?è95žZ€ºÌ¡ªÙý >‹"ÜRn [þÔL G·åÞ²Grýúð–"½eÜ’p™rÒk._W„ÁåÜRy¬þ.ó–oËÅåäR®P¹Lµ-!—™K¾ePÑË%D].—¡KÂec°¹ I‹¹®œ|‘KÍeß²´v·Ä\J.g—R&€xaE9¦ì yìL·š„¨9•“;ËéìŒx,ïOW®r'³p@ü(OªmÁ+އ›z$šÉ Xö¸ZÞL¢ÖšÚ> Oúµ"À†@¸Âz¬0Tc;Üôr¡ÏcQnÂØeÄ„êZðR–¡¼<€ÕV `šóܰˆíÁ$h϶Û7b|ùú»ø¼R•@FYà[67ó_:gÛ0œ¢¥ýw€ ,(0_g&Ëþe`ö::@ÐÂfÿKÅC€– ]S`,ú…; æLiQDQæÉh(L’Ò‰Q¦‚q…•,C€6@U®ì /®·3Þ¤.'WwƒU˜,ueKÝšÈjWi.³Ä+^VA«O›7Bú@üÆ2øåô燩@øè×"g÷ƒüåë зL]Î-}jÒ¾}γŒy»,\.Ô˜å22¦âRtI¹\ŽÁ1¡_rL3fßruYº¼c†ò˜mÌÒZ-‰ycò0«”»KL¥ž@ ·„;\LζÐ)AàZÔÝÚ…Œ„eÉð‡•4\´-w°<8ÝUg9WÄÛU¾/M'ñK.&õG¿Æ ˆ³ð CFQµµ¢ã °¤Ât@<b*n§æecý[0 ¨ûˆ^ÕÓ–S!ú`÷@‡æÝ#NGEªØe¶ z™î`frã„@fâ)Š™¾Ì•›æ‡Ø¨jÙd‚1¡–*Væs#%ƒ„x]X¾\‡4ÍØà ° ‚™3Ç èÌý`S&2¶«ð²dÞ™š‚x¦:“É%WŒuÔ¼–•„ céµ9[Â'ìt˜ºæå&ìw"dÆ ZoT¦¡YF¨DLÈž™ƒ?Ã#ÌwÊÏü•¡'†æ·Levµäef4It@¢ Ù@–Ù9»h² ™¿Ì}ÄãÁöÀÐübR3D*30¦q¥ ØKÃÁ4¥™Œ™æ½²ìÒÐò1l>FŒfÄl£éÒüiÊ4Uš,MQYHóSÖÐŒ¦ÛôkXË!G³§iÓŒÆÜ„š M€…9rp¿„$5_š'Í}]JsëÕÜ›l-[šùJ æÁ†~Éaê ÂL‰;~…Ÿbô6‚ûf‚5©š‹ðåø A .L4¿zͦÀA=HÀükâ+*3MÊâ¬y‘[j®5­e+Á­&ßl®Y¿´k®5÷šyM„W_ó¦éØ$jÆ2V&ù@ñ!Ñ"ÎLmvu’–‰Í0ÀbS|ù±(mªðX ®MÊÂŒBÁ3!6±Í©&¾rЍ3ð|íö$›k€¬ffó­É[shú5˜ÂM¢f`“"wÊãzØ5›_‚ØfS3­ÉÔìhÆ5U ÍrfÏ)5#Ô(Î3?#2QAL~À»$fVÒz‡yÅbãÑO€,ædJ CàoRYF,Ñù°vXÌM˜Ÿ‚ÖècT6#”Mî&¨¿)€È_Æ2¿e´Ì‘8Ó• $bd* Hˆaæ Í!˜PPZ•¾0kÂ’…Tqo ˆ±Xz žwÄi• yó"l8X[ ¥ÍXFB‹6ñ2]†gA¼­î´ÔÜË¡l4fS4&Píf†Dª]džcL€ªNânkáâ5îs8X5N‰Â³q ã|Ï•xœMç@c†ãršˆœWw’SÉ3brNmœœ!#(çŠrÆdÁbq/-웘K-XpdŽ3s+3ÎM`±‘) (œnPNáî!í&M°j8Û´(€L ŸL Ÿe8-1Î>'0ËÈùú±¬9—rÏÌŽÜúµI·Àr’èör@fƹá‚ðejZÄï6w4qÉ¢‰ÞY"(ÑF"¸‡Jg’sŸC23ã59ï‘OÎS%édtn(|n§¯ÙJ3vð(¸Z28‹œbNK'þ,fÄËÔt–-8·Oç¾n/—ð’ ­*šw\‡wAa?" c Í2»¥æ(S(`½:-˜HYç­Öi2»us!£5ç˜r±ÀÍñê¾l𠃺0°p±-1hMa3šÙ_@˜z…@#)Ø–_˜ÚÖŠY'Ôße! ìÛç˜4ž¾L æ•óàYç”tþ:˜2‡ç‰â)x(ž]K '›“ÞN ü©è”t0΃pÈgˆQëNh4Ç/Î['j™€e>3Yž"„²&@Ú9jÃ< kž|Í%DÓ®éíDÈÁ6EhE'AÁÕIÜ”(<¨:éÎ1§Åóç ±z=÷r4Ï)^Ò³?WÝŒh’ܼwØM:@p3êyáŒP=s›‰ÎÖóÈiéÜçÄ;O;lN*ªÄQ±@úFÌÈn)NƧ‘õÊsê:mœÏL'áŠøõ¼V8ß,ó×®€mt©p±3GfìÎó™»3ë”á4s†¸Ø™Y4öf3‘É÷l(0Há¡ÈÕ«6ß  18ø„fçGÉãT¹e'Ž„e ¡çÂXÖü8•žV0³gÚ3¶ J hZ4}š N@ÓF")îÍ¢h*€«ƒ¤Ù(’pŽàZ™‚N„ç¤S¢èLÉHÑŠŸˆÍã,“§é8ûà-gg4íç¯3¹”[iVˆP„MÈA<Çw²Ïa`žnÞeï’]†àÙ\_Àö9]MâèˆyÿDrîs¸::=ͼùP3;^P‰‹·sƒvîü~ª;å eN?ÞæS € JìA-1¼L•YF³ñi% ¹:¸‡ƒ'æóIYùtx..4Ï'¿ñ݉êô„ÆŒ œL1èÍï<™Õ¨GïP”Gí(ðTùUP‰Aõœ1£{‹óÌ ªU@ƒîå~wÖ;d§ÄJB‹ƒ¢:-1uÐ;hq‡ÊuvB¡O!Ôê°ÊD¡©Î” #WÓš„¢îDÐÂ`¨ÙŠeíϲžuOTgæÓS° í„^CÉÐ"(ïaúI@“ƒâBUžVÐ]¨ŸÒQOH€J€$‡0BŽX9Á³×™B ºÐ0(ên ºLœ$F›˜¡pg¨Tמ‘†ºAõ pÐ&ª†Ñ†æAõ¡ÍN?(8tù©ývBI¢†ÐÑ =4ŠyX‡¼öX׳ƒ;ôÛ9¢ƒÄìD÷ öPX'>tÖ©•…¢9÷ ¶Ð9¨”ó™) ýB¢E´mItʹ‹'´B?Ÿ¯Ð7h&ÔÖyæÄuÖB¯¡Ñ&’h‚èîÄ ‰n:•SÑNA¨8ô!“5‡ÖDÓ¡9>Ã̃ ¼`8‡òDÿy3HLAg(ÊA«„Æ:µžMQMhY” ÝÜD« lÎò¥§@˃Y…Ýês† ‚.ÑÂMX…Ž)‡@8+è«`ƒ¶¹S†–AÁgЫÃ3´2j`ƒ²EÅ¢ö³•(´%Zm‹f:e¢pÑ@hó.:Õ±Fs¢:ÂhOÔ&ö}„b„££<¾‰MB8j]Š®;c¡ŠÑ×StƒM˜?›wÂN/f‚¸fììqÎO¢Åzh^á:ʵ”JÈ£§JJç˜31J•ŽšE©£ ‰ÀJ4ä1ˆ&îT0ÊP”h}ô>šæ<|J—š( / ä”d똷ѷ¨%š¦*ZÊØ*%‰ïœEæžäí4‚6A÷r €Àï®v§tÒ’C™HÀ;§@‡´!ÚÛD>$@;Q΃†”5J¸S:Á „žÒÍ]s”îÉ‹¶;£œÏþhÌèT'ït@¨PÈ dŠÅà Ѽ«I* Ôd+ã£X{qÃø4„;^›å Ð&»^¾#”'O–áLW!r7E h‘áÆ”—;ñPæ ×íœ}î°<'Þ3TY“($pâ+“§ªƒù7'ÿì*ô,É d2bêç8ôâ œíxy§Êãâ}ªðùïôœnb™@O‡ÀûsBÿ´/avš®¬e´ qvþìœÞ„ØÀªó]°þ>˜ ᛬sô†!ò:Å9øÏK'”æÓ¤fNJ-•Òæ&ÇSê)¡ð@71¡F³Ä%&}`Õœ`5c™˜MlÙ«”ï%Š ¼Ý¶ÔLòÙÔ-úì̆C¼ eæÃðàývæðìS´Žéeçì(Z…~:Gå ÀRÍ‚¢ô}Ò(5lúNž£NÑ÷èd&Í?èAy™O4€—  $J À¾fÏLVY¼t^J!0xª?žOˆI¨Íbø õ–JJÑ£RÍuçªôƒ@Ði"LÝšÛœ©­4YJëÔ•F›ì¥-ÚL¯Tð+]iK1ÃÒXéÞdñ¤%Kr-}š*³xéÏ9y‰Á5UFÜ¡ÐMX(ßdæô,C"„B*S°ä•cºîľøL.SX(/“„y¨Ø—ºL[¦žiÔT:3u—)O.ðR_&¿4[†1¥u,@2"«i´éTÊ*ÝŸñÍŸÓciÄ´ãéëTxÆLï¢ JçÓtYê1—–¥r€ré£ô\*M—2F×¥ÉP—é¡”ëYò0štü¥dÓ„ç³ á])ÌH ¦¢»i±´pÚAÚVFh¼L˜aΔeŠ1uu>=›Þ¸”3\ê.›ÊMå—˜÷IÊ u \:£h‚È-€ €yÐBKÜ5ZÄ:t²Ž r/À”`8€HÍ)ôK9ÕšNE_š0C hãsêhêLCž!.»B jõ[¬G";C›¯1çÔnš#½….M“ !èfânaÚ*õj*N7›cSZéÇ“bzªÛš5É^OAhØ4Â` <€GµgõËcJ´é™† Ÿr°Ú›à7I…whtú,ÙÉ9XaOÕ@Á°GǶì}îPôk•Mÿðórz 3~*6‘Ÿ–Må§w`e ù2 XQù_þ²ûy×Tþ99¨ßÏvAø³)`ñ$JgÞ¼ôgà´VÊþd`–PwäÒÂ&Öå}âÇ„q@;J¶³¦Ùé`)°ÏÉvg>7ßYk(0vø ýËy³j\³`&þ4• Hs '!(³ôê,•‹6HIÒ‚ öÁǘ+­PH¿£LÐðè·Ó&÷àðFÞ(?€/êŒôºäŒŽÎB«§jÎ5©b   uÐ:^‰(n.e›Šzm¨˜±¼ÇžhNMªç<š¡FÐéáj4k©EpNC… –˜'*òMhš m–.H墀T˜•:”8zxªiéC{¢5½æÝr4)Šî¤‘¢KݨÓQ\è/…ÊÖ[®¸£_SA¨t‰˜k´PË|§ÃÒªtJ=儞ꆠîSÍa'±=Ńʆ©-Щ)g#fanhö¤**Õêµj F©XQEê÷¥”àH=‰þR·fFM°Á­ñ9+m{ŽO½šµTZÍ£ åé3õˆJ@¢hÐé§6µzgÐꦦ‚ §ðÔD*QðÈë¦*9wЯæ ZSÊMX= p­Ÿš«ÌÚ¥)á,{ ó›¦7¹#_0x˜Tð”’ì€ÇRÈ»1±® /³dXBT­·mˆ*“ü.=™S ðiø´˜J¤—2̲´’JE½¤zG/fî,j=% –ãkqKÁ¨RÌÃqŒ:O%ÜYcb¤<Ñ5*b:Ú}£úR­§.UÊfUT7šå£ÒRÿ£Î‡Tè‰ð]g†EQ¢½TZ'.ÔPšM”¾Mc¨uRÐ)â„—K]§n3¥›ÍMéiÃSJ¾l°ÍB¥¤RËJ^•)º=½ivM¦®ÒUêÙ¬œêñ4›’O£ª¼ÒÍUs)ý˜þÏ«nc)²Ô«©,E‰NQÿ UÔ›*Âì~ ,<Û(Ÿ,¸jiªÓEÔ«±ð&´¥¢²ŸªR5ÊT½‘ºG隸ÐêýàaFÒä›}0«Sª[UûÀ8MCdS“-MÐ0§CÂà²ø|R[ÔL…' Své·”öÒ}HQäªWS¹ÊÆd®–Öz« 4À°T ,xPµÐ ˆÎ|YàmgÖrÁ®Ê1‘„š1 ÑÌ‚–CÅ®š2hJ3úBÕ_BÜ"A9§‡ Ï© tJ7ý¥žFX✶ñÁ~@I}izC1«6ÕªªnêKqC€/ ¢U¡j—­@÷[uuzKM©rPKLÕ ÕéD«žUÍ ûІçkµzº.MÜEN3Qïh&yÚ@|ÀRcv…”g Ãzåü°~Sݨ ÏS];USð.¥©"X;rQh)ÝDóàSmŸÊSŨ©Î Ìa“ÚÎx¶•$žï¬~ªÀtµZ# ±öC¯§²Ðëý4\É*+“&ÏŒ¤;;A÷-MzãÓ²!ªJ ˜Tv uÄùtÙ®.´Cܤ"A¼ëyËv¿øM½Mc ùQ•¢Z«½|ž)~ ÒìåÕV;g Ϊ ôÁYþDœ55ã¥O ‘1³Á©2ê€Ö?g˜³Ól !ð,{˜¦F©¤ÔzE¢!Î!£ËÙ‘@ù¶=kš©TŒjµtæ|pÀZI@©VLknôþ9;³~2éž›ÔÌ '÷T à0u´Ú;1 P‰Bú€V9={¢­U…¥¼À[ö {¶jÕžy¸g&€[kÓó½zk­¬šX}¬)V+³5ßV¨)ÛÝ2ÌV6ªô|†ÿlZb2­—ÌYµÇj`Å&X?˜‡M«à“ÇR¨ùÁo€‘åÎ)kºu©bm·^O-1­VTéÚ”ÞÚUY5«Ê<…WcBo—pÅ䎢BÕ¬5µ ‰S¬\I©–P‚ëÖÌàZbÅžJn­Ñ[«ÅÛŠ ­·:\ã¢7Õj§ ÍyGø¸RY×#×^kÉUº>Ã;ÝÐT®±VÅCTjÿ|˜ùõ¾z%MinµÑx»µ²ÐÖ–˜iÇ4Rš8¶²Oõp”UXhÎMª}ƒîG­§%×wë®Um€š‚[3« VåM‡ÙÙSœDq×›k tk¶u }4=%f¼Ø j5‹åÉ”¦jƒÒ¤îKB+`Ó÷NEj^<5š NïhÔ”à9™P3¡š Ìujõs‰i=hZÖOk¨5°Ôä3&Z_SžVÇ*n5qJ-CµR^O•òÖ%B«u‰ðjõ¯ÈZIg¬³íõ†ªxÀ€ŽDR§«S@ë”Jئüè "GÔ2ÜhÓ«9 ¶žê†¦¾WFÎà |My[«ÞÓ]ÙaÒšáT¦âø n#ÁŠZ?² gô¹\Ü+­ÍÍC[3âú%u@|…üx±•Óê ÎsGM5•.['qÍÖêÙ³dJ-{² ”f©×mÎêu›£mÍÝq[W®fW—«%õá*n…¿’[ -¯”s«…õŠam£6UŸ¢PÎw«å5Þºj À6\°0W«¾UŽ×oýEZ\×M©ÜÕëZuªº[£M ×KMªTŠzv½·N;1 èE&YrmÝ·Â5mWãPzaãêoú`gl®WÖª•GúTÀ¶ÍN®þ•”k·Õ{` ·â[E2×%šÔQ}„eÀª[‡°#Ö"쩎ç*Cë;逮£&ûÙ¥³èÚ×ËYvö­ó×ÿYýõŸæ_yºâR¥®ŒÕ4,¯s·*6™¾A_§~ ÙéñóP;½æNÍ~ŠÞéæùŠg:°özVQðÕxêœTš–\ ±&'ì V `JyfYߘw3ÑçÒœG¸`n`3ïÈÌ ¡ËFÍvNÃny–,ËðZ@¥jT}”ÝSâ¤4ò >[¼Æ4¯“ÖÉ«-vjZ/u™Ò^=tUS_+F ØêÕÌpbL÷¦/M³ªß´_úx¹âä°kØ÷ê…gšl]úMcƒ¦BÐ…) sø*tŠ:džNð*Y'ú™,•±T*3VÅM3Îà ¿|ï ˜ë; \é„.ôGÀø\òšæ××A8aßýwŠŒ’«>€åªèÒË$ËŽ¦5Ý‘³9,áŒ7»ÈÖ-M wK…)@V ˸|è5¥+̓lBVúÚ­È.ÓP‰ìt5 []¥cr.cƒÙˆBö„ Žvd7—M€ÎeD–ÖyĤ®Î1U—ˆ.Ö%o0%û§XÉR̤¯5Q=æèR'kºÉŠd‰S6Y¡,&'‹ðɶZ²/YÜeˆëp)c=±Ò&§™¤)…Àrê@5E`]‰SšÓò©oûk%mÚL©¢8S_æÊ4+KÍÄÞ]Íy¹?A‚ ïZêŠ[¿:Ît)e–͆¯`ဠȞ1²A2jÐ,ð:Ô¼m8á°L:åf O[ÆÜ„•‰M_±äXÊêäõuÆ.£½2Í^¯«³VÕ‰bh#¢üe˜Ùáôóµ­´î)~´U¯içì¶ú0¬ÃNdK²„K‚lÎLº]ÍzW!âX€xUV^Õ‡žW!déU­èzuiÖ^Õ‡¾W…¨ñUÏì·hj¶ÍŒN?¢¿K€u!J 8g!©Ñ&çìæŽÆ 5há\ýxZë©2Uáãªl_„8‰¨•;¦¥Îb£6ÚÛ›´_g¬„„+§s¶óéÇ;N¸eñ§çS£¥zòZ·wå›`|8ŠM‰(f­ûØô}žO½ž‡W”¦µªÊh=¡ÚRÏf´X&¬sÅV4[)ì?q˜:L ‘ÿÓRÁü¬ˆV𜛤Mí©ƒs¥‰Ú\‡ÕUßÚ½C‰6L Øç0P_o‡ @A…öZw a0Áúƒ@ˆé„öšæ©äh/³HTØ«f¶wÆ™åŒJ Ù mfúi0ÂPáŸûUóÍÖó¥ÉÛÄ ×2‚…Ì@õUŽú·»Dz0íªþ35†ASpÏÛV+û³ÔÔžçŒÕœ‡vyèPF¯lUȪ±ôlöèÓ–NÄ´"ÌØA›Ðô¤ÄÀ ‚—œƒÞ?LO»@µÞ=_œfÕ‹L\î¶Y¦¥“:Jwwã6ùB™ös'>ìåµTÚ3€Â3"rwÚçdjž¬T’ë§ÖÃ?tj¯+M³*ò !8øœ’e1j´Í/Áç”+;BõÊfjŸ³…ÈfI¯ñ)‡•ÓÎT¯ñS­ Á‚*]Ë W½©Ìζ©»dUË¢uÕ 6³Ú’)ÕÔW¿\wbØ´|7­o³W«[¬þj§¡´Î°ªx–K‹3€ýE\k,f†kœ!_ MXLdønä¡"ß›4Úv©íƒ…03 ·UníƒÖ[{=«É’do²0ÙÎ¥·ó7»H["àæš 6_Aä€A`š ÄÈH}¨3¥hC•QÙRµ®Ø µ.PðåÚŽK’®…ôä±Ã“äâìnÀv[xq^˜Ë»‰Ý‘­˜‘ǹÔöV´*®ëiS Á¢¥Äj¯ZÌV>0 %˜bNEb7L ªÓÐsÑ¢UFh£ZVêÜ,d4ªåÔîBCªDS0Ó¶~iX…~Éb^³Û¾eóæ©¥Ú’jÇþBS-ú,d$!ÀÒâK“±‹*mÜt¿:Q˜Ÿê6×UÚ ž\5¯à³µÕVk÷9Ž+ÆÙiT[ªM;1\ É´›­qjƒ]Ù5NÒ*ž:Ò¡©ÛTmëª-ÛÒÏ^¨;[›íør€xÙÒlc¶ª×½ƒÑö-D´ÕÜTpµ•[¯mßV¸ªÏ|¬8@GdLX{+ö ·’09lºõ‰À”q”²€ æ >+6t«–àjÜ4< 7á´ÐÖníœ|v+5±*kÌZ‚³vw³Ö&Bë¶ÔÚ ­µ[+ÐÖvuôµêT~-GÖ°®E¥¾Gw¬Î3¾-ØÖbGºõÉ3ù™éŒ,@êöåJU}Â20§™7%zb¨ç†è"P01›R@û‰Z¸7‰ .º[‰í¿êHÞ¶jÙ¶ÏZYí~Õ ½Ú†_¾³Øï-”\‹²eîõm xvY›šjguÝ&í^œ³µ&lvnÉÇl]¦-ƒf#âY,Hൗ}qzp#ªïYË­k#‹Q¼ÜÊn¶”ÛÖ¦‰¶g;­uà¶EÛÏm×6h ª]U¨PÝCÜð˦ÖÕAsø`V‡îkÙü'¦Ökk²,‚bm…²%ÜäX† ðÝžjɶ9OÁÙ–j“¶Õ6nݶÈÍÖ­«enk8íáÞjñ¶¿MÁÞVt;¾%ÙY`·Á-„«pû&ô‹!nñ¦Š[w ã–m븬Bnm¸’ÛN]åVE‹ÈÍÜÆhµ¨úWÏíѶ+¾Ù™j›¸æ[ufj ½™[ßb`Û·/X€w‚‰ÀtÔnÏp9X‡f·”z…íÝ ~·ØÛ5,G¶x›¬p¹M ¸Ë[&]óv+­íÊFo¸´Îk­LÒz ¼™új¯gÜ[¬æ“ûäl—²âB·Dܯ­%·]†ÉMgšnÑ·Oõ- V[S]݆rß·=ší`~Û`å`Øo•9X n·°°€à\ ¸e\.—y;Øäå>oݸw[e.?”™;®}q¦c)vaÛ‹Ýn#G¯åyüÆ®M4ðkËÌNû?‹åÒa½,l\­_v™“-]Îf£«ñ„Úlwõ»j¯#ëìfÓ~$ƒ=RϹ˜˜Ò6ú–èUÍà6§G›£­ yÐp´/Í ÷8[¤5ÈWÇHZæ¬"V„f÷L‚n]¬T»ì‚'·››}ÂîÌÌv]ªÌQ% ›±«–bôk«Ü«Ö•[€å*]«®ÂÛo--·ýiË]Öâ°”·ó\]n=7­ÊÀÅçJoƒ¹Ô[:1ס«½=›%s×­ûÜ,ì VÙ*P€z2\›°h×'lµÓ}‘+ó ºY[t×ÝíTW³à»ÝÕ²u‡·“U°,äôx[ÀýêpÓª9[ÕÀ.—¬ÛË­ÕþraÓÛa®þk[{ÕÓfu‘¹Ü,öøÚ‚õæ=W¬ÎØo驎;kc=Ô²9jSAB»vÑ6qCx…=k-+ÕÏ2cpÑH`sJC˜Z¯ ¦” ð-¢T/ñ¬*7Iâ’Ô|4¦„×’bª-–0 üÖmêÕáNm7¨:cOÁ‹óοu¨ßÞÍ»fÞ‡sÌ"H©W=*¥ î’ÏÛ‹ó'öÛÒöøz%F®Û±° —hÙÈH„J—Z²*[Ó¬ª_…ìvߪÄݸ*F—¶Aµ¹×–že䲺^*á-Ô•"9Mº+6jȈªkÕ¥ºzv÷µˆÝ¯ldKûâŒÚ6x\˜ùF-¸ÏAÌåIŇâÍ…©E)¿R˜_€&šµíKà l¦®W¼4‡Àkdöï„çÊs!» Ü«ìW¢`ÖæNp;¼yVBÍ%²Á ~˜ÔÆRpvgŸzmZw­ÛÙ Þbx¿µÉ\'­‡·¿û¨ ¢$,±8VL,Þlðz@¥çBkÙ¶/Z*póøÉجm–i)­ € ­ý2C«ÈÔþ9弞M܃š7»ÙDM‚&m¸NÓ²«>wl›-Ó*<ÓˆFN'®Qì•@±_*<Õ1 Ýnú`é¯ðÚzóh3†^¤dëð›¨9›¶®mË MIáèÕô fýg.€*î§—Š{B¸tVr™ºÕ\yfŽu2ãÌužez½ Pqn@PËèõÆ3½x€îî8‡¥9üy#«BÐW/ù6Ö»ÏDtõ3ç®àY»+þ {´Äe¢bì¼r]»v¡À¥Ä´e:Ï3›Ÿu 9 ÌPºÚÉf‚V­¹ Å·:V fYÿìÙ ÏKçÍÔÍ %Òì®j€ –¼FÑڵÄJ„êt$°{Ì„íÚͼ(8äº6Ë—)Ú·CäÖEÛ•…ÑÚ6·SÚ¦Œ6ðJû[ ãf8ñ°cÝlI/àû@å®4ÿ‰zD € @÷Y"(¶ COÓ«%FÑðÅJ0ˆ|S$_Z‡Ó Àôg¸ù®4«f°=€4´Á;Ôý±uC¹4ß;«Ó×­bé.Þ'q× l•ukž-¹6,ô 'ÌÜ(­óF‹:héîhu¥Î–nL7‡Jë„ØQ‰´ü2#-N׈Zöµfô`î‹Òlâî;?Ø2Àk:XOöZi€½Õz,{Vô,îR;c=Ø}ÍyrGC´Ì‹÷dsÂeYéË„/ž“ðûÓMÍŠSº Ûh™V÷ŠÛÆl\.°«83‰‚FW}ÀÑ ¯òÎÈgØU†ïÖ‰`›^=®Æ^º]ß—¦KWìËb(ÎòD;hðÕmÎM—¬dDu¯¶v¥¢(€Ÿ®t6¨ T"Ò~q½²³²ë2:¦„²éÚ’ßÅ„Øt¶!èàmD‘¡4{혖5»ùÉNtݘ…SÖ¯fð“z°}Ú*lË Û(Ë“ì“êtû.Qqßë'•ç+jÿŠÐž£Ñ_Z¦@¬úK¥ûRuÕdyß®B›A €E†búj`įâ,ƒÖc†ª_ë®4ÅqëÓ D™¿ý‚³’‰^£uPwsêß#©¹¬‚;!Ð…Ò:>˜ÞïÁkLuvó”<|ÉBºÐOBÅÅ9~•­œÎrªÑcè/SËÈáfG#·8ÜÈîA r;màÚ{k¢ÛGî$wswì•›= ä  ^OïÓ6hæá…³z­¶Þ¤lç×"‹‰Ý ){ÿ…§Ú Z!KÆ-y r!»$QËaIO;åWó¹´¼­7ð؉E‡¦o€ÀíørpââãnŸ£QÑ@î¡â Üå-ä>Gg¶®Í ° w‡kñÝÜjÏ$¹Þ0•Ž;Í-ßZså.›Ü(5ô²*‰-zŠr¢ç\cŽh5Õýý$È©»Üni·T°[eþVÍÄ¢ÝPÕíÑ×<ÃŽ¢vG°‰PÖ.O÷,ºýºÞBk½“àh®—Ù{Íuö¦o7Á¥ÝYð^œKb Œs=©õP>IW•·Ñ†f’%=Upj·û 6mXsÁñÙhÙ.¸ì°±BU]Á"´íl8ØÆJë•Óu%¿`^3^þWÿ«)P: JáÙ-벯6Û üÍv-jZ¸;k0·Î»Uvô~sE¬eêsÀr\4÷R5‰› ï®öݢÀ*9²Y­¶\vüýúê/³u>Ú±oZNH£¤žåË ÈYµ/ï7I›0û¾›´ù3…î€ûÛ¯åü2W=¿ݸãè÷6{èôèž~'då MH×mª £ŸŠp)XÛ•.LWG;^ƒý†„k¿#a£0M7íkÓUÎætÍk;]ûjâÎTú †Ï>Ñl¬c^|%"ØD»Ú¢èpk¶u[ðçš÷ÚæÍª¾y'¯ôÞ»¦wæ¡ve«±t¡W•x©Qôn½a¬Q/©W/lêô6ï.5MàÀpWšDÞô†TS½å2Äð¸ v2†ÇF„á4⥆–`çòz[Šá¼°WØ› ö:Î$ÃÑÜÒ«”É sLjH ·ÈAh¯­ÇU ¤ †ýbvW†&D8›M ïyÕžéàüe]¸Î[¿¼óv6é¼H„ßpl3ÃYŽ•n1ÁôÌ™´7\ùøý“ú]ue^кPö‡•—5æ\©Æ”ß_‚ì ׿.ÐîP³5ŬâìaÈÀÔ÷2C´ÉÒÉìºÌ#,/#û–„•¨'áÜïî—í{ŽØZ0I³4RÚ«lõt£?»ü΄ºš_Þjø_+”•Í&Ðh³#Ûlé×'l©¯.Ð|³(]à¬Ji6œ•é&B§Â¿³ªð|U§;Ÿ­¦ˆ‡¿êZ!˜uÖ;‹•(HR”0ⱌxFL#®ÛˆoÄexmh-2.8.0/misc/ns-exmh.tar.gz000644 001047 000144 00000005772 07114472443 016444 0ustar00welchusers000000 000000 ‹àá19ns-exmh.taríýSãÆî~ÿ ] %áåÃùd ÎÐÀ¦„Þ˜»yeŒ½‰Ýsv=»6^éßþ¤µœ¯ãz¼×Öú!±wµ’VÒJÚ]sUe·c·þêÚæV§¯ Ûîš-üh¶¶ô&@·Ó6ÍÖV³Ûh4ºÍæ+è<§P)D*´$À+ß±†CÎä*<5 Uø½,ðÄþôS³Ÿ‡GÃ4»íöJûoµÛ[©ýÍn³ƒöo™­Ö+0ŸGœYø‡Û¿¾ù$`@ì@†}áxC90”b '½ Ê>æk6 …„H1˜x¡ ïû‡8fÏq töù¾˜x|¡€;Iø£^ã,T¶°z ÙIÆm¦j¿*z>ÛÆÁHL^Q_©8¶<¿†ïW–Òs±¡ŒXyg+Á¸r|Â*Ö£úØòÇLÆ+A‰"2 '‚;éÜß}·'‰(Ø>Gܳ­Ð\á« „Ô/°|ô’!×æÔŒ§QsÝ0Œ5Û~ä0ø· OÔÜï3M(¶Î¶1)ù,Z1èõ~Í-"9‡ =δ%ÎßBñ§¢ÎƒâLOïçþ´ç>×{rðnöž°‰Ê}vpÚ'õ*Y÷…mùõk×oC&Ç4ÎNOPBÉ‘ŒQG×Ú$ŸùxeqçŠÝ2êÊz6x<4f:K¶kÉM°äèæâ²l|2 ÞJúvwáäüø~ÿ=î7/§Me@Ì‚da$9T;FáÞ0 }Ôvq8±(•,ÛBï­6¶ñqfDÜaêvÍ”ä¹)%¬*šg™8V ¥B!@ã™â”wt#»õÂ’¶ZÜp?¨)+òÃíB†«©Å¼ŸjÉ–Ì ÙU8®hmPÓ;é…Léµ5fJY#×¹£åeAÈÆ^E L؇ÀR1:µsk¬© 6­Ý¬âµš9މò‰ƒV}üJT` ŸJ¤nšÖ›£ãƒMÍ×Y¬/øí·±„ø_*iávQýã%êÆ•:)–Ëð:¶[j’á„æY¢PÞoL µ,e| %NDwáÔJÚ¾P¬”¾“µ­›ŒVOÙד}Œ=ßcèqØÚÃUŽ1nâ2®ÕubÝx#+ÄØæ)ð­ÈviÕ#â¾à!p†È¨FõÎïB—BBR+”èOY+˜\z‘géFxŽVêƒñd<矕RðŒ|ä]_/Ù2NŸ—íg´áÐÿ0>.SÞГ* Ç0Œ¸Ma”Ôhk´/”•°Þà3Å£ Òúˆ^I^ˆ HFœ²"?¤O+(žÓœ„z:›ÓØÝ¨ÀlCsêÛ°ÇtÑOÄwÐ;=z{–„ÒŠöÐûÏš T:dÕ#\®©¯2 å±éç‰Þfâü~6æÍFÆ Å6øÿH¶RÌgvÈœ ëâ€qޱ«ˆa‡Gh6Öu‘*×ÂÿÌý;ØÅF6Ttý+ŽÞÀ 8°AKÑv˜³cóŸ1ßWzF4Stì 0‚q6GZé-ÁX}Ξ•8v!¡ôIÈQú˜HRÁ•éC8Kûm;}º¶íŒP(M‚Õ’8›ÊvÇQøÛΌߴ–9eÚØu¦T¨o &ì†ÉÄÈ8]Šâš-)Îg¡^MÊ–^‚A“´¢ck)`LSÓ€º›ÔÅ<¨ „¢LQ3Èu˜RÃÁgèߨœ*-®˜¯ØJLÄ+§á>Qõr²ƒ¸sJ;Eþƒé˜”Ë"J5ü…TuRИq6Huêü.&àZ7¨`ôtüÓÎVƒ·"1jµãºóB­hmÔ5ÕîΗ®ý+&ä²?ˆÛù•V$7f|Ä$Ƶ¸]½¨N#¯T0 å) –YÚ¹›†‚ ¯‡(ðôáL³‰W`““ ëaµo]K ö=eG:,©ÕsÛXÈœíû³sÉ2Y×b‘~da©!ñA(c:˜ß /.z”nÅGLÊ‘ïÀu†pµAà[6C»/3IiãªhÍ‚PÅc ónÐVŬÒp(ÐO#åRýÎ ºÈm¥°„JžÄd1£ÓCôŸQß¹ôçMŒñY-æmΘ(Õ¦÷LÞˆ ™ª‘ô©VŽÐ‡6Ã')4óKœ—¶'s!5»X‘Ê£ëô½M6HÏÒmßsðh˜Ÿ?ÿkw€}[[­VǤó¿þçç?/k¯çöÝO¹†¡°– ¿¸ ¬Ð…Y”‡N|ÑÆd¬s0;N †›Ê?qÒ(-¿i7fÉRSˆó铹%1¸\L<>TÓ0¨KXŸ2¸ÜÝ­6î±.!W¡U™ô‘dõ4øê»©óÈ÷á[2ò—çàñÈýo£Óè¦ù¿c6›ºþowóüÿ°ö$€i?u }öœ\®¦¿×FÒ+ƒÏ9F=ÚÛǼo…:â]3_LjÆ dœíþxp6Àý=$7ºÈûàdÎðîèìö`p¼78|m ÎöŽ÷Nw3Õï]×Óå…ÍhG·ÆZ¯‡DG¶m¬õý€¯ë¥ãý2T„ªíØFŒ«¾ãëá[ÒS_3ôðmõü½¡ÇÙ˜öüë?PÝw”dƵ‘îèñ{Gï¡]kâÜdªé8uƒ‰³zÝßœà¿»ÝÆ_.Ð8ò.–¦ ×0,ßßFv‰vËíµr·c- £°^Jè£@"Õ}Ú£§Ø6a÷zˆˆSÛ8µÙýP\/=¥ü¡8ý¼Àãtsío…ñGÇ“P `Õ(TÇ7˜Cg[ÓKýå­`º Þmf&7GÙ°}fqäŒÎªLñ6kS¹dÁœ—:xúEÀsðx4þ7ÛÉ÷?ÍvÓìêøßíäñÿ%àɾÿIÈ0àˆvYC:…¦\@Gº˜˜äV°”˜Ä"¼InzUz†ØÓm§Šl›)U¡o%ðuˆ£"Éjÿ—_ä¬yCî°!\]Å:¸r§¶dš0ò‘h ºä“‚øÐ}'‹´ú¦}íO_^ÏŒ^~-<‹ò•ªúS½·š½Z}ôVu†ûÂeÕbïâõÏ'&ºâ>fkÕeÈ ÏU;è ¸Qò†©,ÆÿÓƒ½ýþÁóðx$þCWŸÿwLÓl`?ÿ5;íüüïEàLÐÅá¶a4Êpàxñi-oz® s jÄGâúÅ5`[<Ô‘•>ƸŽ<ŒÝqK2°h–ØIå½QPwŠîré¦× 1x¨©*t°D߯0Çh–±ŸÙ5/:„ÔÇdŠn4“ÊÌh•õwQÜ“‚E£]^òù(Ǩ/øˆÔ(”Ò£+!]¦&Ç–Xô}Ñ×¥~\ºtS‘ýÒ´S†> ŠC£ïdõÁ %R¢øú©ƒËìù?Eµ'fðêñû?èèïÿÍfËlw·ôý_·µ•¯ÿ—€äüŸNþéÜŸÙ®€âz£Hgêá8¨Ó >f·¿TNË!‡rÈ!‡rÈ!‡rÈ!‡rÈ!‡rÈ!‡rÈ!‡rø'ÂR£îPexmh-2.8.0/misc/mhutils.tar.gz000664 001047 000144 00000020305 07250753477 016553 0ustar00welchusers000000 000000 ‹,ÆŸ:ìÿ©Æ¾–c#?ä¦5a…F¸l8¢ø¡º>¬íbãyù¼Ì]€ICü´Ë³§‡uVYß{õÓׯöÎ[¦ã¶šâÁ¨ÂüÙ‡kÿN—³êðìƒ6¨D6Ó`WÝ-^@Ùr}X< [‰’ãl˜„ChbëÃA4qF¸qltF¬J ÞõfÁ‚ׇ­æt2Tº3ªÐº²…ÑóãÕÖ¯Òõb­:û =¨ÕÒQÙx¼‚ÐñbVÙÜ„Å|ð*»…Îè,Šù”U@¦Á¡Jmt^NŠÃ\¢—°p—½±ãÁViàò)ð½;@~Äâ‰Áôþ84§;¬û>‹\ÿ´VÎY˜XZˆßF®Å`(\à$ÏGówú¬r+ aæÆÈŒâßVFä¶®œþB~r-à2ýßéöHÿwt]ïuº¨ÿÛº¶Òÿ7q}«þÏû •:;NbæÄ,äSÿ|ÆxÂat%㤠Sz¯ŽºLhˆÇìø,µ%Í•1!c‚mwÙ!¡’.àœðqÊŽ9¨cÏñÆÌôlзf4É:¹gÓ³Që×"]÷°µµþðá÷7O]¿·‰ÊqÌÊLÝä•Óÿ×þß!¿ß¿ôü§«iF·‡ñ?ý3®Ó(©ë®ÿýÃúc*é‡RêZÑŸè2v‰ÿgh]Äÿ½^·m`þ¿Ç…+ÿﮫùÊкgì4tâL&8pÿò'û/pF"³‡¾íŒ‹,p„ÝO>öÙÿ¼îÀˆ{ä‚ †™á8A{Íb°Ë·œÑ“¾6ñ/æÔñ8=ó˜£ãGžŽ´ÖYŠÚQ%xufoc³üà ='†ÇÁ}ñèÑ4uYõÆ©ÿšú¤ :¸°h‡Ü\ÏŽ¬Ç´bô~skÈÜZt¡ã œ`BPnl~.yf ŽëM¢À´,Y‹ž&O=ŸÎî·Ž.0ἦ׼ óÍþ­\ÐôŒ=t¼`@^ìnê*ÏgbpT-CÜ¿Vy´”,ϲ.¹¤yæÊPâœ5ÐÅoÝy˜KӜӿ@Žåî÷̺æŸoá"lîò˜§–çm$Èm+¨Õu­WÑþKÁþÎs\–ÿ¯OæÿÁÐ:˜ÿ1:«üÿ\W³ÿoHç) ùdÖ6Á Ÿ{ÿD3õ÷;)˜ÉÁ\œZ¹m¦\]7v-«ÿüžs\Rÿ©ëm=ÿûX ªw»ýUýÇ\ ÿƒVl¹íf›”þ©Cµ ï"¾Ãæª=¥Š{_,ùüãå€) “y~Ì&扈ٶX䌽&ÛÍŠbÔ5v ªËc*8»†ÀVvE…orb<<ÀxF¢Ë:{ Q—Ìa/pXù00ÁNåÌ66Œ¦ûÌFÁ ý(ŸNɲ١yÊš˜^u‹0«·³0ø:CŽ¡c$3ƾ¾kd†`¼ÞŸ:àBÁšcÑG¶žNðq0hèçR5ó/Ü’}¸ÄV6Œ=`-›Ÿ´¼ÄuÙ=,ìÔ7ÍQ2GЉè*>Ë™ãr™ÆöM2lÇåÞдùÉGvž³wÁ¨!-'0¬|ΤÍ-Eܳ^dRîÉÄô€RmóÀŒ¶²!ÿ—Òÿ˜©Ð¯Iá^Zÿß×Óúÿv¿ù¿.æWúÿú¯‚ÿúÿ¾ €y&uoeýa¥lûåÒ±ÿE½àä^Ž­­õVkã·r‰†T61;T@]ˆôÜ0ä±]x_釿ǕÖÿN:×3Çeòoè™üwpœÞî­âÿ›¹Ëÿ«wƒu½L±ëµjƒu˜i¥nñRò[Ñ$´à'Á÷žå¿wAü×ÓÓ÷?1ò£úßUýÿÍ\wDdal%1¼WŸž}™®ƒï”Jò5q?JJ¹wÅdãIRJ dS˜” åª9XØ„&bf`ÆÖä;Ìq±þoÝ^OéÃ0ðý~gõþ÷Í\ûžÍ¿ì€„{#gܴʃ¿~•Ÿ1íÖšøSÞ’¨mY'Qèûq+öý”ãZjæúI9äqèpª~µéD¨Öõ&ý¯l;£kX¬Ê–lÉè^ª›æ[:ü¿Çôí½½£Ý/)FcÁÀûÌÐwôþN·ƒòAÖ»uCct‹Ïã­ÎàW£Ì0;³&ÀA›OùÈLÜ8z;ße­M6`•çq•ÝÍV™²p…Æ<Úò¡áˆN£j»å-vâ;¶\gò!›N†B&#þ™Få¡¡`ùê0fKÃmÇŠ‡À¬á«æz±¹.'ÿÄÏðÄèëÂ=·»ýz»gd»nw·¡¡§ö+ =öêÝË—YŬžáÖŸó8W,“U`$öЗïQ ‚À¾yyÈ]& û8€SsC!ªí¡£õêí~¶‡Ž®Õ;í~~Qz–’ÌxRg•–¤WEÎï܉ŽkàH—{ò¾–/Ñk‰ÌÂ(; ä(ÜÁ9îbKb„Êã™gN¹(Pž«%b£ÐŸRÙ\DÉQ±µ‰ô)ðŠv„ ˆú'à Çãvr,bÙrʤCT%žl]‰©`ÐWAbÏ@ñ~ äðÓMxµò¿tL Œ…‹dUfÈ\©‰'ñ¸r ¯Ñ.Zyz>f¡÷^½Þ{õ¶&»ÔÆFtl #£Ø†Á0Gc¯ÁP´Xavfû€ÐÀ‹¿3˜r(?ŽøçAŽe`ma쪲`}ìC\©¥û a£ój•ˆ¸¹Y»‡HͯH0¡†T£'^|; &þú\,X¨sú=¯Íu}F›ÇmPÐ;]mÇX¢ÌµºÞÍ)s¸MÂ]dz\°ñ¬"6ÒœT ­áÈ2´N_4+‰6´x ÕqUõñë_†û¯ž½f›€¢/uöü%¾X°9á&–"(í+ôø=BYVúÏê3D/Ì™ò¡xìr¨Ïö_î¤@¨t¡Úr–÷`R[/Œѭ·uy^$ $6«éÓx074lÆÐ9aÕQ€õØ]g÷àèÈZ­ ˜Vc²va-ú5R·SÐê‘ʬ2‰v@‡ôkò‰|ýBDÝ0óÛÃw{Yñ‚fMÂ ÖÆáFÝ»Çæ;^o l¤·f­£èýý7 jà5ªk­OLîI¢AC£ÆÎT‹éÍi PWÆm7¯R®…‹Ý£m¡¶âÆžî²M;€51âͬ…˜RÀ~ôöpÿÕó»´kê›á1ˆRÖ“>‚æQ5£wUÉõEÉñ¿¹/ëF{?|óúhÿ—á›Go_ ý )h`ƒý„*ª|J<`>{ôòh/kN‘;ÓîDC,ßkŸB¬GV+Oì =–!ðŸX诅d=l^hÆYYThŠAY€qfñ{w…ª­§]¶3oç/ÓlÎ,^#n™ ”:HX’%]2N£qn hFE–ý‹D\(l÷ûu£Û/¨i4^2¦eñ)Ae?ék0â|â¬Gƒ5¦NkCjì£Fm©§K°‰-¤ò¬Ú\êM‚cB;ŠGóúqû™¦+Ï޳><Q¬áqð“cŸe¨÷ d‡^O=’¾ÃÐ|F¢•.ÆÌWöÈS¾:î*‹Âh`ü~ˆZÀÌ­"0Â…ÊW#¥e*W…w,ü‡ô㈊6%JXý¸%èV¬Ž˜*ɉ¸pÂqK=¶Q €@|B˜Õ‘nKçs,&ŽY:`‚„®žyX©$‰Ñ½H'ƒ®'‘Ôr4ë&ã'<<£ÚQcåD¤ª¬ØÏðÛ?¨?ÅÐ+ÐOJÍœº)JLþï¹°½¸u˜•©%삽ò(V/ý˜zؤUÜŒÛÆ#DL'ÈvÐå½ÈW~‰íXü^ûØŒO@ƒ[@ȨÅCAízÑ­ ÛihFÝèéGñϨY©&—è7ÔKçmÖ—Ü_œ$@B©˜_˜-ÀÚ¸{ÇxbÆ™©$ *­·’u/¥ Xv,¢¦ôEÁ S)ÔÂF Š=ÿ𼞂m‘"É¿¢%+Óh3˜Ð÷,:á¡‘dEX|—î êP<°,Lgœ1Õª0ÖƒÂ#$¿µã¢N™÷wªgºDƒ虈pVîºR JΞ,B×[`wG¦<§ÄXÖJJPÅ¿u-s¡‘/ï¨Ed~@j†¯ê LÔboàr@Ò§è ”æý€ÒR@©é¥ö‰Š]h´Òyš©:géÏ«¸[é¶„R]hÿ·;!³¼²Ø ø¹#l^^ý«-jélÄ­*ê…I zŒ^/Kð½n½­u²((A‘JøÆ*“ž2µžËÚ~ßO1½º$ÞÄ~—íŠU,óåT‚õÊ~ÜLÂòO¸qYþv)ƒÏ%r¿Ý¥ËòayLs®ßüRÀ˼l³ov WôôÒ¼vÎÙ˯cybùO»yjÊ+ºzéð+Ñ9¿ØéÛ’Jâ\ȆÍüKÌCÏtå{RCá»ÌÉ“ˆöC|³º(Z5•Ù–éÙ[Hm«™¿9·.µ”ºYÝ6 ÙíeïïtÚK’qËÏ*….:œ”¦‚UûQû•Ö‰¶"lh!ãU²Qòˆó?xL…t–psþ_8ó'ƾ —3cØþÆwÝ·h+L×òû¶ÐðErOnÜ“?KîIžÜ“än/"wn`ŸénG×’»ß®÷·3rÃív73uÒø˜™Ðsv°wtôèù Û®8Â@Á†XB% †" H-‰"ee¹/¬,Êî¬$7ElÓa'KŠÁÑÞK3‹çd® ¼ð“:æ±Ë¥ùº¡À.‹-ü6ì1·åûZý~z*¢xk7kÎôÌpJö½‘?Óÿä壣#&ûŸàë«ïÉ(Ë!ó¬¾K'D#ÄáÓ½Çïžgà„·ùq2F~Û-®Ú]ÐËK¶©ë½ºnè9Q6:u½=#Ì‚a†2”¡·ª¢GÆ*ØExZ³“7Cg‰ô ßbê81È;¿×2iŸ? ‘®‰rl°1}–îÄd[RßgVº®Z¦2ò¤êXü6ã8¬eŒãyqд» x¼§cl™–Æ¡Ÿ „' ?7‘«\>7ª–ª×9¾ 3BÓ~³R‹Eî _ ÔI· NŠ£äÉh{§£-v;u#W,··¥g ?F±`' ­‰vÚžm N©i+ÿøYÔBrͶS9€x~éAìb9Ùî×õûy9Ù¾_o÷ E*ß$ý)<}£WÍÁï%_'«ÑØ#ŽÅS¹ƒ¹|‹ãëv¶sâØ ¨. 'ƒ[ÒĈ\¨IQ¦aáGä"Uî‘%5è+7òû8uò°EÌ1­ÉÐÛCsP"ñ:%½Ji ï>ýn>êÀLªþ$ÁèË‘\| /pÒ’µ&{Do!ÿ21a6Ì*ÑLü˜ (bn7ñ >⣃rFºÄ„ç(È+@Å$.؈‰ïä`³êÃgfº 4/U¼õ=.²>SŽðÄ1šä‘zA‘¹|D_:–s6u—k¢™zèÃb eÏèô\/ê—;U+klfQF~Ð&‹T5ÔþÈ'“ZÙK¯ŽçÄŽé‚öd´ƒ4ÄBÇ;*ÖÌ'.ðI€áØ'À6}°‚H1Ž5¤QÂm6^IA¶:ÕÂK&KâZÚB) ÜzŒþ½0è¥g‡{{Õ{1éñR<(€P!•ú[D›¨$Êß#êÒ†l§$G‰r)ˆMlñÉö)©V¬¥©-g´+á/iàÏÀuès¥Q`†Y´#×€…;Yà(ÑÌSiI«¢ÕH9"yÆ•afÓÉmPb)­ÆRx¤ [$|U=ÍL êÖr§8èÏ8!OÖ<Ì,¡•‹´å`\`eÏ@³0CN&ô*}Í‹è .#‡æÐŽR;r¤^±ÍØ”îdò<p'ÕÏQ›P1Ûhl`Ò¶°TÌ'ç Ó—J¦"Ajõ‰Dx]¥¨@kM…únö¡K›Ÿ´ Áå¸910cß©µ¬™ˆC­R¯ÔªŸ·ôZnlxÐЯ†h\=h7]eMbe—®&pñ"òÂê5$ßü|¬ÈëHÞ"£ç@ Ý Å!¥‹/Ht̲i&.ã¡ø‚I•ÊöæÓöd.¸M¤ö“ßl £Â@¾¡/̃ªžkÇŸ†ø¾z®QÑ'EYõJˆe?2m¡”“IŸU™—%N¡ ÄÏ\ÜuI,]HM%^äüO¨ I¤ŒTš¾-,V."xaƒÄ’»fÄ-µ&Es@ê…žIí¬çga™3×AJ ibp`™cŸ(„Ð<•ü^08y6)Ñ h§? _#ûr´€SdDJà—$>¤¥4ȧûçÙäPÀÍk·9†Q^šœ!“…B…0Á‘Üù C!ç8‰e…°I¡rÔÁ‹F®43cËŽSË €¿!èJ=#ïb|U¸’zçV_TLó¹qé­£S­.ʰ[FÕ,ÃñæÿÚ»ÚÞ6n$üyù+ö| j]¬µS\¯8#=\àˆÑºÉE.zEa+‰’Òî âʪ®H{ç™r¹’Ü¢@Ûà±"wùΙá3|¦GKß‹YII\ñ%Cÿù½ìÓ‡,݈ýûõ¤Ï7 ¯|Ôˆ5ÔK‹kt|¬£-ÍV.| Ûœtåä’=±uUÑQVç~J._Õõ<œ}ZndƒžJ^â®ÜÙ~Q9j´þšô„‰‡ÎŽÊ%4Ôr¦o¨ÍÞ_\ô|öÐtç¡qPÓ ½*®÷CòÍ/{íß\2øòæí·¯\ˆ¡RrÉZÈL~ ¿ûrÙlýéFZeYë::¹¯(M‡¤ûÎåm«:£"y{[º‹ÉÎÄÎ`±¨ULÆÃ|ÄÑP:’‹ÔÖó”-æ1Ë´Çœ:öáð.Ðtöù䔿`ÏÊ£‘ýê«MÿÁMñbóýzI¸UЬ-~‡6~åý÷Åßñ[ßþés¼ÿûìøþïÏIý]Øpö½•Ê’ôqú²Ø»¹Ø^$§6yÁ¶KfÉôª.Ë¢1°µ§¯Iœ¾¿uÓÁ5¦?2oª½óVMЪ¦bR` /–g?~¿²SR èÇEÿŸ÷Ïž|HŸpI"òb|0®ngïòn€ºFëTL“½ô ç4 šõ±×èLžÿ/.Þ]¿|u{ýG´ñËü˜?íûßÏÿÁøïŸ=?â?ý)é¶p#»Xä•­×î1¤Öù—š0ÓŽ[ëÿ†dÌÝÌ’VØVÉ÷Øö¡^< –Ю|aþíx/npÛ{#ÇUê‚ñMsG2|Á!@éxëÈ(tÆ*ȹ‹lÉ~#íÉÃ÷ȣº•¼é“«!6e‘‡;çÂr=’‹#3YØŠáÂfpTL‡ö"µÆV0&BÄ™:‘· È;ê«Þø3.}”‰¡ïëÒnDÍ©Òm½–ÓT–~W¯åÞÀuƒ4º9ä§`*â?^>êBvõü£3}ãJ ƒ:1€ç‰Ænït81}\§Q=¶~ÊœQ´,T1©|ÅŽÓ4?`J4u©‹õ›öùžmîþÒcÀGêL:±vÁ½2¬“’±^ŒÓ|áøªc'•‹ø¦ Òù(˼ª7Ôy-/ÖjËk%×xL2’Æ‹HgÒß,ÐøÇ«z‰JòÊ01PEý~+’¤ºòú¿—kRNmfÇk¢Ö«Áëtp}÷Í[±ö‚_Ö2DΙ¨£;è#›ó}eáR^1Ðí–)xlsž<¦7å(±Å;¢‡ŽêªÉ‰jbà Ü ›Ý朸þ8Z2êY–¾•0\žˆ2®•I#z„6¸e¦º9[ (¦qí ±KA‘ôÍjú}“ïÏ¿Ìù_c¾åh L˜Ï‚æü¤-WÅÿ$•ZÑÞ}µX¡Z;·.1 hبEKUõ,Ê·²£šC.]ö{,Cöæ: ž‰hS¯Úã×̶0™v¼:FIŸíò®öãoõÓ»³“GÇjdTDw×ÿ½=DQÒ£ÚöäMšÎpÆd$”‘²‡]Ä«vvclƒ¥Ï[lUg4zÆ£šÙ‰¨f'AÕè~/Íb,p ø±Ì@áí@h 9«O“r˜¥××éàêÝÍÛ»é¨w¯Åþž§ÃUa'€G“,ñmûY ÒU¨z¢áW…#ù±•ýÍ;.w±0â× à>ÖEòÏÒ—,û¦5‚áÐ6êÚ‰…êdG1IgšC¨Ÿ6DЊ¥'7ü¤ÆbýUˆ ÜÆ©·1ñ>;éa½jVsb&ï›áD¼‰Ê ½¦Phõ%çé澎Ê$|˖…$‰¡ëüJà% ©‘”H¨Î–Æ:›ô‡É¯(G¥eÞ*tå“è)fzÅTä§G¼öƒ³>«ŽÔÓbißµ@Û5Dîj½å‰HÒÞ%åî1ž¡™¢ háÉ® ñ› ÷wSÐ/PsYLgÝK&Q8_I–ŒÄ <-†¶ÙXÝÐØ0ŒÃŠIP+‘z^ªKmå,³ñº•DÝm€‰+¥¥­± /j¾²WJI§„¾+/nˆïáì½Éý3<ºß˜BÍé ŽçHð˜ .kª•fž•ÔÿH̬žÁGÅϦÌ »<ÖXï7Ÿê°ÂÿȲLäÜî|Ò‡N¦Ù†öI)0ænG`ø8ÿÁVä2¸}ÿ„‡FÂ~Qµa®ÐÜeTaxù\4h)|ÈܪÌ$YÆQÀªfU/ ‰ù<¨+¦Éw*–™ÀÀ`óÜ-áÖ;¦ í–ñ/s„Bo^2Æ!ºwS2pÀˆÓ@Ý·_ûÛï©(Å8 =CdÄAfëQc1¶£Ip ç"H›îï€ócŒË9Ú$­¢)°ý¾­y ©&gê“FxÒž¯I:P =«S1„"û ›Æù–©gZ«l [ká‚F¸Ûë¶;u»µ„*Df ËÙªã¸v±~!Detc€ÓÀã1,þb”êîÄ· ¢ÆW‘æìºË¤¡0ã^ñ¬C¥oMD‘ïG dp O¿¡#‡Ú0É¡FÂ3&&–§t`Ü%ßÝÆŒñxŸ ü™~ýÍmBá°d¸ßoyw[{ºW'¼nâ7b“àÅI‹ÓåZ'! Mˆ ‚•©}Éá—š÷ÊݽPZ>Õƒêî±R5‹H‰`åÂË€}KxLÇtLÇtLÇtLÇtLÇtLÇtLÿïég¿½² exmh-2.8.0/misc/README.gbuffy000664 001047 000144 00000001030 07312143620 016050 0ustar00welchusers000000 000000 gbuffy is a gtk based biff program, which supports multiple mailboxes and MH style boxes. gbuffy can be found at: http://www.fiction.net/blong/programs/gbuffy/ gbuffy-use_mhunseen.patch is a patch by Diego Zamboni which enables gbuffy to use the mh unseen sequence to properly display the number of unseen messages in an MH mailbox. This patch is against version 0.2.2 of gbuffy. The latest gbuffy is 0.2.3, but no one has ported the unseen patch yet. If you do, please send it to the exmh-workers@redhat.com mailing list. exmh-2.8.0/misc/gbuffy-use_mhunseen.patch000664 001047 000144 00000032566 07312143620 020730 0ustar00welchusers000000 000000 Index: config.c =================================================================== RCS file: /home/zamboni/cvsroot/tools/gbuffy/config.c,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 config.c *** config.c 2000/10/16 18:13:09 1.1.1.1 --- config.c 2000/10/19 21:17:54 *************** *** 15,20 **** --- 15,21 ---- static char *DefaultsFile; /* = "GBuffy";*/ static char *get_defaults_file (); + void configure_get_mh_unseenseq (); static proplist_t pl_get_dict_entry (proplist_t dict, char *key) { *************** *** 357,362 **** --- 358,366 ---- return NULL; } + /* Get the unseen-sequence for MH */ + configure_get_mh_unseenseq(); + PLRelease(top); return box; } *************** *** 406,409 **** --- 410,437 ---- strncat (path, "/GBuffy", sizeof (path) - strlen (path)); } return safe_strdup (path); + } + + /* Gets the name of the unseen sequence from the MH config file. + * If multiple names are defined, we use the first one. + */ + void configure_get_mh_unseenseq () + { + char *tmp; + tmp=get_mh_value("~/.mh_profile", "unseen-sequence"); + if (!tmp) + { + if (errno == ENOENT) + { + fprintf (stderr, "-E- File ~/.mh_profile does not exist\n"); + } + fprintf (stderr, "-E- No MH unseen sequence defined - not using it\n"); + } + else + { + /* Get only the first component */ + MH_UnseenSeq=safe_strdup(strtok(tmp, " \t")); + safe_free((void **)&tmp); + } + return; } Index: count.c =================================================================== RCS file: /home/zamboni/cvsroot/tools/gbuffy/count.c,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 count.c *** count.c 2000/10/16 18:13:11 1.1.1.1 --- count.c 2000/10/23 15:50:24 *************** *** 10,15 **** --- 10,17 ---- #include "gbuffy.h" #include "rfc2047.h" + void process_message (BOX_INFO *mbox, GList *headers, char *path, char *fname); + int parse_mime_header (BOX_INFO *mbox, GList *headers, FILE *fp) { static char *buffer = NULL; *************** *** 25,31 **** while (*(buffer = read_rfc822_line (fp, buffer, &buflen)) != 0) { ! if (!strncmp (buffer, "Status:", 7)) { status = TRUE; if (!strchr (buffer, 'R') && !strchr (buffer, 'O')) --- 27,34 ---- while (*(buffer = read_rfc822_line (fp, buffer, &buflen)) != 0) { ! /* Only check Status: header if we are not using an unseen sequence */ ! if (!strncmp (buffer, "Status:", 7) && !MH_UnseenSeq) { status = TRUE; if (!strchr (buffer, 'R') && !strchr (buffer, 'O')) *************** *** 158,173 **** DIR *dp = 0; FILE *fp = 0; char buffer[STRING]; ! char garbage[STRING]; char from[STRING] = ""; char subject[STRING] = ""; char path[_POSIX_PATH_MAX]; - char file[_POSIX_PATH_MAX]; int found = FALSE; int status = FALSE; int is_new = FALSE; int mailfile = TRUE; int count = 0; struct dirent *de; struct stat s; struct timeval t[2]; --- 161,178 ---- DIR *dp = 0; FILE *fp = 0; char buffer[STRING]; ! char tmppath[_POSIX_PATH_MAX]; char from[STRING] = ""; char subject[STRING] = ""; char path[_POSIX_PATH_MAX]; int found = FALSE; int status = FALSE; int is_new = FALSE; int mailfile = TRUE; int count = 0; + char *mh_unseen_seq; + int mh_msg; + char mh_msg_s[STRING]; struct dirent *de; struct stat s; struct timeval t[2]; *************** *** 197,257 **** mbox->num_messages = 0; mbox->new_messages = 0; - - dp = opendir (path); - if (dp == NULL) - return 0; ! while ((de = readdir (dp)) != NULL) { ! mailfile = TRUE; ! if (mbox->type == GB_MH) { ! char *p; ! ! p = de->d_name; ! while (*p && mailfile) { ! if (!isdigit (*p)) ! mailfile = FALSE; ! p++; } ! } ! else if (mbox->type == GB_MAILDIR) { ! if (*de->d_name == '.') ! mailfile = FALSE; } ! if (mailfile) { ! mbox->num_messages++; ! if (headers != NULL || mbox->type == GB_MH) { ! /* Ok, we need to get the From: and Subject: lines */ ! if (mbox->type == GB_MAILDIR) { ! snprintf (file, sizeof (file), "%s/new/%s", path, de->d_name); ! } else { ! snprintf (file, sizeof (file), "%s/%s", path, de->d_name); ! } ! fp = fopen (file, "r"); ! if (fp != NULL) { ! parse_mime_header (mbox, headers, fp); ! fclose(fp); } } ! else { ! /* For maildir, if we aren't getting headers, we just count ! * everything in this directory as new ! */ ! if (mbox->type == GB_MAILDIR) ! mbox->new_messages++; } } } - closedir(dp); - /* Restore the access time of the mailbox for other checking programs */ t[0].tv_sec = s.st_atime; t[0].tv_usec = 0; --- 202,261 ---- mbox->num_messages = 0; mbox->new_messages = 0; ! if (mbox->type == GB_MH && MH_UnseenSeq) { ! /* If the unseen sequence is defined, count according to that */ ! snprintf(tmppath, sizeof(tmppath), "%s/.mh_sequences", path); ! mh_unseen_seq=get_mh_value(tmppath, MH_UnseenSeq); ! if (mh_unseen_seq) { ! /* Seed the sequence string to the function that parses it */ ! expand_mhseq(mh_unseen_seq); ! while((mh_msg=expand_mhseq(NULL))) { ! snprintf(mh_msg_s, sizeof(mh_msg_s), "%d", mh_msg); ! process_message(mbox, headers, path, mh_msg_s); } ! } ! else { ! /* There are no new messages in this folder */ } ! } ! else ! { ! dp = opendir (path); ! if (dp == NULL) ! return 0; ! ! while ((de = readdir (dp)) != NULL) { ! mailfile = TRUE; ! if (mbox->type == GB_MH) { ! char *p; ! ! p = de->d_name; ! while (*p && mailfile) { ! if (!isdigit (*p)) ! mailfile = FALSE; ! p++; } + } + else if (mbox->type == GB_MAILDIR) + { + if (*de->d_name == '.') + mailfile = FALSE; } ! if (mailfile) { ! process_message(mbox, headers, path, de->d_name); } } + closedir(dp); } /* Restore the access time of the mailbox for other checking programs */ t[0].tv_sec = s.st_atime; t[0].tv_usec = 0; *************** *** 261,266 **** --- 265,304 ---- utimes (path, t); return 1; + } + + void process_message (BOX_INFO *mbox, GList *headers, char *path, char *fname) + { + char file[_POSIX_PATH_MAX]; + FILE *fp; + + mbox->num_messages++; + if (headers != NULL || mbox->type == GB_MH) + { + /* Ok, we need to get the From: and Subject: lines */ + if (mbox->type == GB_MAILDIR) + { + snprintf (file, sizeof (file), "%s/new/%s", path, fname); + } + else + { + snprintf (file, sizeof (file), "%s/%s", path, fname); + } + fp = fopen (file, "r"); + if (fp != NULL) + { + parse_mime_header (mbox, headers, fp); + fclose(fp); + } + } + else + { + /* For maildir, if we aren't getting headers, we just count + * everything in this directory as new + */ + if (mbox->type == GB_MAILDIR) + mbox->new_messages++; + } } int external_folder_count (BOX_INFO *mbox, int force, GList *headers) Index: gbuffy.c =================================================================== RCS file: /home/zamboni/cvsroot/tools/gbuffy/gbuffy.c,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 gbuffy.c *** gbuffy.c 2000/10/16 18:13:12 1.1.1.1 --- gbuffy.c 2000/10/16 18:19:43 *************** *** 15,20 **** --- 15,21 ---- char *Maildir = NULL; char *Spooldir = "/var/spool/mail"; char *DefaultNewserver; + char *MH_UnseenSeq = NULL; int Vertical = FALSE; int PollTime = 10; int PollId = 0; Index: gbuffy.h =================================================================== RCS file: /home/zamboni/cvsroot/tools/gbuffy/gbuffy.h,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 gbuffy.h *** gbuffy.h 2000/10/16 18:13:13 1.1.1.1 --- gbuffy.h 2000/10/17 14:57:11 *************** *** 73,78 **** --- 73,85 ---- char *face; } MESSAGE_INFO; + typedef struct _mh_seq + { + int first; + int last; + int cur; + struct _mh_seq *next; + } MH_SEQ; /* Global Variables */ extern int Vertical; *************** *** 83,88 **** --- 90,96 ---- extern int PollTime; extern BOX_INFO *MailboxInfo; extern BOX_CLASS MailboxClass[]; + extern char *MH_UnseenSeq; #ifdef DEBUG extern FILE *debugfile; extern int debuglevel; *************** *** 116,121 **** --- 124,131 ---- char *gbuffy_expand_path (char *s, size_t slen); void safe_realloc (void **p, size_t siz); char *read_rfc822_line (FILE *f, char *line, size_t *linelen); + int expand_mhseq (char *s); + char *get_mh_value (char *file, char *attr); /* nntp.c */ int nntp_get_status (char *group, char *npath, int article_num); Index: lib.c =================================================================== RCS file: /home/zamboni/cvsroot/tools/gbuffy/lib.c,v retrieving revision 1.1.1.1 diff -c -r1.1.1.1 lib.c *** lib.c 2000/10/16 18:13:15 1.1.1.1 --- lib.c 2000/10/23 15:53:40 *************** *** 24,29 **** --- 24,31 ---- #include #include #include + #include + #include #include "gbuffy.h" *************** *** 187,191 **** --- 189,377 ---- } } /* not reached */ + } + + /* Expand an MH sequence into individual message numbers. The first + * call sets the sequence specification, and returns 0. Subsequent + * calls must have a NULL argument and will return succesive elements + * from the sequence. After the sequence is exhausted, NULL will be + * returned. All the elements allocated for the sequence are freed + * as they are returned, so after the last call (the one that returns + * NULL) there's nothing left to be freed. */ + int expand_mhseq (char *s) + { + char *seq_str; + static MH_SEQ *seq=NULL; + MH_SEQ *tmp, *last; + char *p, *q; + + /* If a string is given, initialize things */ + if (s) + { + /* Clear up linked list of subsequences */ + if (seq) + { + MH_SEQ *t = seq; + while (t) + { + seq=t->next; + FREE(&t); + t=seq; + } + } + seq=NULL; + tmp=NULL; + last=NULL; + + /* Allocate the new seq specification */ + seq_str=safe_strdup(s); + + /* Allocate a new linked list of subsequences */ + /* First, split by spaces */ + p=strtok(seq_str, " "); + while (p) + { + /* Create new element and link it in */ + last=tmp; + tmp=safe_calloc(1, sizeof(MH_SEQ)); + if (!seq) + { + seq=tmp; + } + else + { + last->next=tmp; + } + tmp->next=NULL; + + /* Examine the current subsequence to fill the data structure */ + if ((q=strchr(p, '-'))) + { + /* Subsequence with more than one element, of the form first-last */ + *q='\0'; + tmp->first=atoi(p); + tmp->last=atoi((char *)(q+1)); + tmp->cur=-1; + } + else + { + /* Single element subsequence */ + tmp->first=atoi(p); + tmp->last=tmp->first; + tmp->cur=-1; + } + + /* Get next subsequence */ + p=strtok(NULL, " "); + } + + FREE(&seq_str); + return 0; + } + else + { + if (!seq) + { + g_print ("-E- expand_mhseq(NULL) called without seeding first\n"); + sleep(1); + gtk_exit(1); + } + /* Get next element */ + if (seq->cur < 0) + { + /* First element in this subsequence */ + seq->cur = seq->first; + } + else + { + (seq->cur)++; + /* Check if we need to move to the next subsequence */ + if (seq->cur > seq->last) + { + MH_SEQ *t; + t=seq; + seq=seq->next; + /* We free elements of the list as we go past them */ + FREE(&t); + if (!seq) + { + /* We are at the end of the list */ + return 0; + } + else + { + seq->cur = seq->first; + } + } + } + /* Return the current element */ + return seq->cur; + } + } + + /* Get the value of the given attribute from a file in MH-attribute format (attr: value). + */ + char *get_mh_value (char *file, char *attr) + { + FILE *f; + struct stat s; + char path[_POSIX_PATH_MAX]; + char line[2048]; + char *p; + char *res=NULL; + + strfcpy(path, file, sizeof(path)); + gbuffy_expand_path(path, sizeof(path)); + if (stat (path, &s) == -1) + { + /* fprintf (stderr, "-E- Error accessing file %s\n", path); + perror ("stat");*/ + return NULL; + } + else + { + errno=0; + if ( (f=fopen(path, "r")) == NULL) + { + fprintf (stderr, "-E- Error opening %s\n", path); + perror ("fopen"); + return NULL; + } + else + { + while (!feof(f)) + { + if (fgets(line, sizeof(line), f)) + { + line[strlen(line)-1]='\0'; /* Remove end-of-line character */ + /* Split into tokens */ + p=strtok(line, ": \t"); + if (p) + { + /* Look for the attribute name we need, case-insensitive */ + if (strncasecmp(p, attr, strlen(p))==0) + { + /* Get the rest of the line */ + p=strtok(NULL, ""); + if (p) + { + SKIPWS(p); + if (*p) + { + /* Not empty string */ + res=safe_strdup(p); + break; + } + } + /* We get here if the attribute has no value */ + fprintf (stderr, "-E- Null value for attribute %s in file %s\n", attr, path); + } + } + } + } + fclose(f); + return (res); + } + } } exmh-2.8.0/misc/mhthread000664 001047 000144 00000060225 07671676642 015470 0ustar00welchusers000000 000000 #!/usr/bin/perl -w =head1 NAME mhthread - sort an MH folder into 'threaded' order =head1 SYNOPSIS mhthread [options] +folder mhthread [options] /path/to/folder options accepted: [-debug] [-no-write] [-fast] [-lock] =head1 DESCRIPTION This will thread an MH folder. It re-orders the messages (as sortm(1) would do), and annotates each one with a new header, "X-MH-Thread-Markup", which can be displayed by scan(1). Together, this results in the messages being displayed in "threaded" order, as in trn(1) or mutt(1). Sequences will be rewritten appropriately. The folder will also be "packed", as if 'folder -pack' had been run; see folder(1). =head1 RESULTS Here's some sample output from scan(1), after threading the folder: 430 03/23 mathew 3 [Asrg] Re: [OffTopic - NNTP] 431 03/23 Kee Hinckley 5 |- [Asrg] Re: [OffTopic - NNTP] 432 -03/23 Chuq Von Rospach 11 | |- Parameters for success? (was Re: [A 433 03/23 To:Chuq Von Rospa 4 | | \- Re: Parameters for success? (was 434 03/23 Matt Sergeant 3 | \- Re: [Asrg] Re: [OffTopic - NNTP] 435 03/23 Chuq Von Rospach 7 \- Re: [Asrg] Re: [OffTopic - NNTP] =head1 OPTIONS =over 4 =item -fast Use an on-disk cache to speed up operation. =item -lock Use a folder-wide lock-file to synchronize access to folders, so that multiple processes will not stomp on each other's changes or cause folder corruption. If you use this, you should ensure that you also use a locking version of other tools, such as the C script that comes with ExMH (typical location: C). =item -no-write Do not rewrite the messages; instead, output a line for each message noting the actions that would be taken. =item -debug Output debugging info to stderr. =back Note that options will also be read from the C entry in your C<.mh_profile> file, in traditional MH style. =head1 INSTALLATION FOR SCAN To display the results in scan(1) output, use something like the following for the subject-display part of the scan.form file: %(decode{x-mh-thread-markup})%(decode{subject}) If you do not have a "scan.form" file of your own, you will need to set it up. This functionality is accessed using the -form or -format switches to the scan(1) command. To use this, copy the /etc/nmh/scan.default file to your ~/Mail dir and modify it with the above line, then add scan: -form scan.form to your ~/.mh_profile. =head1 INSTALLATION FOR EXMH Add the following function to your C<~/.tk/exmh/user.tcl> file: proc Folder_Thread {} { global exmh Background_Wait Exmh_Status "Threading folder..." blue if {[Ftoc_Changes "Thread"] == 0} then { if {[catch {MhExec mhthread +$exmh(folder)} err]} { Exmh_Status $err error } else { # finish off by using the ExMH packing logic to redisplay folder Folder_Pack # then show the first unseen message Msg_ShowUnseen } } } Next, you need to rebuild the C file. Run C and type: auto_mkindex ~/.tk/exmh *.tcl Now add a button to run this function. To do this, you must exit ExMH first, then edit the C<~/.exmh/exmh-defaults> file and add these files at the top of the file: *Fops.ubuttonlist: thread *Fops.thread.text: Thread *Fops.thread.command: Folder_Thread Restart ExMH, and there should be a new button marked B on the folder button-bar. Press this to re-thread the current folder. =head1 NOTES The threading algorithm uses the In-Reply-To, Message-Id and References headers. Thanks to JWZ for guidance, in the form of his page on threading at C. The 'X-MH-Thread-Markup' headers are encoded using RFC-2047 encoding, using 'no-break space' characters for whitespace, as otherwise MH's scan(1) format code will strip them. Here's an example of the results: X-MH-Thread-Markup: =?US-ASCII?Q?=a0=a0=a0=a0=5c=2d=a0?= =head1 TODO dealing with private sequences (stored in .mh_profile); limiting displayed thread-depth to keep UI readable (so far has not been a problem). =head1 BUGS duplicate messages will always be shuffled in order each time C is run, due to handling of identical Message-Ids. =head1 DOWNLOAD Latest version can be found at http://jmason.org/software/mhthread/ . =head1 AUTHOR Justin Mason, C =head1 VERSION version = 1.5, Apr 25 2003 jm =cut sub usage { die " usage: mhthread [options] +folder mhthread [options] /path/to/folder options accepted: [-debug] [-no-write] [-fast] [-lock] "; } use vars qw( $mh_sequences_file_name $mhthread_options ); read_mh_profile_data (); if (defined $mhthread_options) { unshift (@ARGV, split(' ', $mhthread_options)); } my $folder = ''; my $no_write = 0; my $fast = 0; my $lock = 0; my $dbg = 0; use Getopt::Long qw(:config no_ignore_case prefix_pattern=(--|-)); GetOptions( "debug" => \$dbg, "fast" => \$fast, "lock" => \$lock, "no-write" => \$no_write, '<>' => sub { $folder = $_[0]; } ); usage unless ($folder =~ /\S/); ########################################################################### use vars qw( %TZ %MONTH $locked_folder_lockfile ); use strict; use Time::Local; if (!-d $folder) { chomp ($folder = `mhpath $folder`); if (!-d $folder) { usage(); } } init_tz(); if ($lock) { $SIG{INT} = $SIG{TERM} = \&unlock_and_die; mh_lock_folder ($folder); } # trap die()s eval { my $ctx = thread_folder ($folder); mh_rewrite_folder ($folder, $ctx); }; my $err = $@; # always unlock, even if we died if ($lock) { mh_unlock_folder ($folder); } # and finally, propagate the death exception if ($err) { die $err; } # otherwise we're fine, exit 0 exit; ########################################################################### sub mh_lock_folder { $locked_folder_lockfile = $folder."/.lock"; system ("lockfile", $locked_folder_lockfile); if ($? >> 8 != 0) { die "failed to lock folder $folder (lockfile $locked_folder_lockfile)\n"; # $locked_folder_lockfile = undef; # not needed, we're dead ;) } } sub mh_unlock_folder { if (defined $locked_folder_lockfile) { unlink $locked_folder_lockfile; $locked_folder_lockfile = undef; } } sub unlock_and_die { mh_unlock_folder(); die "killed by signal\n"; } ########################################################################### use vars qw(@to_unlink @to_rename %num2seq %newseqs); sub mh_rewrite_folder { my ($folder, $ctx) = @_; my $newnum = 0; my %msg_rewritten = (); foreach my $num (@{$ctx->{all_message_locs}}) { $msg_rewritten{$num} = 0; } # read the mh_sequences file, and create the map of sequences in this # folder... cf. man mh-sequence, man mark. %num2seq = (); %newseqs = (); if (open (IN, "<".$folder."/".$mh_sequences_file_name)) { while () { /^([^:]+): (.+)$/ or next; my $seq = $1; my $msgs = $2; $newseqs{$seq} ||= []; foreach my $spec (split (' ', $msgs)) { if ($spec =~ /(\d*)\-(\d*)/) { my $start = $1; $start ||= 1; my $end = $2; if (!$end) { # not supposed to happen with nmh at least warn "oops! no end for sequence: '$_'"; $end = 9999; } my $i; for ($i = $start; $i <= $end; $i++) { $num2seq{$i} ||= []; push (@{$num2seq{$i}}, $seq); } } else { $num2seq{$spec} ||= []; push (@{$num2seq{$spec}}, $seq); } } } close IN; } my $changed = 0; foreach my $line (@{$ctx->{sorted}}) { $newnum++; my $oldnum = $line->{num}; my $oldprefix = $line->{existing_prefix} || ''; my $newprefix = $line->{prefix} || ''; $msg_rewritten{$oldnum} = 1; if (mh_rewrite_reorder_message ($ctx, $folder, $oldnum, $newnum, $oldprefix, $newprefix)) { $changed = 1; } } if ($changed) { # now if we missed any messages we read to start with, something's wrong # in the algorithm, and we could lose mail. Don't modify anything; just # die instead. my $failures = 0; foreach my $num (@{$ctx->{all_message_locs}}) { if (!$msg_rewritten{$num}) { warn "mhthread: message not threaded, adding to end: $num\n"; $newnum++; if (!mh_rewrite_reorder_message ($ctx, $folder, $num, $newnum, '', '')) { $failures++; warn "mhthread: oops! failed to recover: $num\n"; } } } if ($failures) { die "mhthread: not modifying old messages due to errors.\n"; } # otherwise, go right ahead and unlink/rename... foreach my $name (@to_unlink) { unlink $name or warn "unlink $name failed: $!"; } foreach my $name (@to_rename) { rename $name.".new", $name or warn "rename $name.new -> $name failed: $@"; } # now mark the sequences with the new message numbering foreach my $seq (keys %newseqs) { my @messages = @{$newseqs{$seq}}; next unless (scalar @messages > 0); my @cmd = ('mark', '+'.$folder, @messages, '-sequence', $seq, '-add', '-zero'); system @cmd; if ($? >> 8 != 0) { warn "'".join (' ',@cmd)."' failed\n"; } } } } sub mh_rewrite_reorder_message { my ($ctx, $folder, $oldnum, $newnum, $oldprefix, $newprefix) = @_; my $oldname = $folder."/".$oldnum; my $newname = $folder."/".$newnum; if ($oldnum eq $newnum && $oldprefix eq $newprefix) { if ($no_write) { print "no move for $oldnum; subj-pfx '$newprefix'\n"; } $dbg and warn "debug: $oldnum: no differences, skipping move/rewrite"; return 0; } if ($no_write) { print "mv $oldnum $newnum; subj-pfx '$newprefix'\n"; return 0; } $dbg and warn "debug: $oldnum->$newnum: move/rewrite"; if (!open (IN, "<".$oldname)) { warn "cannot read $oldname: $@"; return 0; } concat(OUT, ">".$newname.".new") or die "write to $newname.new failed: $@"; while () { # remove an old thread-subject /^X-MH-Thread-Markup: / and next; /^$/ and last; # end of headers print OUT; } print OUT "X-MH-Thread-Markup: ".$newprefix."\n\n"; # dump the body # TODO: use read()/syswrite() while () { print OUT; } close IN; close OUT or die "write to $newname.new failed: $@"; push (@to_unlink, $oldname); push (@to_rename, $newname); foreach my $seq (@{$num2seq{$oldnum}}) { push (@{$newseqs{$seq}}, $newnum); } return 1; } ########################################################################### # note: these global vars are ONLY used inside thread_folder (and # inside functions called by that fn). They are undef'd at the end # of that function's scope. # use vars qw(%mid2msg %tree %toplevel %subjtop %subjsets %subjearliest $uniqid ); sub thread_folder { local ($_); %mid2msg = ( ); # message-id to msg object %tree = ( ); # the threaded tree %toplevel = ( ); # top-level nodes of the tree %subjtop = ( ); # top-level nodes for a given subject string %subjsets = ( ); # top-level nodes with the same subject %subjearliest = ( ); # date of earliest message with that subject $uniqid = 1; # used to "unique-ify" duplicate message-Ids # %dupmessages = (); my $ctx = { sorted => [ ], all_message_locs => [ ], done => { } }; if ($fast) { eval { use Storable; $ctx->{fcache} = retrieve ($folder."/.thread.tmp"); }; if ($@) { $ctx->{fcache} = { }; } # kill it if it's corrupt } opendir(DIR, $folder) or warn "cannot opendir $folder: $!\n"; my $num; while (defined ($num = readdir(DIR))) { next unless ($num =~ /^(\d+)$/); my $msgpath = $folder."/".$num; my $stat_details; my $cachedmsg; if (defined $ctx->{fcache}) { my @st = stat($msgpath); if (!defined $st[7]) { warn "cannot stat, skipped: $msgpath\n"; next; } $stat_details = join('|', @st[0 .. 5], $st[7], $st[9], $st[10]); $cachedmsg = $ctx->{fcache}->{$num}; my $cstat = (defined($cachedmsg) ? $cachedmsg->{stat_details} : ''); if ($cstat eq $stat_details) { $dbg and warn "debug: $num cached message matches"; } else { $dbg and warn "debug: $num cached message no match ". "($stat_details vs $cstat)"; undef $cachedmsg; } } my $msg; if (defined ($cachedmsg)) { $msg = $cachedmsg; } else { my $hdrs = mh_read_message_headers ($ctx, $num, $msgpath); next unless defined($hdrs); $msg = parse_message_headers ($ctx, $num, $hdrs, $stat_details); } my ($subj, $sortsubj, $intdate, $irt, $re_in_subj, $mid); $subj = $msg->{subj}; $sortsubj = $msg->{sortsubj}; $intdate = $msg->{intdate}; $irt = $msg->{irt}; $re_in_subj = $msg->{re_in_subj}; $mid = $msg->{mid}; push (@{$ctx->{all_message_locs}}, $num); $mid2msg{$mid} = $msg; # create the node for that mid, if not already existing if (!exists $tree{$mid}) { $tree{$mid} = { }; } if (!defined $irt) { $dbg and warn "debug: $msg->{num} no IRT ($msg->{mid} $msg->{intdate})"; add_to_top_level ($msg); } else { my %seen = (); { next if ($seen{$irt}); $seen{$irt} = 1; if (!exists $tree{$irt}) { $tree{$irt} = { }; } $dbg and warn "debug: $msg->{num} IRT $irt ($mid $msg->{intdate})"; $tree{$irt}->{$mid} = $msg; } } } closedir DIR; # store it here. we don't care if we rewrite the order later on, # we just want to cache the least-changing messages in the folder. # Doing caching post-writes will require more logic in the threading # part to update this cache, and let's not bother with that! if ($fast && !$no_write) { eval { use Storable; store ($ctx->{fcache}, $folder."/.thread.tmp"); }; if ($@) { warn "failed to cache folder data: $@"; } } # now find "orphaned" message trees, and put them into the top level foreach my $mid (keys %tree) { next if (defined $mid2msg{$mid}); # it has a parent # OK, this is a message-id used in an In-Reply-To header, but we # don't have the msg. Reparent all its children down to the top-level # instead. foreach my $kid (keys %{$tree{$mid}}) { my $msg = $mid2msg{$kid}; # if it's already in the top-level, ignore it next if (defined $toplevel{$msg->{mid}}); if (!defined $msg) { warn "oops! nonexistent kid for $mid"; } $dbg and warn "debug: $msg->{num} orphaned ($msg->{mid})"; add_to_top_level ($msg); } } sub add_to_top_level { my ($msg) = @_; my $sortsubj = $msg->{sortsubj}; my $intdate = $msg->{intdate}; $toplevel{$msg->{mid}} = $msg; # if there was no re: tag, add it to the 'top' set for that subject line if (!$msg->{re_in_subj}) { $subjtop{$sortsubj} = $msg; } $subjsets{$sortsubj} ||= [ ]; push (@{$subjsets{$sortsubj}}, $msg); if (!exists ($subjearliest{$sortsubj}) || $subjearliest{$sortsubj} > $intdate) { $subjearliest{$sortsubj} = $intdate; } } # ok; try to figure out a rudimentary tree from the Subject line alone, # for messages that did not use 'In-Reply-To'. foreach my $subj (keys %subjsets) { # is there a suitable candidate for a 'parent' message? my $parent = $subjtop{$subj}; if (!defined $parent) { next; } foreach my $msg (@{$subjsets{$subj}}) { if ($msg->{re_in_subj} != 0) { # this msg has "Re:", but has no In-Reply-To. reparent it $tree{$parent->{mid}}->{$msg->{mid}} = $msg; delete $toplevel{$msg->{mid}}; } } } # now recursively display the tree. Sort by the date of the earliest message # with that subject line, and by existing number if there's a dup. foreach my $top (sort { $subjearliest{$toplevel{$a}->{sortsubj}} <=> $subjearliest{$toplevel{$b}->{sortsubj}} or $toplevel{$a}->{intdate} <=> $toplevel{$b}->{intdate} or $toplevel{$b}->{num} cmp $toplevel{$a}->{num} } keys %toplevel) { dig_thru_tree ($ctx, 0, $top, $toplevel{$top}); } foreach my $mid (keys %mid2msg) { if (!$ctx->{done}->{$mid}) { my $msg = $mid2msg{$mid}; $dbg and warn "debug: $msg->{num} missed ($msg->{mid})"; push (@{$ctx->{sorted}}, { num => $msg->{num}, existing_prefix => $msg->{existing_prefix}, prefix => '', subject => $msg->{subj} }); } } # delete these state arrays, they're unnecessary now undef %mid2msg; undef %tree; undef %toplevel; undef %subjtop; undef %subjsets; undef %subjearliest; return $ctx; } sub dig_thru_tree { my ($ctx, $level, $mid, $msg) = @_; my $num = $msg->{num}; my $subj = $msg->{subj}; # OK, we want a result like this: # X-MH-Thread-Markup: =?US-ASCII?Q?=a0=a0=a0=a0=5c=2d=a0?= # just use the encoded string directly, it's quicker and simpler. my $MARKUP_START = '=?US-ASCII?Q?'; my $MARKUP_NODE_LAST_CHILD = '=5c=2d=a0'; # "\- " my $MARKUP_NODE_CHILD_W_SIBLINGS = '=7c=2d=a0'; # "|- " my $MARKUP_TREE_EMPTY = '=a0=a0'; # " " my $MARKUP_TREE_BRANCH = '=7c=a0'; # "| " my $MARKUP_END = '?='; # TODO: limit levels to 3 for UI reasons my $levelstr = $MARKUP_END; my $iterlev = $level; my $itermsg = $msg; while ($iterlev > 0) { if ($iterlev == $level) { if (!defined $itermsg || $itermsg->{last_in_level}) { $levelstr = $MARKUP_NODE_LAST_CHILD.$levelstr; } else { $levelstr = $MARKUP_NODE_CHILD_W_SIBLINGS.$levelstr; } } else { if (!defined $itermsg || $itermsg->{last_in_level}) { $levelstr = $MARKUP_TREE_EMPTY.$levelstr; } else { $levelstr = $MARKUP_TREE_BRANCH.$levelstr; } } # get the msg object for the parent message my $irt = $itermsg->{irt}; if (defined $irt) { $itermsg = $mid2msg{$irt}; } $iterlev--; } $levelstr = $MARKUP_START.$levelstr; # printf ("%4d %s%s\n", $num, $levelstr, $subj); push (@{$ctx->{sorted}}, { num => $num, prefix => $levelstr, existing_prefix => $msg->{existing_prefix}, subject => $levelstr.$subj }); $ctx->{done}->{$mid} = 1; # within the tree, just sort by post date (or by number if there's # a duplicate). my $kids = $tree{$mid}; my @sorted = (sort { $kids->{$b}->{intdate} <=> $kids->{$a}->{intdate} or $kids->{$b}->{num} cmp $kids->{$a}->{num} } keys %{$kids}); if (scalar @sorted > 0) { # mark the last one in this level, so it can be displayed with "\-", # instead of "|-" $kids->{$sorted[$#sorted]}->{last_in_level} = 1; # and recurse foreach my $kid (@sorted) { dig_thru_tree ($ctx, $level+1, $kid, $kids->{$kid}); } } } ########################################################################### sub mh_read_message_headers { my ($ctx, $num, $msgpath) = @_; if (!open (IN, "<".$msgpath)) { warn "cannot open, skipped: $msgpath\n"; return undef; } my $hdrs = "\n"; while () { $hdrs .= $_; /^$/ and last; } close IN; return $hdrs; } ########################################################################### sub parse_message_headers { my ($ctx, $num, $hdrs, $stat_details) = @_; my $mid = ''; my $subj = ''; # these are not stored in the public "msg" object after parsing my $date = ''; my $pfx = ''; # remove newlines from headers; makes them easier to parse $hdrs =~ s/\n[ \t]+/ /gs; $hdrs =~ /\nMessage-I[dD]: <([^\n]+)>/ and $mid = $1; $hdrs =~ /\nSubject: ([^\n]+)/ and $subj = $1; $hdrs =~ /\nDate: ([^\n]+)/ and $date = $1; $hdrs =~ /\nX-MH-Thread-Markup: ([^\n]+)\n/ and $pfx = $1; my $intdate = parse_rfc822_date ($date); $intdate ||= 0; # ensure the message-id is unique; if it already exists (a dup msg) then add # some extra bits until it's unique. TODO: figure out a workaround to avoid # the ensuing shuffling of messages; with this algo, if messages 4 and 5 are # identical, then they'll always be swapped each time this is run. if (exists $mid2msg{$mid}) { my $origmid = $mid; while (exists $mid2msg{$mid}) { $uniqid++; $mid .= "|".$uniqid; } # $dupmessages{$origmid} ||= [ ]; # push (@{$dupmessages{$origmid}}, { # 'mid' => $mid, # 'num' => $num # }); } # figure out which message this was a child of. Some In-Reply-To hdrs # contain the email addr of the parent's sender, so add all mid-like # ids; no messages will be found with mid == emailaddr, so it doesn't # matter. For the References hdr, just take the last one. my @irtsary = ($hdrs =~ /\nIn-Reply-To: (?:[^<\n]*<([^\n>]+)>)+/); my @refs = ($hdrs =~ /\nReferences: (?:[^<\n]*<([^\n>]+)>)+/); if (scalar @refs != 0) { unshift (@irtsary, pop @refs); @refs = (); } # In-Reply-To = last of ( reference1, reference2, in-rep-to1, in-rep-to2 ) my $irt = pop @irtsary; # now clean up the subject for sorting, and determine if we have a "Re:" tag my $sortsubj = $subj; my $re_in_subj = 0; while (1) { my $was = $sortsubj; $sortsubj =~ s/^re\[\d+\][:;]\s*//ig and $re_in_subj = 1; $sortsubj =~ s/^re[:;]\s*//ig and $re_in_subj = 1; $sortsubj =~ s/^\s*//ig; ($was eq $sortsubj) and last; } my $msg = { num => $num, subj => $subj, sortsubj => $sortsubj, intdate => $intdate, irt => $irt, re_in_subj => $re_in_subj, existing_prefix => $pfx, mid => $mid }; # cache if we're in "fast" mode if (defined $ctx->{fcache}) { $msg->{stat_details} = $stat_details; $ctx->{fcache}->{$num} = $msg; } return $msg; } ########################################################################### # Parse RFC-822-format dates. sub init_tz { # timezone mappings: in case of conflicts, use RFC 2822, then most # common and least conflicting mapping %TZ = ( # standard 'UT' => '+0000', 'UTC' => '+0000', # US and Canada 'AST' => '-0400', 'ADT' => '-0300', 'EST' => '-0500', 'EDT' => '-0400', 'CST' => '-0600', 'CDT' => '-0500', 'MST' => '-0700', 'MDT' => '-0600', 'PST' => '-0800', 'PDT' => '-0700', 'HST' => '-1000', 'AKST' => '-0900', 'AKDT' => '-0800', # European 'GMT' => '+0000', 'BST' => '+0100', 'IST' => '+0100', 'WET' => '+0000', 'WEST' => '+0100', 'CET' => '+0100', 'CEST' => '+0200', 'EET' => '+0200', 'EEST' => '+0300', 'MSK' => '+0300', 'MSD' => '+0400', # Australian 'AEST' => '+1000', 'AEDT' => '+1100', 'ACST' => '+0930', 'ACDT' => '+1030', 'AWST' => '+0800', ); # month mappings %MONTH = (jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6, jul => 7, aug => 8, sep => 9, oct => 10, nov => 11, dec => 12); } sub parse_rfc822_date { my ($date) = @_; local ($_); my ($yyyy, $mmm, $dd, $hh, $mm, $ss, $mon, $tzoff); # make it a bit easier to match $_ = " $date "; s/, */ /gs; s/\s+/ /gs; # now match it in parts. Date part first: if (s/ (\d+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) / /i) { $dd = $1; $mon = lc($2); $yyyy = $3; } elsif (s/ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +(\d+) \d+:\d+:\d+ (\d{4}) / /i) { $dd = $2; $mon = lc($1); $yyyy = $3; } elsif (s/ (\d+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2,3}) / /i) { $dd = $1; $mon = lc($2); $yyyy = $3; } else { return undef; } # handle two and three digit dates as specified by RFC 2822 if (defined $yyyy) { if (length($yyyy) == 2 && $yyyy < 50) { $yyyy += 2000; } elsif (length($yyyy) != 4) { # three digit years and two digit years with values between 50 and 99 $yyyy += 1900; } } # hh:mm:ss if (s/ (\d?\d):(\d\d)(:(\d\d))? / /) { $hh = $1; $mm = $2; $ss = $4 || 0; } # numeric timezones if (s/ ([-+]\d{4}) / /) { $tzoff = $1; } # UT, GMT, and North American timezones elsif (s/\b([A-Z]{2,4})\b/ / && exists $TZ{$1}) { $tzoff = $TZ{$1}; } # all other timezones are considered equivalent to "-0000" $tzoff ||= '-0000'; # months if (exists $MONTH{$mon}) { $mmm = $MONTH{$mon}; } $hh ||= 0; $mm ||= 0; $ss ||= 0; $dd ||= 0; $mmm ||= 0; $yyyy ||= 0; my $time; eval { # could croak $time = timegm ($ss, $mm, $hh, $dd, $mmm-1, $yyyy); }; if ($@) { return undef; } if ($tzoff =~ /([-+])(\d\d)(\d\d)$/) # convert to seconds difference { $tzoff = (($2 * 60) + $3) * 60; if ($1 eq '-') { $time += $tzoff; } else { $time -= $tzoff; } } return $time; } sub read_mh_profile_data { my $mhprof = $ENV{HOME}."/.mh_profile"; if (defined $ENV{MH}) { $mhprof = $ENV{MH}; } $mh_sequences_file_name = '.mh_sequences'; $mhthread_options = undef; if (open (IN, "<".$mhprof)) { while () { if (/^mh-sequences: (.+)$/) { $mh_sequences_file_name = $1; next; } if (/^mhthread: (.+)$/) { $mhthread_options = $1; next; } } close IN; } } exmh-2.8.0/misc/README.compface000664 001047 000144 00000002373 07471014066 016365 0ustar00welchusers000000 000000 The compface.patch file has a patch that teaches the compface and uncompface programs how to read .xbm format (X bitmap) files, instead of the arcane .ikon files it used before. This patch should apply OK to the files in the compface directory of the picons (a.k.a. facesaver) software. With the new version of uncompface, the exmh X-Face pipeline can just be: uncompface -X To create the X-Face header from a 48x48 .xbm file, just do compface your.xbm > out The file "out" will contain three lines of jibberish. You need to add the X-Face: header e.g. out contains: znu_@QbSegynS/\2YND%-w_L.V$bG-M.}<:^^3tS,BszwEdNEo)-/"eZF^+1]M%>A#"QV8U #*cFsKsnwC63B`A#"QV8U #*cFsKsnwC63B`A#"QV8U #*cFsKsnwC63B` + #endif void BigRead(fbuf) *************** *** 70,77 **** --- 73,111 ---- { register int c, i; register char *s, *t; + static char table_inv[] = { 0,8,4,12,2,10,6,14,1,9, 5,13, 3,11, 7,15 }; + static char table_nop[] = { 0,1,2, 3,4, 5,6, 7,8,9,10,11,12,13,14,15 }; + char *table = table_nop; /* optionally invert bits in nibble */ + register inc = 0; /* optionally swap nimmles */ + int bits; t = s = fbuf; + + /* Does this look like an X bitmap ? */ + if (sscanf(s, "#define %*s %d", &bits) == 1) { + if (bits == 48) { + char type1[128]; + char type2[128]; + while (*s && *s++ != '\n'); + if (sscanf(s, "#define %*s %d", &bits) == 1) if (bits == 48) { + while (*s && *s++ != '\n'); + if (sscanf(s, "static %s %s", type1,type2)==2 && + (!strcmp(type1, "char") || + !strcmp(type2, "char"))) { + while (*s && *s++ != '\n'); + inc = 1; + table = table_inv; + } + else fprintf(stderr, + "warning: xbitmap line 3 not static [unsigned] short ...\n"); + } + else fprintf(stderr, "warning: xbitmaps must be 48x48\n"); + } + else fprintf(stderr, "warning: xbitmaps must be 48x48\n"); + } + /* Ensure s is reset if it was not an X bitmap ... */ + if (! inc) s = fbuf; + for(i = strlen(s); i > 0; i--) { c = (int)*(s++); *************** *** 82,88 **** status = ERR_EXCESS; break; } ! *(t++) = c - '0'; } else if ((c >= 'A') && (c <= 'F')) { --- 116,122 ---- status = ERR_EXCESS; break; } ! (t++)[inc] = table[c - '0']; inc = - inc; } else if ((c >= 'A') && (c <= 'F')) { *************** *** 91,97 **** status = ERR_EXCESS; break; } ! *(t++) = c - 'A' + 10; } else if ((c >= 'a') && (c <= 'f')) { --- 125,131 ---- status = ERR_EXCESS; break; } ! (t++)[inc] = table[c - 'A' + 10]; inc = - inc; } else if ((c >= 'a') && (c <= 'f')) { *************** *** 100,109 **** status = ERR_EXCESS; break; } ! *(t++) = c - 'a' + 10; } ! else if (((c == 'x') || (c == 'X')) && (t > fbuf) && (*(t-1) == 0)) ! t--; } if (t < fbuf + DIGITS) longjmp(comp_env, ERR_INSUFF); --- 134,143 ---- status = ERR_EXCESS; break; } ! (t++)[inc] = table[c - 'a' + 10]; inc = - inc; } ! else if (((c == 'x') || (c == 'X')) && (t > fbuf) && ! ((t-1)[-inc] == table[0])) { t--; inc = -inc; } } if (t < fbuf + DIGITS) longjmp(comp_env, ERR_INSUFF); *************** *** 127,136 **** --- 161,179 ---- { register char *s, *t; register int i, bits, digits, words; + extern int xbitmap; + int digsperword = DIGSPERWORD; + int wordsperline = WORDSPERLINE; s = F; t = fbuf; bits = digits = words = i = 0; + if (xbitmap) { + sprintf(t,"#define noname_width 48\n#define noname_height 48\nstatic char noname_bits[] = {\n "); + while (*t) t++; + digsperword = 2; + wordsperline = 15; + } while (s < F + PIXELS) { if ((bits == 0) && (digits == 0)) *************** *** 138,162 **** *(t++) = '0'; *(t++) = 'x'; } ! if (*(s++)) ! i = i * 2 + 1; ! else ! i *= 2; if (++bits == BITSPERDIG) { ! *(t++) = *(i + HexDigits); bits = i = 0; ! if (++digits == DIGSPERWORD) { *(t++) = ','; digits = 0; ! if (++words == WORDSPERLINE) { *(t++) = '\n'; words = 0; } } } } *(t++) = '\0'; } --- 181,223 ---- *(t++) = '0'; *(t++) = 'x'; } ! if (xbitmap) { ! if (*(s++)) ! i = (i >> 1) | 0x8; ! else ! i >>= 1; ! } ! else { ! if (*(s++)) ! i = i * 2 + 1; ! else ! i *= 2; ! } if (++bits == BITSPERDIG) { ! if (xbitmap) { ! t++; ! t[-(digits & 1) * 2] = *(i + HexDigits); ! } ! else *(t++) = *(i + HexDigits); bits = i = 0; ! if (++digits == digsperword) { + if (xbitmap && (s >= F + PIXELS)) break; *(t++) = ','; digits = 0; ! if (++words == wordsperline) { *(t++) = '\n'; + if (xbitmap) *(t++) = ' '; words = 0; } } } + } + if (xbitmap) { + sprintf(t, "}\n"); + while (*t) t++; } *(t++) = '\0'; } *** uncmain.c.dist Thu Oct 24 03:28:07 1991 --- uncmain.c Thu Dec 22 09:58:34 1994 *************** *** 28,33 **** --- 28,35 ---- int outfile = 1; char *outname = ""; + int xbitmap=0; + /* basename of executable */ char *cmdname; *************** *** 59,64 **** --- 61,73 ---- while (**argv) if (*((*argv)++) == '/') cmdname = *argv; /* find the command's basename */ + + if (argc > 1 && !strcmp(argv[1], "-X")) + { + xbitmap++; + argc--; + argv++; + } if (argc > 3) { exmh-2.8.0/misc/query_jpilot.sh000644 001047 000144 00000002763 07665150501 017014 0ustar00welchusers000000 000000 #!/usr/local/bin/bash # query_jpilot.sh # (c) Gerhard Siegesmund (gerhard.siegesmund@epost.de) # Adjust the paths. TEMP=/tmp jpilotdump=/usr/local/bin/jpilot-dump # In which records of an entry to search. Here e.g. the 4. userdefined field # where I put the nickname of people. You can use (nearly) anything you like, # just don't use tabs in here (see jpilot-dump -? for help). If you just want # to search for the default, meaning name, lastname company, just set to "" more="" #more=" %U4" tempnumber=$RANDOM.$$.`date +%s` tempdb=$TEMP/jpilot-email-dump.$tempnumber tempresult=$TEMP/jpilot-email-result.$tempnumber function thatsit () { rm -f $tempdb rm -f $tempresult exit $1 } # Is there a querystring? if [ -z "$1" ]; then echo "No querystring. Please try again with a querystring!" exit 1 fi # Create temporary Database-File (for nummer in 1 2 3 4 5; do $jpilotdump +A"%p$nummer%t%f %l%t%c$more" -A done) | grep @ > $tempdb numall=`cat $tempdb | wc -l | sed -e "s/[^0-9]//g"` if [ $numall = "0" ]; then echo "No emails found in your jpilot-database" thatsit 2 fi # Search for the querystring cat $tempdb | grep -i $1 > $tempresult numres=`cat $tempresult | wc -l | sed -e "s/[^0-9]//g"` if [ $numres = "0" ]; then echo "Didn't find the querystring \"$1\" in the database (Searched $numall records)." thatsit 3 fi # Output the result echo "Searched $numall records. Found $numres matching records." cat $tempresult thatsit 0 exmh-2.8.0/misc/jpilot-lookup.tcl000644 001047 000144 00000001464 07665150531 017246 0ustar00welchusers000000 000000 proc jpilot-addr-lookup {n} { # look up addresses in jpilot's address book Exmh_Status "Querying jpilot for $n" if [catch {set jpilot_results [eval exec query_jpilot.sh $n]} e] { Exmh_Status "Error executing jpilot-dump: $e" return {} } # the jpilot_results looks like this: # e-mail@add.ress\tlastname firstname\tcompany set result {} foreach i [split $jpilot_results \n] { if [string match {*@*} $i] { lappend result "[jpilot-addr-formatformail $i]" } } return $result } proc jpilot-addr-formatformail { line } { global addr_db set s [split $line \t] # s will contain "email" "lastname firstname" "company" set email [lindex $s 0] set name [lindex $s 1] set company [lindex $s 2] return [LDAP_Entry_FormatForMail $email $name] } exmh-2.8.0/misc/README.mhthread000664 001047 000144 00000001727 07671676641 016425 0ustar00welchusers000000 000000 mhthread -- sort an MH folder into 'threaded' order This will thread an MH folder. It re-orders the messages (as sortm(1) would do), and annotates each one with a new header, "X-MH-Thread-Markup", which can be displayed by scan(1). Together, this results in the messages being displayed in "threaded" order, as in trn(1) or mutt(1). Sequences will be rewritten appropriately. The folder will also be "packed", as if 'folder - pack' had been run; see folder(1). RESULTS Here's some sample output from scan(1), after threading the folder: 430 03/23 mathew 3 [Asrg] Re: [OffTopic - NNTP] 431 03/23 Kee Hinckley 5 |- [Asrg] Re: [OffTopic - NNTP] 432 -03/23 Chuq Von Rospach 11 | |- Parameters for success? (was Re: [A 433 03/23 To:Chuq Von Rospa 4 | | \- Re: Parameters for success? (was 434 03/23 Matt Sergeant 3 | \- Re: [Asrg] Re: [OffTopic - NNTP] 435 03/23 Chuq Von Rospach 7 \- Re: [Asrg] Re: [OffTopic - NNTP] exmh-2.8.0/misc/README.mybogo.html000664 001047 000144 00000017500 07671677570 017066 0ustar00welchusers000000 000000 Bayesian spam filters

Bayesian spam filters

Introduction

Bayesian spam filters offer a more elegant (in my opinion) alternative to network-level and regular expression filters. The seminal article on the subject is Paul Graham's "A Plan for Spam" (2002) [1], although there are earlier descriptions of the method (Pantel and Lin, 1998; Sahami, et al., 1998). Essentially, the program evaluates each mail as a bag of tokens--words, numbers, (parts of each in some methods) and parts of the header are all individual tokens--and maintains a database with the probability that each token is in a spam mailfile or a non-spam (ham) mailfile. Once the database is primed with a significant number of mails, the filter can make a pretty good guess as to whether an email shown is spam or ham. Improvements have been made to the original algorithm (which may or may not really be Bayesian, but that's another story) by Graham [2] and Robinson [3].

Applications

I myself use bogofilter (which offers different algorithms and seems to be the most active of the projects), so most of the rest of this guide will talk first about using bogofilter, and then try to mention the other applications or the general case. The first step, of course, is to download and install one of the Bayesian spam filters available:

Filtering on delivery

The usefulness of the system comes from having it filter spam mailfiles to a spam folder on delivery, which is checked once in a while for false positives (hams in the spam folder). Just as on the spamassassin wiki entry, I have bogofilter called after lists and before the catch-all with the following entry:

 :0HB:
 * ? bogofilter -u
 | rcvstore +bogus

If you get spam regularly on any lists, you'll probably want to put it before those mailfiles get filtered out, obviously.

Bogofilter can also be called as a pass-through filter as

 :0fw
 | bogofilter -u -e -p
 # some more recipes
 :0:
 * ^X-Bogosity: Yes, tests=bogofilter
 | rcvstore +bogus

This is more similar to the way SpamAssassin works and would simplify integrating the two. This is also the way SpamOracle is called. There is more information and examples in the relevant man pages.

Integration with Exmh

If you have your filtering program called so that it adds the mailfile's tokens to the database when it evaluates the mail, you need to tell it when it gets one wrong. I've written a hook to exmh to simplify this task for users of bogofilter and SpamOracle. SpamBayes doesn't add the tokens; it is run nightly on the respective folders.

Files

The routines are in the file named mybogo.tcl and is (might be?) in the misc/ directory. This file needs to be placed in your exmh personal library directory. If you haven't already you also must copy the user.tcl file from the EXMH scripts directory and add the call to Bogo_Init to the User_Init procedure at the top of that file. Mine looks like:

 proc User_Init {} {
     # The main routine calls User_Init early on, after only
     # Mh_Init, Preferences_Init, and ExmhLogInit (for Exmh_Debug)

     Bogo_Init
     if {0} {
         # Arrange to have some folders labels displayed as icons, not text
         global folderInfo
         set folderInfo(bitmap,exmh) @/tilde/welch/bitmaps/exmh
     }
     return
 }

Once the files are in place, start the tcl command interpreter (prompt$ wish) and type 'auto_mkindex . *.tcl' to update the index for your user directory.

Preferences

The next time you start EXMH, there will be a new preferences section for Bayesian Spam Filters. You can select bogofilter, SpamOracle, or some other software. If you're using some other program, put the invocation (with flags) in the correct boxes. The program will be invoked as exec "$bogo(spamprog) < $mail(path)" so it needs to accept the message on stdin. As far as I can tell they all do.

If you're using bogofilter, you need to select whether or not the messages are mismarked, because then bogofilter will delete the tokens from the database to which the mailfile was mismarked and add the tokens to the correct one. SpamOracle doesn't have this feature, it just adds the tokens to the correct database. If you're calling bogofilter like above (with the -u flag), you want this flag on.

The last set of preferences tells EXMH what to do with the message after you've marked it. I redirect spam messages to my spam folder and redirect ham messages to the inbox, but you can opt to do nothing, or delete it. This should probably be taken out of the preferences and put in the function call.

Invoking

I have the routine set to be invoked from either a pull-down menu or from the keyboard. For the menu, add the following to your .exmh/exmh-defaults:

 ! Add this entry to your Mops.* resources if they already exist!
 *Mops.umenulist:                bogo
 *Mops.ug_current:               bogo
 *Mops.ug_range:                 bogo
 *Mops.ug_nodraft:               bogo

 *Mops.bogo.text:                Spam...
 *Mops.bogo.m.entrylist:         yes no
 *Mops.bogo.m.l_yes:             Mismarked Spam <Key-S>
 *Mops.bogo.m.c_yes:             MyBogoFilter spam
 *Mops.bogo.m.l_no:              Mismarked Ham <Key-H>
 *Mops.bogo.m.c_no:              MyBogoFilter ham

To add the corresponding key bindings, select Bindings...->Commands from the top menu, and type 'MyBogoFilter spam' in the Command field and <Key-S> in the Key field. Check to make sure Key-S isn't already bound; it is not by default. Either delete that key binding (by clearing the field) or choose another key for MyBogoFilter spam. Do the same thing for MyBogoFilter ham.

I think that's it! You should be up, running, and hopefully spam-free!

System-Wide Setup

All of the above are for a personal implementation of bogofilter, or possibly a system-wide one where the user has write permission on the bogofilter database files. For a system-wide setup, we'll presume that bogofilter is called as a pass-through filter from the /etc/procmailrc as user bogo. Then, users can filter mailfiles based on the X-Bogosity: header field from their own .procmailrc files. For reporting mis-marked mailfiles, the system adminstrator should write a script that takes incoming mail for user bogo and runs the program accordingly. Users then need to bounce the mismarked mail to the bogo user. More on this later.

Question, comments? Email Pat Carr at pmc1 -at- cornell.edu or edit this.


Updated on 29 May 2003, 00:08 GMT   -   Edit Bayesian spam filters
Search - Recent Changes - Reference - Index - Go to Beedub's Wiki - Help exmh-2.8.0/misc/mhthread-manpage.html000664 001047 000144 00000014264 07671676642 020043 0ustar00welchusers000000 000000 #!/usr/bin/perl -w =head1 NAME

SYNOPSIS

        mhthread [options] +folder
        mhthread [options] /path/to/folder

options accepted: [-debug] [-no-write] [-fast] [-lock]


DESCRIPTION

This will thread an MH folder. It re-orders the messages (as sortm(1) would do), and annotates each one with a new header, ``X-MH-Thread-Markup'', which can be displayed by scan(1).

Together, this results in the messages being displayed in ``threaded'' order, as in trn(1) or mutt(1).

Sequences will be rewritten appropriately. The folder will also be ``packed'', as if 'folder -pack' had been run; see folder(1).


RESULTS

Here's some sample output from scan(1), after threading the folder:

  430  03/23 mathew              3  [Asrg] Re: [OffTopic - NNTP]
  431  03/23 Kee Hinckley        5  |- [Asrg] Re: [OffTopic - NNTP]
  432 -03/23 Chuq Von Rospach   11  | |- Parameters for success? (was Re: [A
  433  03/23 To:Chuq Von Rospa   4  | | \- Re: Parameters for success? (was 
  434  03/23 Matt Sergeant       3  | \- Re: [Asrg] Re: [OffTopic - NNTP]
  435  03/23 Chuq Von Rospach    7  \- Re: [Asrg] Re: [OffTopic - NNTP]


OPTIONS

-fast
Use an on-disk cache to speed up operation.

-lock
Use a folder-wide lock-file to synchronize access to folders, so that multiple processes will not stomp on each other's changes or cause folder corruption. If you use this, you should ensure that you also use a locking version of other tools, such as the lockedrcvstore script that comes with ExMH (typical location: /usr/lib/exmh*/misc/lockedrcvstore).

-no-write
Do not rewrite the messages; instead, output a line for each message noting the actions that would be taken.

-debug
Output debugging info to stderr.

Note that options will also be read from the mhthread entry in your .mh_profile file, in traditional MH style.


INSTALLATION FOR SCAN

To display the results in scan(1) output, use something like the following for the subject-display part of the scan.form file:

  %(decode{x-mh-thread-markup})%(decode{subject})

If you do not have a ``scan.form'' file of your own, you will need to set it up. This functionality is accessed using the -form or -format switches to the scan(1) command. To use this, copy the /etc/nmh/scan.default file to your ~/Mail dir and modify it with the above line, then add

  scan: -form scan.form

to your ~/.mh_profile.


INSTALLATION FOR EXMH

Add the following function to your ~/.tk/exmh/user.tcl file:

  proc Folder_Thread {} {
    global exmh
    Background_Wait
    Exmh_Status "Threading folder..." blue
    if {[Ftoc_Changes "Thread"] == 0} then {
      if {[catch {MhExec mhthread +$exmh(folder)} err]} {
          Exmh_Status $err error
      } else {
        # finish off by using the ExMH packing logic to redisplay folder
        Folder_Pack
        # then show the first unseen message
        Msg_ShowUnseen
      }
    }
  }

Next, you need to rebuild the tclIndex file. Run tclsh and type:

  auto_mkindex ~/.tk/exmh *.tcl

Now add a button to run this function. To do this, you must exit ExMH first, then edit the ~/.exmh/exmh-defaults file and add these files at the top of the file:

  *Fops.ubuttonlist: thread
  *Fops.thread.text: Thread
  *Fops.thread.command: Folder_Thread

Restart ExMH, and there should be a new button marked Thread on the folder button-bar. Press this to re-thread the current folder.


NOTES

The threading algorithm uses the In-Reply-To, Message-Id and References headers. Thanks to JWZ for guidance, in the form of his page on threading at http://www.jwz.org/doc/threading.html.

The 'X-MH-Thread-Markup' headers are encoded using RFC-2047 encoding, using 'no-break space' characters for whitespace, as otherwise MH's scan(1) format code will strip them. Here's an example of the results:

  X-MH-Thread-Markup: =?US-ASCII?Q?=a0=a0=a0=a0=5c=2d=a0?=


TODO

dealing with private sequences (stored in .mh_profile); limiting displayed thread-depth to keep UI readable (so far has not been a problem).


BUGS

duplicate messages will always be shuffled in order each time mhthread is run, due to handling of identical Message-Ids.


DOWNLOAD

Latest version can be found at http://jmason.org/software/mhthread/ .


AUTHOR

Justin Mason, jm dash mhthread dash nospam at jmason dot org


VERSION

version = 1.5, Apr 25 2003 jm

exmh-2.8.0/misc/exmhwrapper000654 001047 000144 00000000571 10063341605 016204 0ustar00welchusers000000 000000 #!/bin/sh displayfile=$HOME/.exmh/.display if [ -e $displayfile ] ; then display=`cat $displayfile` if [ "$display" != "" ]; then /usr/bin/wish -f -display $display < $displayfile exmh rm $displayfile exit 0 exmh-2.8.0/misc/sequence.patch000664 001047 000144 00000014142 11744612066 016561 0ustar00welchusers000000 000000 This is a patch that reflects a non-trivial change I made to how exmh tracks changes in the unseen sequence. The original behavior uses a Tcl variable trace on an array variable that gets updated for a lot of reasons. This can be expensive and so this patch reflects a change away from this specific variable trace. However, I don't think this change is 100% perfect, and you may notice less than perfect updates to the UI because of this change. So, instead of committing this I'm just saving the patch in case someone wants to tinker with it. Brent Welch, April 2012 cvs diff: Diffing lib Index: lib/fcache.tcl =================================================================== RCS file: /cvsroot/exmh/exmh/lib/fcache.tcl,v retrieving revision 1.13 diff -u -r1.13 fcache.tcl --- lib/fcache.tcl 5 Apr 2003 01:24:35 -0000 1.13 +++ lib/fcache.tcl 21 Apr 2012 20:08:12 -0000 @@ -68,7 +68,8 @@ trace variable fcache(nicknames) w Fcache_Redisplay trace variable fcache(unseenCount) w Fcache_Redisplay - trace variable flist wu Fcache_RedisplayUnseen + # This is an expensive trace. See SeqSetCount + # trace variable flist wu Fcache_RedisplayUnseen # Init the cache and handle various error cases. @@ -96,11 +97,10 @@ proc Fcache_Redisplay { args } { Fcache_Display 1 } -proc Fcache_RedisplayUnseen { array elem op } { +proc Fcache_RedisplayUnseen { seq } { global fcache mhProfile if {$fcache(unseenCount)} { - set force [scan $elem "seqcount,%s,$mhProfile(unseen-sequence)" folder] - Fcache_Display $force + Fcache_Display [expr {"$seq" == "$mhProfile(unseen-sequence)"}] } } Index: lib/mh.tcl =================================================================== RCS file: /cvsroot/exmh/exmh/lib/mh.tcl,v retrieving revision 1.60 diff -u -r1.60 mh.tcl --- lib/mh.tcl 18 Jun 2008 09:53:53 -0000 1.60 +++ lib/mh.tcl 21 Apr 2012 20:08:12 -0000 @@ -578,6 +578,12 @@ # Directly modify the context files to add/remove/clear messages # from a sequence proc Mh_SequenceUpdate { folder how seq {msgids {}} {which public}} { + Exmh_Debug Mh_SequenceUpdate $folder $how $seq $msgids $which + Mh_SequenceUpdateTimed $folder $how $seq $msgids $which + Exmh_Debug Mh_Sequence Update complete +} + +proc Mh_SequenceUpdateTimed { folder how seq {msgids {}} {which public}} { global mhProfile mhPriv if {0} { Exmh_Debug Mh_SequenceUpdate $folder $how $seq $msgids $which Index: lib/sequences.tcl =================================================================== RCS file: /cvsroot/exmh/exmh/lib/sequences.tcl,v retrieving revision 1.24 diff -u -r1.24 sequences.tcl --- lib/sequences.tcl 7 Jan 2005 06:09:09 -0000 1.24 +++ lib/sequences.tcl 21 Apr 2012 20:08:12 -0000 @@ -174,7 +174,7 @@ SeqWin_Init - # This trace is crude, and now we do all the updating in + # This trace is expensive, and now we do all the updating in # procedures in this file, so the calls are made explicitly. # trace variable flist wu Seq_Trace # Seq_Trace is now SeqCount @@ -186,11 +186,15 @@ # flist($seq) is the list of folders that have messages # in that sequence. Here we ensure that invariant. set num $flist(seqcount,$folder,$seq) - ldelete flist($seq) $folder + set ix [lsearch $flist($seq) $folder] if {$num > 0} { - lappend flist($seq) $folder + if {$ix < 0} { + lappend flist($seq) $folder + } } elseif {![info exist flist($seq)]} { set flist($seq) {} + } elseif {$ix >= 0} { + ldelete flist($seq) $folder } # Now tally up any changes if [info exists flist(oldseqcount,$folder,$seq)] { @@ -217,6 +221,13 @@ BgRPC SeqWinShowSeqPane $seq } } +# This procedure replaces an expensive trace on the flist var from fcache.tcl + +proc SeqSetCount {folder seq count} { + global flist mhProfile + set flist(seqcount,$folder,$seq) $count + Fcache_RedisplayUnseen $seq +} # Reset the cached state about sequences because the user # has just packed, sorted, or threaded the folder. @@ -228,7 +239,7 @@ global flist Mh_SequenceUpdate $folder clear $seq set flist(seq,$folder,$seq) {} - set flist(seqcount,$folder,$seq) 0 + SeqSetCount $folder $seq 0 ldelete flist($seq) $folder } @@ -276,7 +287,7 @@ if {$num <= 0} { return } - set flist(seqcount,$folder,$seq) [expr $new + $num] + SeqSetCount $folder $seq [expr {$new + $num}] set flist(seq,$folder,$seq) [concat $flist(seq,$folder,$seq) $msgids] if {![info exist flist($seq)] || ([lsearch $flist($seq) $folder] < 0)} { lappend flist($seq) $folder @@ -301,23 +312,26 @@ # Mh_SequenceUpdate $folder replace $seq $msgids set newnum [llength $msgids] if {$newnum <= 0} { - set flist(seqcount,$folder,$seq) 0 + SeqSetCount $folder $seq 0 set flist(seq,$folder,$seq) {} SeqCount $folder $seq return } - set flist(seqcount,$folder,$seq) $newnum +Exmh_Debug flist(seqcount) [time { + SeqSetCount $folder $seq $newnum set flist(seq,$folder,$seq) $msgids - if {![info exist flist($seq)] || ([lsearch $flist($seq) $folder] < 0)} { - lappend flist($seq) $folder + if {![info exist flist($seq)]} { + # SeqCount will append $folder to flist($seq) if necessary + set flist($seq) {} } - SeqCount $folder $seq +}] + Exmh_Debug SeqCount $folder $seq [time {SeqCount $folder $seq}] if {$seq == $mhProfile(unseen-sequence)} { if {[string compare $folder $exmh(folder)] != 0 && [lsearch $flist(unvisited) $folder] < 0} { lappend flist(unvisitedNext) $folder } - Fdisp_HighlightUnseen $folder + Exmh_Debug Fdisp_HighlightUnseen [time {Fdisp_HighlightUnseen $folder}] } } # Deletes messages from a sequence @@ -349,7 +363,9 @@ } proc Seq_Msgs { folder seq } { global flist - Seq_Set $folder $seq [Mh_Sequence $folder $seq] +Exmh_Debug Mh_Sequence $folder $seq [time {set s [Mh_Sequence $folder $seq]}] +# Seq_Set $folder $seq [Mh_Sequence $folder $seq] +Exmh_Debug Seq_Set $folder $seq [time {Seq_Set $folder $seq $s}] return $flist(seq,$folder,$seq) } proc Seq_Count { folder seq } { cvs diff: Diffing lib/bitmaps cvs diff: Diffing lib/html exmh-2.8.0/misc/mafe/mafe000755 001047 000144 00000053554 10005705401 015467 0ustar00welchusers000000 000000 #!/usr/bin/perl #use strict; use Tk; require Tk::ROText; require Tk::BrowseEntry; require Tk::Dialog; (%aliases,%distros,%dtags,%olddtags,%akeys,%dkeys,%nakeys,$ndkeys,$CDchoice,$CAchoice,$WhichBox)=(); @hnames=qw(aliases distros); @CADc=qw(CAchoice CDchoice); @BNames=qw(Distro Alias); $Defaultdtag="Undisclosed Recipients"; $UpperLimit=3; $MaxLineLength=80; $DefaultAddress=""; $DefaultAddress=$ARGV[0] if $ARGV[0] ne ""; $configdir=$ENV{HOME}; $configdir.='/' if ! ($configdir=~/\/\s*$/); open (CONFIG,$configdir.'.exmh/exmh-defaults') || die "Can't open ${configdir}.exmh/exmh-defaults\n"; while () { $BFont=$1 if /s*\*Button\.font:\s+(.*)/; $TFont=$1 if /s*\*Msg\*Text\.font:\s+(.*)/; } $DColour='grey'; close (CONFIG); open (MH,$configdir.'.mh_profile') || die "Can't open ${configdir}.mh_profile"; while () { chomp; s/^\s+//; if (!(/^\#/)){ $AliasFile=$1 if /\s*AliasFile:\s*(.*)/; } } close(MH); (%AliasCheck,@AliasFile)=(); foreach $key (split(/\s+/,$AliasFile)) { if (!$AliasCheck{$key}) { push(@AliasFile,$key); $AliasCheck{$key}=$key; } } # First, construct main window my $main=MainWindow->new(-title=>"mafe: MH alias file editor"); if ($#AliasFile>0) { $ShowFile=$main->BrowseEntry(-autolimitheight=>1, -choices=>\@AliasFile, -width=>22,-font=>$TFont, -browsecmd=> sub{&SwitchAliasFile($_[1])})-> grid(-column=>0,-row=>0,-sticky=>'nw',-columnspan=>5); $whichfile=$ShowFile->Subwidget("entry"); } else { $ShowFile=$main->ROText(-width=>22, -height=>1,-font=>$TFont,-relief=>'flat')-> grid(-column=>0,-row=>0,-sticky=>'nw',-columnspan=>5); $ShowFile->insert('end',$AliasFile[0]); } $CurrentFile=$AliasFile[0]; $oldCFile=$CurrentFile; my $BFrame=$main->Frame->grid(-row=>0,-column=>1,-sticky=>'ne'); my $help=$BFrame->Button(-text=>'Help', -font=>$BFont, -padx=>0)->grid(-column=>4, -row=>0,-sticky=>'e'); my $save=$BFrame->Button(-text=>'Save', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&SaveData}) ->grid(-column=>5, -row=>0,-sticky=>'e'); my $dismiss=$BFrame->Button(-text=>'Dismiss', -font=>$BFont, -padx=>0, -command=> sub{&Dismiss}) ->grid(-column=>6, -row=>0,-sticky=>'e'); my $dialog=$main->Dialog(-title=>'Unsaved Data!', -text=>'Blah Blah Blah', -font=>$TFont, -default_button=>2, -buttons=>[('Save', 'Don\'t Save', "Cancel")]); my (@ADFrame,@ADLabel,@ADBox,@ADEntry,@ADBFrame)=(); my (@ADComp,@ADInsert,@ADChange,@ADDelete,@ADSwap)=(); my @LabelNames=qw(Aliases Distributions); foreach my $ii (0..1) { $ADFrame[$ii]=$main->Frame->grid(-row=>2+$ii, -column=>0,-sticky=>'nw'); $ADLabel[$ii]=$ADFrame[$ii]->Label(-text=>$LabelNames[$ii], -font=>$TFont) ->grid(-column=>0, -row=>0); $ADBox[$ii]=$ADFrame[$ii]->Scrolled('Listbox', -width=>22, -height=>10, -scrollbars=>'oe', -font=>$TFont) ->grid(-column=>0, -row=>1, -sticky=>'wn'); $ADBox[$ii]->bind('', sub{&show_tag($ADBox[$ii]->get('active'),$ii)}); $ADEntry[$ii]=$ADFrame[$ii]->Entry(-width=>26, -font=>$TFont) ->grid(-column=>0, -row=>2, -sticky=>'wn'); $ADBFrame[$ii]=$ADFrame[$ii]->Frame->grid(-column=>0, -row=>3); $ADComp[$ii]=$ADBFrame[$ii]->Button(-text=>'Comp', -font=>$BFont, -padx=>0, -command=>sub{&Compose($ADBox[$ii]->get('active'))}, -state=>'normal') ->grid(-column=>0, -row=>0); $ADInsert[$ii]=$ADBFrame[$ii]-> Button(-text=>'Insert', -font=>$BFont, -padx=>0, -command=>sub{&InsertAlias($ii,$ADEntry[$ii]->get)})-> grid(-column=>1, -row=>0); $ADChange[$ii]=$ADBFrame[$ii]-> Button(-text=>'Change', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&ChangeAlias($ii,$ADEntry[$ii]->get)})-> grid(-column=>2, -row=>0); $ADDelete[$ii]=$ADBFrame[$ii]-> Button(-text=>'Delete', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&DeleteAlias($ii,$ADBox[$ii]->get('active'))})-> grid(-column=>3, -row=>0); $ADSwap[$ii]=$ADBFrame[$ii]-> Button(-text=>$BNames[$ii], -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&SwapType($ii,$ADBox[$ii]->get('active'))})-> grid(-column=>4, -row=>0); } my $DistroFrame=$main->Frame->grid(-column=>1, -row=>1); my $AddressFrame=$main->Frame->grid(-column=>1, -row=>2,-rowspan=>2); my $AddressLabel=$AddressFrame->Label(-text=>'Addresses', -font=>$TFont) -> grid(-column=>1, -row=>0); my $DistroLabel=$AddressFrame-> Label(-text=>'Distro. Tag:', -font=>$TFont, -fg=>$DColour)-> grid(-column=>0, -row=>1, -sticky=>'e'); my $DistroShowFrame=$AddressFrame->Frame->grid(-column=>1, -row=>1,-sticky=>'w'); my $DistroName=$DistroShowFrame-> Entry(-width=>26, -state=>'disabled', -font=>$TFont, -relief=>'flat', -validate=>'focus', -validatecommand=>sub{$SetButton->configure(-state=>'normal'); return 1;})-> grid(-column=>0, -row=>0, -sticky=>'w'); my $SetButton=$DistroShowFrame-> Button(-text=>'Set', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&ChangeDTag($CDchoice)})-> grid(-column=>1, -row=>0, -sticky=>'w'); my $AddressBox=$AddressFrame-> Scrolled('Listbox', -width=>30, -height=>20, -scrollbars=>'osoe', -font=>$TFont) -> grid(-column=>1, -row=>2,-sticky=>'nw'); $AddressBox->bind('<1>', sub{&show_tag('',2)}); my $AddressEntry=$AddressFrame->Entry(-width=>38, -font=>$TFont)-> grid(-column=>1, -row=>3, -sticky=>'wn'); $AddressEntry->insert(0,$DefaultAddress) if $DefaultAddress ne ""; my $EBFrame=$AddressFrame->Frame->grid(-column=>1, -row=>4); my $EInsert=$EBFrame-> Button(-text=>'Insert', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&InsertAddress($AddressEntry->get)})-> grid(-column=>0, -row=>0, -sticky=>'e'); my $EChange=$EBFrame-> Button(-text=>'Change', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&ChangeAddress($AddressEntry->get,$AddressBox->get('active'))})-> grid(-column=>1, -row=>0); my $EDelete=$EBFrame-> Button(-text=>'Delete', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&DeleteAddress($AddressBox->get('active'))})-> grid(-column=>2, -row=>0, -sticky=>'w'); my $EExpand=$EBFrame-> Button(-text=>'Expand', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&Expansion})-> grid(-column=>3, -row=>0, -sticky=>'w'); my $EContract=$EBFrame-> Button(-text=>'Contract', -font=>$BFont, -padx=>0, -state=>'disabled', -command=>sub{&Contraction})-> grid(-column=>4, -row=>0, -sticky=>'w'); ############################################################# # Now, populate the Aliases and Distributions ############################################################# &ReadFile($CurrentFile, $ADBox[0], $ADBox[1]); MainLoop; ############################################################## sub Expansion{ local (@newlist)=(); local ($curbox, $othbox)=($WhichBox,-1*$WhichBox+1); $changed=0; $CADc=${$CADc[$curbox]}; $hname=$hnames[$curbox]; $word=${$hname}{$CADc}; $special=0; if ($AddressBox->curselection ne '') { $special=1; $spword=$AddressBox->get($AddressBox->curselection); } foreach $key (split(/,\s+/,$word)) { if ($special==0 || ($special==1 && $spword eq $key)) { if ($aliases{$key}) { foreach $subkey (split(/,\s+/,$aliases{$key})) { push(@newlist,$subkey); } $changed=1; } elsif ($distros{$key}) { foreach $subkey (split(/,\s+/,$distros{$key})) { push(@newlist,$subkey); } $changed=1; } else { push(@newlist,$key); } } else { push(@newlist,$key); } } ######################## ### check for duplicates ######################## @newlist2=(); @newlist=sort {lc($a) cmp lc($b)}(@newlist); push(@newlist2,$newlist[0]); foreach $key (@newlist) { push(@newlist2,$key) if $newlist2[$#newlist2] ne $key; } $changed=1 if $#newlist != $#newlist2; @newlist=@newlist2; $$hname{$CADc}=join(', ',@newlist); &show_tag($CADc, $curbox); $save->configure(-state=>'normal') if ($changed==1); } sub Contraction{ local (@newlist,%inlist)=(); local ($curbox, $othbox)=($WhichBox,-1*$WhichBox+1); $CADc=${$CADc[$curbox]}; $hname=$hnames[$curbox]; $word=${$hname}{$CADc}; $special=0; if ($AddressBox->curselection ne '') { $special=1; $spword=$AddressBox->get($AddressBox->curselection); } $count=0; $changed=0; foreach $supkey (split(/,\s+/,$word)) { $count++; if ($supkey=~/([a-zA-Z0-9_.]+\@[a-zA-Z0-9_.]+)/) { $key=$1; if ($special==0 || ($special==1 && $spword eq $supkey)) { if ($akeys{$key} ne '' && $akeys{$key} ne $CADc && $nakeys{$akeys{$key}} <= $UpperLimit) { push(@newlist,$akeys{$key}) if $inlist{$akeys{$key}} eq ''; $changed=1; $inlist{$akeys{$key}}=$key; # print "1. $akeys{$key}\n"; } elsif ($dkeys{$key} ne '' && $dkeys{$key} ne $CADc && $ndkeys{$dkeys{$key}} <= $UpperLimit) { push(@newlist,$dkeys{$key}) if $inlist{$dkeys{$key}} eq ''; $changed=1; $inlist{$dkeys{$key}}=$key; # print "2. $dkeys{$key}\n"; } else { push(@newlist,$supkey); # print "3. $supkey\n"; } } else { push(@newlist,$supkey); } } else { push(@newlist,$supkey); # print "4. $supkey\n"; } } ######################## ### check for duplicates ######################## @newlist2=(); @newlist=sort {lc($a) cmp lc($b)}(@newlist); push(@newlist2,$newlist[0]); foreach $key (@newlist) { push(@newlist2,$key) if $newlist2[$#newlist2] ne $key; } $changed=1 if $#newlist != $#newlist2; @newlist=@newlist2; # print "$count ... ".($#newlist+1)."\n"; # foreach $key (sort (keys (%akeys))) {print "$key - $akeys{$key}\n";} $$hname{$CADc}=join(', ',@newlist); &show_tag($CADc, $curbox); $save->configure(-state=>'normal') if ($changed==1); } sub ChangeDTag { local ($tag)=@_; local $name=$DistroName->get; if ($name ne "") { $save->configure(-state=>'normal') if $dtags{$tag} ne $name; $dtags{$tag}=$name; } $SetButton->configure(-state=>'disabled'); $ind=&GetInd($CDtag,%distros); $ADBox[1]->selection(set,$ind); $ADBox[1]->see($ind); } sub InsertAddress { local ($word)=@_; local ($curbox, $othbox)=($WhichBox,-1*$WhichBox+1); $CADc=${$CADc[$curbox]}; $hname=$hnames[$curbox]; if ($word ne "") { ${$hname}{$CADc}=&insertion($word,${$hname}{$CADc}); &show_tag($CADc,$curbox); $ind=&GetInd2($word,${$hname}{$CADc}); $AddressBox->see($ind); $save->configure(-state=>'normal'); } } sub insertion { local ($substring, $string)=@_; local (%tempy)=(); $substring=~s/^\s+//; $substring=~s/\s+$//; foreach $key (split(/,\s+/,$string)) { $key=~s/^\s+//; $key=~s/\s+$//; $tempy{$key}=$key if !$tempy{$key}; } $tempy{$substring}=$substring if ! $tempy{$substring}; $string=join(', ',(sort {lc($a) cmp lc($b)} (keys (%tempy)))); return $string; } sub ChangeAddress { local ($word1,$word2)=@_; local ($curbox, $othbox)=($WhichBox,-1*$WhichBox+1); $CADc=${$CADc[$curbox]}; $hname=$hnames[$curbox]; if ($word1 ne "") { ${$hname}{$CADc}=&change($word1,$word2,${$hname}{$CADc}); &show_tag($CADc,$curbox); $ind=&GetInd2($word1,${$hname}{$CADc}); $AddressBox->selection(set,$ind); $AddressBox->see($ind); $save->configure(-state=>'normal'); $AddressEntry->delete(0,'end'); $AddressEntry->insert(0,$word2); $EChange->configure(-state=>'normal'); } } sub change { local ($substring1, $substring2, $string)=@_; local (%tempy)=(); $substring1=~s/^\s+//; $substring1=~s/\s+$//; $substring2=~s/^\s+//; $substring2=~s/\s+$//; foreach $key (split(/,\s+/,$string)) { $key=~s/^\s+//; $key=~s/\s+$//; $tempy{$key}=$key if (!($tempy{$key}) && ($substring2 ne $key)); } $tempy{$substring1}=$substring1 if ! $tempy{$substring1}; $string=join(', ',(sort {lc($a) cmp lc($b)} (keys (%tempy)))); return $string; } sub DeleteAddress { local ($word)=@_; local ($curbox, $othbox)=($WhichBox,-1*$WhichBox+1); $CADc=${$CADc[$curbox]}; $hname=$hnames[$curbox]; if ($word ne "") { ${$hname}{$CADc}=&deletion($word,${$hname}{$CADc}); &show_tag($CADc,$curbox); $ind=&GetInd($CADc,%{$hname}); $ADBox[$curbox]->selection(set,$ind); $ADBox[$curbox]->see($ind); $save->configure(-state=>'normal'); } } sub deletion { local ($substring, $string)=@_; local (%tempy)=(); $substring=~s/^\s+//; $substring=~s/\s+$//; foreach $key (split(/,\s+/,$string)) { $key=~s/^\s+//; $key=~s/\s+$//; $tempy{$key}=$key if (!($tempy{$key}) && ($substring ne $key)); } $string=join(', ',(sort {lc($a) cmp lc($b)} (keys (%tempy)))); return $string; } sub InsertAlias { local ($curbox, $word)=@_; $hname=$hnames[$curbox]; if ($word ne "") { ${$hname}{$word}=""; &FillFrames($curbox,%{$hname}); $ind=&GetInd($word,%{$hname}); $ADBox[$curbox]->selection(set,$ind); $ADBox[$curbox]->see($ind); &show_tag($ADBox[$curbox]->get($ADBox[$curbox]->curselection),$curbox); $ADEntry[$curbox]->delete('0','end'); if ($curbox==1) { $dtags{$word}=$Defaultdtag; } $save->configure(-state=>'normal'); } } sub ChangeAlias { local ($curbox,$word)=@_; $hname=$hnames[$curbox]; local $ll=$ADBox[$curbox]->get($ADBox[$curbox]->curselection); if ($word ne "" && $ll ne "") { if ($curbox==1) { $dtags{$word}=$dtags{$ll}; delete $distros{$ll}; } ${$hname}{$word}=${$hname}{$ll}; delete ${$hname}{$ll}; &FillFrames($curbox,%{$hname}); $ind=&GetInd($word,%{$hname}); $ADBox[$curbox]->selection(set,$ind); $ADBox[$curbox]->see($ind); &show_tag($ll,$curbox); $ADEntry[$curbox]->delete('0','end'); $save->configure(-state=>'normal'); } } sub DeleteAlias { local ($curbox, $word)=@_; $hname=$hnames[$curbox]; if ($word ne "") { delete $dtags{$word} if $curbox==1; delete ${$hname}{$word}; &FillFrames($curbox,%{$hname}); $save->configure(-state=>'normal'); } $AddressLabel->configure(-text=>'Addresses'); $EInsert->configure(-state=>'disabled'); $EChange->configure(-state=>'disabled'); $EDelete->configure(-state=>'disabled'); $EExpand->configure(-state=>'disabled'); $EContract->configure(-state=>'disabled'); $DistroName->delete(0,'end'); $DistroName->configure(-state=>'disabled', -relief=>'flat'); $DistroLabel->configure(-fg=>'grey'); } sub SwapType { my ($curbox,$word)=@_; my $othbox=-1*$curbox+1; my ($hname,$oname)=($hnames[$curbox],$hnames[$othbox]); if ($word ne "") { ${$oname}{$word}=${$hname}{$word}; if ($curbox==0) { $dtags{$word}=$Defaultdtag; $dtags{$word}=$olddtags{$word}if ($olddtags{$word} ne ""); } else { $olddtags{$word}=$dtags{$word}; } delete ${$hname}{$word}; &FillFrames(0,%aliases); &FillFrames(1,%distros); $ind=&GetInd($word,%{$oname}); $ADBox[$othbox]->selection(set,$ind); $ADBox[$othbox]->see($ind); &show_tag($word,$othbox); $save->configure(-state=>'normal'); } } sub GetInd { local ($word, %AliasOrDistro)=@_; local $ii=-1; foreach $key (sort {lc($a) cmp lc($b)} (keys (%AliasOrDistro))){ $ii++; last if ($key eq $word); } return $ii; } sub GetInd2 { local ($word, $string)=@_; local $ii=-1; foreach $key (sort {lc($a) cmp lc($b)} split(/,\s+/,$string)) { $ii++; last if ($key eq $word); } return $ii; } sub SwitchAliasFile { ($CurrentFile)=@_; if ($CurrentFile ne $oldCFile) { $result=""; if ($save->cget(-state) eq 'normal') { $dialog->configure(-text=>"You are about to leave $oldCFile without saving the changes that you\'ve made!!!"); $result=$dialog->Show(); &SaveData if $result eq 'Save'; } if ($result ne 'Cancel') { &ReadFile($CurrentFile,$ADBox[0], $ADBox[1]); $save->configure(-state=>'disabled'); } else { $CurrentFile=$oldCFile; $whichfile->configure(-state=>'normal'); $whichfile->delete(0,'end'); $whichfile->insert(0,$CurrentFile); $whichfile->configure(-state=>'disabled'); } } $oldCFile=$CurrentFile; } sub ReadFile{ ($CurrentFile, $ADBox[0], $ADBox[1])=@_; local ($tag,$addresses,$dtag)=(); open (FILE, $CurrentFile) || die "Can\'t open the alias file \"$aliasfile\"\n"; # First, read the alias file and assign the addresses to either # one of two hashes, depending on the form of the line: # (1) %distros if alias: aliasname:, email1@b.c ..., ; # (2) %aliases if alias: email1@b.c ... (%aliases,%distros,%dtags)=(); while () { chomp; if (/^[^:]+:/) { if ($tag ne '') { $addresses=~s/\\//g; $addresses=join(', ',split(/,\s+/,$addresses)); if ($addresses=~/^([^:]+):(.*)/){ ($addresses,$dtags{$tag})=($2,$1); $addresses=~s/^\s*,\s+//; $addresses=~s/,\s+;//; $distros{$tag}=$addresses; } else { $aliases{$tag}=$addresses; } ($tag, $addresses)=(); } ($tag,$addresses)=($1,$2) if (/([^:]+):(.*)/); $tag=~s/^\s+//; $tag=~s/\s+$//; $addresses=~s/^\s+//; $addresses=~s/\s+$//; } else { $addresses.=$_; } } # in case there is a $tag $address pair which hasn't been put into # the appropriate hash... if ($addresses=~/^[^:]+:/){ $distros{$tag}=$addresses; } else { $aliases{$tag}=$addresses; } close FILE; # assign each email in the %distros to another hash has whose value is # the %distros' key (sort of like a reverse hash) foreach $key (keys (%distros)) { $count==0; foreach $skey (split(/,\s+/,$distros{$key})) { $count++; $email=$1 if $skey=~/(\S+\@\S+)/; $email=~s/[<>]//g; $dkeys{$email}=$key; } $ndkeys{$key}=$count; } # do the same for the %aliases hash foreach $key (keys (%aliases)) { $count=0; foreach $skey (split(/,\s+/,$aliases{$key})) { $count++; $email=$1 if $skey=~/(\S+\@\S+)/; $email=~s/[<>]//g; $akeys{$email}=$key; } $nakeys{$key}=$count; } &FillFrames(0,%aliases); &FillFrames(1,%distros); $AddressLabel->configure(-text=>"Addresses"); $EInsert->configure(-state=>'disabled'); $EChange->configure(-state=>'disabled'); $EDelete->configure(-state=>'disabled'); $EContract->configure(-state=>'disabled'); $EExpand->configure(-state=>'disabled'); # $ADBox[0]->delete(0,'end'); # $ADBox[0]->insert(0,(sort {lc($a) cmp lc($b)} (keys (%aliases)))); # $ADBox[1]->delete(0,'end'); # $ADBox[1]->insert(0,(sort {lc($a) cmp lc($b)} (keys (%distros)))); } sub FillFrames { local ($num, %AliasOrDistro)=@_; $AddressBox->delete(0,'end'); $ADBox[$num]->delete(0,'end'); $ADBox[$num]->insert(0,(sort {lc($a) cmp lc($b)} (keys (%AliasOrDistro)))); } sub show_tag{ local ($tag,$curbox)=@_; local (%list)=(); if ($curbox==0) { %list=%aliases; } elsif ($curbox==1) { %list=%distros; } else { %list=%aliases if $WhichBox==0; %list=%distros if $WhichBox==1; $tag=$CAchoice if $WhichBox==0; $tag=$CDchoice if $WhichBox==1; } if ($curbox!=2){ $WhichBox=$curbox; $AddressBox->delete(0,'end'); $AddressBox->insert(0,(sort {lc($a) cmp lc($b)} split(/,\s+/,$list{$tag}))); $DistroName->delete(0,'end'); $EChange->configure(-state=>'disabled'); $EDelete->configure(-state=>'disabled'); $AddressLabel->configure(-text=>"Addresses for \"$tag\"") if $tag ne ""; } if ($list{$tag}=~/\w/) { $EExpand->configure(-state=>'normal'); $EContract->configure(-state=>'normal'); } $EInsert->configure(-state=>'normal'); if ($curbox==1) { $CDchoice=$tag; $DistroName->configure(-state=>'normal', -relief=>'sunken'); $DistroName->insert(0,$dtags{$tag}); $DistroLabel->configure(-fg=>'black'); $ADComp[1]->configure(-state=>'normal'); $ADChange[1]->configure(-state=>'normal'); $ADDelete[1]->configure(-state=>'normal'); $ADSwap[1]->configure(-state=>'normal'); $ADComp[0]->configure(-state=>'disabled'); $ADChange[0]->configure(-state=>'disabled'); $ADDelete[0]->configure(-state=>'disabled'); $ADSwap[0]->configure(-state=>'disabled'); } elsif ($curbox==0) { $CAchoice=$tag; $DistroName->configure(-state=>'disabled', -relief=>'flat'); $DistroLabel->configure(-fg=>'grey'); $ADComp[1]->configure(-state=>'disabled'); $ADChange[1]->configure(-state=>'disabled'); $ADDelete[1]->configure(-state=>'disabled'); $ADSwap[1]->configure(-state=>'disabled'); $ADComp[0]->configure(-state=>'normal'); $ADChange[0]->configure(-state=>'normal'); $ADDelete[0]->configure(-state=>'normal'); $ADSwap[0]->configure(-state=>'normal'); } else { if ($list{$tag}=~/\w/) { $EChange->configure(-state=>'normal'); $EDelete->configure(-state=>'normal'); } $EInsert->configure(-state=>'normal'); } } sub SaveData{ open(OUT, ">$CurrentFile"); foreach $key (sort {$a cmp $b} (keys (%distros))) { &splitprint($key.": ".$dtags{$key}.":, ".$distros{$key}.", ;"); } foreach $key (sort {$a cmp $b} (keys (%aliases))) { &splitprint($key.": ".$aliases{$key}); } close(OUT); $save->configure(-state=>'disable'); } sub splitprint { local ($key)=@_; if (length($key)>$MaxLineLength && $key=~/,\s+/) { $clength=0; ($first,@subsequent)=split(/,\s+/,$key); print OUT $first; $clength=length($first); foreach $block (@subsequent) { if ($clength+length(', '.$block)>$MaxLineLength) { print OUT ", \\\n\t$block"; $clength=8+length($block); } else { print OUT ", $block"; $clength+=length(", $block"); } } print OUT "\n"; } else { print OUT "$key\n"; } } sub Dismiss { $result=""; if ($save->cget(-state) eq 'normal') { $dialog->configure(-text=>'You are about to quit without saving the changes that you\'ve made!!!'); $result=$dialog->Show(); &SaveData if $result eq 'Save'; } exit if $result ne 'Cancel'; } sub Compose { local ($addr)=@_; $addr =$AddressBox->get('active') if ($AddressBox->curselection) ne ""; system("exmhmail $addr &"); } exmh-2.8.0/misc/mafe/help/000775 001047 000144 00000000000 10166430715 015562 5ustar00welchusers000000 000000 exmh-2.8.0/misc/mafe/README000664 001047 000144 00000000234 10005705757 015514 0ustar00welchusers000000 000000 To use mafe: - extract mafe.tar.gz - copy the perl file mafe to a directory which is in the $PATH environment - to hook mafe into exmh, read help/mafe.html exmh-2.8.0/misc/mafe/exmhmail000744 001047 000144 00000000100 10006075340 016337 0ustar00welchusers000000 000000 #!/usr/bin/wish -f wm withdraw . send exmh "Sedit_Mailto $argv"exmh-2.8.0/misc/mafe/help/mafe_addr.gif000664 001047 000144 00000056050 10005705401 020146 0ustar00welchusers000000 000000 GIF89a„ÔÞìäæäÔÚܼ¾¼´ºÄôúüÜÞäÜâì ŒŠŒ|†œüþü”ž¬¤¢¤œ¦´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù ,þ $Ždižhª®lë¾p,ÏôÜ7€ç{ óµ pH,ȤrÉ$úvº(Nðœö~8,O×ìz¿à°xLžU¡èÞ9˦òÜÖë­L¯Ûïø¼‘Š…?µ~nZRlilX:~ZzŒŽCRZk~<…€j–”œšhT‘¡¢£¤e7–—…o†;Šk„|qVƒj?¥¸¹º»,ip‰¬§‡¯¶r†°ª¾l¼™ÃkÑsÍÔÕNʬ²Ù©±•ÇÙɨ9¦µh”ÐÝê[ÒÖðñ)Ñ®«ÅàUõÈÞö³ÊÉ?°|a·nÓ²nÁúƒ@žÃf°¶Ý+äêÙ¥ZçÂhÌÓ-$íBC¤F*lþñ½{ÈR”J‹ë~óÔà°t®€T%DãËOìú¬ (ç‡Íi-“âñG­ŸHä(Th«¨1w.‚AÐRJJ'.ìx,âÁ°Ó¼^½gà€Ò·$ ê̘§°˜ØT%{n2"J›'?…ùÖ¢ª 4ð=ºÜÂUúS[Ù«ta^ë“ÓÃU8vM4·`$+Ÿ#”ri•쨈<9)ç‚û4ŸN㚤NµøÄ•ìvTjÍã·q·)‰q9MØ0÷÷•q¶äÚòFzö–:+háϵþô}·¹ÙíaIªßÎ}÷Ì›¥¿ µ;«m±gÏ;”3Q˜© –h¯Ý•Ó]ÿþW i .CWBܼ–΃ ÞCÎ×éÇ VÅ}7\-úÜWLUL}E?DÛt]q8œ‡E6`b*ªÄbŠÃX§á†Æw˜iЄÔ•é%Ms˜œHÞv‚­‡œ“ܶW‚q %a"˜ŠŽ;–¢d‘*¶¶•™ÈßN~y$%t`Ї XÈMåÔ˜DÂ'¢`ä×¥Kìe£l~v¤sÆ ˆ¤q&â“-þyQâcP¢þȷ扴í 7ä8ÙœOa9¤œuâé c%hÕœP²'çe‚*Ç…ÇyúL&\jzGƒ&ZãNîe•&ivJ㥪¶Ii‚‹‘Øä>VJgIþª’«®MÜÖ£Lu¨Ï„†Ãàæ™¹ÐzÖjõÆ[TÈâ§².g£Xe `S3Ö£'¶óÔ+ª›Ó£`kÀÊ„{Àl=0 *±ìñ5#¨Ñ>ëX±â¦ŠŒÖ³¬ÁLÊ5_¦3d¤‹ˆOMŒªË#ŸÉŸä–›cž»aÀÂáú“R‡¦XѺ Ê#ƒºáå™ó\¡Š×ºo\‰¬ËúÌ(ú9Ë‘Åô03<›»ýD«¥º†ýjuróò…mgöbtr©OÔ+°»¦Pc|©`6;"§tšeŸm… 15‡KèšMùÂèFVsÏ5KÜù þŸOùÚkáxhz%ŸújIÛjç·´R|©Lòoß,S›Êtÿm™¾ Òš,Ź›9æ83Œ|[;ì9òšƒ ºô‘AO.ØÖA¬ŽTO< ²9åÄmGµ×̬GÜ‚î'›i§Ÿ«j)$hBv^ëVæ7;.9è8ÃÐ §½±YGsàÜØ@7›f./›Vë8Ö¨–±op¿À È^Ç-| M(|+:¢¥Œ+^结e„›>™Ï…3Y–hÖ9rP6åbÍ%±p1ïs?`ä~8Ä!²J@4¡­êó¥h[¬9á»4èD&F !A©r3V%}#Ëþ_™º§42FÐh¬ Ø?ɵQy‘i Í¥=æAŒyq¤#Ù®g®}ìihtay\æ+½PY¥KÃíD8÷1Å5²"acÞ)I±D¬ÒŸ× ÑÆÆ! Ìœ'øÀ‡I¬qý3e*óÈJ– «k“¬`EÔ¬§¨-#HÔV&å5Åud(.ôã ‡âwž Y±A1œÀ BEfêÒS««!UÉ0tцFÝè€Ø¹²ÕÌ:‘ WÒVóÂøm,utBݽ¼8#ñ©ii!ã¡ ¶hFz>ÊWåôIé=¬Œñ{Ýð¡¹8P=ÞQ;£B JPí!”¡‹•?wÈFº#5_<¤þ§µ \žo\œÚï®èAa¾’‚õÆ+ñ§L‚À¯áê;ŠRA¦•iM¯¢SK44éŠJ:­3m°Œü!'LòÇKÁ-Rk )!Œ EtrÑ, &ð„Ç‘. XyZ¨:Vƒ.ô¡emàXÓÊ9ê,¬rli‡iU°þfNxKÔ¶C¾óXÊÐ!ɘTØÀ²'Ú¨íIØ@]%dSƒC_”ÐÛL¶ uŒlúÐ'®."2“F•r KŒ*™PC™EºÏßmr„ZÝ^,SJ¸Ù ´øÂ+›Y±B´™Å¬f ZPƒˆ,± šWÜò¾|¢6Bn³TþÁÁ%z3~C1Ï F¹¶…ëìÝìç7J1îb/Z‚\¿’ôÚýŒÆZµØ»¡W"{½çTë»8áLrÍ*cë&ue÷W\cb[ ZÞU@²8 ^…QѦË^¦h›:z ©Féªe´b1åàYô‘Š“9ñ+4]Í’ºÄäj†ïØw-GáÚÉÚñÞ¶¨D†Lä"ùÈFvÛê¥U\Ñf¥—,˜TçW0ÒšXÉ0ö«‚´¨Y ÌXNSg¿ÜÝCm±/áù*}×ìe-Æ H޳œ  €ô1«®Ým®üÜîºò³!ÍœMèBúЈN´¢þÍèF;:Î2FJ†LÙJ@ ØF}©Æ%“‹Å µ”Ÿ$IcÕ¢–NµªWÍêV»úհ޵¬g½T'D]•¥´d*VL3GŸ2®*Sú÷³tûÀµ<âj£‚jÙ˜ËÙÎö­´yMíi[»ÚÏÆöµ·mn{[ÛÞˆ6¸¿mmT÷RFXеl.;œÙ(`Öݯ’ñ$©5~º±!]A¼Ô˜›Ö”]'ÀNpèüÆN÷kÒ¶³cáë«„(%ÏÝÛÿÜ êz#¨˜JnÝ~›(_PáäáN9Ê{¥ò–¯Üå0yìbNó—Û\Ø5ÏùÍQþ‹ëüç<÷7AKnþçè:®«~w ™z#85ÊQÍÔ«ÅåfRèß osÖ·>ëòœ‚\¿Á¿ V/\Ò)’0­=îu™ÍoŽ?«0€º`wÀ€׉ºÛïuÏLl}OݤèðWŽâ˜ï‰øÅo°ñg|áñ*yÇG~«•¿üåI®_’å© ÈSF߀”>ÕJ—ß ì·Þû zçÁN1ûÖÚžP³§ÂÜ@€5]\èø¬hDËé ¿¢Éh|•Ìë}U¥à8àôî0Ûm[±¦“å€XÞVïwpwÄÞ*³¹Ãu0þÔ^¹_}78ì ²œÁÇw”ò_û˜þæ«ô·âµ•nhòL‡j§1p6j€}—og_ôvTUàiÊñ—µií'…±÷%x3vÇTE§"UVWó!´Ã]kfB±‚…TТ‚M}ß…ÓwP 1kWg¸U1¤ýÃq7°8 wxç wwwî÷„…€g~~Çb;P{“p…KXwðW{½gtƇH™ÀrÄ'€g¸v–†ýk•”µÆ²c!b‡€×§Y¤wz @}§÷n Oú‡‚ä #P—ç—`˜„Þ~ñ7…Œè~Œ¸ë±{=‰ì{Ç~qøcµe(á\D…bœ(KMUuþŠ9VZ£Xа¥8ˆ7k kÀ‡8°‡7p‡¦7gAž÷‚Öµ[%öG„ „æWŒ !‚(‚Sè70~Ü“ˆˆHBׂë²DJeƒØˆ%ØÛˆ‚fæÔhcáøÑ@x°ˆg.{Xz h}³Q}㇤sZ¡uùñzϨ €7KX‰†f> ‰K(… H‰™˜ Їîál8†h˜qiT]F[ÊG¯hVk¨öŽT}{x}¸ˆ}A(P¤?õÐ:’a]¢{ˆxG‰š( ”˜„|¥“ä—“í—wa(„·Šü‡q¤ˆŠõ§’¡HŠä”” ¸/þ܃”-B€n0‡†Á8”–€7àŽÂå€J‡q®aMy3×±ZÊHw¸ûx–³×x‰ûX•I{ˆ{í§9 |¾(*)$–âè‚&¨6(rÉf@Å|¾x‚b‡\Tgv³øƒ[)’ Yz p’-–G](ƒU~÷™ígwQØ„8P~¢)~” ‰€ywŒ ˜w6©…B7Y錩†Y|‹r/p8‡«à›ŸÅææ}—1Ó÷˜Ôg.$Y}d‹8Cž8ŠV‚5]¡R-rÉ5"ÆOÁ “ © æf¹µ”Û •¬˜žE¹”ê‰ è¹\±ä”å‹ “Ïgnd%þ\“e˜¦XióWW©>$@+qgcP%r·”½çš~ƒu='~yæ(ƒÐT˜Ê2"˜*xÝy¡Ç€ƒÑuëH\h5t'—„„|©õKµ£_A•(ŸŸÉŒ›ÈW‰¢˜r›<Ê›çÖ£ÁãYÄã„§£XqŸ—…tEž  a´KÞW(3<†8z8«"ÙØC©x‡%Š”w”ìé-cÊžd'¦)v;ÉRDÉУGK ×ãµDi&DóD )I)ÉÇ‘mc˜¢‘•öUd–%5˜ÝÈ—Ú¨ªXuŒj%Q‚KºgçT6d¶)o‰ÐŸ-•BRþ ¿`ˆ‰*êdKVº5aJ $Gžø7T_‘@ª›ïE«µò&åp6t¹ÔeoZœ¿Æ‹©$L‡/+jÇ¥ †·K§:>YÕZ6­ÔZ­Öz­Øš­Ev«Z☪!˜Éª„2_€Œ(àºZ,cI:ø’›vð¯ò:¯\çP_44÷‰iMŠiüúnýº¯ûª¯ ­åv|z~Ô.tÕwª£¦ ä6nݦGâ±+±ë[âV±Û±Û±ß)f$výª¯&˯k²û:¬ñ5Š:.çêf3hc/‹*é8bôš³:»³<ik8oUVAë nÅPÍeaü•, 4¥þŒtªúÕ\ä‘Wq©Òª­V{µX›µZ»µÙÚq˲Y3€†õ¬éR!×tV²lÛ¶nû¶p·r;·t[·v{·x›·z»·|Û·ôw2J™¡ÇYªTÚ˜û1ä9Ž)ˆ§c Á°¶M¹þ*¹”;¹–[¹˜{¹š›¹œ»¹žÛ¹ û¹¢º¤;º¦[º¨k¹% °ÿв}·²¸_ibF8g:?ºdטç¸} ²Àû»Â¼Ä;¼Æë±DVp5±;t-Gd}”¢La‹aí`oW¥¥¥ƒTФ$Ú³â;¾ä;pì–³Ðû‰PJjS½Š81µy5þk „Ì›¿³mú›¼ü»¿ýû¿þÀ À<À,À \ÀÜÀ œÀ ¼À r ÀrhLœÁp¶Ž¿*ÎÄ2‹LÙ§¸TUv·«6!ú\k‹›åÛÂ.üÂÈŠ)¹É>é˲ÀBZ,i»¹»|øEzõÁ†dN÷{½UU©E|ÄFœÄH¼ÄJÜÄLüÄNÅP<ÅR\Å8·½)(Ÿ?½ •K £Õ+(µ„$ëê†SåQ­çoàëu0ÜÆn̳I,F" QÃ/ä¨~d®çjT‹‚‚˜cv³£j»}4’¸†|a¤Š<‡œÈŒŒÈ‹\ÈüÈŽ,É•ÜÈ‘ŒÉ”œÉ“lNàþœù÷¦ €jö*eÆL!\¸N[ƒÏ"^,”¸%ì +l«¸º›¶LË3œËµZËFÂT ¦f7žMóË% ÊšHè–®6\>) ]°@g ð‡ºì£·ÌËÖ<ÍՌ͸LÊf޼‘« O=,O1Ûyç^° X„a¬S× ³ŒvÿyWñ<®~%ÏTUEöŒÏôœÏõ¼Ïþ<Ï}ÏýÐ Š¬ûÖ‰b7Êõ{_;Õ{»U2¿†‹p9èpÐ Àï»ËÚ|ÍÝÑÔ¼ÍG“Á”ž¬$¸ë¹§ÿUÎÕY ÃbÖÌ.…vïŒÌ ÍÓÍÑ; Hdá¡;zûÒ2Xl¢Ãþ2\€ñKµæ5RDC k{´ÙGÇô2ÇdÕiKÕX]ÕåuÕ]Õ^­Õ_ÍÕb]ÖabÿtÍßœö4ßEhFÂÝùq2šƒTò½Bý×9}Ó~ÍÓ:]c`÷žµ6Êç‹kÞ§q„+¶0²¥>F¶¤~ŠñÁ0ÄÜüÁ|ÝÓ} ØÙ¶|*@-&ÈŸ¡æ|°&°gëeì¬Ã¬Â»ø&ˆ:ÐÍ϶ýϵÛúLд½Û¹ÍÛ· ÜŽõ×£ ¢—=5Ë´…ËÇD,p ¿Ñª?­ÔÍÙÖíÙ½ÙØ½¡V¦W¬ €¿2œÒDL–(@eåã,L$µ¯ÝŽª‘±MþuÝš]ßMß÷íc‹š˜;PÜZ•5lv¥äl5B¶Î]Ìǽ‚\kôˆÂrÖ`ád á.á[}ácáfmáÞáž [I|à-ZNÃYø¸Ø­ý2O”AÌz۸ž5­Õ½Ý4®Ý6nß¶ŠÂƒíÝ7PÜš*õg°GmÝwh“â6¬àÖÕ¸ r5Žã×}ãùMãÅVŽu%CzÒ|Åô2Z×ÖËå2Z—ΜÔx}4yáÛlÞÛnÜ¿çmçs®ÛonçpÞÖ{Ýþ­×¹éQzLàÒƒÒÊ¢8‚¢L~XRŽßŽåPžÙ }2¨¸ £mÁSýÚþkçÍâ#¬BI½HK`h°ÂüËéSžêO>‘õÈßÑ0}~n­(H9Lä)θ¤=Î1ºi¼ïŒ'AÃá^áÆ®áŽìÄžìÎìÅŽá@«6ÌÑÛ Ìwß­Ü" Ú>;7;¬¨)¬f:ø•Ý®êÞêçÎê4%;îzŸpªãæ ¶ÚÎØAEÄÀÙ/.ÖÞvBœ»(Õ\½ê‘®î_ðÍ—Ö¾8í\¬©X2LÚ%Ié­ŠëÁÞÂÓ‘çfêå.Cr~çÂýñOçòx^ò ¯6¾,|:z^vÜyl(à ³ýxóÌŒ¶`etô(.Â)ð>ŸîôÝœIþO ] \öcN¶ØËêòÌdæuµ„šgŸîo±½æ³Šîæ¾õZßõÂ÷êäz8ðNæî>é]ï²Y«‡äË»Dñ¦ š¦Üøì;ìvìu÷t¿÷ÎÞ÷SK·©ƒL=®Š„âaîÒ£ò³e>£žˆ©àë#3Nð?Ïõ”Ÿã<Œ”,x3-ßä¡èÒ–°ØàØpƒdè4ˆëWC ^ù^ô–ûhå$ø¤Üd‡©§õæ$œÎsÍ­N+œ¥ñY?Û"ü&Oò'?òu¾üÈò³TÍR0ö°‚†POP‹-¶¹¸÷ª»lø÷²ú*ôäû®ãj¦ë ëÇ þÄšNâ‡0ϽÌT/äà[Šï'i~Ã`vùæ_þ IŽ¥ˆ¦èY¶¦ú®n\«‚:ínø!PÖz7oÀ嘥$*•*{ÉžS†rnYM-ì#áZ…‚»§ZåÒ›<‹¯Ýó»=Çïõr]Ÿàß` á¡a"Ý""c׋˜Ød%ÊPA@V›—'¥Õ^ÔÔÔç©Oè•—QäéI–RÉ™Â爚Œ.Û.j/å쯥p0¯±ï10ñr²$ðZWtJkJfN,ö‘ôìäh©)ÓËø$§eå9´ÜÞ3ŽÀÙ¦òò}=þpò¾~±?3€üþå«G®ŠŽ„¨h B­þS!Ij".J˜WÝ’¬xø03æ •£…Fà²Vªl™òå4—1aâ’Y“溛3wêì™ó'KœAy•Éna@PÕ„Ù–ƒ`º¨(,^ä¤ÑF©"µ)-¦–šG^¡’MÚo¬Ù²Ó²]ëvnë=eš‰^\Ÿr¯Î€*8!rÓ)÷è‰líŽÎ…Z`-Â#s¹E‰¶òeËg7«ÕÜylã„p•ú½Ææ–è–"¿]¤ÂµR¡Ð%†åe4“ZAbÔ»‘"ྠ§ûû8qáÊ‘On’—œÏ]s­öô§ ÜÑÓÕWœÆG×n{肋Šwf÷ÜÖ=æþö™ç˯Oк°N ÷°ÖÔ“2è†8*tW € Ntƒ‹åå`È ›1ÏÑ÷™}ï]¨a†ñaø¡3tȦ;viÒM"‰ –Q¬µ†_|E…[á'ÕH£ ™`Í%”M?5”OD YdF*™$“@:9¤SÏpX“™Ü–•>|µàâ‹ö¨×S1.TŽd円~v›zÈ!ˆo¾eTˆQ÷Tu(†d'5+r÷"äÕµÊ`uÆÅ 7:X >†ÅÙæšnBú¨¤•rÚhø‰w¢ià}Ñ#¨èÌr wdBC£:‚ŠÊ˜©Á0¡ó¸sÁÕZœ­ÎéÚ¯¹þöŠ+°Ëízg!’ÁÉÐ]sÕ¶T¦úEj)4® ‹Ê²*Èž]yŨŽÂù­œ“‚+n¸óݨ…¢ˆY[Ú²‘®´[þ¨kîbE-EÌž!c)+2jR)Á<®¥#ºi¨Ä {⦒бb”'üIoKv­˜ŸN{­¶ƒqÁ-<>.ù$’(¹òÉPªÜrÊ.ËsÌýbI_&žfnŠj@‹ ;Ù^I¨”e2»K® ÊkÒ“é¢A²¾awÙ» 3§$ôIxÉÁøb(«1o§3^µPóŠá #L›…€îen´m¨Ã´`ŠqšºßTç>Æ} ?k˜ôE8Š8þ‰êû·îVŒÉQQsU¬Ü1·¹-f1Xž+ܱ¾—¬ˆýÄÍ;Ñ/ò%´9Êfe\Í¿Sݰ‚;´#눚öKQüYCÑ7 ?« <Ÿ6”¨>Ž$B1l\ìÔ!=æ0w¼¹¶Wµî•Hk ÄøºrB®°uÞ{…–Î3¢‘A†2"JˆÿòÇ?ýÉ2–ø»eÿj©ËÃðÑ,lW 8úÌx@ûØ‚Ú1‘d¦„‘N,¬"S6KRÖĤ›tôÂÞ ,t(‘€*†843uAÈ[e•áÉem3äÊP()ÏKVòš ëaƹ’Ïcys£¼Òؚɢþ.ËÑ6)±¬ÅŽ ‰Û$ç´ØE.Z±¢X´¨D1:ÉýÑ3Þ$O•â'¶&U"šƒ\¡J3¥G„«&6ç ÓzZfw]“ÆOa«‰`+'Fè8«éË‘Fu.¸õŒÎT¦ötjL%NW‘Å›"\˜Kø, JAZ#)%Xõ 4&þS† ¸“üf©V[æ—´tëZwÙVöàR¿Öˆ£C†mt±a]‰âè3µ6O¥'TiªØìpp“½û¢ŒòDÆ‚’$¥17¶.âùóììc”àGx"¶´M5íaöÐ'Š”SÀDQúò)¢br5uŽ¥òŠ&ج&!šþÁ¬F)zÑáf”¸=®p‹ËÍÛ‚NŒ'ÚÚWAƒ(¾b Ž3òiTR©­ÍÔBЧýnjËM›>2žTÒY#QÑSk]ö§@ &3…ÊŽøÎ† •`¬~ Yñ.µQ¯&y+]‰î‹Šsæ1k<¡S+¦Ün¦æ¢TT¦"®peë[çšá [XÃü 0}¹O`Ö—>%IÕØOÊ*½%l_=’–^ò7±6öo=µ¹>vÓ¹&b8 3=rÖÖ¤kD鵤å¼t)m­…ÉÁûßë°®emp YˆSªš­½).•~ì:Î&7 ±n‡Ü‰²9¸m6nr×üÁbuôBVþUfLe±/G˰¿õÈ'\¸[ÎÀ®m£¥²”û›h ’·²‹É©kñêFK¬—Y|6…ñ¥‘¢Žó¨Ïƒ•¬¼:ä)“Zш®]€óéLØJvhÀ å©«ÀºÅ…#ŒËªÔ¥ÉÃæ°¯ƒ-W`ûÃuµÔ]…YSŽÒ½åäuVrëg³Ô¬ôÀõL]ê(Ÿš7ŸcæÕ&íIeF÷¾®Sp_­Û`e#äÄÎ{ì™Ï Ënk»ÞÜž”•¹Œeô¦pˆ`<ãTjË¢ønǪ0U“ª´lîÍÊ•3œñ‡ÇY9™~&}üMŒ»î ²îƒ¶é'TNFè¶q|o{Ï­ÑæVþס³ÜÏ›zZ èY,DéÌ÷³ðf…´¼Ð”/ZåFWªYë0ƒT¡³ªïž.fUÏZKÄ‘ÈZj¯´ ûÂÅÁNl¯ÓnɶÁjèÓKÛ¶çC=¥ !(Pï+Ù^9ÞNoU;–ɽóÀË«U"?»ˆ*ÄõòÌwßQä}Ñ÷®÷È oúÞ”ÌCãïB2ñæÞñ«nGXjÿ“°ÐÞ…Ä+žúÕ»¹õŸó½\lŸºZçKºg­ÙZï¼Zr]zÎÚÆ»OžåE?~…ùøs!Å$ób6w‰ik̦MÚXZü#÷ô ù”7¾äë$¾¡R'„ŸŒÈþÛ§ëì¾z¶tª²v±Îå ‡øëö'{ØïŸü®i'ØÙ¥Î,çMÁÈ\§Ñ—âl× 1ÀØ]øEà÷q[c‘ß=Ž ´Ú0K¥yBîuɤ­›è]Ú0^h©ÇÍ@øM`ñåíí?•˜ºèȉ­ßà¤FòôÞR•ßAQì¯MªžëQë½^çÐǙәGH]Wùà  Ñ ™Õù †DÏðIà ~¡ Æ`7\ ”?¥‰ÓkàñœŸô¼Ÿ$ùn_!uŸ†! VSÒýÓÒ{‰_V‘[| Šé—ì„UâÍœfI´M/é_ÿEâ¯Mþ¢ØQ¢\˜Ù˜¤iž^=ŸiÞTÙÀÂÖ ©Ýñy¶ Þé¸'j`Γł "¦(’v,YöiÝãÍβ¢*ÞX¾éˆ ¾ÖÔ%³yYf…OlXŸ¦­TéÅsA”*!a&á6ÒÅÅñ\Æù!t‘Qyà—šûaW»5QJX~uac1â˜Ë-Ÿy¿b ™}¡Ø3àaœÀ!ô AÝÕ!BΣC®¢^\„¡,¢"3öÛV‘R^‰ ÒÂý 5ÞÌd@¢%ò_IîJJ"iýßÀàÅGü±á"•™ùã‹­TZ›E>$þBdxU`á\`ù!õõ£.ŽÔ3ŽÞIU]œ rƒã¥ 0ò$1Ò£c bÞ>¢áOè˜0}Y–Û9Öï¤Âç©Y6~#[v#7®¥[‚ …9♉ŽâW!ž‹)5òŽURe=âÐ=’!{˜ák…ÍÞ Èä.*`½¡Þî‰æ`ú$|ìáEvø(¥î}rLM>Zû-â¼5bš¤IV¢l’älÆfý`¢]i"»ÉGM0XBcõé`èý¥„ÈÃBÎÖfö¤rÞ‘+ ÞPŽ›Û­Z-ª_:Ž Éu”y“¹“-c*&gUj¦G­Ö•iåþŠZ„Î'@¦@Ú AÒ˜Æ<Ù¨íZZ†J\¶%\æ§7Þ§1¡8ím f$Øon¤Èu¤c}$-]M%g>èr¦H¾ó)¦¤Ñ >Fc€en霆òœ|ýãv&¤,$f6$„†gŠÒŽgN$hŽ:‚ d*å‘1eÕž€¹¦Ÿõmþ¨miJžd†á&²é&ÚÕNzÃ-ªØ2‰%Ü‘%q.¨NËwŠçŠ‚'ê}›sæt"“à "bŸõÛ^‚ÌGø¥v6fTú F¨–Æiå%_VÑV2&H:¦ üfýÕ(>Ÿ:e•ŒÞêç[î§¡j#b ³½cVþd(ØÞÎH^VjÚšïM)wÅ£`b)œz*¥&ÍAšóS©¦Ð°gŒ'’Mãš Ïe®›ƒ~j–‚*3´h ¾ès¹á :ÞjÊg”f'k¥ 9¢’im*+2«é± ’ `'¾Û'¶§Í¼çÖ-`™@“qîd­†+­vHs:8æ@E2a )ᡎ†’àŸ&èA.wj–±ªè¸âkiaeá$ã…îÞŽT³]špz(Ö€¨žµÎÐÑçX ¢>ì¡F¬¢æg8âÛ&Ò€v™~Þ2BT娦æ¤6蕊«¾&fˆª‘êVªÛ©.*\Ú“¦Ÿ¨pšˆþb4þ™¨¬–l¾¢¬­BÛT¹èª|é²|Ñø•cž){¥i.æÚüá#>+‘Ví²ªd³ÖL´¶ä´(?\]Ò*íʼn"‚6‚öã·Z©œš¬Ï^†±nS¸ÅbhÖ•쯾†òÞ‡f꫚k›ZÏžìÚö¬ò¤ç:–ªÙ*]ÏÏ{a,««–™ 2,ÇAìÄZ.~bnJ¤ÅÖ¥ ®ÚÒy\“V¡ËÊ+v6h):§^Eà¶-áþl¿Žá¨nâòÑzÎèâbѺgXn«AþãcÅ*÷´îà ®fâj>QäÜ (úÍ(El¬á)¨Ä«#†äÔ:«öb-Õ^­ÕÖKNIþ׿b}Ü ÛU¤J©emƒŽg¬§Á/Ûï–r_—ŠÛòêºÒhî¾HÇÎäQvÚ¼ÎêßVñÂîüR%¿nŒy*c¶,v†­k”Ī +)–%k™Þ5ª¥æ&jæJìOlÅÞ“Æ]•£ÞdEÔúZ"öåÓâäË&ëÒ/ c©Ê:Ëž¡ô¾ÜÕ¤ ·](–­ÍbŸ¹Vƒðb#¿n[ ¬†RùÁèR"¬¥›Â ¢îAõâ”êšÔ&+÷nï÷voÖ†ñ¶fâÞ´¬©šLçõoþl´*mN¦-&±ü*1­piÿ] óêËjÞvœ/¤Ý4¹ã.Ö\º0jþðã±¾.ðÅEíZžWZë¯0.|>Œªå6/jr([ž°òB1,b»V1¦­ãdÊjÈ ƒ óŽëÞ1.kÈ CíîcÞ6fL²1é…AÕ¤wU&¬*$sef#çrœ"/' mþ.s®*bÔ]²QÝK&™FX¡½fk‚±÷Žó“ó“©´žñy¢³0¼Ÿ03ÍžnÊñ.œ¢ÚÚñ-ç3pÙï3*àÁW˜º¸ò+"_:môù£ ›Îª3ã3xB²>©ób¦qž‚í;ƒÜ3éi·jj5«þrp)“ò厴IŸkìý§%ÝÎ{A¯‰Ó ªK þwk ¯®-×p3·í.Ã[;pâòò6 ²o´Ç»"r ä,5?D?µOB³×Å—Rpóúê×u½+V«õF-²ª±µ8—³YŸóÖŠ/Eo"z~-f´ÿÆoˆ\y8/¡9 ü2“>C5á¾müÆmdM³ºš+^òVsd¿yä¼"&H{§N;ò^—k]—Ìýržš¯a·¡ÁºÂv33êÛ§‹òI‡°ioî)wnºº±WÔWF6Z_–¢á´Ú<öC‡kORÌ¡q´®—´BiW_02WÖ«%_çv_snòêªuÞU÷î˜jõasÄAÚ ‡L8ƒtþÂfY“õ7÷:síZ·X'ZZfC@'vGŸ-3Øsï4n£l¹R(³4AÕ-g·\ãœ.Îô-ö/º¦c/wd;²D·óø’¢á6ÓzxU5_ß_š™w !6’ôi6ˆwðÌ? èŽeu·7,£8êR›ÈšÉÞ·ŒßnïG/¯ó„Þ®\XwêlÓ\ pðøb;‘¨ÎïŒÛ÷%%(²¢û¯§hƒ®o7t%Oø·,û^ Ä' Îg‚»ÃVzˆC¼‡£vJ«¶`Çž>66JÁwõ’û ¦z¢§û‚ç¶««&¬“ÀÆfÿpú>1þJŸÓ+‘7µC—<Î[¥°Øj3äs+âk \6[³ÁOïƒ58åµW;µ/½Ó/ß„ŠXz'©¶¯a­[5erü9a01üK^9¿3·ºË9»{©»t?‹© iµT¶0B=ð&2Cî ç¼:26ð&JoYõp­¶Çq†OnÃ×çÃcº¥gºÄ/¾\†ö‡è,º4¥†:­ צmƒ=É×½=<Ì•âú!¥j¨;>Ñ#5ã;Ðñ:?ß¼ç‡=ÒmúT{tGçtËóeµ‘²ÖÇYuw´7Jy¿µÓC}öªÝÔS++° £ýkò¶*|Ò}»yþçËþOöúýÊm“þÏA¹ ïpÇ»éêºSÇ[‚o¿ûçÝ¿/Ne¯üd—¹ G¾q¯¯šGúsL:ä >@@ "˜cy²kÚ¯ŠÒnÛ2>ç~ä oÄ]Q‡DO&Ô‹ôŒA•Ê‚5`:¥Ñ®rÞb²ùŒNG¿ÛðË­lNWÏ:ûŽC &†7¨å5X(†(˜HHu¨øÈhØ8)Y¹èy²¶&Ç·Õ9b’eUð·Ò ™ú§E– ëI·8ø¸–ç© ˜;e°§ÕÆÖc ‰‰Ly©|ÌœÙlü,M=<4w-­w•ŪùùóÔDŽð«Ѳ)†z÷½–þh—}O\{( ê?%§À~,ˆP`B^ 2|"A‡+N”x"•TZ¦1 CêÊÆVÐêÝB‘%Ý:Y#íݱçòT ˜ZšìY lI*k%{z¬æŒçÏe@‹=ÚL+sŸÂõªÒ ¸ˆMŸîZa@åJ4ý8±áÈ«*­°Êެ@=< } }4®Q·r‘¥;wGq|?žiÊÛq„u„E·5–LšàúŠ£ÓN_€úˆI rä¶$˜xæ¼YsæÎ G‡&-úsêÒ‡ ¯½Û1_T³íìâ2—2±,x~o·²6rÝ´|>…›¹íá°•ã]ž\ÙkH­ÏïþXfÇ(«âáÉ­Í;)Ë5ej¹Ø®îMå§m'sçÍçÛŽº~ºæ$kÃÄ)Yàb˜kÁtGVá‰ÖIc "œo&áÓVeÛI‡ÑBe”¡Fn¨áE zâ‡"žhbŠÆvá\ ¥%Ò0îV*Z…'ãC$Õh‹yÒõ ïxß~õå÷\’GI_2“áSS»@%`l¯qg]c8€·`±)‡chуYYJ¡V‹+6Y¤’l"¹¤›mÂÆâ“Óù—%åý'•vçܨ[âB]Ÿ­È#Õ“6) À$4­ÅZ¤«MŠZ¥§]jZ¦ªYª©¤œVœžóÍ•Ãþù(ˆ‚]zù "c}# ¦þ¨Jŵ5å›LΩ«œpöºät±—K[ØÁZÎ[Û"€*%u­NKyh1û—{–ÅÇk·¿z»ë·â.×ß¶ðm#[•þAJØcYŽ‚Øªe´z‹öRÅÛI®¶kk£Òb8b‡L0Š%Lb¬pÁ*N©f’/–âgÅ™tõ]¼òBhhŽÙ¸;­˜,ŠS´‡‹2¸¾†ËòÊütn”¡µB±7çyfp >›Xƒ‰þ4̽ÐöT'iθ¦Êq.ò¸.3-Ø^|:2qŒ!öd D“ÀóVûpSe²¦`!”^|ê)¦›ºÝv§þ”Â=·Ül× ª¹K:à¡?Ó*¼]{M’Ùš$¡¾HÝ´âÉJ7Ý2ÔNKβ°^) ¢yzŒù»Aÿ)¯€ Z-µ jfÑgi«Í¹òMùÓ±S.{\åNmßVþ|6çX î5Òar™3a ³…Hãì0 «Ø0ÃÏ;ß|ôÐOO"ÄËßUu²bHmLâ\‡.ú„î^K/ÂIdÉØ8ûãòÇOäò>ewêQQsñPbKÜhŒ|—k¬ð +k íLO8šŸp5»ÎÏ~¬]ȯã`sVÙWÖ¨E.‘OmÚ9\¡‡?vÇ_­[ÝîÃÊÐn3| oþhCÕ˜ÌXsÒݺt”;ÿ|fßA”¥‹WÏ.F»‹^GÁúY0ŠTœbI,÷ÂìXÌ"ˆ‡§/11“Úýî™kuŽ A †ÞTXEÚÉQ‚Rœ£µÌv.¥‹T7K ™!8"ž¡7Ÿ;žÎ~tÆ~í`Ò«öéÈH6r’דäÃêd1žt¯„™ô‹A'È2¸&‹@Ô ´Ä/æCH&ƒ¢íXG:Æ.JÑ›÷G¥sèoÌ¡ªBÉõ5‹cˆóÛ׸ÊFañˆ°œe›ùÊÙaòlTû ²5,ÜuÐFÀd•-¶yÁŽáñ~H[Ì\ˆÃ¸åPìÄ[;c˜þNwNj‡Šö(Bö@„¡DDÅ$L¢ðŒÃüœËgÊ2šuY&2“è?xuÑ;ËÊRâø)HƤO£ëQãYGB\.š$©Iïh®?ž°¥Biïf±³n–_õúä?S™Aã(¯“•¤$õ|j½Ÿöt¨B-jPµÇS¤lòL.è»´È>qTœ@i߈Ь24¡\]Ʊš?°ý¡?¤ŠêH¹¥vS*¦³ŽÖ@8‘]ݪVKªPæL3€³æDÓ‡3;y&í'R 2b¢0‘ž0笸ÏuÊ3²ï¬aeãIY±šï“JÒ]q }ýR¦Àã7CU±þ|¢¥ OÌk]ñúZY:ô¬ÅŠè9þªXUŽ©£Jx*T³©À±i‰·qÝBßc*‘ºö®'­ünGÍ ^³o¤„®JJÒzé&ÄNÛ@FEu_–4*$z^¢u½é=RU¶Tâ%éÙÕî—îÎõù„dW[s™»\» ˜¯Ky¨ÇßФ—|¢v·;~•Éxp•Ù.æ:WÂÀÎí°‘öÊØbrP{ŠîF©à[¨žO|çCÔ8 ãØzNÖ²3Æ,3‹ãÓžª•.K_"ã@˜²¾ö5 EqS‘ ‡µ%æ°“ü_»Î¶¸e…D­1Ý ÓP…íæŒº»bþR =§f7 壯Ðåkb EÖôø‘0hMUŠÛ8üÓÅÈ;âNÚ^ö–WÐèt ݼ÷")¾€ ÆÄøà".FÂQÕ¯G¬ÚJ5GyÍ›fÓWǦ¿N7u¤3p)‰LÚÖXhĵ0šÄëPjzÖN³¨ŒbÝËÃô` kŠj™^NlH|4U•LlzUÇ6n¶dsììË>{Çïãa^îYݦöi´¾˜õ¦äA4±Õp§iýdNz{®Î±Fo Ò‘†pw61»zƒeNîqÐmëtŸ(m±G­à”Òùk,èòZ“<Üz ÔP¹þ³%­^Dþzã7´Ç…fÄ–1šÄI¨"Ìj±¸tß­(qܧ€«»Ö3'×Áš·,º¥ öܶï¬b’Oݘ›¨L5Éšæ¸Ì èk(ýlÄö ì¯ÿôqòj÷µ´ÁÑ&Þ7*{ÚÑ®1ÙÏ.í´›½<Õ©û5³ú¤£(7¬Aõläp/ΉM¸ßkþw]M¹Ý7¿²÷NX·š9„j-²œÞ¢2Í›=ýÆŸ¹ŸŽy¦Ïºà9=ø…äÎòwõÞ®°ÐÇÌÅò éãeÇÍûñŽ¿ã°½¢EîW^Ó‹{­n|ªó z«ÛÒŒÀôû.¯ùä;=~Ÿ–÷™±Ýq[ôþÔu¤·\Ì{Ož&oæ—þÀë×9Õõˆã]۬ѷúDdù½‡Ýrd¯p쌀6Ú׎û«]ÿò¤'¢èôv»ÓcºöÜö{‡~FULd+äÖZÊ'~Xsƒ§EGôn‡§5Ã`“uºf©å~­†-üÆ(Èeyßáxõ×v/µR³dÖµp£ó ì:{vdšñXW~w´„'{CX{DH{·ç2#Wu¼Çe¾çe[—[¨zÒ÷rý¥,M—‚Y¸‚ädK9ó|XVZ–eß`€2Åjx÷V"è…zkJwPZˆ…[(s V~SwM^dugC$½UzfDiÿ²þ€&Æ1–OügˆÌv‡XvüׂOãY}ôf^$@HFRW(¨åIIÂd÷&‡‡²1GWx»†»‡%ø&6(/ð|‡¥YÛ×%(vÊå‰(؉ÎÄy‚õMç72X6¢E‰+±-ߦjSH`ŠˆÞg„BX„Í„±çŒ‚„q2rè7_Æ„Á¸÷ÕVÀåuqa|1W‹ã¨‚)Ó|´•4“`øD…媈gXFèo#¨H±ö†·‡¶8Rt˜5vˆ[¨x_å'ð¨uRˆSÓ—}®“lbg.û‡ˆ¹ˆ™én·s18¨CzFSB+EG|§¸JØwúˆ’Ÿþ¸\¸†×Tç3$YS4¡Šy؇x’g`$èF¿F‹åÈAÉ|¨R_g9ÒEIwN˜Q_b!tÆXqaе´ŒÐøŒ³ÇŒYI„ÓèJˆ3X/`Ðâ‡u“zW+U˜iä¸n 5Vù?^ˆK|‰…-Ài¦µj©gt„džI'<ù¨’pY˜F~ÿˆ'wˆ“Q·xóV“,ÁŠ0%|ž!«Gˆ—A‘Š˜ˆ›é™O¸7`Ø‹Ú6‰Ý¦€Äh‰Ø›È@B ”† .,‰L˜ˆD:’/î)“®y…°¹ ‡9E´I[¶IŠÓŽõÜô{®ˆ–_V¯y\³(Ÿõ©£ Êé‚F ƒw‰ Ji-e)ŒÞÕ—y¦_SÉBÛ#—\ây•݉¦—rI˜{¥˜Œ=1£di¡xæ}„T¨D+‰Ç–LJþ£Pê¤Ïus=- ÒœôôP¾ä¢Áä?ªAO ‹½Ð}®GŸ9Ú§ôá R¡ð3BÚ:Ý8§á1U¿‰VŠ™TIBY‘!šª$ºª%ÚÕd>¶Ž“¶ñHfzñ–€ô¨–Åwœø¤ÁZ©E£Åå£T7£k¹eÊ ¥ê ¡ì¹#IúQ²è“MJ©“ê§IA”3H¥U²ŸW:ƒE 9H¬)X¬÷¦Üy¦íZ¦iú®îš={…{Ę¢Æ„4IZŒÁ¨öìŸmù§Ø*¬šyŸèx`ü3«q'†x矉jž Q©†7z n˜ Ùª±{:¤˜–¬*7¡ÆFXŸþêÅæfÜÚk—‰‹ÂB§ YŸÉªœéª4ÛªÑw¢¦Ÿ¨³öP†7¸§å” È€lh’À:¬›´ŽÙ±µi[!Š™fÈC†sW J:œ¨ª´]û§RÚ`€U¨|ª‹¹u«)çŽRÕ¨D›‡1ãƒWžðJ¦s·òêjU9Õ¸©w±›.ú71ú4Ø«§°|êµ×:°ê’‚:3¦.ìØ°V€~; º:Ü%­è©ìš¸ˆë¹{“˜ ²÷•éwuÎà·ÏʶﷶÖ¡Úªª6+»2[³4&š–º³ã1€ÁUƒ&K8§Àq4Ê}¿úš‡»±K[¬2s¬¤»„þ2)D.Ѭ»¡ú¢º{V[Ë-È˱Ÿ;¤)Ä­p¶°Z’”*+D?»1û”µE±˜ ‰·vk¦ñJ¿t;¿¸²¦Ôئ@ª$K¤)'\–«”×YU…+Ž›¼Ü[~ßÛ9ù™‘Vª¬Yvšk´]zwYk±É† Kë½L'¡‹©£¦8¡í+§‰Zµ§vµÃ׺*ôºö9³´{³³» «ÿgO)г£—¸º¨ÖÛº-¤6j­ ŒÀÝ[‡ÀÕ£OKºÖ˜cˆbûº‹ œüoKZ­¹âÁHÌÅ.%ˆž7¾Y¶Xl½©ƒ(qÆ(zá¦Ie¿r[·õÇdJžMe¯#|þž™˜1‰ª¨]­O9’«ÃJ†{Ä[lÈ §€¢èÀŸÇ1ŒË[>ËÇÀ[S!¹«fa›+—¬Àpy©›š©(¡‚¸²Q\¤iI¡…¥ú²‹³5ìÊ1üʵ+7·ÛC:¬%+ªGf1½êÀVë+Éœµ»áu´Ç[È›lœË FLŒÇ¨ì´µË6‰IÕ ˆ:‰°.k‚ÄyÈŬÍsùb‘¨ŽÞʳE€¥¼—àv‰C«Ç銌ñ+Ç÷;ÇïìÎåUǵº¿iTž½ÇǦ7ªvŠIx:P^Žƒ•±]lÌivŽŠ,jc»Y‡J}¾«u˜Ëu|‰½Z|±ƒ9ÐÙ¬ÉõÙÉw"š*,¡~ŸþóÌëÐb€¼ÏJÆ¡¦ÊÊ-;Ã2Lð Ójw‘‘}©T †¾†% |}ƒ›%DLÑÛlÄÌŠge?ª'¨¨[z},‰SlÅû†ÚËÒ=Ô ¶E)¾à¬»Ñ¢RC6Ò+‘†&,;ˆ=H•b Çñ¼Öm-¿>5Ï<|ǼÊ7Ý„ù,9qé ü%° ØWý¾—«:‹<¾p°¢yy¾xÍ˾3՗܆Ñ‚]ÙÝWsí¦Ìœ²d£,Œ×g¹ö¬zéúÂèÓ-˪ڙEË(úÀ”éÍ]z¶Mz†ôÇwÔ„YÙ}Ì¡øÄÍ»ÌÛ#µ{ÜÔƒ$¸”i¤þ&œÔz°¼mÕ¾mÐÛ:Û û¸Ù®¿øsÇmýªk««ÎÚ¹®c ÏnÝÎæýÆÌ”¿_YÏòÅ·ë Úi¸ù%ÄËÐ{(ÔÒ¼Mx†}ÝÎÙ’dÖ'‹–? Vú˜,4úÍà}ŠÙÕ¤ÙÚÑd¹vQm}çÜh|6¡. à¨úÒ²ÜÚ.-âéxÃÉȵÌüÜ‘Üí%š«+½»ãÖ8ݽ=AE •G “"ËÐXÇâÈ­šÙòÅÏMãùmã •ÕáK…:<âl¾ºlá†Å8¨w`ºäÍÖoÍåçÝåø ¤ìáxèhcY¡ñ ÒlÊÄ‹0'ÐIŽäµ˜É<þVþÍG¬§DÎ?^>î—CþÓ“AGØ þZNHP;˜9µ|îMýyJ3ØÍ pÚcâ—ÎÚ˜þág6J)Μa¼Ðv=ÁŽ®¨¼rû±Û„nÙ5>.8^[:ÞÄ{[|æ¤.J& |%TͬçN·äÕKpǤ.8Ú9]zgàÿzŒâÍÎéíåÑíÓ>=qÍ{cžƒ<œž¶îÔ&·¬±ê üæ¾^è˜Çß·”ÐUÚÈü©ÜËíÁ¼7@çþj‚9èp^îœ ÂžÜÑ Ìã}ÊeÌÝzýïǶ½•îá#⫽é6;ÓŽhˈ­³-úîUžwjœç/7ãø¾ê‰þëêUæ”P[HÌKØãÃíG …Á©µÎmf?™ï¿¾Á.«\-ÛÙMÛ?ð+G_<˜5o+–[.íåýåB_™ðÕÞ\§í©8åœÜý,é}]’ñÔ/Oõr8ç8g¢U§ÐfÞã{Îí£\Œ*ÿP ÎL†ó(‰èz~²^ÂžŠæÛ¸Ôýɲ®«Ò;È ¯ðšž÷7ûÚ:Ë‹´*×ï¸ôÀTÉ=ñŽêoöÈùñÒx®ÔøÆ¬ƒ¶yš¹€ÉëpTõ‹oõÔ=ów¾î6¯Â^òÂ+’©4Ø>ÏDOí@ßúæmíštô:—¯ƒðöp¿×õ}iâŽß›¯øæ.Æýîÿ}Ë‘ë¨þ8ÏÝm5Ö€.W‚NWgÏùq˜ö"æ¼Røu£Äx·ÏË¢òsïÂu/cxÏð{/þ¬úð£Û‚+ì§ŽìÇ­ó¹=2 ¸ñäÞñ)ØøîæŸÃù[Öèßôg (ˆcgZQ(Šq¶-Øè‰ï¹èóh½¡°x3þˆÇed>›P U)½F³UgMí&sÛ] `veM>’øé³­Ñ½n¿ãóú=Ž[½Ý´ùÀ(@iݬ´,ê$5B*J>NòDRbZV2n:jfr‚z†~–’žŽ¦^–¬ Ža ¶Ì˜ NYµ.ÍÌñùþþî´9 2½:Â,̰Fé"C[%rIGS_þãbÃVskOã¶ ; “çè–Тó7{ º‰ô×ÛÓ±¿‡]µö“ë—‰‘O ©mÞ¬eKhPá·…BDøPbšs„àýá1ë ‘s."ÊBïI>ȸ» £%C¶¨™{¦YÌš4oªÁ©ÃfΞ;uÎôô§P™FyM:téQ F½¬dˆ Ý™âN|‡WÉ®{l\ýy«]ÄÊJ¥Ìz°›T¶jÛ® wîÛ[X<™ÐWÓÆZÿPÑuµW¯†í4!›  à†˜ícùÌmY¹o/W¦›3ÅÎã¢b*"ÝŒ•€†ZwuÞáÖÎ¥ ö Ë‚.ïŽAµJw§Ýþªzå{xpS¿…ç nÊ+û’YW7)Þ#]—Ü׆YÅU^(X•¹g˛ϗלž³óö #çM«e™ªxSøÁÒ8º—ÂØ»®#lþÈ7:ÙêµgÞzè5È ƒÞeQm uwüÁ7V|Oø÷IyÅ1j½—Âm,%‚S.6UŒ3:E£Œ5âx£ŽóÙÈc´ÍvUµ”†ÒP›å×k"–”$mfäD+gô!„b)¡–ìeÉeB ³_J{é !ègx^èÄêöd¡Ú5¢›oþÞ"Ž“Ý]Xˆ@Í¡œqÄ-·irÇyÚ©¦£‚J*§¡¢jeëeXŸ_EX¨ ”òX÷è='Ñ7›wŽ…uzþ¬ ] Ka±k…Cèã©:š}ƒÉ¹,‰E,i+0`1S¤Œ¥‰—K`V¨±ÃúI®¸ÄRT]<賓‘«dÀ&Ej´Ñ[B›Öꑘ¡Ç x¡+Â×bŽ>îøâÀ#Á #̰ Cüp9Êòyh‘gÆÆšrà ÌšúâE©6Tª ¬¹Ç–;®Ê讼¸ÝŠI& f†¤ß_]VkǾ0Ši‰3§b ¾zËG§Œô¹I3hóîû®UZIqâv¸V»³þ³f¥¼ šu骕Zö©¦~z¶Ùi³-êÚn¯¢*1¬º›Î†b+ß½Z×1­|š\]ï6à‰§Su'#ÞòÒ‹£Ì»Ûý¤¥A]`pòÃ1ß[·Ë✑#ñíØ]7^zâJ›®¸±††aÝa|óºÌIáèæ}§È>0V'ÜcÄÂKL¼ñüñ 3ÛõƒW­»°÷æ¿KÚ¹ö6¸ZVžÎ4ãá¯zn£ƒ>fÈe¾Û‡ÒFÏæíùò›+·ðkôÅX™l¾ÿ¨“/u,sÅ V3ÊA‹€¼sÇVt6¿;|È&ÒÓÞ¼,uL¹ìm¨BÜÚ¶A rðƒjþaqäö¾Ë´Ên´£Ë¤J`»A1^\„V8Ÿîâà˜¸d±ˆNóA åL“1+}LIÖ»¼Ž7 !1M¢›[¸xX>êðŠ;T×{ìòœöEmv¼;’.–È·|dÛ« "|7Aø Oyr Þ¶<;Ö1ŽÌ3Ü…ä,"ÝGéÇ ç—¨*®Ñ-$óH­èH6’\/K_|d†:ñ„Õ¹JX y»bÐgŸÃŸÐîÄ¢ÓD2•X\eU¦@Þ¥Q:E4Ò ¨Æ dí}H$×ê5¯)‰Š™!1IØÁcŠÐƒ!\f1«Èº-¥v=³LE`Æaî»+þ á|EFU¶’•Z'„­(mrö’bè$JxòŒ‹ÌÏIž°b’U‚¤8 NrN…ulìÍšÀHXî+ñÔ®hY?„æÅ4DåõˆG:bô¢µ(G“W”æ¡åyDC©Ù¹\>ð‰My㮲È&ö“Ÿáœ)@Ù2IR†‹/`üܹ=ê·”Î9 $Y‚J]*S›êÔ§B5ªR*U«jÕ«b5«ZÝ*W©Ê@)äÖBw–Äüèj˜ì‚AWÛêÖ·Â5®r+]·úÕWÕ,3œÈÙ5;6Man*¢¾z×–°ˆ]lbËØÇ:6²¬þd+KÙËZ6³˜Ý¬f;ËÙÏz6´‰5ÃhI»XÓ6²ªEìhIJµxP²~(_/«ÅMJµŒmlhAëÛÞ÷·Â .q‡kÜâ®–·U®gO[Úº>õ}Å—ßLx"~uцˆw»ëÝï‚7¼â/yËkÞó¢7½ê]/{ÛëÞ÷Â7¾â­Å̦k­z.‘#ãîbÐßðø7Àð ,`øÀ N0ƒìà?¸Áž°„+á SÃÎ0‡7ìa ÿÀ!æ/z#²’þ‹œä ;YÉ3ž2©le)W9ËSsºìe.{9Ìb–1™Á\æ.K­zAíÛ<ØJ¹Ðw¾R}êlç;ã9ÏzÞ3Ÿûìç?ºÎsvq·È0h<Ï9Ð{¶[Yý:ÃO”gÙ1š™A‚WÌ1Îô—ÉÖ!Ø­´äˆàW =UJÌÂR$J ­HÓWò™@Tb‘%}„¥ÂeZâY À®¡¥[öÛZBÆ T¥=TSð9›×üÔd(Û`ba:aÎßA†}äÅÑášÑ5fd:‚cRæˆ  æÃ]ÙfjYg΀bî€/BædJæhš¦a"&  ·™a&jæ½¹ælægJ%W"@^¾É_QN#6þ(Txå»'¿1ÃTÚe}ȃlj\É1§ÃõŠYD]¹'uZ'Qbgu®%ŒIÉ…s†[u–[ÂYÜ\Š'¶'ÄM%º¡§ m'Jè¦/$F~O‹%d":‹¯égu¢Ù~RY–f~>çÈ5çwŽœY^ ¥gv^炞'‚ìÀ¨sè~ZgbÞf¹1æyþgzZ‚h½y(„öPE^ñ¡¨uÞöfL<{'º½[rªÞÊ™›Ê¥\ºåhŽÀZæ§q~[Œgt¾·ñèÄé(ÓÅ[¶½§<Ô¨B.)v®[”NéZÞBùY¡›ùæF6”IçzN©*[ѨrzSß™ÞþÙ©© ð,Ô‡cÒJpÊé¶Í©;€ØHçJ*Aš^áÆX™&»ˆ˜@†Û©\”NYÂñ乤ýŸ4Ê"¡a^~6€4@¥n±…¢!’C+(j‚²Â¥Zj4 \j"®ÝM¬Àª– ø¨rVj¬Šj<@©úé9D'dž¥Zê¥újJÌ«æ„6Ã©Š€•ÆÙ«€¨–ª­NŒä±*þ¡‚·…e(däaz¡£¡ÄF”€HCO Ü1‚@ìdÌ@¥žÀ¨Š€¸Rb¼Î_\¦r¾ë4þ9«Ûœ«ìA¢ºÞk»þ×H‡¹ž€­À§æ…3²k¸63 ßJþ‰ìݧ¶£’QÕV¥\$‰}”*ѽ ÝÀ¾~*Jú…³2ƒ³†ìþxë×\NÈþšÀ«¡‰«é=€¡(¬<ž¸§³²‹Yƒ0CXúÀ ¤ì¹ÁkˆÒ¾šÝ5˜ìOF–F0rÒžŸVÂÞVŠå«@-Ü9ëfh$ŸÍÞÐ’ê=i ®žÚkÛn[©E í@Øêï5)Ú,Ýî+§öfÔĺZ¦÷ÀÙ¬½Aíñ‰@©n_1B.›æ½Ä'ŒŽ)æ•Á-J|؇Ñâ@­’ê©®l¯>®é’ª¸Æjêë§‚+èÆÇÊŽnÞ®îéÎîÁ²«±Æª¸þ¶y‚ê €.dت¬–Ëòêé6¬¯Þ¬¢*ÔϺۦîãŠî©Öîã6¬L¯»Z¯ê–@µfZª,Ž®»æ®±¦î¨æ®öV/ëm¥º«Ü&íåBÐÝÝ\–àB ÅFÈn¸Â+ù†kô€» 0ðºçª­ ©m³ì»>¬C07¬Û­ÜJ(Ý*0û¯P0¯kÿB®&3ð*ÔëÍ.°ÿ2°ÃFpò¯ÅÊe-@/^L°­R0ì« ÛpÈÞ0'¬Œ©›Êï<ÝìäaV 'Ú+ÇÂðóæ0®µï¹µl"®“Êð¶- '¼@nñºÀ¾Újþ®þ(oY©B/è«·±ãð±Vnœy`ƒî ðêŒ9qn?ï£ÁòR-Ó-ѰðÇ1(ð»–0ÐZðßBm‹r ?îóÚìêr°Œýòñ&ì'CÔ½±·±².2/ßëþ¾2©ÊX›~®æò#ï/ô¶l4/­8ó2ûq*@%bì=@*´ò"^â¢8/ÞÒJËÎrøŽ1u²2‘j‘ܬ;Ïs,7l!Wñ6Û,Û6ò±ŠRÕñó@îr6ãë'Óþ Òæi/ë1‡ò>ïÃnðªl2²8'š½Þ±<<²"û0 ¿3¾¢pÓ[ËšíüQ²W`„æ–¢ëqmþöò'31«1ìŽôÁ>nKÿ«¯À?·kpIK4Ut+åÜB- ô»/Ë^ôùÆrÏât05Ýj/ùro?ñÊVµ˘ºiUh/B[jU#5B?°3µ0ïp <@—*\_9ߊ£6Ÿµ>ÿ(Á¸/õ‚µ»/E»pHÛ®8$ 1p?Ÿïï°¸¶õ/#¯3(÷stð/+oÐb6Vsðñoo6DÛaóîNö 3±û–.b³îéíñþ6,DGôºÎª›vb×¶í®¯Ôªeóð¯R´Hò·1ekì ßý")€«’Nå¡Ji¾ߥ+qŠ'ÆÉ¨¯ô³».\½¶¥É]'Qòg¾õìž\z;q’‚w”Þ©1§5dk÷·áèºÅezé8c2_÷µ"b%×&1[Ô(§ùw‡ÎÑþ¤Ò†g„{æÆÅÛ^5»õ×ÅT½ñ(‡/8ê6¸j\¼å²‡ËwÈyt$8¸f’^w¼y(È¡ l¼´a U¢ªôù%ØÜô›žø¸a·Œ¢êkŒ¾}kº²ºÍÌ-ç7ÑɨøªÛqž,U˜Ü¡q¶žJ©ÈêC1 ÁV[âþë}ô‘ÓGµÅ€ÑñE ýfV\Mw¾ƒ°bÂhB‰B¸&Ým|¡Š›.Èìׂw‰°jžë¼*Êì³Æî ‰ÉUè¶•Û)&ÎÖýÎÆÌéɱK77,]ýªBÞS_°Ûee0fKÏŽ:¢‹à›8üð´¥L×àáµ5õ÷Ô¹%‹o,A}¹½öªx°Ç Jü¹$øˆðæX­ùLó¡¼èË>¡Ú÷.qó ß´ËÑì@•?Ë m‡ýõº Èí='ú¦ ÖÏ£»÷ýˆ;ŠŠí>ÕgýÏ~¹£¤ÎGýá?>Ô ~××áäæ'ñT|åU|íøŒ[–¹V°MM¯±f–™~–Afë'ÙÆšþ™göX”åX'¹¾‘‰¾zsÙ’Á>Ñ~¥_Y‘õþ“1ëûZí§ÅØço+ÇÖ+Œ¹âE¹Ÿ”úYõÚ¸~üW’: y¼C>÷3¤ù÷YÒf¾æÓgNãÁ1K°Š`_~ajjæL͉ҤÊÿè !±ˆcœb%K¶k¬Æ±[Ã"‹ž±qç²€O§;±lÇ YRÍx¤h0I"þnV“ ÈmâL;ÒB.›Ïè´ú\ÔòÀ[°ü%¯¿žïüü݆æézt€~;z†„ˆ†ƒ}Š4މ‡…’oƒ˜Ž@—•”žšžŠm>ck§¨§ŸR‘“F|°±­U&€‚€}¬þtm3w<:»„¬a…¯´µ”Ç6~ÇÄ–¾Æv¸Ô0Ã…Á‹yÛË·ËáÏá¬ÞRàB¦©ë첲呿¿ºŸm½‡ô®rú–ò®X§ ­~÷¡»ç…Áƒ¼<ØÍK±j)Z”È1 êÚ‰TóÄI+q{fí“öhÞ»V}þ}JBÐ2—À*ÞŠøÒfK77úœ˜óePžE­äf(æM§õÔé1äÈ«fNîiÔ2_EŽ\½ ,jïâÑ—&R+SmPf`ðÀm„Î-ÐhãÈ ä7©ž?æ€ê«Ú@è¡`N‹Ý ó)ã’Eb|äo†íû@cêHù+iwê±Kª²Ó*Ûh˜ËÆÜ!½£)`Cøjkï}÷K–÷áyÙ¨+Ç$l|"3&/t¤! ‹@á-¸åL0„îë-ʹâJäf\i+“?Aä„<Î2&,9Ù×µr:+§à¥TÏ¥t=e¨9c¤7fß±bH}‡á“ØqT°ÁøóØ›”ò-·þ[߉bZ)Z®¤c .ø²KN¢W$²Õ›Cx·œ>SlÑÖV©¶„“ü +l¿Í)–”>ðÆ[œqÉ3Ø"ÈtW¨³¸&{ç[†§™-[ª#bê[àåá¬S2»Ö Àù觯þúì·ïþûðÇ/ÿüô×oÿýøÓõ å HÀð€L ÈÀ:ðŒ €Á©çuN 2ÈÀЃa?@Š0&,! Â:Ð…-4  W8Cz°†(Táw¸ÂêЇç æÔÀ0îˆH|œá ç ê4NqU Ž¿15ÈArIÌbþ¡ôÈ‘‹N´¢µh‡)š±‹XŒ"רD6r}#æÚÀAÔÙ±w¦»#-x§Ç>uÀó£ 1ÈAÂñ=<¢Ô8ø¬à¦»KŒW&†J"N-“t¤&_B†´“X¡&7©IHj£’¤tâLÉÅUZŽñø=æxxPaõ¢¿ô¼Î2''ÉK0‰-Y‚6:¤a¢Q>"p/ý RÝB64Qí"]ù‹m¶i;œH§7‘á&NÄI½“RTÉ3‘&ËËШ¥™Q¨£Â ®ÒÌÍ—;S‘e–¥©²iÚRì¾¥m?F^ b–¹j—l˜¹œý°î·É%];Ó×5EݬM—ÑNi)Ë{–¡ ¯\&-ŽªD [#³Dd8 ~ø Úµ^¨^9ˆSòUYæ§ivlbö/;çJ¬Ç{øJ& 2!TpIIR¤¥œ­¹›}iš#õ¡øy [— imÍ@:¯° ;U¡¤4œ0–†"镪ˆ&Ù•¤’sY”^*m:0éjâ ¥>™Ÿþ$—&§£uI ¨¨\8–Ì9›žöú`–Và)SXc#žµ‹ù‘ûÃz 8ÌéŽ_‰ŸÄˆ#þÆ4I©Tâ¥xæ¤8ÆOs¹¨bʤZ¦Õ³ª¯y” ‘dž3‘”‰:]¬†"7Ù!Ùl™™Y¥šJ£•©’Y¬Wò’=*ROµ6÷4àö Úr’ª)9d®Ù¤Ú§RvcF*Šaó’§Õ‚ sŸ„Xží…vjœ“Y~ªv¦-©£Š>Q8¯¿¢¬ÕWöÁ0¤()¹6|âé}³§Ðú¤~ „ÚÈš¼rwxY¡`hrGÌSlO¸SçÔs/j9h:©•qòˆ~í Du>X¥^H‘TwsteÒ.1ÛT3kQj¡$Ò¢8{ž&ûúŒ ûÍ ž–þšG¡&×wŽvREvŠòh˜©¨Ÿ¨¤Ãʨèú޶……ÄZWkŠ²ÜŠz¨¯;6\‚ò%}—–pU“;²Dó¬1j­A ‚–ª­É›§ž’®öÑW:xÙg˜‡2˜rå,:è<ƒ1$ûtˆ˜™M'8‰¯»ìç[Q[²Å£ûJ1¿‰{Ïr\Ûj<ÉÑg :€v pAË®‡ž:A¨Z–»Vx襖Ìò.o •Â’³z¥1ÕZ|l ‡¬;’™êœk(¨²â·¤–›Nv0ó2Õâ!;ˆpƒlTÚžª k[y®˜º ÙºRjA´ ‹$z(UÔ K` Úa‹ôþ˜rõÑ©tI…X¬ZK©Tj™£p@³Ì[m^2h6©¤•Ägõ]è± ²/F‡ i·Bˆ‡WÇ?áˆE„^³„Áã6b³`o‹©£1~ág—î%¯ +ÂÆ{HÜ  $÷¿cË¥nC†jä‹pŠZ§·Â§nHž«+” <¯¥˜Û螀ٷ'ŠGHèt‚ µ“rœ²V¼ÀûÀ7ü¸),wÇ{¯#k°8&A§a0JúUÇ’‘B»E ¢?|x¬ÊžŒ—{©U:L‰,`)uh»‹•÷0U1²}’Ul…oW£Í¥¿ÅXÂÃK5°è”:Žg½’J ܧ¯¶¤³º°þßÛ†âKwœ*¨\»ÕvޝÑd’°,:¿ÏÈ÷–¦ÉY¸ÀšÂ‘[¯Í7¼DSǰȆs6B½“Z…å¦g¥û¯:Œº˜¼½×:¨¬ pœÈ¶*»Ã’þGP®»µ e,º¸ŸZiÉ\ ¹¯|©Xl¯A\›Œ¹;¦P¾æxÆœ†§ÂÌÈãæÆ­Œ§éF·mzk{|´ªŸ:®ž¹”I°”*õR/Å* Д‹æ+0úb\O¾œµU˶ù E%‰±Üæ\GšË{C1 "Žâ¬Í™†Ž›ª <ÎÆ—­ªuF‹ÈD[ªyX;Óy¾l¢¾™&i2˜·ëTF{!ªŒ¬Y¸þ¸ˆÜ½Û }~&H Z Î\§-Ë33Ÿò)/Ö×0«2&yªwUÁî¼­Äœ’<ûÃYÝ[ù,I°ªu€IÓÕ—0nÕíòÖ¡7°N| P ©ÛŒ­LzÔ$è—íµ£k£_ÃÔùÖLEŽºë#×ù™Åy“Æ—¼Àãæ³… ´Å¾²ðÒ‘ÚÃSšfà#Ò÷2Ñ»7}^¸‡^Û¸®Å¶l¿ŠÈÁŃ|¿Ž·…’Ù¿`Ù0¹¾c˜eX0ÀLÀzÍ ¼Ïü)¹¬qÁÇ †ÒïkdzcûVþÈ [ÆÛ* –S˜ÊŠ Å&ÙTK²ƒœsú›ÃL­ÂF\ 5þ£=ÖÁš0”#<.:Y;ÌVx€•=ÖQ:„“}~t{±(èÐ+4“ë·Ÿ¢jÒ)Â+²ï*£`Ob™ŽBëWª :gtÉÞËÈ­J)ŽÍ½ýÍÆLæªö±Ü8Ë Ê×f±ø¼ Xç Ú|¼ÐÅ»ÚîÃG Û7z¼ú¥ÂúmyD@QhªøEº¿à®¼op«·!ûŸà›’É|ü}ÌúCÎX6ÁSÆÏ`«ŒzDÝFÞþœÒ¨Îˉ …Þ—m ®¹Øá°fºÉÝÚà+Ö1mx{;Ž}âåŒÞþ,íÑyÌæÀ­±íÊŸo×àAnÞþå ‰ ÓAMÈ!i´DÇ…­(†bš]]ßð\nkl~wéÕ„⛌O-mâŠqµÔkÞÁ¯X ýa”ˆhã7ŒãR,È[;cÍO –ò:éj¸ŽtK'tY&ÐÒHGÐ!bÞû&ÉHꆕŒ× Ù}ë€>¾V·ièI ÑjéukYÐJ×T-¤ üÓ¬ÚÜ=æM‡Â—zіΦ¡¢gŽ¡“q¥*¯"“‡rð×™îºð%ß_»Ã¦®ÙOÖýíÉ)Îßì¹â¹È¡Öë*šûÌ.רqSÒèH“Ímx×)×h^¼áŒkêê,ÿÔ¹$#oþ{É›¹§¶lÝŸ¥Þ“§Þ<òlÂŒÍê+mó êÜWQ¥/˜›v«UØæ)z÷, £œöîǾN2m¿;^µÅ¾©&æßÃ*Æ,Rõ •^Ïòy--µKŸñòVVœí¨¼í„ÎÍP^ÙR^óµä­Ø¤·W€U†¸ÉÛºMݤ <¯ÆbÔ`J¼¬Zs”îòr]VJ=9.lÅÐãŒ?{© ù[Z0ùK e/ñOßFOñ_ î_Áã^ÖD ¶+}YïÌLƒ@Z F©@Ü¿[×ÚÑ’^ÅßúÉs²È«Ê+y€}-p–rv tJg«¨DRôhŒ".õ™þñÕØÀgíÒɬ2ûœþ7iÙ„ë”Äl¡Æ­Ð—ÆÐcµ »Ÿ Œ uVz±¶xl©" …㨯«Z ]Y{n<ןB8&›¡^,¢©,.=µXG3QE3Vcu¸2×cUü䤬«b)àƒJ­[/õ Fîì¸@¸™š®#´©&¹+8,´Dš¿&º£«ÂÉÆÈ§6¬8˜‘°¡ÀªÆ¯¯ Ò‰;»žŸ Q¢B³ÌCÈÇDz¢®YH^Ë\ÒÒb±JãäFXŠÏ¤ãS2e[SŠÕ‚’ %¸Á$àÒGïL\¿³r®ØuÌKÓÜrê@fÈZÏ€Þ[xþjBdJ®åh…H‚ÿÀÔ¢Ó¯€Aég. ²sYÎÕª'˜´Œ ¥)‘D”!t݉“06 ȃI¡Œoñ õ¸²É·_‹Ø ө馸£ä(Ü5‚¡ÐeC]HÃ%6Ûú(pÀË ‘Ñ$a™—ŽbO”è@Ž-µ g¹}OÎƯ‚3©rÝÉ­‹*¡€«y<¡YÀ0×®†k*V¢¸GáćðE[LSÐv åm,ÂqÓ[ÐF‰X²G¢¤’“fÅ•õù°Ë‚ÛÈãUrW®nç¹]áñÄ¢MÅ]‹Y¥-ËDC¢Ü©·š¼ §}FÒŒ úæ"rCŸ‚´h*©ð‹ÇÈ#ûŵ[,¡‡É´8€-«˜Ì-6Ó­ Ú¸:á¿qôÃ’³Õò0„_Üj‡'ëJ$n¾fN[º½6©«µ`;³Ë1iÓ½l3TGµ9‹³Wn2»BólD8/SÏ9¡ñ¤$ çŒORK…”c…¹ b< XþíQXÃ;A0%<Š®•Oá[¹éäò(XQIZ#+;]KÈm aF˜øÈê¯Îdã‡Âë±ÂBD©5éxïÏ?¯´EΕØ+=5-þÖ¥ŽÓª’!U µÖÑ$öeÃ0~wMC`{EÃa=¼ôœ„v˜Ù°8UÀ7[´ó/䀖»­^=âAk‘ÍJsv‚rt‡ÌÉç‚CòVyŒfð7[RyzR]* dEÕB!XGf#`j\³o"Yܵb_SþªDÊÞԵʻ8Vºåúäs,ìHÕˆ˜qåÖzÄyÅiÐfª‚)…ùL=‰5Ñþäs÷4‹l“]M ôU;~'°7é[s«._˜^VIʉ­“Ø$³Þ:SLç%rQÙ¸*Ä…NßT/pŸWÞ ×Ë;WúÔ{SתÙ*“šËTîÕ®ð€ÉõCu^#â•(á±×ºŸOÖjæ Þ,ÏÍý‚šÉ‹q¯nK=¤rj–tÑùQ•ÝÎüõmyÒ¸c–ß÷s>m*\±Þmì*ØÒ!äÅl¨ÙÙuj'¹x¯-(‰}–µ¼>)ÒSN¨¬†5 @Çö¿×µŽ@!!Ü~E·&9"zMËÙú4ŤNtÍß|b/Ôaà)] þR³=zeK{ÜV²É¹,~U¡DyMYTKð88:­ôm1ã“ }Õ9×E-…²Žó X¤vMÃ~]›½ÎW¬Á€Ò@^½<„72¬„O  Ç&=‚ˆjÕ[Aå<†¥y SÅØ>ÅáÎ\Ðà_“úѾffq^t_åÜ8¿qVZ›U^øF™iPxø"B26«ÉÏDï@àÊÂX.BžËˆ´Ü²®FÁ)™t'jcŒâˆ ˜pyJr„eÖ>ON1}òC!ìvJ¶po¼›e&ñ§4Œqí˜:(ˆe¾tQêw~â,‹•#c{LI/‰þ©2C®_´R. D´&™®\&1“ìçuR¨7ɲË6þ®i¬ß»Ä)/ ¥’`óß³8Á·8nulãO¤âeR EPz¦BçIquÏü2˜Ftš"áè¬Àܨlsz üœcIMJíd›ô^4—8F¤š1JL!ÙÝ"J/SæÐUH;ÇLc¶ô–+ýâCµðPQõ´›N”  éÅø ³‰ ÍÒUxÌŽmµTÎ\4•Ó¡ÞΚ+µ+“*M!1…  '(*·"’O|gü’K‘&ñ޵ë]cçO»~Í¡hõ`?WOJ$6Zqmϸ„ Ü Ñ´/ó[“¤&þVsa­µÜåiR÷»Œ6Ô‰-Ü/ÑçNïAL«•kM×zœ…•ôT‘Äôɦ՗6± oõÐwõ²¤˜dPgK)“êϱ—=£DùÈ„5ön¤ÙUðÆIN i‘’]U a»ÊB¹êR³õ9 s]:O™‘’Žlì,[ãÖ·zÐi²µeƒ‰F·­wšzeiôœú]mªñ]ZÌæŸÀÉQŽ"X±¯`lHAX=õõQ«•,ó¢;ÞÓÂT¸jÍg8™ÕÏý&MÄ£ÝÏji[¾ƒÒv -ùûÔTNT€Ù¼Nàáâ®S,å-}»ÜÐ|ñ,J”é$ã”rzûls¯gšþÍe—­ÿ")D¬Sì~A»1¾hü€‚á;³Ì¡0^0(Ë[`=p3–žû+•†ðfWͪ•ù3·zUŸš˜ÑaíïÃÈúÒ0Kd˜Å æ@ü¬+p³+ IMTlª8^gN.K/\, 3°¶¥”ó’Ï\H +C[lEë> ¶3r/6°Ìç_0ƒ?¥gU OO×ê º¦ÑH+ KWª‘Þ"C\dˆ¦“½ î°†II2(6•Ú[µ{»f6+ù•‘…±—1Ùµ´º#X®ì³ü\5'Ó†&‚»¯KÚÃîÙŸ>!{®”gÇ*ܨ¾ò3nE©ÓþÇÃý,ïFáë]þ·R¾m£/hixßI5‰¸¤´q/x1³’d¦É>oŽòjǹäìÛÄH܃ê G4Ûrsƒ [蘖/kÛóÆ×›œ_«×<•tijZGz[º8”…¬eíùòh7û¹ì¾±Ë…ûJ àœÇnzº¡l“wÜF–šíRˆÇÜ©ª|*ÌxFew[Þe?b5ºYìNž×å—^a ã­u¯KE§r´JYcåàò™s=‰Ô8ïÂ:ôï.=“\q|ªO°êÕ›èu êÀ‹|Ñk5ïÙGÍÕvªã« l9´Á<ðtçi¦·%°3‡©%µ‹:¿<§+Þúªg”f„Õ| Ñ«ç.áÀZþÔ[âuzë ‘ù'ˆÄ¾®:°­?ij˜ˆ\ßyâeŒïâeb"ã§Ùz ðW[|å¢õÞ·¸#2¤{-¥ú$¼›½@ƒÛK½¿ò¸FŠ:Á3+›’7Žb\“'uC.@›%}®+3—r®4û²Âú@Šy¯3„ë=Öò°ƒq¸P¢½B6•3/¿ë4°™¡Á+Bû³¨šªÌ‹ª²£v“»½" Ü/´¿…¾Sš¿‹b¶¯Ë L>Ò¹¶ƒ8£{& »5Uc–ék<¼!¤›¥ã¡¨[«µ‚Ë?©?ª{1Yêºs4ÄÃ@Gs?šs"?t=4¥ÎÁ±h£<þðK°fØ¿§i;’ÛZ‚»!û¶ 7T¢¦¢ò¼¥ÐAÖë»B#CB9¼½¬3<& /ÂR1HÓ@2ÜÀ²ªÂW“Bèª<~ƒžÍ›Cöâ“Ò/j GmˆÑø¬RXùRdS0õ25Q2]Ó1mS1}Ó0ýÐ3-S:eS85Ó:-;E¤Á8¿Ú¶þ€@8'¡9Q Ý4~q”3eÔX9ÔVATQTI5ÐHuÔH5šLMÔEEÔ4íÔQœCXM=ñ2´ÂèR"™LmH}U'˜Ó"¾.€UMµUVSÄ™Ó#«ÕÁÕ_Õo‰ÔÓ¡ØIü3€Ò¡*+ÔÒ)Ñ#äí!»žS7(ViÍÖ4A†­V ”4lÅi5¼ÄG Õ`RBAR–…-{¤ùPêiÍ ¼„’W|=¼|%å¹×|-¿OëBX¸Ò:¬í³[È©•‰³øˆJzØÀ„ׇT€X3€Ø%»X–J‹*"‹ÃU3À[@×pÌb¢.‚È>øþÁ'ÙWt$)ê⪽×D¡%³ 0úW¦Óž†!»<7…::´«3VZÍUi ‘6¥MZžÉ#p° ZmJ; ×G¹-žaÄ¥mJÕQˆa¤RÕ§õ<Õr͇d =„"ÈtâÓ=ò9G¬Ùºj0;²1>Ü=( +%`ÊìZY©tV‚b‡¤°ÂWxÅÚ!¦[gù Л”pÄ‹$ÙìÉéJ¡Ñ¸º\´Eœk&•.f€Úž].Œ*ŸAstZ[B]š£3×@«,}ÆÏ…\ØÀ±W¯Ë¥´mÃß5=ÁѬߥV¸5C© °‘듃ZèâRr‚+Lþ2(-SÕRZ¼½¦ã•"ua·ñÈÓãÕ¬ôª)ïI8û‚;PÍZ5S:È1!±ÚVzšß;œç@3üVàª_Ç5Mg¸Ü˜[â(«0[ŽqÄ: ^èmÝä >qû¿ETÚTê©eê^éc¨Ã:ßdMÆ–ƒŸYX¥,a>aNa¥ÜIóI ÖÞ´C&îPa®a¾áæ[ÏêÄö 9*T½¼ËÏd̸ÍÍìË·c4Nc5Æ×âé3ç«0rƒ¯Äa–4:VI ¾cšÌc=>þ>ž¼ Š‚p””b'>dÆÜ '¶âÎLLEfd+†ä-Þ I†LIìÙbÞ :‚­Yã™=ÚPå|%1õ4å2Fe…Tep@åte"8Úî‡Oæ’tí]& •OñÁWÝeœfaþÑøåà,fZfbff]žOd6š^væ^ÞaÕ^Îæ£!€îhZ”Àƒïâ¯øÔ`-gH­€JcÁÓ[•TJí‘2G5gwN=Ñ`å7Örngdå}ÖS~•4Å€gõ^z \S~ŽQ\šî@Ö0…U­Ò3¹O å)ih)Ýæ`­h)ÝÑ`µæû©g5•þfv’{.h—hˆÞ \¨×ˆÕ[“ÞÔwÖÐx>NÔŸNÔXÑèîg >ê]­RR^ç8*¡þinfXŸÞ4 ÚÚŸ›eE ×aV1P¥Dš’˜þ”¯Q¤Fi6Xi =k“ÎUènš+n¥Ó#ËgEV@µ¡ÃIœ€Ëh™¶Ûi‰û”ah€ÄÎßõ‚¥F ưQ‰¸­ªî¢8ìÄ^lþ;¢ì•ù[‡ÑgÃ.íÃvŠ9ì-šX êÒFlÃn!Ûꣀx6¼X2IB†ÄÆÄæ°àÓ PkïØ¾0ÚëpÈO¢€Þ®€ß¦€Åþݧ]ÛÑ€ë`’íÂ~aÅæküPn©¾nHìXl«¦íC€£5µ‘ (Õ”çíî‘è2›u¢þ€š8¹ûPû¶nXìÁnm]ï6tV4=ñoèÆîKˆïB ï[PëwÕ~oHˆoÚ¾‚8s3LyVmkÁn.\š~$Ñå6d1Ç詚8> ì`ð `€Àðé`‹tÄ þÙ¦p['¿‚¨&kèŽ ëÅŽ$ûÍǺ­§Á–çGÔØæìÍnîØžqÙ.mt¾ëù—®XÃçlÞ¨1w ¯pí‰Æ€Íîl%ÐlÈlÅnnèîì 7íþ.'ìþSìÖìèNl çò:ïlÐsÛfƒ)_Š-t.×ì-tÙ6€×Eq'v¿væöí#_öj€Ë6w7×÷™|·p}×÷ƒ–®Ð%‚®þöè¾]×Oþxt¯qjgAßqçò EqŒÞ òÐþ¶óðo’ø£Aì\`gn]q9î»vœŸñ¯òqOzž÷w—tO'n—ö„rR'÷ßùÖþk ÃoŸ’$wF×wªïu‰oì>u=©‰uö> ¹–pÕußs÷–ñ…·x`wn£ïw”çy”ß4‚_Õ–ñ¾·øÀxƒþnF§ðWp ïst÷ûÉ¿m/h[–èø)éí›wt]÷w“üfOú­Ï“É‘‰u1ßP}™‰lXé¤G›øVp„'}²gî€?“O|Ù×}ŸzÑGvo\ïýi'ú< }#þÈù¥þÇ~çFvñNoÀׯsÀwóí—ó:OvAOlÀz˜‡ì1I”È^”íøvσåæqï·z’?ìúïíÞö~ïçù]·ÿèvmhLN&.i²ÝÙˆàq 1Õ( ¡ÆLŽÕIBÌalCO§B\.†"x,.‘†¨èBR¤â‹±R?[ëê2¥.årôšær³Q:,p½‘õ{µ®-ò@7*IÑÜKÕÞFÖÁJK!¢–d[ž¡€ “ÀQSghAå”WÓ"Ûjeˆá#¡UYhè[&î×ZBä–^èðä"IŠUŠÞ i%åé.`#u¯þX!+ž5h'q‘œ‘¡§SÕS3ë…p÷zw]Eàµ.1Z´>Û§À€œtIzû7­ » |L8(€mîÔ1ú—#±¤‰ÓVPXB\°[r± ¸%¤®Œa³©HNœ$‚CÐ ÛK:+䥱åKqæÜ5¡Ep˜¸‹½~Uúdrb;¡Ô9†@Ë£BýlâµÜ°[Q¤2 ’t\×Ê”Új½A'­:Å­ÜŸöN~%yé$YIÛH|!‘«¨£ˆËf’kØ›0rdýRùÕQ·€ÝJ^É%kÊrNÛ2¾4„iÙ“€‹ºã[VKÉn9-é‹R¶h²°±mþb›öPÊîvû;ôv·Ú`AõF.²!´R ÚvtâPTëmäÌø9éÊdÿí–XrvøÙà ôkµ¡ÞC7 ã>F»LÜ’/˜y²i¶á$+Ø ‚ "ˆ‚ :xà X „>x „ "ha‚ ^á†28b… ^Xbˆ~"‡$Bhb‹,>H!Š/rˆa‡2røÆ'ø!GÅÒ‰£Ešxdˆ1)cƒ1føbþ%’12i!–W–èÞTJé ‹VZ9a—M¢ø¤†NR‰ wãýxD\ÔòŒAs1O%xþ0ÌžÑPƒ§œŒù‰çøÔh>y*J ŠRþÃ1ê‰(§Lz…ZjŸÒäÓ螨 7•XEI“i¨šÆÊfåâêª<½+­µ6ëb¶ê «›µ¦²ë¬‰quÞÄ Uu:7ÖS~ùõ’l›ª©¡-«¬´%™°¤Ê÷Ò´ÕÊ-·Ï¢®²Þ–«,xÎ×M¶©‡_¸…f«Üo¹‘f쩾ì¨é5÷ ¿|°ÁÖÕŠ0Ã\Òp€¥ °Â¥ý /ŵ¢+'üz¶IÃëK-9þ<µ…¼2Ë-»ürËÈA|rWBùh2Tû\Í=S‹.Î×Nd003¬^qa'”ÑM;ý4ÔO‡´¾¥²ÕN®TÉ·iVÄD 3×núSÒ×e›}öÙ_Tr¥5°Íd­ÍqÜÀ ‡6ØaûvÞ}ûý7̶‰w5zKþ.·S÷jà;þ8ä xiúIüÒnÏ;Vä{þ9è/ß*7BŠY¼¹Õÿú:뭻κá–+Þ#r¬Ù]úë¹ë¾;àçÑ=á™^3ïÅ<Ô(kÛcÿŽ9ãÈK?=õ‹}yéÖ&>–©Õ{ÿ=õ“.þï½>úé¿|bå+M›úñËüø¸ENã;exmh-2.8.0/misc/mafe/help/mafe_buttons.gif000664 001047 000144 00000012044 10005705401 020725 0ustar00welchusers000000 000000 GIF89a¢B礶Üd~¼Tv»ld‚¼,Jtd¼ÆÔ}8… Ö±ÿ£ÝÁ@V¶þ›à PŸ VYIP Р@`ÅÊqC¿¾}û~ÆÎ¿ÏŸ~~ùýñ÷ˆy  #IYpA\ à >á dà …\¨A† n¨a ZЇlÀAˆà  p! .*H‚–ðÄ„XƒE\pqA/ÕæF!m iH†Ò䓈$2[~™$“L:©¥!QNéÇ#W.)æ–\J–+ltƒ ®¹`ƒkV¸¦ d'‰u^˜g‡hx¢ƒ Äx‚z¡ 4*ˆè‹ XÀ‹N\ð( FðÐÄIÀ•Š$©†! ²ˆ¨‹ b*#ù™Öé§¡ŠJª©þˆ :”*ꨣBb$‰¤ÊGšyðÁ°;ì ûÁ!(»ÊŽÐì°#@;, D›í°%lûA ( ®²&@®¹Ã¾€î/4ò˜à®#<˜ ÄŽ&á!Eò!˜L‚zÈ"¢k©fú æ’‘HÒpÔèªk¯1U°!‘œ1$‹@+nCû'”ŒÉ%/€ò –Ìr.ksÉ2Ç\€Ë pBÉ#º¬Â >]² ø\tÉ;]¯'|p ìÌC 5ð´PÄ ñ™æ†ˆd‰ˆÁ#¢ë$½Îú5¨‘PÉÛoïjÚªúimG‚±þÛˆÈv["³ ¸Î -ޏâ.0®¸†—¹à&Lo†Wžy†¿À¹àž¾Çç)ܱ )°PI©`IÔ,°|‰˜\@Z[´‚:6$d{Üq&Qú»O:ü¶$nÿ|[óqÉd'¸­7LjpBqÈ)» Êj`í |¾²ãÃ÷Ø*‹- ÚîµïÐAüåž«ìêÈðA%5äÿÁðß ?hM³ÀÂ<7d‰w4Û®&aTÅd>Ÿ:„&žä1I@‚‹°^Ý,&0HP¢3[&&±ˆ¿ýê2ˆáfCŒ@5$ r¸Ãê0‡þ-¨a hC"ÆÐ¨a唂¾ ‰1|¢“˜?Ô €• `þö`.î VãÁZp‡¡PÉ c3„ÛÖ‰M@"!4“×x‡±²•*“xãòøP¥&ñ.(|"XȉÐ^ ºç‚î‰ï‘Ã2 "I‚I毒”Ü– ÒwIMR-’ŸÌß'õW‰l‘ÒT—ÿºÅ§ Á<ØC[Te0Œ¡ð–$$<ñ7‹ýÑT¥Z„3 ºÉ$w[#"¢§7 òÒW‰dÁ '8Póp‰ §Mn~@"¸ûT€àà9('ût€q~`ídß2àÎ@œ,þ°'>çyƒÜ áêçêRW: ŽHLÓTæ~µÅ_nÕ!Ú=fêÊ{lÞ¨Øh¼bž 7ª¢#""QÈ‘Îͽ"/€ œ`M€Ó SÔÀM àÀK/ð@R4íÁOP¡^€¨F%ª¤. ƒ›þTLê͆ڧŸv@'øi%|*©Tõ•pÂOy âüb‹Å:+SqÂÄÄ(#@V%'yŒKf{ãwI±<4¯l  áI1ú̵€!°€,ðƒøà±@Hìcƒ€Åú@X¬€0Á?È@|P„`´¥åj Z A§uþ­Œ@Ù" ¶¯}n5\ x‚k}°# 6¸'-q„" b e¬˜jy6bÆ)MU]9¶+8N„„ÝãvÑ1 r—% p„ váJ”ÐÞ#,Á.íe}ÝË„   ‚Ü„$øÀ@`/€à„#4á þ/„³à'8x‚¹ð°à#F þï6 ÷6ôõ ¤Ðµ*™Jb,daxŸyA4æuæv±Û«cÚXbÄt掟Y <À+PA ) y Kî ”Ÿ\€) ` KÌVª`+S! ƒÂ—µ …*8Á ^¹‚þ¼B DFÌ@° œ#4Çy[I(ê =o Wp¼ò P¡Œ¡‹ÁèD0ÂÑ~ô£ÿ“èE7ZÒ‘†ô¢ù>6:Ó˜ž4B‘è4¹ pZ°'¨Ú[Hµ`­€YkÕ0Xu«] p!½@ÀkTؼæBª[ …( €ÙÆFv³½kˆ¢ÌnÁ(°°j-ˆ‚ ÁæB\Àì.¤º×Y¨¯÷ÀèG÷ÊðfMjà½hF`šÞóF ¾åðiFï6øîwš¾ðäº`È5  Oð€Á¿€…0hbà6 \02x`Õb(ÃÅþ9n†`‡\ ½î¸ ÂÀq2(| f`¹HQ  AYy®Ç`Š`gÁ 7GNñqŒ? ¿*–ÎôD ‚K‡ºÔQáh¨?龺ÕîèT0Âë¨ðz*œnõ«SêS_zšÎp´ýíng»Üç.w·Ûýí!€ûÛÑpèÝí|¿»Ûý÷»ÿý yüáˆÀ.%RAùÊ[þò”C*4yÎ_^óž÷<æ-úÌWXHCêUŸÖ§þ ªýë[¿úÙמö¬ÏýíuïzÞϾ÷¼÷}ðï ŠK¨¢øÅ7¾ò/Á|æ¯Âø-H>óUýæOßùÊGþò›þ/ýâ??û—–Ư†5Œßüç'¿úÉþò¯¿ýíw¿úã/ÿ÷¯¿þéŸÿýÙŸÿ6¨Áÿøÿg~ñçXm@€ˆ~m€¨€þg~Ø€(~l €êwè~Òèæ÷"8‚_£$x‚((‚é·À‚~¨€å·ôGoPƒnPƒopƒ8¨ƒ6؃7øƒ9„9ãGƒA„>˜„@¸„G8„åGƒ?È„õq„RH…M¸„Qx…9øƒDÈ~"ã‚úÇ2h‚%¸ô·hH~pÐ…ô‘†nø†jæ—ƒpX‡vh‡kè~æ'2ùg¸7¨xð'ˆ†xˆþƒ8~‰(ˆkx¸ˆ‰Š8‰ˆ¸‚k‚%¨ Ø~š¨‡ž†›( ø‰jЈ^8¸~©Ø‰d˜¤Èõç‡ü—‡­†}芮†åG‹ôQˆ¢8Š¢x‹º8ŠÃx~rÐ…î'2ÿ`ˆäçŒãµè‰ÁXŒ¡ø‰—ØŠ08†Öƒ+ˆ‹Ùˆ±h°ˆøGè‹ægŠç§Œû'Òˆ‰ÔX޶x~Žn°f¸û¸ÇX„_£‹ó8ŽH‡H~©ˆŽyèŒ{HjàŒÒû׆bX©X‰ñ—мøåx•ˆ”(¦H‘è‘yˆÒØŒy’©’!y’ã÷þ§8ëçŒiˆò¨m ª8~Ñ“ìwŒ˜h~t0t@j€”+¹”0iŒlø5 q“ Y“S©~&i’¹ ™Œ!•'i’$ ë'–‘;é)’rØŠs0äW”†_ùŒ@YŠkI‘j@–äþ|Ù”i•t))˜X)”3I“/)˜˜¨b™€åÇ—g˜Œñ )“mH0¨”ty)ٔ凙ù™x?™—‚Y—X¹““x“©•ÈØ˜L ã·“`H–æç’¤yë7’é–é'œi™©9˜v)>Y€i޼ ˜')ž‰†Ç˜Ê¸ŒÈ)‘ þ9b©€À€‘Žù±“q™O™”Fɉãg”œY”H Ÿãw”G‡¶Ù›2èbù“k`ž?YžAž§iž˜ÊŸ[)›• I~m¸‡ ‘ŒdYž¨ ¡>ù—øH~F9í§”Fù– ªží‰”Z)ò¸‡~ø¨¹¢+zšš—…Ùz¹ŸÉè´ØŽ1•7IˆÚ˜—ñ§¢¨i€* ¤ºY¡¼X‚蟅H¢jЖæç–k œó9~GŠ~*ê>©ŸpX¤ÍY¡y©¥ 8 »(Ñ™—]Ù ´é HJ–\Ú0j ¬©ŸÒI–p`¢­¨”è'œkP”Nz~ñù–ú§þˆˆ{ø~bÉÍ tZušŒŠø¢qê~Ùˆ£™ty¢Aº—ŽJp §> ›¶ ¥ ú¡Sª¡¥êx¤J€æé“¢ÈŸzÉ‚^X£^§,H–2É•³¹^–žø©3z¨‘)£vz—_—å—z — șꙤTЬíXDÚ›>š­( ©ä‰­ß9£»Ö™£s)—ÛÙ†<É“¹ê¢ú­êéÉ¡ƒê~Ú¤ÐʤO*Ÿ¡™ž ÑŽÿù¢¡Cú¯û ° Ц½:÷G’òÇ£ú·›Öz‹z‹+¹H©Ôš±HŒù¡²žx§ów¹£äg€“ˆþ–hhš ®šJô‡²ó›C)€H;«~X~?Û~,{C+³éwi©ë÷ ¯èŠ<ê?y‘$;UÉ«è†è'š [z(ƒé‡ ‰8ù‚ò—‡©h²”8ʉ‹"k±«ˆ+¶ùœ©’rëŒê‹lKŽ{˱æˆS ´×Yœ0 –*k|{~0¨~yˆeØ™T ¹nøŽÛ‘KY³+)‹»¸•ê“äÚ ™Z‹‹ø‘¬x“èGˆZ[’©™´iœ„ȪìÉ’ -yœ1‹‹ ù ¹“Q·i«~xY›­KjéˆehœÃ[µ ZŠxŠ—^ º…{œ‰¼²‘þË‚ŸK½i¼kx§ÞÛ½Þ{ŒÇ¾k8¾ßÛ½¢y¾àk¾ëÛ¾í+¾Gª¾ðk¾óK¾åë¾ê{¿ö;¿üwعK«¿è›¿÷Ë¾ç ¿áø¾¾<Àܽ!ˆ¿äûÀ L¿ø‹ÀúKÁæþ—ÓK‰¡±dû´îGˆd둯x"KÂëµ\‹“0ÜÂ"¶¤HÃ0h© Š À’›¸wxø‡‰»¼p¨·?|Äh8™Ðˆ½äJ½s ’bkœ6)»QìÁS,‘tÉ›ZŒœ‰XÅWŒÅåjŲˌl·T\½J{“þû¿Nü» ‹Ä¶‹†&™Š JÄUû¼ihÇp¼:L“^¹¦øÑûÁŒ¼´ ÆÉëš’«r9ÈL©ÈXìÈ©IÈX,Éq°–ü¹†|•olÈ J·T¹È ‰•šÊ ;Ê€ÌÉ£|ɪ̾‰ÈY\—n,Ê<ÌÄk³³<Æ=,˜¶L‰«ÜËIQËU;‰æúÊ ’ŸùÅ¿+•k˜Ç ÄMé’XÉ›éËÔ,jj˜³<ÊÒ ½€ü™×¼ÉJ+½•Ü»\Íæœ± λìÁ=ÜÆ¤ Ë(¹ºäwÎÁô|Ï—ŠË£»ÌÐÍYŒÏÐ}Ï·¬Í¨ šÐ ½ÐªLÊs ÏÉÐ=Ñ-nÌÎOüĽÑ-ÑL—Ò"ý;exmh-2.8.0/misc/mafe/help/mafe_distro.gif000664 001047 000144 00000025706 10005705401 020544 0ustar00welchusers000000 000000 GIF89a„äæäÔÚÜÔÞìÜâìÜÞäôúüŒŠŒ|†œ üþü”ž¬¤¢¤œ¦´¼¾¼4:<¬ª¬DFDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù ,þà'Ždižhª®lë¾l€,Ó5Ûµ ÿÀ pH,…º¤R¦D*ŸÐYt*ЯØìUJ«ª^ÀÖK+‹E_®Ú•êØév%…“Óà´:Îoïï4Z‚ƒ‚STO&S8o†‡nQa’“•J–zˆ„œ'xŒzy–^¥J~a“8m¦š ­I­²¡±¡“w®¢¶´·¼»_žÁZpµ˜”‹´®©Æ¹Ì{†yÎÉŒÈÊÓ|ÒͿٖÂÞ$ztPªOkäæÒËè¸j ðñIÕ÷®ðôaÕŒ™–øü¤+wÊÜ·N²¹!ØË”s Ó4J‘z*ÑH`@4PÔžt¤§‘]=)þíQ<éð_­e0j™Ç$Ô"Xº&:Ô©Î"º“Ud ¸ ã¼ŒÒŽ2ªƒfCJ3bävÍ&OROÀÈ4R’e&–'û-[ÕSàB_a˜>ZôY’”ÅÑ+ÐÕª¦’0’e†Õk:‰*%Ø Ä©Êrí¼\|5Y¿d}¡Ðµ!#¥¾¦ñŒêÓ÷n¼¦šI*½,Ï(ÆÒf–"/âaÆ s™j¸²•A?ò¬9ðî•írUƒÃ”‰Ú„pé6­ù)RºI_DJ’yÑæ¤£GORwZï•Ý6£ýFPš±ÃI$ø¶bïŽGÁ[ƒ­v•iœÏ :í6ì—Ÿs8rð0þA€ ‰ýå|yÜT{O݆[×à¤!l=ä Uèäµ_ÑÑ]I,R`Sõm¤sL¤È]‹s'cuõ%HIm Bäé‘…F5™õ2XQx–{ '‹ÌÙ·„ŽDfăPX¥Üs4:—%†VzéœÐÑ#VVhÃÏ6HZÓØ…5„Í+€=)Ÿ›G2ÖK–5$g#™Ñ‘Ä%‰˜ eã}BU‡(v9d¤ßiéàS§6ãMZ„‹\ØhU¼©ÉáW—þ¤Nò´f¨jñì`ª1®š˜©~&Ú«§Ú÷Ù‰¯²Å š0ÁFV¯:é¤VGäVO4 µ©„éKÛl*a„^[dþIðЖqÕîqe£ßVË­¶ãv âo²y¸Û°›1b†¶¹‚ϨñªËiZm™¹Ã´Ù6J¶Úþ;H­¸_Ä„Y’&œ+µ'ž@~p§ÃQ<l6{¹íƒn0k­¹”`2¸Öòû-e=„[2™'¿Œ°ÉüNÔ N¼þo‡M¸»i¥7™ä„ÅÐkÍ:u¢Wó>q‹²!5+ý„ÔýV%ºqØ&yC[(„±[ïhð™ 9ylš!1-¹õ„ëÅ´pW‹ŒÓæÖ=·! ¬.Ùv"ƒ):D¼Û DÏô2U-/Úµ,âøâÿЃ¨x Iâ‹ÁÒ`Æ<ÖvtOþž&xM”nú騧®úꬷîúë°Ç.ûì´×n»ì@ž[Ì#pÀïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐ+o@¨RlÍ×{øþ;ÛÏýðßÿýøÑ@¾ùÀŸ¿|øÆsï~ñì—/ÿúÝ7_zî<û†=¾#À2Í4ãh3ü€,`SvÀ’ð$ŠMÄÀ"p‚ Ä 3ÈA ^ ‚ ”é>¬œí®0¤û]$V(ºðgS{¡ —&ÃÚp…44ÄAª´e£0;Ð+B ²%dëÃ3öÂDcüª%tªH—d""ñŠSÌâ·ˆE.žÃŠVþᮚ…8¢¡0 àÞ[šã±]§;ºƒ§nø~玌KWe¸ÃåÏ;?èÝïô£½Lƒæ FpÖ0×$K=9™Å¤ɉ풓Ädæ~‹ˆ1ДӄYºñ‚*iOPæZ¨h ¨âÐÂzªôãWðèš&é¬^°”X.k¹Ë9ÝÒ2PÀýÁ.E£”ÒS¡fH«;´Ü¤K 2ZêÆGŒæÕ²Y˰èá“AZºØå0R•IÕ5ƒ™°RGV Mª »H¬GÃx2ÉOÑ“žú܇¹3ËñM<-ØO”&¥æ4ÚÑοˆ„¢-òN•Ìãþ6;— ÂõæfLÚH9*¹‰ð~èaXï ˜ówjÉ µ4Óÿ(F: ˜âh8Áä3eœ6õÈM4'0€0=W¯‚NåɄ)uŪ0¡•ʤ#À~^ÃH#õ&_·&jòIÿüizŒ$…>~ŠhݤæR0 † ˆ¢„”ªÅ'\M+¬Ä`jÖ"ƒÏ6Ö °E¬Hë©ÇEsz ³Q}Ó£-res:bÓµ¯0ê*P5ú€Ž68-OUÛԢ͓J-žÆ©;˦ð¯¢êP>S*·U¥ËT06©^H±¦ÕÉßÌêU±2·šÒXnµþËXö–'>RB…ø–~!ì»+Xä±°u£±Ù\SI˜Þĺw±â,¦úhEñt­–‰£ëm·u­g”kdS™ ¡ S¶É ­¬Oþ†ÊàËQAI*JýˆÞÉ ‚<@xk¢­ºm˜ªëÑt?¤7Ìy1¡lnZULb¸B¡t Œæ\<ÊŸb¸ZiÄmÔ6Õaþ¬&Ö¨/ÂÆÃm†u¶xRlH—LÒ2ƒ‚Ÿ¬Ô/·O¯‘ ÃÿaÓÐa¥] bØ\WèÊZTû ÕÁ ^íƒzãÖn*ë­ :ÁKq»Ï1žs–ó–Køf´]×¹r¼îŠŸ‹`+wÏ9Ø![­þë—âö¬Û5ßÅÚˆb¿y×N+m4[Ë$'—¾Ln/¨›Ú5¥NÏ„ë½&Fq çýÞ9°F{Ö–{æ†NÍf]™Ñ›æ\ïf„[3i,ç¨j˜;Qq†²Ô›ÃZoYnŒÍ ÉšbBúÚÓF±%|êÐÅ'–ØMS±­F£4´ )±uš‚"(bÈ÷º˜û3a1ŠdYZÔ¡>r¬Ñ¸Ôô¤Ú^…µ²¢b×îB¡$¥mÄ–d»ëN‘™×uJ-®!>qeY¯Í¶ì3ãl¶Ð@{,ZP£"d:A1ÂJ¸m³l?c;ºˆžöË -lëP˜

Œ%],·IC‰õ÷~íWŽ'SPÔÅ8!©wíØù‡Ö¨¶ À‡¬¨ ‰Xém x”îõwàà¤kˆþ7#`Nñ¸·lN©Mªö„™Œ©ŒJÈILƒq}VGZé5ûñ†;©ßèb;_ãmƒ8„'—,IŽ-é”®‘aÙ$5æh±pe®f•²q’•~ÞÆ`g„‰”´HunW 2IPµ(—íe‰9Yƒæ3Ÿ&dåð—Òøm¯T‘š~¨MD6@Ü&Z1x_XSy[l'‰ÆäKáÁh ˆ6“‰q’wy„yY”O yæK‡tf’– '†íuKz”<ôH™vum÷˜þȇ¶IµTv6[® Ž¡›h´™Œ§ ê}Ù a‚¨é•¦Y‘™HE–z©†„9•Õhþg¸$¹¦r‡ÆŠùKû hE蛘蒓g47a}fiÚÈ•n2pƒi`Mu&GTÃØ+Cjé‰ühúHes2“Y©Qlh›=£œ’Ö‹yÒ™ÑöI—»VšX£Èˆ.58aéxÒè:žt6d(ék9q&i -'Ÿ*é‰xÙ¤„ÆyŠ$š+nN9pÕ¸¡ÎÙxÞvržÖGû¢ýH”¢™ MY™Z³j€ñTù‘@Q‚¸§¥=êvÆÙžòø•zª`õ‚-6eginšŸ¨–¤DXFÊ¢¹‡ž*Žºä¤¿©P:PÕ„ã8©žæ¦ûõt–ò`ˆÉ3  þj†^é˜Ê¡Œf ~Z¢–y¡H2¨:9-¹Ùn'w–pš`4zšðÙB(} Ê¥<úš¢ó¦)Y6eÉž½y~C*¤uY‰z D(Ÿ °ªTʤö‡œå¡¢;©;x¸£M—iç•| ‹×)‹§JjÀ—jê9àYœ •A§ÑGtJ¬Òy§ºêž6Ú«4ÉOPF™‡úyÊú‡Y©y‡Â*mÿš«j’j—Ò­ŽÚ9”ÊšÕc‹˜ÚT¿8ª  ˆ÷ˆ¡gs†FFªyjªè ™Ñ8™ÝÖ®ƒSÂÆ­Ï¦”Ny¯C•ž7J˜ï –×:/ó¥£ ëšºð8¯!Éúv¸É¬þåùv‹­‘:±Àéiºa­| µVZ‹2Ë“–j}^Ês&öŠpYéz® (œ?[©I;¬ïj„ñ rúZdöʵd[€¤É¯¼Ê³n{,{˜{4´«“#)lûÙS='±/‹1³¤3+µQ»¤˜ƒìzµì¨VÉ`¬{­ŸZ²©‰T%û'[¦¢{oz±ÚÚ“'J›i°µ[85K··m÷ê©§Û¯zû`Ø$BÜé¶ì£Î ©@ª¤¢ÚšÊ ­e1¤J Ë:µÌû¸º†,¦Û—G ¡\«š‰Y”"”}y__;®Z®¥‹²fk¦H¦“ë…Ø¶! ¼Ù&¥Š}I¡Í·ž€ÉþŒ™›·{Z“>4¥‹?‹¥:ù¥Ä´ŠJm‡û§æ5­Ú¼ŽË›8 [j+½ Œ ó£i¸íÑ ç2ŒÂ˘¬¢r'¾"Œ¾!LKÂÞ³e½j™{ 9§°Û“ÚÖºu‡·þª·ªç»¶øØ|âÙ¾6'Y(²F¯+wŒ&ø´&‰  ü´½aµ¸k‚ÔË ™ÙÂRæ¾°²ŠÊ½[jÄeˆ¶ã;ºØ¹^ȦꚘê{ ‚ ¤Xœ˜0lÃêbJ»¯÷{Ãù‡ªºš+Ãû]Ó­½½L¥òöÕP”Ê}]¥·ÍÀ‰ü–‰ÆÛëÍãàèÝÖ…ûß[<ÐBö½Q¾¡Ù=n4¼ˆ®j1ñáòÊØ–ݾ»¦Sì­NÚ¡=—PŒÚ:Í"ýà1.âÙlÀðüjæœâòÍâ{íÀs´šÝ™±ù- UÝÎÁDªØ#n˜ŒÑmà@.ÔF¤à.ëÞ‰‘PšÝÅíÖ€ Wí«Q~áS.ΧÝÒæü¢\î¬$îÅpàϪâeþ¾âýËö,Á¾]'€®å.ƒÝ+®]Ìã+Õ?ŽçíÐ]”EH,¶eÉ~Æ+Ý—ü¾³›ÉM>Ï´LoUþÑÄFã¬,Y‰ZêÝ´`QÜbÞ¸œÔæzßj9é¿Üß—^𗮨Zç­>î¯>Ô0ŽÒT– £^ãÛ¼àðüë4{è®ÝÝ·»è"9äL-´â†äÚ#Ûìý¼°]¼G¼É™ŽµÑÎéÑÈçÐê²îÇ~ܦŽêÆ :P½ê>.Ùã.Ôo³Üç^Në«ítÖ1œZñWâPnágý‡o½•Íáž Æ^ÍÈ>ïìµì¹æ]ßоé>óéë–´æþúSë ®íï±<²ÆìØ,îoE<¢çn®–³ 3v›½äM ïUÑÞÁ.Ú+?å1yßV._üž!®¹s^ijÊÓDÜâ’Næó=©FÔ½mœšõ€¼¥þŒã¿óžyZA.ÖŽñÿ©Ã@ëñ³>FoØLò‰nÝUÊò“ïÝ–Ÿ?ÃŽîßÁ÷éðÊÞ°Ìþ« [ð=?ߎ»±ÔãD¿Â4äožô?û†ù…òîNîÌÍÎÐëÑ螺3Üì.è¸þî*ˆ³w«ò˜§gÓ²Þw¯ßï&®ÞŸì9­º@ÃókOßÒNÊÕªðE­÷}Þïβ¯Íoþxx¶¬þõ»¯€jÝñÅ¿VwòøÜù&mü»–Ú/MïÀÎÝ IŽ"P[–')¸òìÆ6]ÊßûC*e8L6Ô ç‚rͧ±–Ì1¡Ë+*'£ÚªL爛ĎËQ3í•Þ´.–!è_¹ó®Í§ÿ T¤áÁÝÝÍ™Õ !âSá Ó¡Õ–Îáà¤å“[æ¤fÛ¦gç%äcB‹RèãcšdâÞOPà"êé,"eíìînUªn¡â/îp¨¨î!Ó \²°Rå®kO_ `á³bð¢Œ/™·nx''#žá­¹ÚùºaÚü{%+‰J30ø{ï)5¬¬¾\bfq%/Hñ~•“V þÓ'ˆéQŒdÑ -EÍT8$–ìâ‹~Öþä1ãBqÈLŽyôí$¼‡ÁÜ53¾*¤L¡«i“5 *bá¥-TAz/ 4*¥bӜ۬·ÆÝÕvfX¢8±ñ ™0Spùég‘FlƄɖ¦:ƒ NÌelȺ óJìkר ž(á–©#è¿¢¥ýýXóæ:4¢BÞªÒgå»+ ½´WJNOÍŒ= èNUǶ&-]¥5®Ko¥"e•UÜ´µþe•ãÞÔ‹uç@< *® öe®4²”Ö}+êu¾ØW6ò5©GÉO¸‰ö€Z̓¥VyË {þ|êéΧoŸðÑÉiJÅÁÝ~³"å%VD@©á¤>”QÅOQeõQSî–Ûmrw„-pScóRy¦•T^˹–liŸ^и8v1îUNcHÈ ÐU§ †-±‡PB(–ÜcÚ—YwÏaÚŽÖG~u„ò“Çüw "¢WƒUÂ'_\«SÌl¦ó–„iꦦ—ºØ#X[Â1è’8@u1UÙ\x 9²Ù^Mf7ã …ÖU_u$𔦇y§‘Xdm”ÖGÏp,Vz¤“÷!¥pú½Ù_›±!¹Ã+Ç ¹ ;N𒇝±j C¼¡˜EXkêj!…–þuw†·>cYº@ªezÝ{¢s¶EEfÛ]x¡´ÕÊh(µŒªã´ õhÑ3Þ9Ü¥Föé\bÁZ_³O~ú.˜sdž¾6¸¤?h ®¦ØÚ·­±% ™.›ˆ­l&¼kœcŒ°m¼s».© I ‘ãY«ž¯’Û)ŒuË•µ„¶xèj"Fï­í‰çèÕ ëñ¹æÊÔ)¦4HŒoÇ‚º 2’í–°©öB e%ÕŒË`—F+Y›‚þaÈ'¯/¿£p¯Ylb£Š©.®ª$ó5#>ûå¦p½Up²àÒ'mx™2¶pËíÄ/ý-Úg(­*ÆßœvÍ>Åíi¼þƒÿÌ3âFB¥Ó-~Ù$mé,Åà!¼élüR¼yÖg^ͰÖXOˆ“>DOœßÇÇCD8§Ç\ßÛ3Ìîµ$9Œ>Ó}òïÁS—r^»èíæìûÒ¬¸jœÉØä ^=Ò@ï© p‘›Š³ °Ëc«mF­¼¬¸öÓ¡7::¯[“~zùAð™ ¶‡½?$“Ð|Ù.'—¾EmÌz^ã‚w¸Í­duk '~'"Ã5d‚ø‡§+5FSÙ«`ÿ´ç8~{aN¼æ½³ï‘2èö¢ÎåÃ|‹ÖD—Óñt¢‹KŽ"†9±éMþРB”6ŽÝþŠj±Iß}ç@àM±wÝÂä¦ÅÄýµï0/ _ ‡:èÕì=Äé”ÐJ˜À5ð7@K˜Sý(vaZýp×>õkVˆVß·Ãùõ°jïs‚ ­6°…ðE|p Aç¯0’»–Ø@L†±&yÌL,8Ä/ñb¼à 4<ˆ®—Ï>i„ãÔÈœD«*.c\q¾˜<¶lˆª¡áU¡¬@Ê)~…\X•nø„O*Ò—%ì¨Úil‰¼kVTìŸ@ÌcUüfŒªcƒDRf죊!¾È•ëEeÄei)6Â’]kÑÖÊü¸@\^AšS_âj— >ê&þyÄDß IH>q^Îø:ã¿è’Ü^0k±6hÊn–ç&çÖÎõÙo‚ÈsJ]lÍ¥ î2Ösg(…¹Ç ÍS6¥ivZ/=òNNP'—x©¹0ýŠaÒÏ=êš„"³©î{’ꄺ}q¥HÌØòÚ(PFmð)€Êi75)V*Z„pêÊb9Ÿuι ¢–Ô"/÷I¶ÝkæTŸ©ÅRÊ®«Õ´^bûd]íqó³œi_Jϰì¤[\k®\ɾֵz{§%vV=ÚÆ²ž®¼'Rû*GÖÎ3ÔEŽ>eH‹V.ö´ Ý£™ÙØÒ-t¿W@+N+ÑËÐrm#à$‡YIö"¬`4BehÁ ¼¢Ѥï%_J ‘AS¶NŒq%!Vib_úâµ¾ÁÅP,"»B— >çŒ:Tâ.U%M ª!‹¹Ü;uÂË„£‰ÓKTé6fÅÕMbaµz]+ѵšLžwAKÖMv>1³JžGðÂí}1?©gÛÌÖ¸Î÷þ­3;Çþï¿D€ -èAºÐ†>4¢­èE3ºÑŽ~t¢ñ7ÚX1’N.úñ ­éMsºÓžþ4¨ÝÒ¿¢M%ø[†]ŠU³€Õ÷{5bÝêYóÖ¶–u­Y­ë[»ºÖ´~õ¯omëa»šØÀÞ5²…ìe+»ÙÇþõ²s”?ç |•[Ùý˜­mXG»Ù Ðõ¶ÃýmeƒÛÛÚ··Óîu«»Ý‡f5kTËŽö¾7¾ó­ï}ó»ßþþ7À.ð¼à?¸½ûsËXuÑǘ¶7ˆñL¼â¿8Å1nñŒs|ãÿxÇ5.ò“Üã#7¹ÉK~ò•«¼å)þ9ËaÎñ{ON1å3½±‹…ç>ï9ÐQÐó‡ýÜçD:Ò¾ó£ ½èIºÓ£õ©K½êIX²žõTïOÂłƵ24&ãijf?ËÔÐn0³ŸCÌEî’ `蹡,µrsNñ¦íD7ÂYþÞXl½ï)úá·ÎtÃûAð#8záOøÉ;žîM|oùÊk¾ó™ÿ<æCùÁŸ¥^#HäévÅ”~ì­½ëm€öÖ×cçc¯=îoo{ÝçÞò³}ía|àï¾çÃ?~ñ}¯|áïž÷o°¹3-½#€î´÷ƒÚ³Ï×ßë^í8î¾ò‰Ÿ|ð;_û|=þùe¯~ô÷Þòí7ÿðýŽñ¾4SÃzá1‚Õ@í$=?öñI 4žžÊ0Ÿý  lY_ F`J îM V R Ý û)„<—:ÄØõè]ÿ- ‡¨ÌAì–qÈ· ÙÈ%!• þ BK Π æ îmä@Žé–Ž`–¼¡ ›Y†` 0R¼•Õ‚É@Ð7 Œ˜8ÛU¡^!ž tà”\°ƒ”õM[ú¨RZÑNSˆL(ÉÅü™ƒ$ˆÅÎ!®Ð¡Ö!š#ÉÅš`‡€YÍðŸzÄ ±Î³ôÆ|×aå× ¬a>"$Z¡o4þŠÅQUMŸ•éÜ!rY[ ÊÙ9é zKY5â%¦" ®"*²""´",Ž­BîT|-BþNØEœz˜¡KyŽ©ÑŒc€Ø.Ù˜1bD¡¼ %vX º 6 ¶ 7,ažPV~Î Æ72ØŸˆ"raŒ¾pq þ­Î€½V¨¢Ž(ÅPŸm¢ª=[²q° [°‰›^®Ú·®AÛ_¶`òša&&»-¦°&²=&^Öß8$’K$^&ff¦fn&gv¦gb¦÷­äM‚¸ôÜ[ZªæF¨f£ýkš¸e2†Q® cBf¹%(fdÞ& ì¦ogbn‰cò¦og^~à€LÛ}¦Ù¥Å (tb¡t>guF¢b`gvÚÀuRgw’€tÒC–<ßþñBàÿ­§Ï!e °'0]|F|R~Æ|æg}Ò'ê'ª€{öÇ~ú'²çPhR‚€btAs–T&ßõ½ßí©xF…fàv ù¡ÝuÍj`ˆŽ¨†ºÅah†Š(…²Ÿ‰–àý ù…_À‰öEy‹û  ŽŠhÒÑ‚’(àÖMžÀ}² &i‰ª¨3l§D“^àå@€Ré†ÒžŒ]ƒÒfiBèŠ:‡¦]í}hŽ®_Œ¦Ÿõ]h`„©›Ž)‹ÂßÞµiœ¢é›rߜ‰ߥˆ²A²Bˆ˜§zög~¶ènÂ*œÊž“úþÙÁñ …t–:ümž“6Ÿ@€§JIté©=èéÍ,,¨ªIz;0¨‹ÆÁÌê¬ÀžŠÌ9IL˜iœjª®* œªý¹j×%Þl*ª&멲êb ëàÅ[øA F4ÀY@°*ŸÎÝŸ"A ‹ 8+ üê\í™ÀªkÀúƒÔц«¶@ªúÁ¼>㉄ƒ…Æj 0€ Ü«lA—bX*ݱjøëh«&£¨:܃fȸ枪^+¾¶Æ´’J „t¼Ä°ë°©)øëΑl(¬D,$Èè€È²LÅö+ÂZ‚¿B*°f£xä‹þ–@²Ž¶ ìOŒç ݵ@½ò¬e(KŠÀ¦¦ÀHüŸà]€y´,½¾¬ÎÚ+ÛÅc‘Ñà ,mÍÖÞx_°> Ã^‘&jÏ©*ÊŽ­æ ä ¥—B »ÖÑ®èd+«¢êªêíª’kµªê²–Õ’@$ÀÇîÇ>­&€ ÐjâÖ*âJ-­²+‚ÎlûkàNÛΫ¿úª쬳ú*³fl0À’ì²¾¬ê¦ª¿ €²«çŠ'q‚çØjk¸Â® Ä® ˆ®ì¢bZ>(ŽÄAØ‚^ߎ+«’ëæ’+½’쯞- |ÆX»ÎjãÁJn4Yo­f/Ób/»Âꛬªþö 0oϯ«ú2/ꚯì>­Ñò-ò¯ýҫκ/ºÆPïðN¬ lÍÖ/Ûò¢Ž’l0¼ìɦ€ã/ÖÞ.ÖÒ(¿bïPXo÷À¬»J- L/ájžõîkø*°BXí—n=°ªÏëñ¬ì†¯ÛŸÚÒéÒëíÖêê0 ÓhõÑ)ã/ ôìïù¯w.ç£X&„*oXë×Öìð†+ö 0 +ø¶iãžÅŒÀôÎ-­V¯ãvoôTî½ZqÍÞîðîÿÞðÄVm¸¶o²ÎlĽÉ¿²1—/°½–ïÎ^±ÁÎñæ¢qÏqé-ººþ€@† , oÏ1¯ ˜,»1ûpºf°7îÎm°5«ëÐ îËÞÈùN0ß q_2ëª0_-mê60_U¬Õê,·Þà¦ðË ðÌ®rŸ,ÉÖñ|«k° ë°ÿJq¯ž…7oóR­'SÝio=ôÁ[ðÇݺöÁ£Vmîâ19§ñ¯Ž&çíë5¯·ì£³2÷ê ‹s°úñò¦25›nÚ^m ¼pËo;Κ}© Ë+¹¦ïæ¢jû*l «í*EŽeïäÒ*ÓRoW4õJ´n0L+xô!#¯H;tßârùï+;pJkr›*´¯fkí±®£´þŸlŲ忩àtçò±Kßs?Ÿô¯²±à"€Úáµñï÷¥©–Vr…"(òEà"߆Và¦zŸ”²ŸØÂ‚ò4î…jcuî )ø‰õš– Á–5šN*_5/àñ5õïEðØ n²5ÈÚÀÜrp|oüÅ07ŸZK(† ó{hDt`ã ì!^T+¶ÄÚ^]£_Þì8«öù î© ¦l.ö±iZ/écžT3ˆóñí=ï™õç0QàÃüè\ꙺ*í³@‡v £Þ¶ téëXL© e|ª¶ ð"c“uŠVµeÇ6‡ïZRÝ!ÿÔÃV?þ¯îBbžMÆÅàf6p9Œ%Ì)#ov›~ƒ@þ‚ÓŽ]†sì Sek/\1œx$¦AЭm烔¹ã\éqÅ‹J's~édŸä^y•÷Ñ€GKuñkÏЃmwWÞ!A²Ê®VðPÂÕSÆ^×B¥Ùà LSÅØÉÐÆ/<‘ã% ’ׯÓ„ƒ2N‚~{¡‡ÅøÓ>Ô’‚¾+\é6-¬¶`HaAéBÄ©ByôuŽ]ÜÄ…\””gÜ”Ï\¬âÛ•ƒÍéÛ”Gù•ë4Æ9™“œÊ…¹—“y©Bœ•ky—³9—“9š¯9–Ï\œ·ùÆ‘ù+Bì9zEš§ù–×y¾}ùn¾9›wþy ú cœ=,z•ú¡GºÈY\žgœåìÛ+º£ËùÅ]º¡‡9¨CzÄUAP8@ì)ž£öÐñÝC¡úª#ݪ£'«O[ëk_ö´-ÞÒízB„(¯+­;­£ö­³º¬ é³ {í1¯Û$5ÀÌÝfnµfZ»>a¡_&¶ ÇåÎhx ÷=ª¢¸?â#Pƒ Ì­kë êk~ºûÞ¡k‹h'‡+Ô;ÕØûàù»qÉ;DŒ" þß çìêíäæä´ºÄÜÚÞ4:<œ¦´¼ÂÌ´Âà$:a¤¶ä¤²Ô¤¶ÜŒš¸¼ÆÔTz¹Tv»\z¼\v¼d~¼”ž¬„ޤ|†œ,:^<^ˆt†ÄTr´4Rt–Í\v´4Fh„šÂ4Jt|šË4Nt|–ļ¾¼ôúülŠÁ\r§4VŒ|ŽÆTv¤\r¶dLj´d‚¼Tn»,J|tŽÌLf´,>lDf¬tŽÃ,BlTn™\v¤d‚´Lj«4NLf¬4Ftôöù\j„dr”ìîüTn¬Tj¤Db¥Lb¬ÌÒÜþ `ƒ*\Ȱ¡Ã‡#JœH±¢Å‹3j$ð¯£Ç PÀÀ(O¦D‰@eK” ,Isƒ›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H‡‚\ÚQ 8˜JµªÕª @€ B ŠK¶¬Ù³hÓª]˶­Û·pãÊuËäH RT°°·/ß¿{YJ½€! 6pè ÕÇ­@<Þ*2ˆ–1o12gÏ·~ aiÓß4I½z«jÈ;ZCØ‘ví­´a³Œä6$»·"1Á›øVVÆ!´JÞJäæM%‰>}«têÑ¥@v¥}+÷íÝ!þ|÷¾G)È^ÎoMþ|Ý$ HEP¡„ýûøñW˜*5‰œ€B *¬  -¸ à .C ~   1H¨`…z’G†*øI‡.|8¡ˆ ‚2„¡¢Š ¦¸"Š)LXH \(8£Œ1Ú˜…Œ;*È þX£ ‡ð0d‘’Á„ŽÈÁ¤“ Ò¥ RNXKVNy¥•X*¸¥—]º@ˆÆ2A™g*hæ„ïuD€ RYP 3Ð0C wÚPƒžzÞ€ƒQ9€9è°=è>(ÚÃ@ôã#LÚCBLšÃBHz)š2ª¤¢dᩦNŠê©©ö°ê¤þ_´ú… žÎÚí¶Nº­’î*iTrk¨;i±šî0Ч;$ÁlžÚ"E´ÓNºÊ´’"1Á­9hË-¥xºJ¸’îAnær›î¤·Âm+îNŠFžb9( ššA¿ÿJêo›äU_4PàaD GÜàç~ýéÐI(±DL4±ñATzkÈš†Ì­N BÊ®²ì„Ë ªs±Ö*«©¸âœÃˆöÊk¾Jú† š¾Q‰¦©ÈQ´°’î tÓI$ëlÓÕö° ´ÖbmuµÝN ©·å†Ë®Øè’ÝŠØ=À›ÃÚjËoÚ€DÑC¦Hàé¾së þ·¾G@ ç§¿¹-è¯ß>¶hð90òo~‹äX, úK`Aÿü9øÜ-h¿º,*õaØfƒ#Ø€ 7€pPù$ ]˜‚h–‚%€sÀ‚¼ …&Œp %¡P¦Â0¡…)€a ³ BÐp„6¬á ½à¨°‡þ*äYMD9¨pF!¾!‰^xCG(E¦B *ÜG¸ƒ dÑ‹\£º¨B[äB…«Õ8Â4ªlôßè¶¢vÄ£ÀЊìQŽzôB+  BSh 0 TP1,l dØ‚k@H¡ sã Ð3Dá <ÃÐpºQ‚!Y@N™4¤ Pà*ÑpYª²–³T].å°Ë^ªò¼Teâ0Ëa“˜ÂìB1•©JRL`–Nx¦*£ Mi¢Á º€f6§Y~¡›ª<8Ñð Ìò.8g:U‰Šu¢˜%<åOU¦B³þ¼ç,wPO4Øb ³ü§*áO, aS0¨?s0K`D¡¡ESH1`G¨$Œ°2!‚e¨ÕŸiÑ kHèRš!ln Z`RÚÔîs75ê†Ð:,¡§<ý\í„j;änsFý\R‘zÔåIás_x*ò¤:½.@•ª_˜€ó´º=®baÚ_ø6ˆÏ‘õs((ëæpÑÏí ­›ÛÁûäêÖ÷!á}«ÐÁüôjP`$ ,þ·9`ô`s›pC#à A$b)kI}¨§Hzt ­(˜—¬í IøàH—Ò5@a¥k¸fŠ…°a °½þ‚ `›ÚÙÆÖ¶0•mµ [Øò–¶?Hp… Û t¶ÆE®”K[&”‚¶Tx.l£ ]鮺Ó@u¡ Ú¢âÐïtÅ{]Ðvæ…-*Tà] x×ï/lQßùÖw ¸¸o0”@ÛüÒ6ú]mí£†”‹€ì|¸'#Ü@£G(Ã% *K@ADˆÀŽ¥B(­ˆ€šÊÔt'^ÃR¼â—u¦/^CŒƒ×x¦¢¸q‡›ºÔoÃS½ª‘gUäyõ ºÀW×ð]ïaO­âSëPð€—â¢Ê›C\±@׸ÎÕ®`þBÅ\Pÿ•yg& þöð1\ ›ps@ò·©È‰²‰{pâBê†l–¤€ äðI,Ì!¦lé*ÑÐ!¬ %,yðJ4Ð! •®¦[JsÚ¯ÄB@ýi0˜ t0)ƒW¢Á˜ÂDæ«¥PLk:³š¸ž¦5 hæB¡_(ë*³ºè ´U•ÆVè\`PCâ•`@E¯_9OvâÓÚù¼6ô©ÊhÛø4¨-ÌÐìq—›Ü€µCU¹Š” ÂØÁ»…aŠ|¤`'I ޏ=×@Âp¸ÔPÁ¨øG f°ÃØp‡%ô`èÃÛÀ‡/¡ óÂ<0‹ƒ€ïAþî’œ 9Ê6øå.w¸(ˆ`qà¬"ù­D€òÿlhÃú­„ÞƒüÌiÃBúS‘„o ÷ÖOÚ/H½(èBÔÃåp «^VØoÅŠ¯—}X¬p×­LႪÃÍíðÚ Ø÷ ËXÂ&0 %¼{{x·G"«—Ø 3‚.Yƒ€œ³S¹ÀV <ð` 9˜€€yÍû` QÐ|2Ÿƒ9dJ¥Bç_†ú)8Á­wBV?ûÌ ŸÂ„ú(¼zý)R…â£" QÈAPÀå/ÿhÅOE%ŠéSßúÑ'tô%þq}î'?£èý."z[Ä!ùQX…×’o‹.  ƒÈêyÑÔëa þ*ò_üýë?nÅGÔ‡ü­ Ê—Ä7ʇ€Ä ø/ÅG „bs2 90o xn²`%pão!åx÷'ö°Y` p|ð‚ /TÐ.h_À‡a¯a€BPƒà‚Ex„A¸@ˆLN˜ƒÀQƒ(  .øª ‡± Up° Yx{ ¬ ­àgø¾a hÈ9h £Pƒ·`.(?Ρ…h`Z(?Óá‚k 9ˆá±Õ„þ‡¸wPˆwè…` {艒x”è…ìá‚!( v°w ð‰|ç&UQ8pŠ8 ©¸Šª¨Š¦HYáð€ðÀµ(ÐŒ¡‹‚@‹¿µø;Œð€Œ˜A‹(ÐŒ€# €€P†ØX@઀ÑXZñ{ÀåxŽ\!ÁñÐŽ{`æ(ñk`*°& Ž®À´øµ`ŒÑK åX)Û¸<ØØI0‰hˆ…8‘Y‰[±ù^ ZÑŒP޹޿A’ç!`¥ ð~ Ãðþ sö°Š§X:Ù<É:yŠ­~À]0R@>EY- ”ƒP†P”p0E‰!`•ƒP”qP‰à•¬ƒ0–e¹•¯P”]p#`”jÉ–°  qP–Žƒ`–„0fÀ—uIMz ˜ƒ † @˜‡ ˜q D@˜q@|P—qpMP–Ð l`™™—ƒÐ ‘™—½lÉ™Zé <ÐuyI˜'’É<0›²I˜´9›µ ›<š\}Y À™— šÂY–]P „™ É)¬9\ ¹6©Ö¹j°8þ Ù¹Üù©øÖ™)Œp™diž„Ðpé F ì Ÿ‘ u) ŽÐ  -0 F †ŸR  J‚`”qàŸç9[ –y³Ð [ü)wŒ0ª¡ðé¯@ wŠ¡#°¡]p#Rà$*àÀ0ê¢RP—¾0˜eé+Z—\К£,*¤u Y–*™uù |00*Àb¡&0¥UTŒ¥°¥R £`0J&bÊ¡.P :€P –éP–R • V)§qp£6¹zº§|Ú§‹@ Ú§þr0 r s œ ŠÊ¨q°¨ê¨Šú¨’:©r©˜j©”º©ú©Šš© ú¨—Zª¥:ªŠjªªºª«j —*©¨ú¨•À©¬z©± ©š©ºZ«¼Ú«¾ºª¨:«£:«¢ª¨` —€¬Êj Ëš¬ËŠ Êz ™ P­×j­Øº­×š­Þº­Úª­Ý*®Ü®ß:®æš®âÚ­ãú­äzÖÊ®ñ:¯ðŠ®í ®÷º®ôª®îz¯þú®û¯õ*¯K®›®çª pQùѰ››`[[±{±k±{±Û±˱ ²ë±k±$‹±ø1²!«±+ þ²%û²"ë²*ë±û°6Û°$ë± »³<»³ Û³?û³ û³pQ [œ´J»´LÛ´Nû´PµR;µT[µV{µX›µZ»µK[?Û ¶ ¶a[¶ ´@¶ K «°H‹µ°´q›´s[·t{·œ0·y‹·v»·}û·|¸{;¸€«´zk¸‚[¸‰»¸„‹¸û¸ƒ ¹\+¹öq´7Û°C{¶;+¶Eû³o«  º¢« `[ºeÛ¶š‹ºª›ºš+¶¬«º«»¯;»²[»i˺¦k»«{»ºK»¸ë»«ëº û»¦[¼·k¼¹ûº÷±°4» ÎÛ¼Ë ¾{¶{¶Ÿþ۳؛¹<´›Û³j›½Þ ¾B+´ß{»<[¾å‹¶æ«½ê»½@ë³ð¿ëk¶à+¿í+¾õ›¿ú«¹k¹ûI{¿šË¶;û¶=K ‹Àì{¶»«¶c ¿ÆûÀÌÀ\Á|Á¼½Á ¿¨ûº¢›ºÃ«»_›Á™›»m°˻ |™ËÂ(LÁ/ŒÂ¡k¹ï•[¶d›Ã· ¬¶ÕkÃy«°Œ3Àû˽㫹ØK´-ì¾™{CûÃ̺Qüà ܾIl­ÿ‹¿TÜÅh« PÌÅ_¿¼ÅKÜ¿6\ÃDÆ;ÀF̳Cœ¹¼³E[´á+»J,¿M̽uÌÁ<;þP\½v¬¾X¼¶IœÇ~¬½ELÀ€ÜÁ½‹È<Æk»ÇìÄJœÄ½k»™;±þ‹ºѺ;,½j‹Àdk“JŒ´àÉ#1BlÆd˽‘Å#Èܶƒ\ɰŒÄJ ÈÚ{¾ô ܃lÇÀŒ½ÁÌMl¶º|¶¼|¿`Ìʾ¾f\¿j+±i±Û‹hëÆÙK 6ÙÊsÜÌÄlĤ\ÌÆ Ç;«À¼°¼|Q䋽E[Ä kÅoŒÌOü³\ÎÅܽäLÇB;ß«ÏûÜÏüŒÎðŒÏÇËÎÑlÄ£|»åüÐÑÌÉi̺Ÿ|ÂÌ4]ÒDËÇcþÆ„ŽÙ5¬Ýœ Á.Сýß[æP¬àÞÖ‘~Ñn­ã=Þà:È•®Äuœ×~Õ nÝ„ÎÙhýɮ͛^ÓnÔF›á®à”þél,éœþÜ­â…ŽÝMþnêëº ›·Æ<åvŒÀoKÒˌȿ¾À~\Ⱥ>ƨ‹ì¯~»kþÎ]¼æó›Ë%|ÅÜ®ËÂ˺Ȭ ÒÞÅÓ;ÁÜkÝ«Kê@nÃØÜÕ‘¶ŸM¶ÈìÍŽîÆŽ¬¹kN¶Eü½ [íãn´®ÛÇ»œí½ŒïdŒÈÒþßNÒ ÿǬkÜÙú>ãókñy^íT ímî×nÛëX=à3ÀÍMþÖG·„ÜìÉ<¼^|É÷à»ë‰ŒÇ \Áÿ¾”, ÌÂ+ Ã,ñï+ó;󗌿,?ì<+±`›Ù¾+Ï‹~Ùôžº<Å|È/Éñœ¾Ÿ¿IÌÊEö÷^ô]oÉeÜÂÐ ÍÀ^öelõlÏLMèØÝîöQµQ®Õ%>Úœp¹|ß÷~ÿ÷€ø‚?ø„_ø†ß÷t¸q»ø~ëÆŒÇm‹´‡?ù!KùO³.kùùΫùž²$üÈ Mßk²1Ûù¨Ïù§Ï±Ï‹ú«¯ú÷¡ú²Ïú¯O±­û®ß¼¶ÿ¼¶ßû©ïû§ÿûÂß±Äïûœ_üÇü˜ïëy\¾þ/ïè\½g?ÍÔ_ýÖýØŸýÚ¿ýÜÏì§ÛÁK>¿ôÝòån¶:l¾:»!qþìoþî›Éîþ³‹¼*Üþ -ÿøoÿúÿûŸÿüÿÿ S€š4$xð`A„ Rrø0†d¸P#Ä9näø1À?’%I.¼èä@…*]¢ 3dD.CÊ™3¦Í:yþÌ™2¤E¡@„Hp R„P*¥ RhÏ-M^-‰±¥Ï™5½¶¬êlÆŽTË5Ë5íZ´e¥:$z”¦Ü¹&•¸µ¡Þ§]ûĸ¤XÂ{gÆíZ4åAÁÿ¾ÆÉU±ß“û^®ì•ãÀ¥ ã2þ¥K·ó?§ñ6„Ø!bÖ«•6†í¸µÇÙr-Þ†š»SìÆp#¢D±vnמ}G^\¹æˆ§?7wHš¡s¹§—«ú4ïØÙñZü®}®õ¤ÜÍ»ÆK½3vö¡Û‡‡^>Ôðà«K$zšº~À¤ûZG()þP3­!ó¸ :%ºµ4i9 \0Á ´0C 7 ­Cä°C’ìê0)ļÐÃÝ <¯Á5d1F¬ˆk¢ØÈ£PCqL‘:÷Ž‹±´ä .;ü¤DÆ1djE%Ÿ„ÍȇXÌOÊÔˆÄòHü®zÎC‰ð’‘ĸ°“/½¡D3M5×DGqìN8)‚CRHíS0C6÷ä³O?ûÍ85§ë‘Áýúû3QEe4J¤ú<ÎÅ Ëk´RK/ÅtMi)SO?5Ô£µTSO­4 ;exmh-2.8.0/misc/mafe/help/mafe_start.gif000664 001047 000144 00000173017 10005705401 020374 0ustar00welchusers000000 000000 GIF87aZ÷d‚´,BdDbŒ¼ÂÌŒ¢Ä\f|,F|ŒŠŒLr¬4VŒÜâì\”žÔ ”ž¬Œ’¤t~”ÔÚܤ¢¤|†œÔÖØDRl,6\4Jt´ºÄ”š¬ÔÖì¼ÆÜ\fŒdz¤lTr¬¤¶äÔÚ줦´<:DDR|L^„\~Ä|šÔtŽÌ<^”D^¤ŒšÄd~ļ¾Ìd†¼,Fl¼ÆÔ\j„DZ€Lf¬\z³Œ¦Ì„žÄd4J}„ޤTv¤Df¬|–Ä„–ÏôöùTf’ÄÎÜTv»l†ÄLfŒ”¦Ä¤¶ÜDVt4Nt,J|\z¤LnœDFD4ZœLn´d†Äœ¦´tŠÌ4Ft4RŒùM.‰}“€‘ $Ùdwu$YGwTViå•TN e–Nv d’¹&Bú¸ã8îØ#gªé"Œ/¾)g‹&–8¢ˆßx'‡†!‡â`!„&è ƒ‡Xà‚ŠÈèüíiÝÕw˜¥ßÀ×Þ¦áÅGžyã÷ÍvßüóM'*Èö%ÔPGþ;‘±Ü¬Í-ò\M´æjë­ºÒêWpâ‚o²aì±È"{Ío±ôPB0ߣ€ØÐM'ÊX -ÙnËÊ?Ûn ­Έ«m¹ãÞãOºëjKA»¼;®¼Ú6¢Í¸¤¯¾Úæ»/¾rŒ;‹h;°Àü‚À k;„/ã>\°¦ø2qÅ㚂¸|ÈñÇÚ*²"»Œ&|²É(k»²Ë-[ÐM>ãZ‘EÍ7kk3ÎãF“³ÏüüL3àÝ̸C#M´¶gÔ2nÓãã´¶ÁmA0ãf­õÖ\g]uÔS[5ÓaŸq´¶I£}6ÐBÿì3Ï:ÿ¼³¶ÝÈóËà­÷þÝ*\rÈ#wü1Çk[ñűË[0KÃŽC~°ÁSŽð¿ýòk¿™Û¼ôÆ :¼ê²;.ºçškªCñí¶Ê|cÁµüÊ?ļP-6¶¶H²À»¬ïÁ?ü_¿l&×@)ð…o¿/°€' œ=?'pÏ}/Þ,âWu¬Š¾äÊ:x±~.cP“Ë:ðkC.ó¤Aÿ:°¤1?þ Øß8?¼àÖ8 ýˆ@æ‚ô»oP‚ÿQ0¼ ýˆQÁùqp~ë 80˜ xŒ~&ÜŸØñ?!¼¢…ø_ò!CÒ/4œ2²€Áuì°‡þÈðÀÿâ!Äù©¢ˆë8b•H¿7Ô¢‡Fx"ýÐ ŒÿeC XGÐP‹ýÁà^ãü¾¸?`‰~Ù8c.Òx¿l€ÂŠoœ_êð¿&Ì Žw¤_ ²8?ì/-ø£ ÿ7ÈB‚ÜãþšÀÇu0r‘åCã%iE:¢ñHó3cŸ2ŽQŒk”Âgƒ*ޱŠëXG¡øD#"Q‰®\¢oˆÄê‡7Œ!qXÃΰ…/œß A(ÂT–ð„%”1‘ùÁ V0‚ÏÌ…¥™¾:‚¼æ ö÷šƒ€üëû÷¿ü•Sÿ‹_.ž±.hc¹¨C9HÇ!œWEþÀö´×½~~/|:¹F>¯—½íùóà³®‘ ‚òÓ ÜChøþÒŽƒG Tð4NÀQŽÆ!'¨G/À·,ßôàÈxEš°Žôƒ¥M˜‡ý0(ÓýÉ´‡Ãðý¡ÓöÔ? à…*Í •„ìá ÒçÁæâƒóB öpì/ò ê…™Ua¾B…Á\‡l˜‹xÄ0—C´¡³°?[&q–¹xÃ,ß B#À5Š©Te§(Å\D±€„A þÇÅ0öÐŒ‡ådI¸ØÿãŒn„£1çˆÇÿ ‘~ü` ÉYBzV=$f¥¢\P–~s\äûÖY4–o~eþ-&רLÎö‹¬l ëEaô6¯xM¥]ë:W&Òƒr".}˜¶6w~fâYÅJV‚P]ëV×QÕÿa•ªSjCèT¨RS©ÌàQ­‰À´—›?í)Oÿ÷tÒ¯¾çt$ÿŠaÚuÌà vÌ2òÑ»…rãzí(H?:Ò^L ¤×8p‚|ôÁt‰°C) Òz„Ô%ÅAü²ˆ†f£üˆCŠSìa’: ÕhÁ€§ÁRs¤¢ €hÂ'¨‘"=ÎÆ'^ä1¹Çú8r6ôá‹"7¹Çc(A åÏ£ÊÙ8€<¦ .Ù]î±9ØñåÙfîñþ Òœ k´"È]x³šåœÐù2<òÜcxCÏîs ³áç þF¢Ýã0(ºÑÎFêäKPºÇo q6šp E7!–®4k1=êl¼¡Ô§rª{œn ¦nA ëÓzÖŸî1rÝc^ù×ÀrN°é;"ØÈîuѰW“Áãèñ°k[cšÚ«6u©ñQ“á¨.õ%P]‡OsÚÓ ¾tº+­nGÙÝ=ÞG¤åÍèl(Ñ‚´¾óÝg>g£ þ¶sÞã8œÎ]`3šÏÌæ19ÌÙ0Ç–{|ˆk9ÈWž2–£ìäŽ#YÉIòþEdYëÈ9ÖG²áHdìà÷ŒE‰­×Ñ«ØÃqH(òª=NÈÂç>†‡= â€áÄ'àÄŠ•^8ˆt⣋E3é“ÃFI:ù“hp’½x’«‘#Io  DÉG· .Ù’,y‘€ ‘™ ÐP$` @»À~'´’gÉZG9iG‘I‹ — I‹B i—h@öxý¸—üˆòHè´˜ŽèØŽ†ÙåŽÍðè˜'éÝŽó`hP™Ñ˜™Ì¸Œh ŒÈ¸dà€Œ®Œ¾HšÂH‹»H‹¶X‹h /ЊÙnˆ pй+¾aÕ‡臽àtA@R»9lÜósˆ( ‡(œÄ)sö‡'ÀLpˆ”Øt½p _GSþ÷ˆÐ°õŠÔÉu˜pP7>05z °dD–ž=¶¦¼PmÙàšArWŸJ O– ó°Ÿú‰qX–q=ö— d: j ù0p ªfZgà ™g¡„†¡Äào…ÖcÄP Aö¡A¦ oÿdBp¢=&‘Æ¢(iÈiñ •F£(ù–Ù–¡Öc—°Fx Üð ·À ܰÞ' Ü`žp@ÌPöPu ø Ap=v} 0khˆ/p}‰ÐRé•éI“$ž=ö )°¤žàž P» •½Àlê¦î‰/  ™ Ç Ù° Ÿö¤þQš EРꀀsZUz ·€m- * =Öd°¤PJM0l @Pj ½`'@ly ™ žp’l‰’ê¯ £-:«ï¦¢öf«$:¢%š "Êo„6h{¦gzÃ:¬j Ô‘ÄJ¡=f š ú¬j* üYG¹dûÙŸAöŸ÷ù­ó¹žóŸìÙòÙžéÉÖÀ[º `ÔstÝó›€Rãù`:ñ;¥uý$R²PÇØéˆub~ L t½PA€ q0ˆ¾1bF營H² ž'0°ÆÑ©¯vpøéZ ëÉŸÐçÊ °²ŸPþ+k².˲1Ëú /[³7k³+;¯ð²<û²• ´´ù@´/{ð²æ´+»´JË´ à´M+ O«´µð²ð J«µM˵Qû /K `»²ð€ X[X;i»¶+«jÛ¶oËû·"/;·/+tÛ/k,E)ðE Kk áðÇP–µPÇ@ƒ'ÀPÀÀ)°iÊêÀ·EÐE@Ä` 4P“dj,²/¥BÉh`§ˆ«¸' 8¹8’»ð±»¸ûÀ½²@L0 ]À· иA@$€»RiuÐ'``¹+«Ùþ ’Ó{¹€ÛÐ ^‰“$Ù¸+P±ÀÓ‹+ ¾øÐsŠ·+ ¿r»/«vÛ¶÷Ëð·û‹µ p¶X;¶ @ ^k\ÀLÀJKµM{µM µRµ<ÁG›F»²óP´¬Á ´;Û³ Â4;³8»²ú/Û²)<³*\mð™®#»ž—‰s؃=@ u¨Üsˆ>Ì 2À°;QÅ’uIœ9Ç ˜À°Í)PóÊœ°ˆØ { ¶/¶NÜ=Iüsõà°›Û,M bÀv*eì)Ã.ܯ;®õŸÕ‡¶FÇÕ& \eylkóð |ìÇþÕf€­*­gvÆʬu¡70¡j6¬v ¬¶–µûFh» %Ê ¶¶œÜc `«.º¢´Úc1d§Ücd°š­––­­¬Ê¥¦ ™À `Ðö`˸ `jáP 'Ps*§·`í P‹  Ðsjmö`ÞаРç`cZ¦QºÍ›+ŸoÀÍpö¦‡JÎöÇßÎ㜠ÈÁ€ Ġ銸‹Ì‹»¶ð¹°ö°oð²&öÀûÜÏð0ª0 £Jν`λЕP ÀÀ¤7 A`Ð&ðÊ<úÙ«¨,«/:Ò¤Œ¢**·ŸŒþÒ0à¡—|ɦ¿Ÿœ¡p6¬Í È7ÀÈŒìÈm†ÈmfÈ jkÖÈ,Ô}ÌÇzŒÇxlÇ  Ôtœž ÆóÙé:réeŸð MP Äa~˜t ÖL@Åõ ÆvtYÇ #•sqð¯AðÅ F¼y°†Ø ÓI‰ãiÖ~1bÈSÛbœˆ{D Õ òŠÙ€ (‹íÉš1\‹óéž­¸‹¹ˆ\ð—mš}”6à ¹˜ 6P¡=Ú¥]´°Ò\€Úµ8(€‹—)±ýŒùðŒàˆŽ9™¹Í˜ÚXÓ… ¢µH¬¬I 'J‹ÄM‘Ä`'‰ µ‹´™‹}þ™x x©—y‰—u¹ ‘að ¬ Þk)Þ’f‘i¨$)M A PUê•/i¥‹,‘@ 'ùQp’E`>P>À »`ºF“DÙáK ¬˜Áœ9yM¹©ö ΓP¹EY@ ­X>§¸ûá¥íW‘p° ¸Èâ “ô¾$ ¸ áö—“ðð 9‰ 0Ž2Þ¬:—©Ý×=äþXäG™Í Ïݘ­xÜÆ­ÜÆ]Ü´°¬PgЖÖÐŽÞ‘’Žy”ÈÚ–Â}”i™ÐȌҘ ï ¡ý¨­Ú¬ Ã@ÚžMç¢ ÚžÝÙhÀÙþ› ÚÙPÐdU¬©¨ÍvNØ0g¿RPŒ°’Ø'Íù;v?Œœ_|aâóˆFÜ œ`ŢΈ•ÞœÚ <áÄN7t¦Æ¿‹¯`W ð 3 ¼pM °À_».ŰëM /M0 Ú ìZhì¹x»> p÷ì¼`ZÍ>í»þ¼€מí»n ìóDBåÐe— å0íTN%U$Äîäî¹ N…]$Dïe—¯ÀìÄð ÂþCe7z¹þž ý.D»ŽE” OB AC°ðOBCÐJ¹ð~õDeEe¯ñF $þ å&§ €»ª€»OÚ$ÀãœrZEðDI”&ð»Ní2n`,°¼cj¨^ ›ZôÌî ö ¼0¯©!.§ÞPÊ›ã¼ë0@Š` MÀìåœòç\Îù¬7OÖ€A Pö@ö7oÜ ð ®F8 §›ÚÐ]é Ð M™Çà•8P »òßñ?ñ/ñ ÿð _D €R íoð¦5ðuøñ?´ëßï1Tv[ïb ñ˜Wï%p_úe‡ ÷îN¥îâŽîæNîäíà^”í¹ÏíÕNíÃ`í¹íÌîìÍî^» ÚÀìðí¦ ÆþŸ À.ìÀ ÏPë9Lu àt 6R‹ûÖ–^žÇá×!Åu#U °e]t€éÀéQ‹›×¿;ÆþüðÕM°ðoé_ `0 tP¡Ë×´uÓÌQ#hÐË´ý\‡+ͺ-Ó$´–¦â4k^6Zë‡1dÁ N»‘¦a ¾¶4ì"§ÅLx/Z¬k¡ÀΜàxæ7³P¡Dgæ‘WÒ™ëò°[¹&ßÉ0bn¶ˆ—çº0®"ë@q݈·¨&4^Ú™kÕÖª îL]l[©±u\œhþéMÛ÷ÏUuÖ=+²`׺"ÐHHiL‚™½k!Šñ“+ñ®Z½¸þxAD[‹'ê˜m¬ˆ¡rЊ¨U$—I¬‹bÛìºDE®ÈTÄ€fh»4+NAKpY-¦x·ÁÞ„][fL#n¼ñ.lÛ+R@[f³uß@܆Šðf¯‰o›q>Î$ñY'ƒùj8i•ÀZð‹'#þjÁ¸æjA.¡.Э›âñ`%#² Ê*œ²Úª«•tá°¡0’Â)Œ~ '!ð`q+¢\ôé&£zâiŸxªé*Žhá¥<j膊4 I‘0ò¨ Œ>¢æ#ZÈÅ j jᆅ:†„H¥ŽièP¥‡XÈ àš"ø©ç„61 ¢ž83èþ…No®9SM6ãp3ˆ809&:í¼†ŒXô¬§—8êÁäLâ8¦:{™`CÉ€KÕì%Ñ7=aÐ:½YäÌXzâU^˜á›„€ÃÕ:ˆ)ÆÕoÌA¥Õn¨µŽ€èGVÒ°•j|ýÆX_ëP ؘuö›fuE†[È¡ÕoÉ¡Žoêˆ'•o¿‰§ÛoU ö›o†H÷#^P×]xÕ}7^æu]a`ÇÖ7JhµŽlä¼ø[G×lò‰· …Õ•8≿¹àâ VwãqiÉa²ø8äoGl-¢f°š`.®˜ì‰Å÷`hy—^þ¤"‚ˆ†^ìyy0)êXÍþÃÁžDzÀ&8ø†¤±n*ì!`¹Xxvy†–IàåæX–[B|ޱ§ö@õYšw1»¼cÞE  ñ;&fXGÝW:pr3΂,˜VÆ•mF%<NÈ#Çbxpn|ä,0·¶Ý°t5 {§Ä.¶±EìïšXÇv»Úo=lµ‹íl¿5SÌ@w &oþ0cÝívw¼Got÷@bhÅyiÝŠn¸|¸‚—óá{9¿(.øP€,à! áPÆ,Ž$œâïÆ/,+ˆç; ÑXy/° GƒÏÇTЊ,¤|å^F~j°<åÚ`y.  ´æùÈ:ŠÑ  £ƒù(î¦[[tð¼¸èÊ•Þó©·–6Ò[ÜsÀÉÀ/pœl”`ìe?»Ù³Ð ´¯=ì-Ï‚Jô|X`î-·8à^ p˜×dC>š<˜vðC-Ü¡ÞÜ"]ÆoF‰½œÀçøˆ÷@à7Žt¤›—º@Çwè;ìa×þé¦=p%.q/¿˜ó?rçóÁßâv@Æ­pxmkOyÆ÷Ýñ¾PïákûwõʸÌb°€/<ÞŒEçøbºÜÓ>}·ìjÏGØ;olä øXÇÆ ~†4 ½H…Ãñpj¨êÅ h?vÐrtôèzÏÑá…û££ü-§¹–뀘›¹Ÿ :j˜?—k˲‚ÔB:Š“¸°{@eP¯ „2Š ½‹›8eð¸e(€|p¸Œ®p¸õêeP?S Ö³‚“Cº@·d†v›t»Á¬Á ¸Azs7¤·v!uS7f B ÄAtBD·LI'„Â(”ÂÀ*”þB0xyØyȃ0Àƒ/ C1Ã2Ã/$Ã3DC@y(Ã6\Ã4„C2¤Ã/tÃ:$C6ÔC=ÄÃ/ÜÃ?D@”6<Ã>$CpˆÃ@dCC,C9tÃGTÄH”ÄIÄ>DD,ÄKlÅ5LÅ:¼³P”ÅQ´CXlD[DJ¤DHôÄ[¤ÅSìÃID^ÝÓ<õS@Ô?%T?5ÔAÐ>MÔBETFuÔC]TH•TCT ­ÔËHÓ5uSÏdˆÏìôÔ íÎ*ýÏ*íR-mÏõÌNÏ ÕêüTåÐQÒÚôÔVõÒÝdO7½ÍýœÑç|N*¥MÕÒ)ÝÔdUïÌO^]VU…ÕPEÍÀ´Á¬V¿¬Vk½ÖmíÌÆ”ÈTnÕVoíÖÄLLpMÉìVu5×ÏlWwLÃWÕôÏÕ”SÈÕ|Í×%þeÑXõWQO ý×PX€5Ø‚-XER„]V…eØu؃mR\U~eR‹µX½KºDÌlíØo•ØeµÑ‘åM׌UXõUïÔÕV…Vƒ-Q”UV— ÎWÅÑ×<Ù–]Y‰}XÅÕ›ÝÔœ5Y”}Õ åY‘ÍNí„VLUNòVº ÐLmÚ¨EÍKùÚ«ÅZ§E×â¬×Ú¼W¦Ïè<ÑmN²N×ÛÔL[êdÕ— Û³]εuN¢}N°ÍÚØ4M×hŒç¤Ú¥EZÙŒY–-Ï£•YðÜåÌY•UÜÄ}Y]ýÎÆ\»•ZºÜš Zät[ÌÝNÄ-QßôK/½Õâ\RÐRþÐ P ý\ERÒe]Õ]ϾUZ=Y/eØ¢ZQ=]z×¼×ÔĺüÝ™=YRÑ]ØÕuUŠU^âÝÕâ-^Š ØÙ\UÍUW}ØMæ]R‚åÞäØîXhíÞñ¥^iÝX½•Õ(¥Óà¬U)åÑÅÜé¤\÷uÜ]Íà…üµ_î|\]•[¥Ù£Å^æMXãÍQç=\á|ÜþåÑçm[ìÅÞýMQÙ…Ú‘u\ÂÕܹ|Zô•Îò$NÞàË ÚÖ àÊàŸÜõÍ®ÐE˜ËßÍhOýõ[£]àÕ€ÀMÿ¬Í¦Y£eá™UàØÔÇ»ZéEZÞÜ v[#öþZ«å`Vb­]MÆ_[Íß÷Íâ-ÖM³Õ_ ÅâÓü],–[2ÞâßR4æâ5ÆÐ+^ãàÅ_8ö]ݤa'æP5Þ%ý]ýÅc1f]7þâc?FM7ncBæb¥}Öd½Ý¡…ÝÆ`YÁ _FžZ|u˜!Ù¿…\îœN”ÍÝ×äa0Ý`ºÌáVÛídæZh0e‘­KÿôaVÞdãÜ]g­Ùbeeý¬åF^ä·NSþ×V&ÙËåق;„ÚøŒaã]_cD^ã7vß,]j¶_³ec:žcg.ä.ÖæäQ+þænÞænäg¶Ø=ÎbuVçh~N³ çq&ävæQ?äqþÆß2uå¶NÜ|dIN`þuSÆT VÜ—mÛin^Ö|Z5fa9uáU–áŽZ †Y^-eïTã7ÝÔX†Ù“]`öfûÕßõæV®ã{Fb à¾á‰Vh ÎZ L…bP†ÓÓìÛäTéhæã˜^p6gi–c.®c£&g@äl†æu^jMiyvân>ävÎc¨žc{jå¤áj&g§þêiÝÛ˜UÝ(…M aL¶àQMÑ?Öi@ݽ­âræâCÞÑgÆj¥gÆiŠîÝWîá9~ftÞß{.^—v϶&åûôèyVàZvê;v_z†ìºŒgnÖêzvç\êÑ¥UªöãþCmkì…FfôUæ®õTÆëžææ0ê-êÌŽí‘fÎsFê¦vç£fjkÎê°j7¾æØ.jÉöR9æíÚnjzÞmÁöm°–RÌíSÖçΔ¶îSfea¶ßd Ó2KCPC0h(o >Ñ’&èÆ°nëÆf²nà>j4nh®æ{åPS–á&ÑìfåBX€Š„Oþ>MënÖRŽe|ð¹ôoŽÞÐë^æí–aP–p®.ägðFi'e7ð¿n´Íâ qý†i¿îWñ÷o ÷ÚÏå`œnìOÖíxëŸNjŸ^êŸfçßþj,Æq̶kimÇŽíô–gq–þo¡>ã§Vn-®kçTòžVìàNM¥åhÔ4eø\ã†ÒÚ~dhPE8MñFQܦr´¶dEæî Ç7§m¤Æß ßjÔünÝÏ"Xß SeGO8eñÆnçó-÷óÀ>ðÔäáA·oïl?Fl%¦sDWqÄ–åFßï×í\.ôíôÅõ-—å@×ïOçaä¾rù¨ÚÆÀîö®×Q&ê%‡æ®.[àîôµqénî^¯u×k©Žg¯g%ö—ç²öõÖ~rø®óãžã2Ío÷|S.lØ”cïžWL5„V=ïNWjÕ\o“6O mt\çuºDl¯vêde¿ï¾…ì]þ–å,uL·÷z÷hýÆáêÌOBçlEŸOS6÷eÈ®öÛ¤áö<ñUžÏÅîs/%uïT­&ñÊÖï?øXvpYþω'Ñ@~qLfsX7O>¥è'Ïæø&i¤fÑžVõc7v_‡îg·õ¼>s¡æñwr¼Îù¶žm _ygî™ÿù£oò½ éìé!ÏrlÎÝÏ%óجz'v+sRfO€¿Í!—sü”êÓ¤Sâ…SÔÝà“Öò@·OýŽQ¯ŸpX7wPNí®éÊfpæy—xâ–ÍìÎð@¯ûJ¯W“ïóʦáCoïÀÖðƒwM€eS·nNÍÓÆT ]ü •uá¶ñþ_/vZ?öåöñËVhu&[nÎz÷yÑs£Ÿù:{göÓv£òÂ{}†x®xŠœvì~u4^oóosò.óñ&þó&oä×Ú ÎrO õz}uõ?GôZ®~ì÷áú†÷iEyY.xÍøü&q|ô÷N¾ïsrWÿݧðþÔÏRÏrÀþzòßeµg|8íøï§w“@+-‘AhÉL!Dh .d¸€áÃ…'fäX`A„ñA,b²àÉ„'D°(bA’ ¡ÉŒ9³&Í„8sŽœ)ÒçM 5òÔitfσI—µ‰ÔéO¢Jƒ2Z'ÂMIâÔþj5g×¢î”I©W¯'®l»‘¡Äß6”‹ÁÔÐRô° ¡‚|  X‘àÀÉ\æ-²ñoÁ…l„+°®e¹s5RÆ(‘àÝ„3B+ÀO‹”+ÖUèy³k×p%rŽ=·.H¸A^œÜ1"K¹“mÖ$8û²ïÏ·ãRvͺam–g}_^®dæqÿ²d{Ü)x”ö—&¯´öÃD¡såšð,Ñö=åïéÞfÔ¦[ Š k?<€ñÍgThý7 ²‡ €fõÞþ=Ø ƒL݆6ö˜JÜA“[n¤Ðz)ýÕ—!=¤Ø^~í¥b„TbÜ‘6œ\þ!Dg“å¶‘qª=Ç£K9y‘ixé¶’l×­ä“Qb6‘Gª=y“yÈd\Rf¹HK]$kL>Ùåhn5™Ùea6õå™frÙ$sY~ÔiM‰”ŒIä­dERáU–5¡~"*a‚•„51š¨ƒ“jeé áªç~&ˆU¦úAêè§Aíd"\;zÖV›V>dÜŒ‹lXØ_1&Ó—".*XaР˜«‹‹àUš=#ŠÆP"V¶IÛ‡ÌÂ:\²Õu Ñ]*VGR’ ý•'LÝNµ­hAF³ÜŠ ‘¶ÍbÈ#L{ÂÄîWàF”^dõÊ{£½çûNɤ{.¹øZ•çþ«£û”TEŒ‡y¬º¥S……)SRJ(T¡Â‡ñ‚K‰$Õ¢!gèU†¤^(j¨wj§ô=HÒÆˆîwè¡úXY³y˜m‹E\Þ‹6˜a›QŒóÒ8bFc®r³¡·j˜¬u—°ä"‡Rµ“Æ®HUpÓõ~¤/CØ=¶ÙõV¯Aé’æ0“¼··n’ûÔÞt_6Þ 7ûàøÊ›ï…$5ægÃ~Ø5Çáú•|C%éQN¾)€^®)P¥v>êÄUQ^”æb…¼9§I•^èçõ™î•ਞ»êqÃY]]×'õÙï´þNZ¯¾êZXïäiYÙι—ûþü’¶ÑöÏ?fPÂŽ “Àƒ«â¼ÇÅ®øÉp[>Àâf¾ÞÜïûþúêǯùôÓÿWû3ÝX¾ùÝÏË÷ü<…=…!d<†;˜Ïd‡‘ÎP™œ~873ŽLeÌÌè@ŠÁNQ¡›à@f±”!E>gIœ‘€Æª.EK`šž@x”5 ù…/¹‚ˆ ÷R<=Ć´šáIG'5ʼnLÓ’SuÚB¤ˆ)Ž9IRú¶··n«ŠúkÛö¤X²¶…‹oî[€¿šÆÿ‘)Yœ"2Æ1"D‹fs£ûê5¹HgO cÜ]ò¨Ç=¾„el]Å>ðìdr¤VéA”=þ0r ›ÔA¨ºý¸lA˜{R,GÇÙ=E-Ê‹H¯H/ȨZÃÒËáîÅE÷=$ySÄßßÇÅÒò\‚‚KJs—>ñ²—¾ü%0ƒ)Ìa³˜Æ<&2“©Ìe2“— Óå]„%M—PSXÃÊ ‚¬‚Í-bÎeìd6=7H ‰³» £.I s¢N›_!Ù¤Þ N¾ŒR±Ë˜†€7íè+BMÀ\™ÊUJÅ]*J^Á"·³µ|äÃßôæ3pmOh&F}9žŒ2s<½ãF9šÌz4¤"=©I>J.ƒÂO€&à #H¨HvО¤j †0WSœÊ¦1mY;E'¹¡ªlþ‘ãÜ"7Ȱ–N1”sû[B¥—›B$?^ü ?é¿ýÕï|¢!ÍXο¿„&5¹üåFI R…•”­kU+\í!W¹¾µ®jí\íúÖ¼’t®~õ«]K:W·Òµ°må«a {ØÅ¤‡Ýkcïš>Á«@Ù”`Q™Ôv´B&t "{ u’ª³—¤h%æS Ƴ›òç©j“ ¡ñ€±¼á\©”1 Ra͉@kÛEá¾²¸»¥¿*êÅå2·¹Î}.t£+ÝéR·ºÖ½îáÄ ÊG¹Ôœ¤Óbªš^Jfé$ëV{ÔDnò¨Þu©<3›Ô?®Wœ “É©cÅ«êÏ\þ3ŠŸÌc:ûò-k6î·§Èý²&«‹ÁÇÔeˆÂSqê¹Âjá W8\µÌ‡õÖÝ’˜^ÆPˆSÜá³XÅ-^±‹-\?ƒyKf+Kí9ç[z’3›•“¤R1[ÎFÒ—sî9aä8«Y¤J0QŸp Sbáo·‹mÌjDüSIü.0úlÔ6U{:!BYSœÓLÿEñ¶ªt³¯HFÂy Î(gyÛ8¾¹ÏpžóŸý è.BF*àƒ”åNfßÞ6ÒÆ©koh7˱JÚW„“Fm¥yÓo“ïªMW<“©ÊÖ)5WMpÙuß} c€†Ô·z¨¦þN|½$—1Ðv.c÷ØüæáêY|éË×V}-èeûzÐÌv¶ýj,i–r/µ6!å)ZEŸ·Û,íiÏä1×7f·~õ«)Úv–÷´ìVŠIò8M=NÓš|”÷½FÍ=îûÞø¦w5iÔï€Û»ÞüxÁùmo€KSkž ‹ÛLliïyâ«ð~Ïû” gzÒ¾ô<æàGz4£¾ð„o=ëüæ„©ÁÌš–Êq>dÙéÌN³PúÒþ$U Íܲ#•îþ´»Ýó¬ÙvÛ\œ4z’ÃìÎІ9,„W¯¸ôãÍÒŒ¼.å{¦…Š}L²Wûªƒû8Á²Ïªs§(T·x©½Êê²åÝò=s%|ÝêjQ&»Þ=Oq\tº‡÷FVjlӑ픺iÚº Ï™—za_þéÜ¢eŽzÛK1Ú¸mPßaÒ>ž­õݬýݺ%ú‰qÙØþ‘˜ð­Œá}Ÿ£   ’7¹à a“†YÒÍ©œñ±`e<w… QQ^«YßT” ÎZ=!ÊôÕš_6ø‘OäÇÊ©×ßy`òAZ’©Ûáõ¥EUA’¦MèT•{Wñ…Ot_Î"!­5W¤5üÍ_(Qà¹¡ÐÆŽ¹-ž\R¼àò¢;Má HÞà1ˆ"îá"ºšP ® º–!"ÙÿÑ\¦!R"JÈ)ÒùUˆjÛ«µÉ Î79ȹµÚî\&"¡è,:Ò¹•á¾"/’ Ãq¨ý\íþÂDÎöià"Jþ‘5aÚØoQ!P5àþ”QibµÙœÏ} .c4†!Nf |ý˜6ªáºÍ‘"£:Öš*Š*`Ýßh]“=Y¶¥_ÇÀ#$‚b|)#hÝãÞÔf#4Æ` ÍžÌPžõ¤@âký¡>Rºå_EFÚô¤YÎe;òß#~á=C$.Nâž—ÝíœN$zMìQ <"ŸnŠ BˆÒ×Whn@¤1N¡§©`ò Ÿ1Ú¤xù‡¦¡€€ßF>¥Õ¢âG6%'‘Ó02dù¥N ¯}" m¥RKRëXâ,åÝå¡:¥P‘ÎBn¥R…w(X8=þ£ò à $Ýý ]ÄyÀʇ̆I:`†#BjC:ž,6㦭6ä*–¤õá&¦VH"¦?Ê×ó™eB¾}€#V~&1š¡&ñž=i#·ià©Í$^$#}×2eRŽæ¬ÕÄœÄ[ˆèˆ_Ðí$i¤¶¡çGJbAö¡99åBšÎVesž$IV…†f§]¸½¥P¨ä#âr^_tŽLw.ÒbÖÝçè”=n )"X–çAêbŽ}`v³¨Kç$ß5"#Ž$bÛøy+6äxRd=bD–ä-eö•ŒqâT(²ZhPháWÂW&Чk‰æ6M ‰¥ƒþ–+&’uŠ9a›E†äíÄÖX¥cbc9&牞›ŽÎˆ¼†–ÄPÊB( åÆ %&"æñ! e&©¦¦aßy:ãqŠçN%©þaæ‚eã…Ì9&ã7bhXÂá\^åx*H:&¢M.õàOU$Z¨»Q&)`ZMCüHrµÆr¤Mffs'‘ g:*i‚îe~Æf˜±)iÉd'¢¨FÂi¡çãÅSäämB*j<‚'=(yÞš:ùé|¡–u.Å‘€uº#RJ)® é§F)U|Ó,‡BÍ…ÓˆDwè),©%¯%–®*˜q¢‚š‹Vbq¢!Y’éþ¤rg£r庣VJ´^¡RÒ{J›‚#ã=Z{}¨Šeÿ‰©Øm§LreVnÖz–(¬Úf–¢ÖŒîâ¥ ë˜°Š‡ÇSá!œ¸EEèàŸ'âe*g²*O¥c˜º*’nd{j—¾©†+ag’&–šeÊ'=úß<¡hÛ‰Y<2({RhB}å¤gJ+N«³*È„ˆ¸¬ ÔÈÆo° –Œlô«Í¦*윅W2¬6Vá¸â"s"R>fÆëtrdl>f"lêÇ©’ãCNéÅtcuf¬tv½:N¾¦ —ì+›¨FÞ¬bäÞݶ>ë5Ž©dv-5#Æ®«ðVi×Rªà¶+…li°ºcð2!¦Ð¦§ÁwV©¬g>®é¢Âk̉­Dn¢Ø¾ Ü€ØÞ„^èadD¦¿)Én£:*P"¯.–]¢no ^Ûà:jJ^¦Ô"(ufcþçÑš¦ãÒÔü’*|PîþáxY¢P"°lIÅÖT-ôß &mï¢n“ lþý„øâ§ÅqUØ$ ÿ*–oî~륭ÊVÊ岊k³vãÀNk±6-¬"l©òo;2^~ºÜ=± ‹% ?lÎæ( GH‚Ôå­¦Áâpâžî%¦.#©Yý¼Þ‡uÕ¶pñýŒêšiíR)çn-ü¾èGFqI2­„>æÂ +b¾äy†ïvê¢6®ð žpêŸ2©^ŽÓK/?H莬öþ,»v㦠¥W˜‹±‘œÉÅ%¹f¥p*˜qáå-Îù¬$ÕÕÖh¹>§íÆäM=©» ­îë:©²Q~²¸2¬¾ëZ6ë™–×û¢00×¾*O`ï'lâ¶¢ÐÆT S[þæ›Z=rÖÖ­3¨å®î-%>g&÷íìvì°Þ¶1ÏžÖÞú-O:™£yi=ÍfyJZ&q媫.’h7 ñc窲}µh·þ+ËЇéjLŸa:7‘Üyf~˜í§¦—¨Žqç%Q®jêó÷ª1cúóúÑî^´yR… [ío6¡ò‚*F+4— ãrï.–âÿÒãéÉ¡”K¿4LÇ´LŸÔkb2|±¦rr›Zª¢îèÂ3(³q¤ú/UÖ²æÂäuRlŒ"u)'ðö²«à¡“*(ýp½ÄÐ_$ÉÁm5WwµW5X‡µX5Y—µYŸõW;Æ k²±vîþl@J5o;àZ?ë¹®5mF¥'cäö0çrsÔF­Š²³÷itJ/ºµ.±O=¶„uÂYe[Ód{õdg¶×‘5ÒYöÕmµgKöÔaöf—öÒu¶¿ýÛ. ï©Eÿ4ÁþGB_)\'ì|¾±U¬Î‚lôO®I*¬Ä.i ³‚ÒöCFÚÖè’¬ôs÷çÑËé‰˜áŒØ †Õê•æ=7ww7ç¡ïs7ußOw;·è]w r•u‹·t³w‰ÁÛIP°û>(Nsr:-²Žg¦¶¯,CaKÒò»Roœj¨ ãwQ‹Ù0Z!§‚Zã¯ÉÊ—âìþšôžÕz¸aþésI‘†SW‡G2†/ׇ‡xyXâÖ°Þ®º]óâ>.]3ÞÓ&m0kr„Js=¿¦…Fô;Ò":Câ·­³²‚h4+äkðL ¬÷¶uƆn"$Éí…+…™Ø1“t Æ0Ryï¹–£-³ oi9”£•o9†H¹˜G÷‰=ÑŸP/" +nÏ'ÄÖîTÿîð²õM~fzm´^26Bú6±Â¨Gcc'+7wô+·zâaiÌPÛV¯«ôMc8=ȤKׇñûÊLŸTè¥:¸ãö,clUÞ–ñmþÞØ£F.—朿vçþ÷?ôRkì‚ã,¼–úf d«oê0‡Êr;¹MìFþC¶Ëò“ÛÚ-Âk²ó3b­²÷¢­×‡+qì)¹Ll:ªºZ©«0¸±0@·°«èT2kM§,Îñá K+ðnç¯ò_ϵã#raas»MA8GÖæ {.G7±vTÝϨD`{ã Ø$D¬6»úo{Ÿ*üõK‰cºƒ7<Ѳ‰~ædÂò»s'Ó_GjkÛoÄZ_%›³ÆÖ‘B‚ïM›ÙÒœ„„.s£ªF€„=3x ë„Ï2g|SÓ=s/…²²¸3Œ~Q.ºw or¨siS{{(Ã&-û7¦x¯ËE­éè_àCu”áƒ~r’óÎǸˆšû)ß·OþmÈ÷²¢CѼÒêœÄ“È·äžeg,äžóÞûu,ß4ÀÎn2lTÛOsɆ¨5›¢Øf¨Íå®]{óeªr8÷'£ðiSØ+RÌÆ,+µ›þ=åþ2R"Ǧ®?™ºŽbfµh’<ÇÖìé`fFáŽ~ m;Â7n;rìÉK%ËsvVÛä,0~¯oâü›W|~ö~ ¬"+‹ X”Ìæ‚gš5 ô&O·ÜJ½1aX“±ÊLØå`¢Tùº”™5åaÃ1njQrcÇS©Ê,²™.dÆT…råÚ¸oTÂU•ZÎ\9éÖ¡A“DxuàÓ­# fMÛ5ÛŸ>ñÉý¹²ÐܳÅkν)7¯\œÎß '.é諊?W¿üù¶îÕªs;½>$á²Å³^º”-NˆiüŽ{îηtëâŽù˜õþSì™÷Ó 6Èôï¿– Cª¶×4° Ú¬ÿŠ2 ³´ÍÀÖ°**@ÙB³0°ó,Ä »û0C’ÎR.¹¸Úš«½dè{ëÅåj"/œnºÑ¬Ëòɨ‘0ÐDôT\1½l06OLÒ+¦T’q øÚƒ1.Û’Ï·þ¤ü·±À o"Þ`ãÍ»Ìü:Ð%žDÄ¿Ð[-™"ì™PÈØFl2µÿ’í?˜d3'‘^ªQ#DjQ3lШ â±>¶Ô‘,¸Þ⩬åhŠNHû>U.Ô"éoÒ©ÚLOI¦`kiÕ)T5RH%+­,û®D ¾ålRN®,‡6¼È*þD­VÙæänÙAû[­Ù?©õÊ LT±ó“°12Ut¨E“%3YË,0P?E;‘R0]ÃŽIr›v1犵 "¶î’É·OCm:7•ß­ToÍp‡T˜¿ÏT«p¼GOCµñÜm¸Úx Ü•®;@$`²œÒӞʋ2#.ôÕï$uÙÞ0±¥ŒIdi¹Î„¼ÝsJAf×å'·4QŒT;h {™h¤“šªéŠÓáî»ëäü¶†Ñ'bO6ùÇÎ0£–ãl¾ÙMŒq{Ù35c¥Ù2ö̾ÅòÊÈ®”ñëZj¨Ï×Z[Ž[ÃËœ•Ê[õSºIžðœðÙÆþÁCõé³gÕ3ÄË…*6Š£®<·GsS[Y°Pâ1SƒÖ2SOMÝ 'ß,Íò>^yu×Ñ©„jup·=45Í]R“¼h[e;¦„±$Ùäêúy5ÇÔÖMĶkjWîÍìo£Íûœû£~ç9Wh£S%ïè‹…ß ¥ï›.Úþ§Q'mí(ÝŒSþúñ%°º ‡uÁ’]€õáÐ'ÎÙÕ\Ü2‘úŽÊÚXËÆ÷¾\]/;e3dèw=‘xL3¾Bô|†2!yFE·qábJ„ž3Yo{eªá ãÆ8Ëql†$‹pF§>h.†—+âäpXAøõ bëҳΖD¾I?(tþ^¯6+BO…]\áa%µîHQŒmkšC'«HµkhÁŠÇТ–=¥P‹P|áßÄ$ÃD5펌 œYµ!¸¹FNðÚߕҷ§#ëcö X'Äqt¥"ü2fÁGù.ŠŠ3ž[ò‚·ìi”2 %)‡JSNåkØù µHBBêˆRÉa ×C+ æÏ†ñšQ„Lx<íT²^³T\U^(%0&KZS˜à޵4q‰.!Ë“"Ïw¿hΤsò²¤ÆäÌL~ðl¼ÄÙ"‰6/nbdÑb2Z OÖQzaƒ§<átʼnx Ÿaä ÇξìEÌ’l{åS6Ù Mëf¤³Rþ"຅a²D^É ¢Ž%£Ù˜„NfÞ ¢þD‡Ò&–x’Tܺ¹ÆöÕ²œDÄ£.BÇ®heOzÊóHTõ% ‡qÚGG*IL¢¦Y‘I3jЪ宋øU×4¤²Ð˜Å»–G)—¸Yj5¬6”fürZÒôih;<¢VáÊÔ®jÌ’àêfTix×ß™.<ªæA¨øÎ-Ní„@­âÓõMTÏwœTQbÈɶš~µ sµ`NàØ+ØG}]œüI¤™õMßä^HGkÑM¥#m«“zFÚ¤ò©}AÔàA+KQfòr“µÕñ'[÷ý¯AééNþW¿†Õ°ÜúÎÛt K©¶|Âdrm5·¦@3„´mší LÒ¤KªCæl'#ТzT™KmfÍàËÛ²¢‘·ÜZ!i!¢ª©¸LãMÙGÍëòU¤o¢ÜôÔÄ,¸‘$Ù‹QϘR[z•¿I“Û!½©Fo†sœô©oÅ<9¶†jx Š$ãú7 +«zä¬-_Ó³–{XågN¼Ä뺖·Ld$k5¸¦JrW¿÷Û]v÷ H%1f uÐ,uÛIòt—dñU¬< m™Ë]ö²ä™äÐN¸1»²›xUÓ@™š–™mºŽ ’y¸üŽ7 Uï4/Ä8Φդl•ï‘Ïþ+ѧšéí¯éÂl(‚ÎxÞ;§Wéj">–äÍö/:+*+[ì‚â\'K4‘/úËW-ò ã¬˜7‚ NM`tª¶€âe:ÂÚÑØ<½¹Zæqµ~J4{-,´û;± ù˜æHãUwñõ3xHmiO›ÚÕ¶öµ±mmo›Û_¦ì‚_ä2ÅWâ{öQ¿ùKÍ‚ª³õ!¡qX#v_X/J4³ÅlïßE—¾š\óg¬)¹s›ÃËölbµé?ŠŽ³÷Ã!q‰Oœâ·øÅ1žñ’6øÃ(w­è)4×wÊsÒªˆ×©…*F' –Ë·ÔÀPÆxÒ*ŨԺ þ±œ§:·5¤H¡yc=åÕ·fC6%E$à˸·¤Ê„öE—¨G]°UùÕ­žu¬K}ëZ÷:׿ö®Ë„êc{ÖŽÄñÞ¸d)ä)4Ô2Q"[Ôq$| v€L€ÂrŠ}ìÜÞöRg‚“¥³]ð~—·÷øøˆžïû=qò’yi!ï”´kÜŸÚãüçAïùÐ{ô )§›™ûbÑêQ_ÉÈ!.ãÁ”L™-©¯Ø¢ÅDÌÎ>¤ªšîUg^ÄëÆ¹õ¦üå)¸ÛQصýu‘b«Äèôø˜‹)Šã§Ò!Ëê gìÉ~ðƒ+ãÿùÍŸ~ôoýêwÿú9Ü~þù¿ßü•þÖüñ¯~HˆÆKx"±èáâŽñn%yžDÝn/>b'k~c°Gd‚WŠÂĮ́2/£ìå½:ÍYˆ ÊvhÏ<.OJ"èþÌÊn©Š®$«pjJC6¯ôНôdã6§ô.pâñ>‹ÎÔ*…>‚ü†÷TíD¯lª.@fVÂŒE:˜ŒXT‰‚%VVJû ¥£¶*Øà·ÐKšúŒùVìçÜEÌ ÁÀÜ%@Ìð ÓÐ m,*&dås[6î,mn ìo½”ç´”<Å4x0-±´ÉÊ.M%E‘ 9/Ñ%½‘'ºÑ'Fì¬,GðF"'MH/­ç4Ôf‚QÎ^‰&L‡"óà€ôpÀ“ ÕÌ:ä¦r5ò"òs%âþðJ;ó? ISÃI±#g6cÒN8 U£qU§ñI 7‰Ð7UU3þÁÐä”,º±9át D”/Oª 0XaÍSó­«ç‘2Æ æU·èÌ´ƒtT#¥ÃÂÐVÓ×¢k†¸’!äP"#\ý3@uÃ?é“1Ó!Ñ5"ÕPJA¢6-AýïB-ô@uBARBó•ß³_Ûç‹«îdB2Ñ'âô°X’ ânöÄ…î Ñ_ª3âF$!,–Ír±h¬åú톴$™Q=vÐ:ÑsPÿ T[b)r Ü\é³4ÿsE“f{ˆe}Q>mö?ÐOôÑþÚ EÇ4hÁ2צ5-=iÛ²Y;Ïh£å$K–m¶1/}uWsõ“¡NÛaD#U óól¯yŒc ÁO[j"‚8v}¾á\ìP{G:ÇÊZ¹U . ÿ’ب/JÞ°o#ò Gó3 "!—0ÞPJù“>áð"Ô°TãTYvÿ¸VÑ”r[õréh1÷¼J¸„“/ õÔ -&¤¿‘éât»‘,>T&u.ÏÔF Ƈ¬ê>ÚÑÿì+?æ v³¡õ¼>iÉñÕ<Ñé)ñCe{ë=‡ g4 ²°/ZÔæ#ÂÕIWj ±Ê”6ô`Å{!«ìÕAcÕÊÆ7b‹@gÊdþõ²Sa}&Êm.Ÿªp¸J'8…lý¦rBøÓ ¿—¸0J5YF#Ev¥âÖGw, EY«+Ù¨LÃþtÜ¥’˜I«Ž‘q…ÇáºÔ!!vÕôƒ£UxÇQÒÔÓsr Vi“²p Ç„ê0ƒî~¥‡æç°5+9àM‡£Ã,B‡k"ŸâVùPßj ϳäæ6‰‰7diˇ֊¯¦d#c˜î_Éî*úö[‡3x¦‘†-wVɘGC²7iGef8'·îK§K¬ª)…5òVí¡ð—KnGØÍT8ˆ¬Zj³/l9-ƒD¸G²ù2'¢ÏµµìaýéÃ0þ„³<ØÒäµbT{$Ⱥ—wÀ÷|Û†t&´Õ•”õ:î„B"‰6ùϳPï ‚)ó²ƒSŠOYô'FI_~oS†£,€†59ÀÌ ]è8û'))×­¨˜äøL!x<ó ÃÌ#ép*R]i€‘ [är§,æ…ü·ÑŠöÎÆ„Ái¶Røc# ’V‹Oï; m=;wEFOýd{47«ry z¡]ƒˆç•n«µµî6¢´®”m½Æ‹Ä+À‹\€5«³Ñ<ÍÕ|ÍÙ¼ÍÝüÍá<Îå|Îé¼ÎíüÎñ<Ïëüa\‰o²%À«¤¬Š†ã8¨â‘$ºÇö?Zhñ,‘þÙ¬šY­²Ù±À¹} 4þŒ•]kt¾÷=¾Õ¥Çìºn¹¾±¾Ã oþº8ý1’õ,õjéžé•¾é¡þ饾ê£þê©ë§~ë­>뽞ëAýfˆ=e´‡Ì^*ôý®O+Y醪âWÑšN™5½@ •yUQåÞ¯/Å{›ÏÒÇ燾™³wð˱MÉQRaênj0ä¿ñ¿+Ôµ)·äŸ¸¥*Ù¸p é2 ¸Â|#ßá»\”í[Z÷m,]èךõšªš$÷管+ÈŒ>œlÿSqÿöu?÷y÷}¿÷ÿ÷…?ø‰ø¿ø‘_׋–EYÔ\Ìi{XmšÝîN s„+ú¬¼“˜=V‹S:Äñ©ïþÊh[šþ©G™¸ÉßÃ(‡ô¾%,Ÿ?QÐãcñÿþñä•©HZlK3Bçš@|BKT Aƒ ",˜°`2h@›­-:„ØqĆ GB„¶ðáÇ“6T‰ò¤Â˜/!ºliÒ$É›söüi0"É™Bu 3hÆ"ör‰)Ô’@g6´z2©M–·fU:µ+K’a3nĘ2èôP×®d ÷­\±qéÎuk7/Þ½jû¶õ[—ïßÁß5ܵæÑ•*É:– 9Ó"½‚½ü¸èUÉ*b4‹@à‚Ï+)Vn,ÖgЧ%‰V…Ì5læËZÉ–MŠviþ —SGUý”d2{EŠLD«,LÛÌ“÷þ‰u³kÙPYƒe3·ÆÐ¼gcÖý=¹÷²ã˃'Þ¼øôì×»ï±öد–w‡-N™fýé¾}Û.[Qe’!°Hg%RHEˆÔE‰ä ƒ nÕoï%ÕB›Á‡“t‹aH•~!.O÷!‰ô-ÕK0™H]QÖ‡—\Ö͇ãs»©¨£k8•z‘è]x¤‘BÉd’M.é$z(Ê(b•®=„_Žeh¥W;UæYAÛ dÑ:Ø‘GŠtfE%…]j–ö¦s½}i½É‡¤w:÷§TTN„F0Ú¦'ŸÀ]·gþOqƉV‚*U'zcrUivñmš'§šv ê§¢fJªœ¦¢†ª§¥¦ꪪžú*«£Âj£+>yëd•ùGa{«ù”æ®Û%cæEaT&Ÿk²îÝØcN&¨gŒ3zzÛ­ý}9eˆ\~ íTÅ5Eu7’Hb¸ý1fᜎÚÉèkNôãDi%”úúŠkŸüæûï¾þLåC‘&—[}1IVÜ»¿ñ–ð­ ÈYF‹p7á„Æ’ ƒÌzÄæD›áû«xŽg­rTZxpˆ®eº¥Vв¼¨J„6<˜})#ê¢f>ƒóÃÐùµžívu)}+pÓ÷ËôÓK½ô9¾þdÖ$éJ²I-wIíIb4lƒÍ’ÙÑq¦… æzWj™³{¨]ËkŠ)OýZ·¢VÉ·Ñ?e©åt‰škç‚χ5Ö°»XmwkÓN5yM–Ó]9æ”o~ù‰šwÎeæž:矟Nºè¥Û -”XâŒáÜR«œæg—f›»*»1˜öž§”ã[Î$«¼Æëh« <ÏÚî<¡Äzw‰€^4òZH]×Ç/j1wÏCM>ÞåWm~úè¯ïôÞ¶ ½¼o“•›·¶*ò¬½ÃšF¦‚iâ ëLUrÏ@wž°ÉD0;œ‡\¶¹•…Mo‡;Úã`G#èIÐzûU¸þBÄEy ´Éþ¦C” Em…çk_ ©æBõÅP=„` ±Æ°üOfZ“k d»³˜!j«Ø®ÄRÄŽm‰yµŠ‘»,H§ºÑl†@ƒÛð¬è·LI2"«Þàš§0=,…󪟖Tä§ÇmS±Y¬ÞØ*ZÍJV®Š#åXÇ9ÂQvÜcƒ–<ª†8ùŒÞœ„¯¤ŒM°ˆG¶Â Ê@H‰:¢Á²ÅxÑ …"Ë¡î?8õje¥&ÿ†A32±oÐK\—b“Hç°pÚªß. Ã\²P»dŸ._È4V~ö»È¸¨‡Åbþ¬+µãÌ”ŒßUì3jK"Ün„µþj¡L›–áǪäÊZ9/ŒÔ“kn¦ÃaoŠûacgäÊ,V§žûZ’VF÷ù²—Tü%/ Ð~S7áìIé\Ʊ†KlHþ‰ÒX“~Ó×­ff=Ù‘ÎzŠù·üIA‘2eŠܯ6(•fÈK”ŠMCá%Å—&Ç–Aó(êJ:ÕéÔt©ã)NoºÓœú4¨@ê‰Ö@*2¬EuKžwf9ÀŠábF<¢DNRM—2´dUô‰7[‡°d*,~~³ÚófÖ­-vQ¬ÙcçIP¢Åírœ#m¾‚Ïzö“Ÿ Ýk@÷ù×öÕtœö %DY.Ãe‹žÐz˜6ò"þâ²NâIYÃõ¶`Ò3¥#ý¨ Æ:S²Ržº1©~„¹(ÏŠ1–˜—ºV)¹2F†`zÛÜú·»àb ú¶¥VEž”í_&f (4¤A™Lïj×§bk]FKª,¯éÂ@j÷Œ^»ª®Ö5ÐUšUS"lMÁ;·G©_Kœªø¨2›?âq¾w¬¯é{_ûöq¿|ì¯|‹wÅÝž¡ãƒe!² 1¦yÙ(¯TÞS|ßûdµ »^‘zË·ßgÉ8lÕx¬¬my-bøFKµÏÛ×óuÆ0¦±”:;Veò$‡§‘(Ç÷Ã01ÒLT‰e׃\ ƒþmvÜüÍW{öYVk]pZ—ÂÅI°m½ö‹½Xvø;c*.dD)ã«™·ifó.© NÙ’e"Χ“7E2+ûÓ˜ŽxôHh%ùB“­j¹©Z7¶»8Ö²RÆUÕoÖ¢Øt-YºR¡‘÷x QÒ÷¡Šº¨£îi©jjR«:Õ¬Fµ« M·‰7YZ+l4ê¤MÅrêU1r9EM»’UIŸI“‹J6aß#hÝVëö†·rUm‘Eä—=çCóâlçl&aºG/ ZQÈyú˜ŠŠøo€WVH€®¨ráÈX9!†0·FÂw¾!QYå|Köþf½÷5ì$‡€wVlem¡²E§ŒõÈCÈ^"µm;e\%0GU|“51èûȈý(“MÒßø»önxg %fiÈ,f$ÕM8QVUIEt”â5‡¨‡°vcuøKúÇhGR9ònÙㆷƒ'†kaÔwPõŵp-Vxs˜–¨–è–¸–(—‚g޳sAYfyF×n—8wK ‘ø¶k,A?•ƒÕ(i¤ƒ ¤L8hE#©d礎²–tuqõ‡<鎇TíµFC“5“4)šüè-ïS…{ÃŒ‘Ùñ&1¶øP|†øvD5˜±„shˆ“vŽI‡þxTtˆŽ{E)'€yŽ Å÷bŠ¥Y]Ê“ž»gšjvt²8™6“Ä1‹)ɇ3x€ãå.^ö§™/9ã¹BÇø‹Èˆ ª Å˜  º ‰9• £šbôŒ&öæ‡¥é’ØÑà( šzxƒåØh¥‡’•‡çxì–zÈx ¸Dù60ÓÈq×¹ˆ7š¤y%Êž5Ê)G\ yšt‰ËÕš%éMúiJî% ¶ž9˜‘§m9‘Y(&ºNï9~'v¤F¸"ýés.K¸¡Óeþ:Š£gšˆ7é}âØŒ:â›nd%”¢hŽE[‡¥š&]Ny•¸ZOH•Úgð¤Eøïh”¬>Ú~¬Šu¿a&å’þ¨LTм*¥ZšTºŠíDŸóówX«é –µ˜‹ªdœQö8-ɾè +KŒ-;Œ/k , ³=Ú«KR'oÊ“ä3ot 9 "sl"@fò³è×? ¢~"ñ•…é€Å†˜uxa‹Ù®ƒŠ¥úhìš®v±AÚB:> 㱋©¯Ëʯg«¦õm˜c‡èxÉFy®‚ªc"†Ž¤&x[´m’1¸Ã1³ù[N <٬㥨‰Ÿ!ÉNö‘Û ¡^„Ÿ•9…—yKÚ¦4»ø¤²þЬi‹¶Ü'u E8o7*i•ps¡Á?"ñ°œáH·G†t÷Ñ~ô×”ÄÄ8àþ€`¥—!µµWYZX±ƒÃòÈ|¶è“Ö-8DSše©Ï«©q)½œ:½—j½=ex¼+‚Ý OB|Ùg•„{hSwÊ¢~cÓ‚dI0ˆ|x&ar›I˜k}Š«¥Ñ6(ê(–“ u–WÍ'EZ²D¢¹¯Ê¹l¶ž+$êFxwF„¤‹¤R»«ôvá !fs¯[†dXDu‡‚`¤»Q9‘»9Š\r¸Ã{œT»†o›‡ œèE°ËÆ­p*ˆä(˜®óÛ¯ܹ;ÜWËrÜCAJ‰¤GOâ (˜&@{·æ›w R”g8l# tò;Å z“Ÿñ«®©~¸¨¨lE€¨±þ^j…þ«IÙ4}ë+1ë²l<³úÆ2ëÆÉxÅX,¡Y¹œkŒxb”ᦂÉÕ&Ò~ê÷?µ&¨è¡k{7á(¢R{Â{èˆÃiŸðÄ¢¿«.yé¨=$y0jµ› J‡ˆÀ<¬Ã܆¶š_†¼9IÆÖƒdZ$€DÊ9lÍŸëOlê¾(Bº/ÖR¡'E<»`YòJ I´\IV…Q‡F—ºŒh†¡ûgŽ)†Jÿ·Ÿ[™µ/¯SÊAóH¸šYÓ(ÊØ©Ð{ÐÑK½ }þ½ mP›Í«\z#Fl·WQOü—YËWåÌÞ(º‹<޽J«=¸‰ë®у¿6^)L±â7%1|x[¦˜½¦ªÕŒÍ¥¬Ó5¦ÀC*Gš‚³.)¿Öj‹~iÕ˜D~ÉI_Y¯æá†"œpæ:"œS­x‡ŠŸ'jÕ’æ•@ìÂS4à l†1Ún¦œÓ×<ÊùzÕ ÄÛ¨&˵̄° ™²iÂ|HëùÊ~ÍËíœ]›Å‰j|(®j¬¡;a+¶À<[Œ¶¹qÜÆ ZÙp<Ç–MÙý5ÌU“šxL¿O‹`©ûÀ¥Ñi¿¡P[X¶ ì´íka#íÓ>¼»ò<^þ–XuÙŽ¸Ý`­ ÖÌéRHh$»¨Œm½ÓkmÜP 4 •(÷ީܘbH(-)"²Ã^èÉŸƤD·@…›’‡Ë¤T†±H¸±ºªNÈÇeÑ7­<À͹²‡dljMÜlÓé½i´°YYÚ8ÉÉ|\o  Æßòͼܧ¸[œ!ÜÂë»õ‹¨$­$K¼ºM’:²2©Áw)Îj Ð!^½=âMâB•½ÄFQ*¼ŒœàÛ™ÖâsñÞà àáVh“Ýê—íê«îüÍýVÿOŸÍ®ÿÍ$,ΪË;ŽtD£ñ®Ï6Ãuõ›íí¯zÅžâ/•ÉÝ’¹û’yáÕ&ÓZnüЕùE·ðžÏùŸŸÜ<‰ áƒVP`A„‹,„–l`B‚¡|˜¢Á„/l€Ã†E é1™G“-€†òdÊ—Uvl˜¡Ä›nÌÈ1gFž-æôùshAœ}&%ôèS£Q1FMêpa‘šH¡j¥jóâT¥:%»ÓæÄ³9r¼Øvë׋"ä©­P¼þRÉîíÙ7/W½~ÿÕ ØpaÄ| +Üø0ãÃwó2M,” U†‚m.ÛY`ѯ2AÊuÈaéÓAf]PræA²‘!Ö´0hNµâ. ¹òߤasòì}{«Î…öfÖ& •·e‘…Ëž>VjÅâ]9sN&—kl¾>icŸÛ|yôµÓ“Wßžý{´ë㻟|}ü÷õŸ§¿_þþ¡ŠËÎ1ĺª&·°#0¶ÂrÈ$A +XÉ!‡¢ Ó\ µ¨6N3Æ‚3 2²¾*0EÛ¶ÂM³ÈTTqÀé0+¤àÀsn3 jFèz$Q2àÓL®Ø`ƒÑ7&—tÒH(þ|RÊ(›ÒÊ*›î:¸Z4kD{Ôñ-¼œz¦FÂp¦ÕÎÊjÍ3Û¤ºò¤|Køš 2Ïζcn·mnвƄ&¹³žëŠPüˆ\ ¯àd4LÉ?›«³¬.i‘ï¼2/Ë&A½RKX·lpÄãîÔ“@"Y½ÒÐë T¨‹’±g¡ õ4D!¹Ý6Ñ ³£ÑÄ'ó,¡^ûŠ3»ÚEöKx—W2yë¥÷^wµÊwÞ}ííßwý `}ß-‹:Q› :igK+#ÑB`‘at3«7k’óºfþ›¥±:G«dQ@Â2­ôX’µÕÖ%C4×=e4G†-½×MCnq\Q‘+Á„WEuÔT Úh¡‹ZT?UöÒ>7¤ÜM«¼31òÎ.›)Êy9¯ÞSÞ¥wüË.iïmdÝî8mݪ:Ûß.òim»Ì:?ïÎo .ª µ3¸l¤G|q¥'úñ£·VI^¸Ìo)kY§¬GéϯÁÒPçèVÔ À9]m;Rã"O¹Xš_—9¯— ^›ôFifîÅG¥“nó¼Ë]û Ÿ£ ¯?þ þ/ùü˜÷ù壇~zå©o^z¨-8é¨gÕYwÇ(åjW'îÌGþÀ 9»º†4Zñ6L“Õ»c ?íÚ;ž?øhAJ€{ãÊòBðµN*qùœ¶Ö9Šsœ-AcÈj+ØåNV²§õî0;”šºU"Åh€{Z]_üæ°Û±nmš«” µ·%ÖqIVÊYêŠä*ÿåŒebZaݦU© ^fSS3Ý¥(8AÆA±‚|âŸDšJVXa" ’r\=ÍA-IIM7¡í ŽcŸò£fG¶É…l¾‰cf¼û½ssãâ¢Ìæ6Cé©oß‚×qnÆ–»¥¯Oèj Pø/H,’i%9XI~IR“–œd&9¹É6ìYþñ ïÊ&ȼtNbs9áÍîòÀ!™–VŠ¡ÈlSœ¶mp–¹3‡@…dÆ•8ÜqJÇ zÑfãˆ7±©ÉRŠÓ´b«9E;f³2슙.?e©‰Rœ¡ŸûÈ·Ê©|,!k›¹ZwÊñÊ"ÛàIÈ;ÖZ©)µ†™¿rÉÏ€è‹%¸Z)D¨x³|ht7¯IM*Z3¢Ø”¨6“$¤z ÏŒÂìáûf†)ˆ¡Égæ#èÁ~ Ì©œtZNä%òƒEˆ—1K @DÈ®”¦E|TïÂ;ûñ‡„jJñ©Nç%{׳Þóª÷T¦BÕ©Q¥êT­šÔ&Si[þ¬I­X*¢%N í¢GG).|"µXõ# õ¦PoáQ ­$Ôå’9»yQ~úC«þÜ—¸3êð¡ƒhL+zXЦŠ\-çÅÊGjo3Š*KÈÐù³¤¨û`EЦO#éñlçrÚ ©-_ö²›r…¬œ`ê×Fs\{N·¸rN…4˜ƒÕ.kØÄW¸„½bVO«`ö™ª¥\ÍÆ'´¡öªíô¦¬f”ƒ±ÒnEÓöÝnµo&ýÄŠgïW”ÖM}‹¤¡ÃÚL{.4”ì$&í{IüÖ7¿ ¼¯~ýËßýR׊)¥y'¸Ü„pSnnye€¾ã½a«ÇDcY€>ßOƒz> çšês’vŒžp»çÝNCÆkvíŒ.ï=„fÓ„þЙH+’ÈëD²“Kµäó¦âí”Êm[×Cù3šv4þ ùæp1Ø7éÓÂ\ä;ë½áx¿öÝ »æãj´”þ~JF§‹ˆ”•ﳯKo•³Çë}6CÌw±ºéWm©yÖÞa*û¼ùÆùD*MLŠZûŸæ¾¦»Ïiï‡ü|v¾š%®^GÇ/Þ?>Táb×סo{Öö¬ŸüV°Ã<¯žÿkšÞö”+¶Î‹´A$}¶¶"•‹6×S½…{@Ö[½Ñc¬àK£n[¾’ú:v«,©óœÝC¼-97ÿ9>S#>; Ô7Éë-y3.zc­{ +•zÁ€*¸»Ÿ$þ=q·:s·¬kÀÖsÀ„ÀÇy¸æ*Öú™ÝÁ‹—¯ÛAÎ4™ ŸÃÑ®‘Óµ’;°<êB {—…É ì»yBÀ,«B4lÊ` †z:¢;:¡“à«Ã¢›Ã8ÌC£s«˜"0 t›UA@ÜC“W+«øK?º¢5Dl²=Û5*Ì¿Ô+¿Ò"»ÿ!¯@±:tÛ:éë7µ[#I“£B BR$BóÁ $5ÀS.UÓÀÎr ö»¾F”§dóc‹œ¬½ýƒ³E±sJ°¨G/£¾Ô‚´ž:޶ûJG²3ʸ„ʺËITDËk4E#dÂ5 'Á£0²ÇÇ‚.«ˆÂ±ìÈ­ÛHn9¾ÓF†;9–Üb䣖CFK¯fü°þ8´d2FzC½¤Ã;´CʼL=ÄC¤ÛLÍÜ ø;« t®£ÃÔ7Q|¾¿ô½–BÊØkÄ‘‰IGü²¶ Á%ì<{ë'ŒÑ([Ÿ¡š-OlFÆ¢¾Á›;sËFµ4μFFì»ë¬$ä·¡D7rÂÈ(<Ç,ü, 42-B2È{¹_\ι²¼+æ«B`L`üFe2ÀLä=¿ƒŠiĨHLNäLKút@Ø»6óÆ*”'L$ŒÜ3ª„ê:fN+d)•jÇD³xt¬äãCo4Ý"v<¢Šl(ƒ:1ÄûEÝsÇmRȆ ÑíÑeÈuÈ«rAóK Ъ/Ä82â÷ó£žLþ¾-lŒú‹Ÿ)ŒÍUÔ¿’ä¼`˼)S©^Lº +EzÆ4d5<š´IûŒÒµíùΩ¤»G´JäਬÜÐÚ\ÌwäJ K̼Ôª±¬R* Ôû,¬¶œK#‚Ëš‘CÍ›'Ô8ÜS[ò)+´@¿LA-œÌÄ1Ò|*RÉX9Wl™ õB³`Of¬-/éÛFÒ:¼Ï¬LWÅLδÌÌ”ÕX}Õ8„Pxdº-ý8¥²#DªCÍ|L/ëXµELMûSQXôɧ„J*+7ÀØÒGlÓa…IN„>f¢S# Å6)GAþ•ÒúœR ¬%Óž¯ 'ŠLÒå–Y¬Î,Ù.í¤/]äÎ ÌœêO¯UEó¿› ›:Õ˨—¼8Øô²uœÏÑ68WpÔAÝÉüt£nÜÕ;ʨ%­‰ oõ»s´Á 3S}Êz­\­JƒKÌhå¨asJ ½´b; }» ;Ä:¡Åc5Q„Ñœ=Q%Ñý4ˆ\QDõ”ZlLŽÀÈe«%´D!øI¥ËµƒÝÑ1ÄÕ %/çz#6|ª.£™Ç\Ö'UʆýV†=[3ëÉ÷üÉö™½ âµÅ4J1]P(-Nus«|7 ½W‚¤Û [-”ŠÁé˜Û{t/öоþÏ›¾Z‚k<ˇ-ÛÈEÛT”D·ô¡õÐ_\¦º,£»|Ô/³¿pÄÔ¾ÄBdu<Õ×MEÓNR@CŸzZT¤~¤5œÎdU8¬UXíLZõ][åÝYí9\5>]•ÓgÌÔ µ¬`²xM޼YŽÔQÊ%HœM\ÍJä(>ج©˜½ÁšCBÜ©ÅgE7uXÉ]_Ê%T5]WœÈµÛ¶£(¼/ÌN Ì@[œ×*éÎÄcSK OaŒ²0YØA›4CùTÒàA ¼‚Ô²ˆOyUßöÜp…¢ˆ]«‰E^ЃL<ýUPƒ-¾Œ^Õ Y})J\:±K;Ž´þ)ÜÌMÕM\NlàùDÞ ›Õ:œõY!b"FQž=bV¡É1tŒ>‰”ÅdÃV½G Íßzå:ª…Ä]ŠÚ®=OÌ» •ÌáD=‹ƒÝF³WfMi4´à †c9îÕõÉ, Mò•ZÿT æÕX.Ü’-¦t¸ ÔÛæ[œDzÁÀa ÓÊQÔGÛ”¼¥ËÀQ¨²|Ü86ÛMÆàÐRÖË=TïIWæYÔÖiÔÏí±)¼á+)]®U¼K6MÝ?´K”ìEãc (…-‚=œ 3-7ô5 ÞÞý]d^à=fe6É@» þÜT-J`]1aEa®½PÖþÄ×d]äè\ÛfÇ ƒV—qä#õ^?]”—ÍדٰµndNžcOžgVEfmž³ÈܶĨûeÕ¸³×[DÒU•z]+Ç`X&`ßF~¢¯’É/NÜ+~•¯=hg0KX3îdöé 2ÒÏ./ÎýÉÛ!Í™ÈØ£ÔAíÝ¿˜NaJTPEÌ7=YôJY².+çª;\cµh+ƒäDþáO.âžUj$b#þY ÚˆbbU^\AÚ)¶R®ÝùóHÙM@/¦_”íÅ®½æ†àŸ‰[IßÛ^å›”N4ÜIš ¹ù iz¶k{¦]%»;ö¶âõç -¹ýcþÚÄ1Ò|3ÍÛ5Ý[©Ld@öf§y¹züg£.Î&¼ìJþe -aŽV¢>ÅgÈÅëzí.TñUt_¹¼A°Ì¸T^Ü]¶QÒ½ÂW~Þ²îCÕ¥eÂŒè>ÊÓPÏG nU]c§€`ÜÍ(›Lc^námîefîçÞÃta>MçÝE÷QD ž^¨U—oN"P.lJì0aZ5ð}_é@¨ÎèÀ†V¹[±ôÍkѾï‘6A¥_;?’IÇueTû,Ôß[üà†>²ÿÍb^lìäÜF1ŠðÔº¹ªM2Ru SuFó„mf¥`wi¿ë‘Þ`c9éÙEäQÝ —ÞþØæ,ÐW|¼¿KP;3Á™æÂÖiå*ÛbY%¶V<ÂV€£SaFê{~j§^j$gj¨frM+oŠbbRþX‰„ÑÏH­âèµ%­èeÝÔ‘LàXÒ=±«IÞט˛ó4±"ai/б­5qûžRµ…«¾Žæ¼lÒéc¸ @tAtB/tC?tDOtE_tFotGôD×¼G&ry>gÚÜ™úµŸxãì÷Ìä íü¦sÒN8Ó¦òîqE¢]왽H»,!HuXuYŸuZ¯uD矙K<’|eCÒMøÎ nÃÈ$ædffc‡îbGöf~Õâ¥n·]Ú±ntþ¹kþï§kçòÚök'/{èvpOo÷jçöqÿömwuÏvq7wmïvr¿ xŸ÷twmW÷x—÷tÇ÷uwwv¿öøFg|nbeêXTÜw®Œx®ïQuüÆFråoçäçygÚ£+—÷?÷sßxçxkÿx‘ù‘/yoÿwtùŽ?ù•÷x”oy–Ïö”ywç÷B·ðŠÖlù¬]ÖýgNß%WUPwøPŸs5(n„¿F‹]^0%¸‘ˆz©Ÿzª¯z«¿z¬Ïz­ßz®ïz¯ÿz°{±z¬ØXìÍtÌöD6_¯Tíá€Ô\wTr¹oj'¯û%¿ûs¢3EÂÔÞ±Ñdõþ€¾¬‘‰|Ã/|Ä'|Å?üÅO|Æ|ÇüÆŸ|ȧ|ɯü·|ÍÇüËïüÍÏ|Îÿ|ÈG^8•ÝÆLÒ%-îe”oÓsc(-ú:'z ¼s¾J7»=VB©ˆ‚;`ù} ~à~á¬l!~ä/þä_~å/þ1þço~æŸ~é¯~ Á ¹©¹¤A¢naKßa÷$ïÆÕñ¡7úØ7ÿâ‚ìPFíÀKÔÕÎl(¾òZ‘¬ÿ‹qDãbýïõû·î|¶€€&p`²„VÐà„‹@DhP¢@|ZL˜šE„-‚tH‘#´‘M˜1ãÈ$UÂüøR`þ`jÌY±$LŠ{Ý铧Р$‡"5ú³(Ó£J‰:mº4*Õ©V¡^M*+Ô”: ºœ¹,Y‹!Áè'Û±N]n,€B…5Õmȳ!B¾uSú |r¯Âd.¬·ï`Á€C~œ!ež•ÿ½\ø¢cÂ’=[λ2â…‰KD;¸mË®!ÛÂÞ Wík’µÃ¾œÝ6lØÔ-k’÷W·ÆÅ"'Nv9låÍ‹'‡îüøôèÌ©KÏ.³µK“Þg¢¤ ±îH‰+aW‹3Ù܆5o6L,P¾èùëã§oŸ ÿ„ôÿß`|¨×Zö8 ‚ü-ˆ ƒîW`„ 8Pþö¤¥›q¸¡Ôšk^]WÛu»uµˆ%¦G“M¶©Gv#Vcv0Îø7Ú˜ã‹:ZÇcu%Ît[,ž5žN¸É”ärå%4W^ï™¶_‚þQI¡•öa”Myå„÷}©×i¢M)f•[ff•Yf} UöZ2ªçaJ³i˜Ûr"vX§Ÿ9yDbLƒ õ^Ny²xç`ª¨£<1 ž¤‘Rº¨¥6 饚b:香‚êi§•ŽúiB™&º£ªWnœ®ª[wuµgáŠpV)Ñ–»J ¢~]QdÞ‰\öJ¬±¼BõëZʦg²ÏK‘_]¹ŠÓ«]˜–^³Æ†äE"Uˆþç†ãZ¢ÓÝåâ°2âkî¶;¤¼ìúøî¼ö:'âq(žj”SE¦Urü~;¬[rÑuØ]6*“žŸW°‹v‚1ÄcEœq¿@ÄXk¡røðÅ#÷¶/(Y<’8+·²ÉâP†G±W/»ñjP \îpø/½ðÖ+tÐE#M4Ì›¦*䈶:pªMÇ<¨ÃìàÞŠS?]aÅc¾&z]6Óá­ž·×¢m6¬V“õ±Z©a˜3k- s! ÉgÏyj(äH†î›/WZUuøSˆgµ¸ã[1®8ä'¹å”Oe°·F °z(¿ûjXN*l“|_R ?þ-Vë.Ù¯ê2ÓÞºn«SíúºÃâÞ;×Kã½/ª*©;Ù""ÿ-·_+5¢žÝœ¿‡ó½œ'}}öCk¯t÷ßsßwϼËN6«Ú²ì7ØL GkÖ.rK6_¶D6£²È¯»½±‡õ‡èEJêŸÿöt"§ÝÎB:]uvó¹ÄPcÛÎѼ¾‚„ÄžA¤rM\žsàWÄg-æ ìI¦ÓI¦æ÷aÁ*emKÛ”ƒÃò°j¢»!ð€ô;‘ˆXÊ CˆØ£.8sÙø¤V3ãð…±É›îPè››T‘8¤‚ÈL5Æ2–*dÕþÏÈF4¶ÑŒrTc¨R7J ª©ÜfÆ£ΧV*ãk®5‡%ËœÈJx(çµhv±Ë"Òf£¶QP  ØulÆD (IMˆ"F±s90]Œ,Ñ!¹=­ !ö6®õùë'+ìÚqR„:ó‘Î.¿ ×£>XC½±\¯¬â·ØçÇÙ²–s“çµSVU—¤ÍÓ~É¢%jñDÜÝô°­.b0–Ë\§+ÛIKv¾³ˆ¨r!5Ń>öYì˜à¼´fN¢’˜—»eËNø¢Vn’)‹ @ý5É„nE™æj_BVö@ó}'Ä›íÖbI6jÜZFÙþҸɡ¢*=éJ%×R„²4¦.•)L Ö͆d—áLš `–³kÞ䜸LÖÈÝ”„† #/ªÎ>MŒ ‰Ê–;yGeÊÊ€Ökèj¶Ê:.VÇ7À±c:e©NwÎ2­gg9¨Ìuj-{´"É·ÓŒ`ÍŸŒ\åÍf„J¦,”+nm%w( ½ Do–}-éÔ\¢Sr OªW¤ßß(‰NÉâRb,é^תV³‚žŸ­½ <}©PŃ™(éiD“•pÉœŸÃàH¶Ÿt7‚cZX.Vído”nWóLȪöž‡eZòàÆZ®Ð,mOÃ!réÙÙQŒsŒ#‡ëþÆïn—·Þ ïx» Þî’5»&´gU¹ÉÓT1Fz´ÉðÂÖÔ#í•_¡.Rƒ7ÁÞ´¬ÁM!Ð~ôQ²=Ö°ŒEîÝ’?ç2°ÀE×0WY\´z6áÅð†ÙŠÂØÀÕ¥ÿJîç‚×!Ú'¶6A ‹[ìâÃ8Æ2ž1klãã8Ç:Þ1Y\7>V·}üóˆÉÑ sœãV%ÕáÑr˜´OÖ0i©X.§5x®ÿò••·œ¼ÚªÇb3™Ëlæ3£ùÆ›”ªWl¼šò¡žj.d÷’24f5Ý3æfêg>§”¦}ôK)§9ÿ†Ž$ îa¢ëúÓ„Ù-Ú$³eþI[:[•Æ4§3ÍéNgzÓu¨KÝéS{ÚÓ¨Ö4¥7IêO§zÒ¨žu¬5jZ_šÕ¢^sǬÚäç½ÖÑ”pRƒL£éõlTŽ2³=¼lg›õÃê3_o+5q]%³Œïûèíoƒ;Üâ7¹Ëmnr¨®¢4‘7‡ ÈÉê,ηնq6 gýN9ßRÞw³¡ü=ÓŠt¢f!123j(†½NsŽKÂpGúáeޏÄilÏŠËX¨Ânwî,›XŸ ò‘Ï9/wK.^’Ÿœ¼(/¯ÉYžrô2—eÙƒšr»jðx‘ Ì4Wu­qÝóLƒñç¹ö9®Qt¢ çH_5—.t§þo2èµÆxM ðßAÒ¡ÆFÏñbágû;ì`»¾ žg›–“u±¨}sëÀž–(˜v‰â¹½=à ÕÝî@Èjó^núªÖï<Þo¶BPÁ‹]¼Ak“dš…ÉêTÙ¡ÍoË÷›ì#OoÀWEóö–oSXn$·÷S¼ûyõ‰$ëÇ”Œøi²ºJ=íWo{Õ3¦ °‡FÝp_{ßßþ÷´Óîì ××Ç÷È'¾Ôå3ûå·>ú§IÆÖ¶ZÐ7Åu>øÁ¸`·:Ð4ùÅOhA›¿üáÇhž‡–S‚C8iÛtß2gõYÇ*Ö@†™ˆÂÈþy‰›´É0^±þ蟚àš áŒ|@ H þÝA ›` –¤‰@PÏIRˆm¼ˆUõ€ØU ^ž føMMˆUÛù€SÑÇ)D­,Dñ`†FIšFÇlña ´‚ü ë•ÄÝ= öJæ¯8aN_¯ì^Ô0à^àËëI˜ I›H`¢Fõñ÷‰Ï‘žÄÀ`÷‘C± æÁáÊ᳜k¡S‚Á]ÚI[± „ÜÍI¥[—¤‰ Nˆ‰ â. þ“n š(`"ž‰BÜâGˆ  "R_#.!ØÔ'Þ\Bt ‘…bð0Ør ]I©×ø¼\Ë­\þ,ªÜ,š-¢-ŠçÑ™÷|^¯½Ð_ÝMûô«lÉ"˜a!'#µ]a›\`r’]9„$ª ®øÇÖ@Dº_¦ÇB`c˜ tAE°˜“tîÔÍÁÝ:ZÊ.c½U˜p¥ æeÞ<Úã:E½‰˜.ÁFqÝr%Ü£‰Æ!Bƒ!‚"BA¦—9ª¡ATâ£Í]ÜG¨‹½Ê& y´ÃA&dBdBöÚüTdT|•[dŠ~¤A¤"´CRd~ÁÎ|(aJ"äJ"R(Rž(â…?ΓzdUƒ)˜’¥‡ä5–“­ =Æ!RΡÑXÙi XͶ±Ñè]”ΉGA ¤A þ$ây„ŠÇ@ÐÅ4ÄéÌPèÒLBCVÄV „G™)>ev¡@($$)ä8vË^¨åZ&D^îå&¡$ ¡åÀÈT±[mÙŠ÷µŸú¡ßúUæeŽ_úi¦efæúÚY½Û ½”ä°ÕÂåBÀåðÏRÌ$BHdÚù(þ”Cva2xdbÜ¥BÜemLÉ`Qmt`ñäæ[¬¦LxäØ@ã|(‚^¼ä^Çj–"I°â=ÇQå°…v › X=å=ŠgyÞËZÏw䤵ÕÜbí& ã£éÅx¼d”ì&âè×Ê$'Š%}¸ *Ätþf¤"ç@‚jÓÚü‰b~c]Ü%tREA,çZP'L`¤j)è~PçHPèdü#4^ ’¼ÙMxÚ[$áÛxº¨y.å‹R“nu^Aá¡9%‰úÔiŽG„®ÉJz¤A$[Ú¤q¦dÿÝfm"ÌÂ\Ô_F$”:‰@F¤€V©ˆò'HË[)QpäAl䮦Jé[’)#f¤B¤&o§r)…ž)G‚¤JÂå­àVÈ]ºiJv$B꩞¾$>¨ä]ZÄî%ÞVñW¢N8|… ‚œ,Öâ¤Þ"¥¾â¥º\¦J*¿˜;õ"]½#ö­‡|^‚Et²eªº)[®¥þGf%jhDýM©“¨XZ)”ÒªDò*4Ôß&†%u:–Ú%\ºjnk«©²–©²‚eàá©„¢*Hîæ´âé²fåaî$qö‡©>§tîæéZ†+Hn’e_â]ßDñÈàÄ#TÉhŒÂ¨RÒk2)& á'?²»¡]Š‚ ¦Å}öKqV«}ìæ‡~(‚¢é²GŠåEÂÈW·)éû$¤‰èXõ¨/‚ˆ–J§}ë_Pë_|kjîæ_'žhÚ¥V¾)`¶åÂF Çré^èip,uŽ)&:e›t±Ù- 3’E9S£^XR’'ÒÆk½¾ÕeuœQE%H5êèy·ÍþgÀÂeF¸jCx+ׂìËÖ…¹&)ÅÖæ“€Ù’NDFim „ÙÂɃ²ªD «iøh2øéÇ:g±ê-¹Þ­B@ãa|«A$hMúé›Þí«ìášjsÎìÀ}«~éÊB¨}æE„¢£Q™aæzàèHI&¢m&fž_gŠ.e’îéŽ.B}憅fßN›Â­]ÀthÁBèÌbeC|+n²,4ÄOš²í ÖÅ­V,]mÇÐ…®4,’¦é¶lÎ6ëZî×Rhá"¬(òçÌÊí]èôvlØ‚¯CÌdî n„§³Bï†Î¬ŠSÛ5ö 6µ«ŠììÛ­¼*í¼&íþ§â©§?þ’˜ÆêIzn[Αª‘d+îª*›nhÂ:ë«>¨\TlÅöa aXVð~d€>k« äO¤ï^"+Þ’ïšò&äúm’.¿ªŸ0O¸ª]+ÂþíÌòDà,ùš¯ôj%µæ%bZ–:Z]& ÕãÑÛŠ"Òý2­þ.íþ®Ur_º.Z\º±Aé@¦ÅöF'‚®˜gµ¾jBZïÅf¤Úo­¶‡ÚRD"ŒÅÆ–¦)VFnõŽlÍzqVFnäú)[â¦Öi–ÞmäžptdϰšÖq}Âq©úñA†i›’ë÷±÷GçuJWvª+æFO—mv¥+j*.޲¥–r¥¢2þ¦nj öd¨þ{q%ê×+3É0B׈•üJàšÆƒ&Ä“Ö߯ß¾É@üê7jc8~‰›Lˆ"³*ƒ0î|á•Hášôrö‚a*‹6RHüèÓ½j]JPw*Éc£3«³Òæ£Ð6¦ÜÜ(eiÛPÅ…@&FÔŒI=+³™¨¯mfd2ÔŸê5Ä“>¢.cÉpv¢ñ3ƒˆ2°› $ò5a1— 1"')3~äYé&»—a_¥>~QÑŠ²£t:çïJûÍÔ>åµh™—Må\UBë2Ã+9B§[îãBáf`Æu/E0f½îžˆÝöí”fÓct1³¢þÍ5ÿ3–(…ð9âAØDæä¡Ój\8w2Õ¸ëçÖHé†.êšnê®u[§µê^];µn4¶Ý{ù«=Ïnhˆ<ÓÀUJò_&*"¸xcö¾ ŠÕÑ81I ´ƒè‰YÊ9Ù)]#Õæ&NxtØ *)²_ugt|'ç)qJ¯3þšvýI%{Î`ÌÕ ŸØrX.ÄÙ1*V+J£•ärŽR ‡%ê')‰EƒÄMQËå(—‰4gµ$¦îwÁPßNZ_*n2XÏ›;ãüpV‹–ö³´w+ÖsØöã7”kÍŸìojÓ¦a/ðªžpS^eˆÜ_î"¡„’D=óþ ¦T vr“ü%/éÖ5ÌÂFXâ@õÛ-9G1Q€ò};Þ)«2)¯2…cø…k83v*[}*€¿—ÓØ´‘|ÝMŽ }›ÅrŸø $·D5u‘hã–™(vðU]ünàÍŸy ÚPãR—WVÖqkë)~¢v*˜S r¸«×sw“öw?ùhµ³4¦<—÷Q‡¨ÕAÀÚD—ÿÆ—wyüÄO˜“y™{¹MŒy—É™ƒ¹—§¹›“¹˜·9šŸù¶¾‡œ§ù›ùž×9›9›óù›K]œ÷ùœÃ¹¡º™¯9 ³¹Ÿ7ºœÃ9¤«y0™<³«Ï¶/v+Q&ÏzB¹JŸv”ÃRSÖèþ+púp™SÚd°Ÿ º¡·¹žG:¢¡Ûú­¿z¡ù˜ŸE£;:­Ó9Ÿÿy¢Óú¿£ º° {™'û™÷ú­»:¡Kz°ûú—W·³ ‡òö}˜lMæ[»5g²5¸“»¸‡;#Ñ(;Í5c*dÉîó‰}÷Zî‘G¼k ½I½G }GŸÇ…DÛ{5÷jqçº N„;Ú„o¸)?~*g¸…S¾)ëbã—,ÛM¥ÿQ|ʼ¥—aÙÔÛ„þÏ'}ÿŒ¾è&û¼‚~hôüÚüž(ºrש wº“O}ïïÈ”÷k¾†h6‘’3¸Ì½{¢,’Èi jÕµÙSîp'’Û—ÆX‡„é¥õsþþT¿}) á·°™7ÉQØk))ªâ¿¿#§;-Ôó~üïþükWÌ(/þEí׈ހI˜MƒÔÏD"h¡á#8ÐàA„ÐL¸àÇ!*¬ÈТCŠ9jl‘ãÄ…/n´˜P¤É’"SlÙ$Á†)cÖ¼H“¤Â‰.oöIsgGž#A€ÀæJ 2ÅH*E§S—VÚÔªÔ¬X¯>ÕÚ•*Ø­^¹~5[-Y¯sªT S%ÏdЊÔÕIñ%܉m×BÚÜ„fÜ«pæIÄ0%ÞH2Q¡¿“ÿ.èÛ7'ვMò 73Fœ*C R³Í†I¢dKz1ã×?Ïfœ»äÓ 6YÞMftÑ\™°õÞ-~õ¾WN¹Íåc’P­“F 8}ÝÝ9çªÉ÷Ùó¡Í_¿üÖQ/RPÃ[+1×™¯{#´‘Ìk·÷¦~ÐYȰt—³Am2dûÈ~è&6/uÌmÂÀ¶ VÐJcC[íê²»]èz%óÖàõ2Û°„ \³¸–ÃM-+ê+ß Ñw>þÖ}8¤WŽà”)…Ê8í Yõú1$ÍI±"¡²|XíÁÊ"T­f÷[©wX[òÌ–ž_O‹ôÒeWÅ-1«FèÙˆ—ؽ¦hGRq&+‘Œ_‡ûSq.¥©LUjS}äYHK2ˆ$¤"ý8(ñ¡Î†E™ßhÜè¦ÃDmœR ÑvؤJâf(AÑb`Âv¶õˆMm´éÐæ%ÝQ •¦ì¢;†Ÿ½¦…Ô[UéÃ’4'J ؽž;î ­[w3QoØÌô=3’Ñd&4Q—›\Æ0^à öVǺ±ivjbñÔM@Ù„2‹ÚÆRE»Ú%þP‚Vd§ÛR•*)l„g)Ó;5áe';æ1÷¨¨›á¯~OtׇF0˜u“f%¡.¥ICgVT‡½¨ö%Q§ÙI›é)Ì8¶Gjµ²„ÄÌšÀ·²P–HŽø©4Ê”ÅôÈt`§óÕìxú›zÍ‹9jïNGÔ™>F+ Ø.…¦R!jÇA{é1ô*nhB‰»œå4—9Ì9î«[õ*WÃÚU°’­®ê¸äRã ‘:Tsåé²z§:íLáfMpESŒì¨a•R&ɼ ›¹¾uŽßëÞgoÕíœ'<'W.Bù7å]°>q­Â\Ù-˜ hǹ×·õ‡JjâUíä?ÿÐļ‚i6°ÿа=ú¯ÿJÎÃ2íÆ"í³L»ð„DMÔ”%¢LÌõ¾½/üº¯}n¬¤žèBfkT`£ó6/¬HÇZ®W"fÑNh"®„÷Àe¯˜ÏLj/ÑEùØ FÚ¾ÅìÌ ©OÄèêÔËO|‹ íÜÎíÛÆÍܪp ±ð ¥psÒ­™Ö ý\…ÃJ¦¬®c†X2 >aLÆÄXFÿ¬ep:„EnAêêXE²ÈoÔ ‰þ«än/áÎ¥îcøçuêd eD´Â'ÑDÐãHü"q[„¿„ëÆ¾/ìyFMá è”Dˆ‡®¤g;²¤K„£õlPœxfáš*õbQÅ”‰:æÂÂÐÝàˆé¼Åéí@) 5J&â… 0ë$q+}¶Œ„zhÈNϪuÈÿ" 0M)ìC¦nI}n¯šZˆFú¬ò”ñ8Jë‘T0ê(äòêöâñÃ@+død÷@oÓV‘õdñôô±ùÑôrõþȃlšdïín Eg7ôG÷F±Ÿh*$bব©db&YD:O•®@öPí°›Ú-qþR‚ÝòæY¶e©ª*Ý„,3 \R÷ÔL™¸Ïw2{’ÍeüJ²ÌÌ/=„ðÑê¥U-'Ê0°Ñm\É–Ò&m,£”èfnðÃÖQ×ø¨šÚãÝÄ.+;O,å-òë⤪ö e*ÐÄ Î=m-óp™JíÔHJ'}’ñr÷RÓžÑ~@jM0×|â’rÏꮈ*ç¦Kl©w^I‚Ü©mRèD^+$ÍÄÝÊQ/­…\¢nq‰°Ïö¦ÍúSO† g÷¶- ¹ YS [Ó as5cÓU3®H­ù$­\® çí(ӌʃˆŒ,È‚òÂèýfÃähÚ8)¶H²þ#O2Õ SeŒö.ú8³2pêMúêeíÒ<óò<µÎ}bÍ]!iÏMR7Ÿ,bVî7»FÞ.ˆŠ€G?ñSŒ6èÁN›,„g@®µ%,©QAýò;Tä#nqöœO€vq$ÈPª/)2I²Ÿê.Ó³<ÑSD!Ñ´4¥1ýø¬-]¤ EDÍøó•öƒƒRñ*e‡?Ç(!r4DsÙ43³Izqf:³Ýjc¤Ž`!CL‰H*î1Co Ò© §K«4Kã§;1Soz-BW°éh× S&8[i2ÖiО*±°»"++ÓÐxQ>…’íþtC Äí¢AÙú†A·%=%V‘ |Öl/CôQyDçì2§³„Îo›øÆ&3teÀ©)â#jJ¨FU¹˯ÄL,Mì¼PFZðGÔ/Ç2VÃÓ&ò¬ÿ|ÔdV•ÓV%µòmO3>?0RÔX'U/ûÒD¿4¤àóV'K¡~,#Ït§úê)†ªºëT HbŽ*¯J3ES-N–cD—£h~”ÖŠP\‘ŒÌ<¤Cš´pbHÛ.s=es iÓ5÷U_ûu6+GÌÚ 3¤<+ê¨E#й²uÂJµ¨hÐ+ïpN9µó´/7P:3ÖbMP’ìA!UcNĤ.þ£Š»Œ´Eñ,yY[¶\%5/‘: ’äl-➨…LÈtŠR«¸Š+@©¬W‚ö[Sj¡˜cˆÚQV—V—µò0õtòFJÔàhò¶²B€UO/¢C‘åa¶X]6lѳD韛PT+±«-cåïó¹–Ï*¦I,“öìCQXÍ•\ÇVh„47#‹+ÇÐÏ©~LEâ,Ž6íLãS¢¬t÷!×q#—r'·Å Ró LEÊäBóNÒê`’sqÕC6ê¾¶„z‹$U.5vfWw(! ˆÂ‹u½zü'H Ä ñ%Ó%ÍRƒl…7ƒÒR jË.Oå’U˜rþ<±²ð´a”@VN{Ô/Á Õ˜,»×UÙ1i<3-)®/)0s•ôh÷ªp7”PérX'Vl‰7~‡×Õ”5+Ã)0= ¸‰k¦UVðyŠÖ~¸ÁuQ7Füöe«Ão77ÿvUé¾~•Ðd3ôú\Jì E÷_óµƒñ„_S„ùµƒ­WÝp;MIÙ/aÝV=â´¼XF{ &FΚ$3.ëìb_wy]—S7¥(q1;Cv;G¶KÕ´ð&‰÷ìy¡‡oåwçw£Ö3WaKS›•¶0.€Ö—>C±dÅH3dwÛmXòƒ€‘à E'“vog޹wi ¬":3tÆþoj‚ÁîP53†ÁQ©³kµê‰é÷X£˜µÊ6ƒñëo3Om1 PF©†ËhG‹Ï/XoF ~OD ™åp8Œ±÷g’”Àœj¥$?/JóñJµT–c™–%wKmÙõdmL‹ ‹yL¼, frË>ýlˆjJvj>ýo”.u òEÐM‰áµu{˜š©sVNÈŽýÉÝZò—z—Š­mê¤y¼–8D´/w¡”¥X1Êx÷yƒ˜`¡W>Á1Þ Öâf-~¡s’:W-µ'åü÷ív-¿ãm3q;]ßá\è³Y|ÄÁƼcÞÃIs¶i5Ûëµ@šÐòÝò ½ªKô„Ñ•`‡;}¸ýÝAÕáþryÂKðK!Ÿ\ì_Þ„¢Óå!ÂçcPþÝ+J¯yÔ.éX Õ÷Õƒ¦éÉóçß¾ð±|þÊCÝ=7>y•®Š×ú½ó{ãÅÇQ¼ðÖíjòù뺧û›û‹\ˆ[[E›N¨Åàcû¯Ó¾VoÛCÝÞýùýX¸Õ=…}Þ‘…éßïÎÌ2/~IY ðA8P ÁD¡$¸PaB‡ BdøP¢ÅŠ>,èpa‘Ð’M„†¢IŠ /F\©qeÊ'Yr„IRæH q¶,‚Æ—.5.D8t"Q¡HUj´iѧIkBe:UjÔ¥V©^uºµ*Ö¯\™&Äê°ä̘#ÓüX$dM“:Ѫ 4"òôY–¢Ù·ÿvÛ¦Y‚_Ì1'`Â.þ+þ¸òCËc/kÎÌùìQÁ“Ù™òäÛt z1Ä¿a#{öfiÈ<õÝ,÷vÚ¹µû.ÜfñÞÆ‰+Ξ~Ú¯[¶A£Å<(Á»n“íU½ú8KÚqe…œýEÇŽcG?‘>|”øç·Z+4ì"©WÛ{™ÝgšsÞÁužq6QÖ™{!í•—~û‘‡Ü…Á-ç܆šç¡†‚˜ás#®ç…Œy¸H"½¤SUôe—™HwMXÄ"|•ØÞH%iÇŸŽòœ…@ $‡@~H¢z5$v¼ýØžˆ’ùf›vX*øX‚¦ø_OÒÍ…˜uU·Û™c–Iþ&š€¥É¦™nÆÙæœpÒ¹¦œuæy§NI¢m=Iƒ!Zç„7^XõXàOg%ƒLÖ×TŸFNÊw›FI§F ”V•‘.F5Ý`÷Å· |H¾•Û„YA«ˆJÞú'®¼îê«®Àî禗œÖêã¨Bäj§ý™d^k‰!&ªYiÃF'Ñ…ö•çmŠÝ¢.¸–Jê©hƒÂÚᜬ=H 0m{¥aû×^^F:]¯Á&Éo¡ýæ ðÀþþÚg¹ûèév×,¹@%û]¢"‰‡€n––÷®d%¨b•MV°Èó<2Á²U²î"Øo•Õn[Ì0¯þ„——‰oÌž–WŒþÜÕÐ>m4ÐHmìÑJ Ýiª[Ëp[-ÒëqÉB"jcO¶+ra:I|›™A)Ó°ŸÆD¶½ ¶i”Woeƒ¡}êmÞÙò‘8Ë‹3’¹ùõ¿'.°á„®xâÿF×ÛjZ'h[AÉì6{g!ª(˜qã·¬º´™úï1×åß°žž3Ä®n.KOŽæêÂ\aË<Ó”¥t3×û6gò\TÀŒ›¼¸ñż¯¶·þ¹¼SÏ/¼âVîlÑblëŽ@u7‰Ñõ9ÊH&5pÆåQÃ[ÆzxÍ~jÕ-üêëúc;«%&Ÿoî©çøxþòŸÈ¿ðý;à(¸Um‹p:™\³@C¥é%< ^—’E¿IS³àí~WBîk'dÉU–©íQ'º›ýFç1BÕp…êêÅA+²éxÊ âù–'DÄÑyÕbÛð䯢öëro©’Ö¢•#ó„ì…òšŽ²…°ªŽv?—ï÷Eº9Ì,£¡Ü ­´-:‘wZR€Ž>ßõ©!ørœ¥¼xD#ˆCü£ù ç@$jì:ìó_•9h`0B«Úöp‡"ðýÉZ£ë—èÙG!I'4£ê`o:—Ã}IÉaZÚÑ‘6ÂüU’ZKKZÑd˦1m–¶¤þ¥Ój‰Ë^òòSŠù㊨/9¹Ï‰ÏÚZµø"J*k’d›W*õ•š +…iC!ß(Ã…¥‘t³[j¾B®é`s*])‰s¯‹5ДœŒg çéGzòdz´ ¹ˆ Zi;¼iæ×i1ð‘t¢ሖ:Óµ®”Ôc]õÊ8ÑRÞ,!.\eí`˜"±Á²ó S í88H"€VÚº”=yÏ–²ô¥ühÇîÇÂŒFÑ34›[°§ïH¡º#9§åI›™l“+©3GâOg¾«‚%ýžßDøN)QT/ÒÒ¶ ÈU_ kW(V¯ŽUhm I÷>‡4uš…‹þL4—A®õ̉ =ÓUB¸fR›/d(6»Í >(”fô¥ ×É(µˆ.Ó²H)–YqžI•g=7ëR¥rÒu|C1ÚDyÍ”„ϼ´°ê“+bQ§Üâæs¢q2o‹¬¨n%:R -lnŒ¥Të<ÊÆõx/uôY ó¨ÕŸvV³Ïͬt9ËRsò–•oe•Œv»ªé4xB5”E-é>ÓòõpH¥®g¯E“èÈ©wmkIoˆ9ÙÞ”±ªK„+½Ë]ú÷–¿ü¯.,à\Ø—.ÚeS°aJ¯?”-¦F¦ØS¾ÐÇlì¥&lLý쯚ukTaGŒZnÆ'‚ÑÛ0ÿþºFçr%¤+t­UI8½­W½Ð…iŽo|œ|n°‚SvÕiNMu t5éA!ûÚfEke+,c¤ÑˆŽñªW.M«åJ^T°.û$÷X(båº ¼¯<¯Ž§]³yÍ ]pNUiÓ5\-© O¿TETi~V´dÄΉÞòñ˜pb{K?S _Au’„¹¢eBÇ—Óù{àVÍÊi²ž¬Ÿ.«§;VQ§sš~™[ý5UŸò»îÜ[}‰«Ð‘ŽVŸªü« …æÖׇ¬M}gªq®±ØÍ:®*-]°ö°¨nŽv›§ gj;4Í€¶Ìh,I§Ⱦ£0Ÿ9þ$ÙÄöX¶  ã}/0Êb9·¼µm„Ñ¥Æ.;v¸KMµ‹»ë¹šÜ#a®¾ÑVí‚úà;np”¯ ¯!CÞå>I’ BLÚoÉŠ»ífÓkí"&z)\~òGmJ@k×Ûñ£Ý¸V–Õ4›(Á&°ÌLóǼæ–¹œ9®"½4‘ƒú:¦žWûŸ–sÒ8Ôpb nÔ¨6ÜÖ,3À=õoEÇá$§§P§õ„}²ÃCõP;ucã„¿ág7{=}Lâ ×ëÍ…ú.H1%“÷uq~rGz©)g¬ÊP‹7ÄQ<þ¼Å ûò¿óÞWšEvPAQQŒw<혗¶ÁÃþÃ1Ö´´Vã(•SËqïŒé­&y‰J_DZí…8½¬q“׌QvDoÛLKyÔÀ/u¨‡OjPßÔÆ~«õ×U÷äšáÄõrë‰\Íýa™¿knš°íݧzåeú&ïr±nìÃw×xÄ «<¼¬å7ŸùËkíÕ“uøÏËm‹{ÌÈx–Lkat@rdz—ngÓ>ºwn]R{úònhH€ÇDõ–~•ùö0•Ö*-#cb³\œw¨Wôw°W‚÷¶U Øp¬6­!Gw›cPØ—g·zIƒNW$¯G‚K^±CL´Æxò!ô¥ƒRcb&raûÅ`þ·ƒs7gs07…3'…U˜s&g¶1î…WØ[RäHDçJ˜WnTT#È&cb`#uûlp¸JõãsmÑ„~ÌVv©…t8%Pˆ!5¶*ó‡öWˆ(¸fl‡ü„Hu¨HƆC‡"†›ƒ1g^MÖ_œ·pá%`xY¶[ŸÈlšr¢øD”5$cªØ^ðóq›füUƒ>x‚„xˆJug‚÷yÄ”*4ôPpƒd{F}‘Ó.´ƒqäx›ÈƒDE‹HNãóM¿¸.$§}`‡Nýv}ìöS¾÷È×ħ|Þx|ß(|âˆ@¨ö{†ö[ìS‰ÜX+ÞUwuެ_·–}Å¥þ §ˆZwæŠqø†r'frxæ§~[lî¸V0Ö\*ÇÎ&µøÌ8‹g×€¡¥MÛF‡nt×}#ez=xþ‘)ä†nçä„íH‘=Š* o§Ô;"î—‚ä2„ñSI_÷t$•M‚‡Y&(‘?”†x ¸‚©w=‰’o4}Òb9*QŒ8ø10TÍØƒB)"¥¤hX톃ªQCµn…tQÈe¬_˜…T¨–W…Xh…lÉ–;'LÙmrözC§Lf–©Ç•iMÕ=g€mÈU×:IYp7wïôˆ¨‡¹ÇH»goŽˆ/‘W ‘@yy‰x˜n·hÏþ燞Éok6AFµ,›ÄP˜HN|¤:…·„ƒÕQ÷"èe«C“±¨;ÉÕ~‘W,‹)E•›i‹˜9”ʃ‹ž'f¤Ø•°‰ro'†z‰“ù¢QÆ(hœq†Xi•ʉ!Î2CÆ•5Y€É؇¬ÓA«˜C½—UÌ7[äŽã˜|ñYŸôyŸá¨|òXD(ö|DF0È”|›a†²¸4xm:é}|%~ *~GØ…x÷KxØ7ªÂŽ|ç›”ùŠ‘äɉœÇ©™F”n٦م•R¢v”—T’Ó”Wð¹E ˆK&o)9›œÈ’¸5‹ù…‘£$P.Ès}n‚­%‚þ>ù™ù¡"ÚRÖe[,蟎ƒë913BzDžÙY^ÓcœÊhžNjn‡¢Ö•Vù•ŽÆ7d¶ùÕ„—p9§oY§ny§kI§À”;QÓ¼øm9(bIƒ^‡JØÈa!æg•’€lø£†éš˜¿šë˜uÖ5I¸¥‰vCš¨Dž"b™´Ç¤¢ ¢M*]鋨£¾Á¢¹*º£ºÖšÞ²Ñù…+I›¹ÈJÂV~¹iе¶š—©ÖŠpHœã7¦!ª¬¥Z0Ì9gRcSâ#©.ÈZPcrªç%crihGªà+³98Vâ¢cFh ¤Û8’å(ŸñjþŸùI¯óY¯ ´ŸôÔŸ•wbšh¦¹l{ÚÕG7`Ê^´ºkûˆ˜Ú¨{j¦‰lÉx§µ»|µÒ‰Ѫ2ˆÌ:ªOj‹(©¢[ÏÙyPä;5†=ÑF½©b¯´u’h*¦‚§«¡¨nNÒ‚¥ˆk–¿¸žJ{p<ù0ß*®J²Lë),9¥ #š?Ú€Ú᪒XW:68^Üš®¡ièÓµÌÊq[i?/k³%Gfì—‚nÚJ-w¶{'§vš§sÛ–t‹§vk4siO~ú¥ª#×Êg'†°gú—„vR;˜æºb ~’*{09.æ˜yh]è9˜›ì„Qîþ™ û±K º…Š{Ù”ª<ëoE¶¸h° ù›Ð–° »®£ä‹¸Š£ Hx¼Z+ƒ›=ËkÁÊyIh€Iø%6œv;ø¹Ëº¼Íêd({«ÑÊ»v&z–‹Œ-k}•b[–Cê\ݹŒÌûºVB¥fûžXi鄺ÿ &‰[ ø®±5¯øy¯öK¿øš¿ó©¯›Å¯¨µË‰¬K TT`Zq¸'˜çE˜ ©«@ø²c—Æ*±;H±§DzŒ¡¿jl–Õ±M;¾¡+Â@Z‘O“zj=®pì¸{’’F¦›&³5›&û£”6›«9zU:{þ©±BêF<'MN»¾þŒé†:)pH»¤#ܼM¬¼Ë]P[‡¼†Ðvµ&Užé{Å[,•ÈázâëÄ0ë›Òz¾>:¡O”E˜›rÇ6\p7r‹·q|·tœ·s¬szÆÿ±Lö<ÿ†ØK¨?µWìé“€‰“Ôø K‡Ä<š zF¹½å¨lågGÇw +UkÆ6ª)º LÂfwªŠüSBvºåù¸òª—ê&"9»Èì¼£çn¶{³9 Q !¾Ú»w¦k Gžä­wÄiƒ¬³,ÊÊ,ÆNú¬Ð ='{s¶ž.ü‘|š›]Êz,Æh Åäk±/™Hœìjê+k±Z-Zö³T$RŒ*¯îlþ¯ø{¿ï\¿ÅÇ¿÷ä¿j|T®‹Åñ(“†l{u°Û·›)kŽÜÈ K½ý÷ÊŠE¹CëŽëçºú´ÎÁ±1ä±ËìÍO\<# l'Í&)©£3¨úWÂ@ëv팦µµ:µ{»8«£HÒ£Æ.ç4Äî‹0ê9ÉŒ|J<áÌÌ-®QÊÒSŒšA\³sÅÏ;£©aw{açÅ«ªÏa¬ÑKu›»x¦.Æj ÂÑøå¶U·½X·w\ÖzZÇf]·{ËY ½ [x±3QÍP„,‡ÿ ¾Oç‡êü”|ÐŽë°.ë|ýʘ]wÁ)bí›a—»¡‡Õ¹‚Â@ÙT]”lUʟɈ¡þšº¸ã1¬Ë|³ŠŠIg–ÿôš´kË/}ÚööÛ¿Ü À[¬’ÉÁGZ“'<É»Ñ=Ù©…´½W¹Ôú9BÒ×,ŠÙlžÈxÛc<Α>ú1žÌÝ|ÉKÄÖG¼ÇÒò+£ñ¼Ýó¬¿Ü ÏólÏ$ØT ÀÚý#¬|™ÐÐ:%Ð)ZkÛÀ–íÀࡤXÁy<±ÕGÌÄšl1éÁ Â?­Û’-²%yÅÚ†ÂeLz”»Éª¥L0|à¡mÒ‡ ·±…ÃæÒ;¼áM¦h˜ÝÔD¹×Aj6¤½³Z=]á¾â¸ {Cm”A”K¬” §—¡]vÜP¶SÝÄúgxþBˆÕbv[ œLvŽd™»Lø¶!=Ör|Öv,åiådm‘Å+}+#o=M×˲‚,8u­nu†\$BhÃÀŒû×lNäQ®æv‡muç\¨½ÛÉŽ­ÞžÛ-.‘¤|B¦š×™B¾²YÚÊ|%«‹~WLÍÄÓœŽŽË·Ûá ×ËÛÚ½F„^­ºbI¼¿ƒÌÔ~^ê;æÌ½ ͽŒ¼µ)!×î~:Þ­p´Ë›cKÙ¡Á³ä鯮¾7Í1¦¹ø¶Î©ÌLò ÞÊNÏÝìÌ~j—Ú¿ämÔälM´·^̶6݇.Ú| ôͰ ˆÒKlùmØOئTÕþéyN-Íþç}~ꬾ]îi nÖ»²ÕYÃ|Þó+›¶Î]¶¬áOé:=pÎØ!&ÄîsNT¤¢ ê;˜â—ï¦NêÐõâ^w”¼À6ŠÞJ--žãQùT~ ¶Ù®Ç˜©±»¿}¨Y¶GÞº/jÞIoœ‰S~å>oå@ÖT^²yÌs\x߃±Âª°ŽÈÙΉú=‹zñß¾6mî×nNàõQ}ÝL½¶m˜Ø¸.2ž|žòÎâ¿v¾nÙƒ>Ø•|Ô€víRÚÁL’Û¶€~7Y’~ð:Üê\Œd<äªé‘'S†Óìl¬g¼'eÛ*ñ¯ñ°ü¼©þ¾e¼;­Q1z/DÜHmÜ'?÷‹Ñ#ŽöI7‡?özž“)»UÅuØížèøì²ïÝÍþݳïìi^Ùã­ŽåíëX³Ê#ŸµQ2æÉ¼íå,™Úßà>ßÌ¡,„HofŒ©û}É=–a,.ùóîýE¢­à«Ž²ÌMïï }néÅEx¯‚H¾}ð!ÿ£g"ÉíÞ†¿.æÛè|Ä‘ÚÀ B38°Ðð9<8ð¡D„'¼Hñ`Fˆ-~ô#È‘"5–DyReÇ”,Wr„Iò¥L—5cFLˆòáÅ2{&ƒVDèÇž8Gòt™“ R M¶°þaM—7UfTjÕ&Mª/f¥‰ÕdÕ°eÇjݺtìÁ¨CæÌ™1¦\³*ÁÒ¨6oܽWM…ˆ4‘T¢gY üzXqbÆj\ìX2äÇ^'[¦|±æÈ™=c½ù³èЊ’lXu^¡Ežvœ6eÏÄ@›UÈ/\™|uV4™ð!Ø‘ÂS‹nôtðâËë…ù¹ôèÀ£ãÕû¨½¡½Ÿ'§IÜ/E¥‘Óž^;ÙÕA,‚X^üÌö²é·D›¿î}þöýë¯Àß8¢J)›k¨Öòš¨<Žlé$Ûœ‚Š0ëf3Í.ÃÃ/Ãÿc鼿| ±D¤N<*EŠPﳌþj½õŽsÑCßT\i-öòº·ê ” ·=â°Ã÷ñH%d²?DòIA£QDƒrë‰b#ÍJéðJæ6‚¤¢kF§³ïÉØD°É¤Ú“2Î(Ó“IÁîèt3I ×2®#ßnÜl͇$ï ©² ¼øÚT´Që5.RF¥TÒB/]SH'µ4SO7Õ´RN•[KÎítT÷Ûr¬¦^‹Š¡}LéFç#m>꺺UU-—+òBa!üÑWbw1'.×w}0Ôlµ¤mq¦X’J]Mu\(—7Ü9ÉÕs& …öÀ` ͲÌOå‘· …”Š/þì}“I~ýu_à^÷ÙE\af·ßã´Ã2Ulý£T0<#¤«ƒ«]YYV™?[Y‹÷â­Ì<Z.WU)ÎÄ™ÃCž‹³Êœýº³ÒÂ&Ûk³Gì³Ç^[m´õhi)ÇÌÒG¢çf/Lðe(c4ÅÂÓ==õËcD‡UpÂEMÆǶUˆôº’kšO`ŸqÔÑïš³ÅÜÐ÷—:锑F½èrW?]uÙF.^Á“£ùêÏÛ ÉðW+”õpm•Ûî¡%‹þÃ᫜¸ø¬—g—aä·yY[¡k]½_ÅS Öp°bE [Aßu9uÖËwýóMÇ~Ú›û£Ûµë}3fk—»wL݈ zpþÔ4Xúœ64ö°YÊH휆–tm/{„ÂË™-æåf*¾ûM§@5/ Š*Tá¨>(B’pƒ'ô` Ñ„ÁÕý$b…¡Ö~4¦3hìî)=ëKu¶'¯Òq†OÎé’‡§¡îÉ®XŽ3¢Ñp¿×¬‡7• ÝĤÀê(Ñ9XëAÂ-¸éЀ4_ëÖFõ¥ÌbœƒÜ»˜8?ªåXèÑˆÞø†’ŒYV´cðfÇ9€ª óùþ>Ðq$Ü‘ô(fœ3⃺Ù;²=琢0°käÁ¸IMvRŒŸ,#6‡<­¸r¹Ë!);‚/GPSä·ÐɰžT_%'"½Fu”Í&x­ëŒ(fƒéçŽç6¶¡­lÎl[Ú¤ùÌfV“™×œf4»È5Ó­‘YÁl’AÄ’? îæo½œÃJæ¹Ô3‰Šãä8Ï#Q`­¾³ZBïr}bSIÕN)îg‹¤V(¿ˆË…‚²¡ mجŒø¯Šä“x-yc‹vÆ»©Œ²WúìP°–y;/ò¯yÉ«ã c¶Ò%^ò£`H·9E{*³f¼’Ã>6Ïþ ™”]²$ãC…T¢rDÕó©—r¤¦qOlJµ§õGGŸÊ ¤M à”4=2´¨;­Î!ïTSа¤#ÒXZïwǃ•HYÉŒ!rRˆÂŽÐ®*Ä+]M8W¾Ö5¯}mñâúË™½+EKŽ[i!Qž“¬4Õ'ùR9IBÊ“ˆ¤'î2;Dì±e£ýΜ¶¦NܦŠ]Gm“t ößãZNYМŽ2ºg›É©!Q‹~‹jË},q†Dª.^n`%iãûPE°­oÿÜœè6;7YÙŽ|U-Ñ“^+Uâ@á¸+ñF‡¼ô•qº5NeCs¼›£ô£ò,º±{N)ÕóTÄ,lÿY~Þ•l{6½ñÕ=1%rîì…{íÅküÛs&øp¶fò o˜Ä6:ÒAœô½éJÛ6‰>Kx+ÏQBû˜pó7Çæ<8¦±o&m°oVþÚœEûôê´å«¦È@¿xw q“ë N¦¹¹õÞñsÕÊ]2íØŽç(Znê¯Iù™çß2cXñóm¶šE]ðéüy SVS³Õ¾ “uJ>«Z«uZqéü™›1÷xÞù¾wu;þ3¿Î÷üÔÝÁ-n]Nê%SÂç-YO.Z©ç5¿V{©XÕõd{›,3Œq&%f·êÚú·ž5®k}î_?×w}<'M©ðT·â¬Ì¯+üº£¾4̦¬OÉžm³ÞþàfZoýËÌÂo^lÙô*š0ÿ3ŒÖ’:Øê»ÔSÀdÀÛ:½ú{·b#£88<§H›ªIË#Æsþµc7>ª‹€£´ #$ËÁß¿D"ÀÑ.Áá.£ñ9 J1>c¾‹ûóR½Ö¾ÜAø9ç¹Á›8Ã+èbS?þ"-Þ«.šA÷³™ãÁË) Ô)êµs"¦<ƒ°Õrq» n’¿¥#Ã:§cº4,C4$C©K.×A1%›<«+‰{Ë=®S¶C6Òa§!¬¾›±úÄã¬Ü‚Œ‘£¤Lë?U‹;ɽbŠA—šŽ»ÛìÁK\½L¤­¿Ä,;>ò ¿BT²ƒH<‚¬+,º4 E(±I$ÁÊ+ÁXl>—½Õú¼Îs$pr¾-Ì1Ò›Ó#:(ÔÄ$Æ)þ, Dƒ½±B±«5«7µÐºýi0 c¿5SÊ4*Ac”¹ú+¬;ås°‡[«? S+²U›¾`ó¾íkGíƒÇîþw”Çï@vü™øG1¿ABR•=¼Fö[6¼’SEhK»û#ÄgÃ]Ò¼Ñû¿­*((Š+œRÆ…C qã¢Ë¨ÆaäÆl@—ù@C¤?Yy¹:BT";$“|Û#Ïû@~;<ð ˜i´4ŒEXÄ¢Ø@ÄÞÛ§LzÁ磟TꜶ©š’ ,Æ‘ÔAl@÷Zµ ü5æÚÉæP¬ôc,Û[Bæ³Æ•³â>¨DÅñ­ÇÒ9³*Óš¸¶¼©þŠÄd ÃÃû©5<û|º¼TC3ÔK»ü07üÊÃZÆ+ú­©\̶RBïâJ#tE• DùxÊÓlJLT7NlH}ƒ´ª|%j»£Ü/®©:ÅÆ›Ågt´ÑÔIžì͈Ϻ¶tl˜:Ã,×@¼ÇSôE0áDM‘TÍÔT(d¤Ø‹HDN$³7Ü{Iœ\8̪ƒì´mtÊnÌäJ 4ôÎYLGy« ¢¾FrÇyÔO{ÌOþŒGzÐß[¨„!|l»/ÓÊ0;¶Êñ ÷+H†“Žî\ÈÈJΤlÍA,þ7 ‹·¶ã?Ф0‹´’Ó3Þ\¸­0@îœÎô¤N²$I@kÍLI9t£ÄéÄÔÀ?$³ì*“7ä28»ÊW|³žŒ¿Á;ÑÆj8Ü,µÓrÒ#“HB ™†àDlÑ­Î+¥,ªÅJ¬ Z:Büâ™Ú$­ñ\>¡Í÷Ô )dQ¥¹˜Q´„Iô|°Œ\S^ G‚ôLE¾ÜK6T¿ T¼,Ô¿ôÈ7dobÆ9 À8ϾQL‚ÔCµÒy¤ù3¼ç´Ì %+ˆKPcP·[ Ë £ÔsD t¤Æþ+Í+sQ,Uëì@êóTO9~\Dfl‰RËÛ”IáþIÅÃ’¥V\³ß,ÒàäEk{äSN u¸:]+ÈÃS¤D;?cˆÖÐÖmåÖnõÖo×p×q%×r5×sE×tU×ueWråP:¬ ¨:?•V4KøbN6U–{Ó(¬ÑÂUü»OÒÒ¢¼2ŽIÕùt®…h׆u؇…؈•؉¥Øu ØjRm£Mc È}Cæ€ÂoÂEC4NÅPOÅ£ ŠCÈ~jP-PÔ=/ Þ*{àDºÙŠœÝYŸÚŸÚ %Ú¡5Ú¢EÚ£UÚ¤eÚ¥uÚ¦…Ú§•Ú¨¥ZŸíYž½ZµÚ£%ÚœµÚfeÎÔê±ñpIIFEíQtÍþ-¼I1ü/"…[ÊkÏŸlBTJ5­ª‘»ó»PÞêÚŸ¥Ú©ÜÀ%ÜÁ5ÜÂEÜÃUÜÄý[ mÜ› \žÝÚŠýVRLP•ãJã$Oë"aôØöÌÒijdL·}ÛµìÂ|å'•}Ù“†€ÝØ•ÝÙ¥ÝÚµÝÛÅÝÜÕÝÝåÝÞõÝßÞàÞá%Þâµ]×H HMÌíú\¦¼ªKUTšLH„5Ù¾µÐ”U}ÔLÇüW¸ÓìýÑÖíÊöŠ÷`ˆE8ßô5ßõE_öUßö…ß÷•_÷¥ßø­ßùµßüÅßý½ßþÕ_ÿåßÿà&`6à>`ØEßö]ÎÝÿÝß±*ÅÏüþTUT[5‹b•¼|LÖ¸ÍΟ[Ù<Α ^T+ƒŒÒ¤Ü:¨€•fa-‹·na†´[ÆáÖaæáöaââîá &ââFâ#fá&vá'vâŽb(Žd°â+† ,Öb-~Š,îb+îâ0^–²¥*ñ\­ÍåàìÈF[BÏÐõ×ßH\ÝëÌ“`Õ'4š%8õÃ'_Ñ?ä@äA&äB6äCFäD>änAY’c ?Î FVdB¦œ…PJÝMïYѬK@TÈÊn£¢¥2aãL‹ƒ¢a0Æá„XþâYnbZ¾b[Öå,¾å^þÞåZæå_Îå`&f`6æa>f\Vf_.fdvæeæ[~C„Æj† –f!‘eYfá›0ô@ƒçÔç-#ãÉ\tMšT€ ÒmDV~gÍÒ2ج[R¡O&Åç„ÅÆUÅckå, F&hÌ4èGFè>Nè1]èiVè‡fhˆv舦艶è‚nhŒ–h®hŽžèŽd‡îæSŒ–ä‘éIv>Z žàÌ¥F4ΘÓW]¨ÔÀ‰Hg5]—»ÓØAŒõ?ëÑ/øÀ Fê>Nê’Vê¦fê§&é¨é©éª^j©¶j§Æê«¦j®Îj¨îjˆ¾ê>h¨~äþ°FiY®–€bëˆSŽS"ãk^èYé•Ì!eëEÙ9ÌÌQ²R_„Ú[-GVÖ `„FžU-uìõJˆ ƒˆe†ö¾‹PÕ½—S_µÍ ¾³¾Çiu=¥š¼x–[›„ØæÚó\Í¡fåEçÁþÈ,dËê¶é{~ìñI$åi^ãׂÕ=½TïeAßQ¼d7nì~-0üÄʵ©½Ùƒäʵ´È¼T±äïíLµsP 5×å÷»ÞFÞë5›S!kÙSÃk1Ñ_þÖ Ìá‚$ }lö–ÕÖm‘º 6 ãæWÊbÖ#T^ÝKgµÉSm°>šçœÒÕ–ñËd‹‹áÊç`µÑL²µÞ¡s$íÏ!ÿÏý$òz<ò®Ëà$BîÆÌ®ÒF„ÚÐ"péËêÓÍÐ3uBúiî¶ñöÖ@Y&åÒ¥KŸöS›9a†£Ù˜1@]ÔE §Õ8W//Á)cÛ¥"ŽLب£âÄ'éžTÔKe?G™LšÞÉìÔOt²g¾%l—õÌ&uËvƒ Ä– /7ì¾ðö†ó6†³ÓÕ=ÞlDÁür”äŽ*/SŽõ=ìm ö(s±ó4–qÕFmÇJ°âþlÕ©!ê`åÅ<µJ1Ù­³ô`î¾îáNvd?vy-“ºó¢ÀšEFѸó’õµ›ýó½™*§n™þ¯%ÿ:6ÆòO݇a"é4­cJ¶~¶ã'5RéKo˜îô —óõ*¿M‡.O‹¨K½rźÖPuŽºdAÿX ¯Æ[ô©Ö]×k g¤Z|ØWš]6ÚO¦iØ‹©é§q=÷€rÛFªËÏ̶Ú}ó]¯Ö\·½÷m¡Ö 8Ý‚þŽ0ãž ÞŸJ¿^—¨æ¯!,™»¶ùå ºÒ¤îùé¢o šIÛ¹.:z!¦X-ÓŸ‰÷çµn["‰„º+)Ûr­å‘|0”gû½¸ò3v¤êýn7õ‰[ßY¤!•ÄñóË«7÷ðƒlv£Ô¾ãŒ†<ñàg¯–ZºµHÍíôn©ùÇ<ôlýï-4[hæ?záoøáðüç2‰1°~ \ #Á æ¼ßH È é,„–ž¤EµÑ…P0qÚe\g´¤Ù©…W; Ü,Ç5ÄYiu[[£÷=Ö0H;ì!!¤‡è­†Flœ e)·gþl«óá“H8ÇI{CÜL~âtÄÏ ñp–Ûb…è=¥e-¨rRÙœ·Ã5‚ñq}ƒ¢“øÃ6’Ïkëž›‡Ç=²ñŽs4"”´è"ÅL­t,”ڇʣ­ÆROÓáëB³=%r‘ŠSÛûèSÃk­¨ØŠ‘íîÃ.ƒXì^˜JH>xÊ'¡0•#¢?ÙÉHænwš™M&ô;¥™Kd…ŠbÓ9úM-~&£Ÿâ¼HIçœë—ÇÔ¡„‚¨FV”PŽ^1=%èA3šÒ;¡ðhú¼)ˆØr)w¢er’è%¯g(#ên¨ƒ`ï츺šŽÓ¨÷zêõªçE©R5ª„š£aÂ%È›F„ròŽ'å)5=)r„fx°¦EED²­*²©G\©£ŒL²ž)¨@ØZ­~äv©œ¡¡×ƒÂ[„Ua\'#×ÇLR°a«ü #¤µ5£ÃäJØb׃ØsŒ ’ìg7ÚOxt¶)Ùm.5NÊòõ­ºkmhKš'ÓÅ–1]}Ý"s{¢Ýò‰·ºþí-pIS¦²uÝ!¡Öi5ÍjΕ“êéÖß–Ï ¶é]HPç:™.ñ=q’©gdzÐ 9Òœq$ATU§ß—³ƒ­[9Ùç–Ö»÷ì}dj^Ó w¶‚ ÛÁ¥)Ër–®“ wA´ÜÆp¨àò©[œt`Ð4w,tÚ‚73Ëä&ö¼¦ÚhE%b×"‰K¦–ÖvP^ýpGR4;±ÖTv¢d`|[óÖ)#2]¬2«üÞ×6ÜkR]˜Œ¼2‡Ö}ÒA{,ý²èÉI“«)3;å-ã);IÎîdŒ¼/b6f{C.[‚C,˜ƒ¢5ÌUÞ2)G9Ôn‰‰½þQ†µ#ÝݽyvIVç!£åÉùHF¬†fÑ¡ èE+ºÑêd­Eü»v²èÏ"¬ñ›=ž@Wjæ³&Ù¢ˆ bÔ  ¯H§œjƒ²•¢¬^i}Ç6j_Z—¤àqµªMÍ]‹®”¢l5@¥ËY(£=¬ª7ëë)[”£Ätiœ’Y"+»Ô Å5³õškã5ÛOcˆÂùí²¦¹¶5« jWlcûÕ­'^›ü`3RNÂÜi±‹IÜåH·5©Ò‚š!9ÜçŽØQ–Aïd’bA­Ô4í‡p÷™Zò––ÑJÉå¼ê¯2muÇ3Š×YrC דڙ!çU¼-÷ÌþÈ­×ÍÆ!Mnl‚¥Íê–oYÚ"7„¨ò‚H4\0o·©óê^ž?¹Û5ß9«qIfRj’È!¢ùÏy®Ù»›Ëõ9ÓÁ{²3µ(ëtùj´ݶÓú³áNéÞñ´îx¾{ŒñÎÁ¼ó}ïnï­¤cÙvžÂõ;¯õré*=¹¿èµÚ­-Üð› O›»D~7àÚÛ]´Tç½Ôü¬›ß»ný°“HF;Ê˜È è —ú“aïr1 q0â.ý¬3RõXó[/ýʃo›Á5Sg!0*KŽù"+}6ÜýT×kHdЉ§Œ*Åb›gN_ØÄÞ]yn5‰ß¿ÚþÑï\¿54 /¢IÛ~þÆ»UÏ¡4‡ÝþiÓiüÛÿE¶`}]HáZèÑžÍ9‰Ct›¡g¦ÀÌ= ÇiVÇ dÝ\„—`Œšv´ ™«IÛl€`Ha™­^´ÍœãàÿmܘT±Í†œ%—®YÏyÝ€´Ð5àá¼` Jà_!€Ä•Ý–œ]À½™ÃeÚŒ šýYMŠ`šü)×ÁS¦Ž&M Ñçýε¤Ór (qáÙVâ}ÓÃÕ–’%Oð9Dï̺­œ¨žñ cXÖB]ìi~=Ÿ³}ÐíY×ÅáêxàEÌÞ“\ŠDF1åYÚ õq„UÎ¥yß[Esõ›Y˜¾MKy<d^!qaáH:a4¢üѤ‚)æ+†•âÙIœþ‘$‡9èÏÍÐܰ ]E[úÄQ3yÍf¤–“UR¥Ñ÷DÓe ƳlŽÝÄÕQ¹Ò RÝ.Î31“jB2e—!4ÐY„¡] !×Ûuš,>×u|™§UæF*!0Ч/Þ¤yþÖ¤~DÅ:­Ý R¾…磚L>#ešßo&ÐTE׬€ÞÌø¨ŒÚH^ "Œª¨’»ì¦ 1èsú¸Su1§ã$Øÿ ç4Á%,yÑnn‘ø8Å\K+’Dö¦›­ß,¦I}¦H–aaÒbI¢$Išä‹õWyöK1ªèK^gÂ墌}¦áþ-˜ÆÁ‘9 aQi¡œÆdp‚ÆùÚª *çu-g%¡RàÔWk&içpœ*6(+uZÔDéý½S¥èi2Nt—Er €Ô©Þ)žæi|di¾m!gºÐÚµ3îÕb^Ü„¹H€ JCuX¾KuDþ­)¡]¹„ÄáÏC¨—Z‘O+eßTcUQÆŒ¸§×Pœl‰ˆ†ªã“¶¨c¦SÀpBðKõ ¦žæª®î*¯êÇÂ9Æ1Šg2ò(N%Œ±Ÿ}â¤z ‰gñ¦ñ–¢)³¦}ÖåG˜œHìh.jšimK ª£š)Md%Ö¸²q dÁ(þÕ'ý™†¦&–EÇrŽ<TÁ_ОLÖ­oÑŠ¿`pS¯áˆØÉ”›ªûMœs±k†VRÙL>åÓ¿AÜpìÏaà°À̰ ÿLýÀ ¦à°«ÏMëËÀø0ÍÐ/kç0ËðÍÐ4ñ˰¤ä“#Œ»ŒsñGqŒvo A•ÃdLºöžÅÇ$qǨ±ÄPŒÂı¿1c [PŒ¦äñËqóqœ˜KÏÈŒ¶ÖìÙNj›…fþ‰ÙØ}ªáiŠ—¾ÆŠµ©jD²–Âlh`2lÌ’k|a¥ø'ÃÆ(£¸TpÀX,„~h1Ê¥dMUÕQ6ÕP“é~Þr,'U‚Š-Çò2ìmp2ç© #§íU23føRlv”±¬Æ1–¡*À…$Dñp¥:À},£Þkó|l³7cä5›3ÕÝR;c ܽé“;ó›³¹Ðê9ïìÑТ“j­MÜÌ€2.[ú$4øÐq,å²Uô~®âö8¨C¯Eç“ û2¥1Ðʲ¶ôáJ3e3týÛ|º'Õ_-~«$¿´)×ìh€2Ó–þÜ™Æ2ãiïN§F%·†ŒL§Ô/6‘i-#é,5É+»f5EuQwQiÑQ_µ5 Îmv¬Kß´1û¨ËNŽ.&Ü.®0nD (µ.W-ã/W.Òâou’Hãì·.’ ϵ&¦nŨo&^Ã,¨õ5ÕR×õÍj •h¨ò¢Ff¸AƒA?ò¢2“32ÖN¦fÓVÔªÏÉhg?^75D74ÚnFeCóG7¬b¢*Ú’4G"nQ˜#ÏÖ~}Õs%2‘Z«eò6±ž¤âm'$12¾XHV™n›Ÿ#Ñ(±zj*ê¹Zš‘X…Q‹ÉZd÷É{Np‹þ¢!KA·‘I7³ñ©Ñœ÷®Ó}”¶»TF¡÷Jñ0‡•æ Þæ¶EV©A-Ÿírþɨ©NXÔ0žÎèr+šø®tzÞ,ïÌã:l^'¸w/8jg!L{òLvïá\Z¥•礶„wëÖ2¸‹0ö´®Ó=aÄ’fÇR–,µöè'uCk–åõà:ÖhÌ:XÖ{­£DèX0‚¿hY 2D|}›¿ÅØGÇm»‚–y¸¶Énß~»ð».˜£¾ì÷)­lǧ«&îyvæŸjùÞõWŠ~$Ô jùönÝöøJ¸3¶9¥= j±¬cY‰æy+Þq†ê=ËPOXž-¸8A<µÒ5d‘…¤þ¥áøBº$2]ïX‰d™“ícðùl0nËgœ£Ð³‚·òØlošÒ„_¢cyµ¦¨ZÃ0øz•ß™M®F¬4H¢ß2?moãú‹¯_†BÔ†.”àc~/<±wgÐÛeùx’L³°×[(Ôžë±2²ûŸf&•ý¸™&CF‹Ù‘ç`9S!`¶ïY…ôFjøŽæKò´2k¸[Y†÷û6¹÷žu©wy«‚ó#o9kßÉãqöH·±ášqäÿÈÌ‘”$.Û̯Ú\†7/x=™‰Oü­áÚØ9³m»+"ë[E9Žw'FªSæ¨m÷Â:Á§p¿Ó5¤‰su“§KFø†“úÓÿâÓÊmw«¤ØŸ5 «ä1—QÀ(̰CÖéc> Ö1ôa˜É›°gIÆ uÆ{|É~‹[ÑØ ;³mz?ã;þÝ×1Æ V~>Ža ÝŠ;@6_76Ž—œaxÄ*rû1òXÇ6¾m¼{ÛozÓÿö€§>ŒÇ9î·9Máa3óæ¶¢‹5iÆø£Ù»œ÷y£hÛFDâ´Ý86zêAûA uZôT²'>ÉþÉg<þþŽ/„“{ÃÞé‰Ùùë` b¼Î©CÂ\<†"—µ?—UõZmâËåý£ò»âæ4@àƒ6 4$˜¨`Bƒ :|˜P¢Ãƒ"T8°¢ÂŒ!jÜØcÄ?‚´øPäB“Ð>JdXÒ%Ä•!Þ”²%L,UºÌY³çDž>i=thP )‘Ú@²V‹¦ÈPA«í¬v%(ÖÕ°V¡%S4ö*´®É ÀªÕjU‚.€@ï^ªu©N åÝdh!˜u«Ø‚oݶíÊP­!®h¡Ý:ð²Ûµž-[N›x.ZÇW×rUM–³¢ÕVþ3´¼:m\«öŠ„]Í•mXɪÓní W1EŸEwÆä™ò s¡F•¦„ µcAç@±_Ÿ®1ivîÇB*PúIòÅ+7.ÞøÎ›áÑÿÜÈóæõ£MO.my¤xýã¤n¾ÿîÃn)ÀxbL­¨"ÛÊ¬Í äL²àbãÌ*YL«Á‚K†°à{ª½DëöN$n.Ù‚(Ç kP4 Y 2×DƒM¡ ƒ†±´ÖúȲ½ŠìÅàC ÉàlóqÃÏz‹p­¡Ë,×"mÀî ûï"œò{i©•ÚSŠA ëI'óën'¿Ôï=8Óì’Në°#©M“ÈüŽ?ïåí{ûóç–þ¿”®á%oŸÜ÷ßYœb+^âd2°µåQ–K› ½õ=÷Ñ0MÛÁ^<å¶/铈ë´Óù MG.j›…Šb Š'ž“ ns\¥´" óÑ)#häßðIÁ7pI¥ÝþÌ„È^²/Û¹#]ü6iþð¤¿|¥™.Š€Y²r¦Q©›âvÎ{²2_ã;IÛl¸<$¢pl—ì¤))Ï„ ´–âLçñöVSÅ‹›±WQÚʧ*Ì/£›à›^˜Ê/™î +óQˌ钅¢ó“Yê‰Ége‰ Hÿ&Ã>™­ û‹—›‰Äá=¡EDCÁþ5P(îPm®Dl—òºII6±½iI0ÛNK•S|[)Á¤ÓãuK®m=lCñ¦PîÕiq£Ô∔Q¾)•@ž… F7t.tžÇ>+QÑw˜ÊÓZU›Ð„ÆI†ÏÓ²+oÍ-ûÂ7R‡$©‰ó$Ûž÷Sº 5®îdœ£&é¾sÚ¨[íiV‘ê.Æú3½u=¯RéÃÕ²ð¨ó…nÂöÉVÀ°ƒqILbü`ÇC&ð <`?‹À pƒ á/XÁþÕƒ+œa Á–0€\Í"8ÁVð‰KLbCXÄžp‡ â+XŠ5â)•¾uî4µ ç eÉþ]}éÍœý*h;çudU®M@Ø 6³iä|â8©_[(— D%Û3RŽËȈ?ìᓸÂa&ñbflb5kÅf0VÌQ‰KüâPÖ(îØÔu©œÜ»å‰°·Z½:„oh¨Üªü½I­ï½¤ºT¬n/½™¦â|±¬iâ-V¼Ñ%~½’Ž"Øè˯]^Qø„{•å=ÏP~muúÔz»å™+ÔÕ]Þ¬ÃóÉSÄzÚV(õ‡XÅ™*nTÊ•kW6Má‹o×wˆñÓ{*<âÌ!›Ø§BÚݽ²”Ã;¯Ì66Ý‹·íe×-Z‚ÛÉ‘•¹iït¸;5¹ñ!Õrß‘œ“$<+Mo/ÄëêqI:<½½L½êÞzSç×õ±·¯¹j»R£?š­Š„¹…ÜãÅ’›^ÎË/âùÒËËëôÌ¿¹x7¯T¾B_9Êã9qojWg<£_:nŠ€tÄš™°/ßøMÉ Š‚ˆÉú)óÊçª ¡ Œò%èÊ;:pnÁH7ìü MAFE: MH Alias File Editor

MAFE: MH Alias File Editor

by Andrew Billyard (andrew_billyard@alumni.REMOVETHISBIT.uwaterloo.ca)

  1. Introduction
  2. Installation
  3. Terminology
  4. Usage
  5. Issues


Introduction

MAFE is a Perl+Tk utility which manipulates the nmh alias file(s). It can add email aliases, delete them and change them. It is similar in style to aliases.tcl by Brent Welch and Scott Stanton in the standard exmh package, but has a little more functionality. Unfortunately, my TCL+TK knowledge is limited and it would have taken me too long to learn the language to do what I wanted to do, so I've used what I know: Perl. However, if anyone wishes to convert this to Tcl, they are most welcome. This is not meant to critize aliases.tcl by any means. Indeed, aliases.tcl is much faster than mafe and is native to exmh (whereas mafe needs to be called via exec, see below).

mafe uses two features of nmh alias file(s) which is not currently exploited in the exmh alias editor:

  1. nmh can allow for several alias files, which are all specified on one line in .mh_profile, namely,
       AliasFile: .mh_aliases_research   .mh_aliases_friends   .mh_aliases_family
  2. nmh alias files can the format
       friends: All-Friends:, friend1@b.com, friend2@c.edu, ... friend@z.ca, ;
    (note the semicolon at the end as well as the comma usage) so that specifying friends in the To: field will result in the recipients receiving the mail with To: All-Friends; in the header rather than the entire list of emails.


Terminology

As mentioned above, the nmh file can take one of two basic forms:
1:name: {list}
2:name: tag:, {list}, ;
where {list} is a comma separated list of email addresses or other aliases defined later in the file. This help file makes use of the following terminology:

  • Alias: An alias will be defined as any line in the alias file in the form of line 1.
  • Alias name: The name portion of the alias line.
  • Distribution: A distribution will be defined as any line in the alias file in the form of line 2.
  • Distribution name: The name portion of the alias line.
  • Tag Any word(s) found in the tag location of a Distribution line (line 2). The tag is what the recipients of the email will see in the To: field.
  • Address Any words found in the comma separated list of both the Alias and Distribution lines. Note that Address may be anther Alias/Distribution found later in the alias file as well as email addresses.


Installation

Requirements: mafe requires the Perl::Tk modules.

Presently, there is no "installation" procedure (such as compiling or rpm-ing). Simply place uncompress the mafe tar file into a directory seen by the PATH variable. Mafe also comes with script called exmhmail (which should also be visible to the PATH environment) which launches a compose session in exmh.

To add mafe to exmh, add the following to the beginning of exmh-defaults
*Main.addr.text: Address...
*Main.addr.m.entrylist: alias alias2 addr
*Main.addr.m.l_alias: MH Aliases
*Main.addr.m.c_alias: Aliases_Pref
*Main.addr.m.l_alias2: MH Alias File Editor (MAFE)
*Main.addr.m.c_alias2: exec /path to mafe/mafe \$address &
*Main.addr.m.l_addr: Address Book
*Main.addr.m.c_addr: Addr_Browse


Usage

The program mafe can be called from within exmh (as described above) or can be called on its own via
  mafe address where address will appear in the Addresses' Entry Box(see below).

When it first starts, mafe first reads $HOME/.exmh/exmh-defaults to obtain which fonts are used by exmh. Next, it reads the file $HOME/.mh_profile and looks for the alias file names given in the line starting with AliasFile:. It then proceeds to open the first alias file mentioned on that line.

Layout

A screen shot of mafe is given below.


In the upper right corner are several buttons whose meaning is pretty much self-explanatory.

The name of the nmh alias file is displayed at the upper left.

If there are more than one nmh alias (as specified in .mh_profile) then the label is replaced with a pull down combo-box to switch between different files. Note: if a change has been made to an alias file and has not been saved, then either selecting a different alias file or clicking the Dismiss dismiss button will result in the user to be prompted to save the file first.

Left Side: On the left hand side of the window there are two nearly-identical units above one another. Each unit contains: a list box, an entry box and a row of buttons. With the exception of the last button in each set, all look the same. The upper unit is reserved for aliases (as defined in the Introduction) while the lower unit is reserved for the distributions (again, as defined in the Introduction).
Alias unit (upper). Distribution unit (lower).

  1. List Box: This box will display all the aliases/distributions defined in the alias file. Clicking a particular alias/distribution in this box will list all of the associated addresses in the list box on the right hand side (see below).
  2. Entry Box: Any changes to be made to an alias or distribution is to be put into the entry box.
  3. Buttons:
    1. Comp: If a particular item in the list box is selected and the Comp button is pressed, mafe launches a compose sedit window from within exmh. The To: field will be filled in with the List Box's selection.
    2. Insert: Inserts whatever is in the Entry Box (if not empty) into the List Box and generates a new alias/distribution. Any addresses to be added will be done on the right hand frame (see below).
    3. Change: If an entry is selected in the List Box and the Entry Box is not empty, the two values will be swapped.
    4. Delete: Delete the selection in the List Box.
    5. Alias or Distro: If the selection is a distribution, it (and its addresses) will be moved to the Alias unit. Similarly for aliases. However, distributions require an addition distribution tag (see Introduction) and the default value of "Undisclosed Recipients" will be used. This value can be changed in the right hand frame (see below).

Right Side Frame: In this frame, changes can be made to the addresses belonging to the selected alias/distribution.

  1. Distro. Tag Entry Box: This box remains inactive if an alias is selected. If a distribution is selected, this box becomes active and displays the distribution's tag.
  2. Set Button: If the user changes the distribution's tag (in the Entry Box), this button will become active. Click to permanently change the distribution's tag.
  3. List Box: Once an alias/distribution is selected on the left side, its addresses will be displayed in this box.
  4. Entry Box: Any changes to be made to an address is to be put into the entry box.
  5. Buttons:
    1. Insert: Adds whatever is in the Entry Box (if not empty) to the list of addresses in the List Box.
    2. Change: If an entry is selected in the List Box and the Entry Box is not empty, the two values will be swapped.
    3. Delete: Delete the selection in the List Box.
    4. Expand: If a particular address is selected and it is an alias/distribution, clicking Expand will substitute the address with the addresses found in the corresponding alias/distribution. If no item is selected in the list box, Expand will perform a similar operation on all addresses in the list box which are aliases/distributions. Note, Expand only expands alias/distribution which are defined in the current alias file being edited. For example if an alias contains the alias "john", "john" will only be expanded if it is defined in the current file.
    5. Contract: This is nearly the opposite of Expand. Like Expand, it will operate only on one address if it is selected, otherwise it will operate on all addresses in the list box. However, Contract is careful about what it contracts. In particular, it operates on an address if and only if:
      • the email address is explicitly defined in another alias/distribution in the current file and
      • this other alias/distribution in which the email address is defined has, at most, three addresses in its definition.
      This is a bit terse, but for a good reason. To demonstrate why, consider the following alias file:
      ProjectList: jordan1@home.ca, jordan2@work.ca, tracy@foo.bar
      Jordan: jordan1@home.ca, jordan2@work.ca, jordan3@laptop.com
      DistroList: tracy@foo.bar, hans@down.de, einstein@hair.com, \
      fred@rick.com, apple@day.ca, ... , person100@years.old
      Now, suppose the ProjectList alias was selected and the Contract button pressed. If there were not a three-address limit, the alias would then read
      ProjectList: Jordan, DistroList
      and so all of DistroList is included in ProjectList and not just tracy@foo.bar. This may not be desirable. With the three-address limit, the line would become
      ProjectList: Jordan, tracy@foo.bar
      (note, that Jordan contains one more email address than what was in the original ProjectList. This might be ok if all the addresses in Jordan belongs to the same person). Really, Contract is meant to replace several email addresses in an alias/distribution which belong to one person only and replace these addresses with an alias or distribution name for brevity. So use with caution.

      If the number 3 is unsatisfactory (i.e., you want the limit to be 2 addresses or 8, etc.), change the line $UpperLimit=3;.


Issues

The following lists a few issues with mafe

  1. When saving an alias file, mafe first saves the distributions in alphabetical order and then the aliases in alphabetical order. It just looks nice to read. However, it does potentially pose a problem since an alias may then be defined before it is used (since in nmh an alias needs to be referenced before it is defined). If this is the case, repeat the alias file name in .mh_profile:
    AliasFile: .mh_aliases1 .mh_aliases2 .mh_aliases1 .mh_aliases2

  2. mafe was written in Perl with the Tk module. It would have been nice to have written it in Tcl+Tk, so that it would be more native to the exmh package. Perhaps one day I'll sit down and learn Tcl and do this. Anyone up for the challenge of porting is more than welcome.

Andrew Billyard (
andrew_billyard@alumni.REMOVETHISBIT.uwaterloo.ca) exmh-2.8.0/misc/RPM/exmh-2.0.3-conf.patch000640 001047 000144 00000005225 06750203213 017714 0ustar00welchusers000000 000000 --- exmh-2.0alpha/exmh-async.marc Tue Dec 17 17:37:47 1996 +++ exmh-2.0alpha/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) --- exmh-2.0alpha/exmh-bg.marc Tue Dec 17 17:38:05 1996 +++ exmh-2.0alpha/exmh-bg Tue Dec 17 18:01:09 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module @@ -16,6 +16,29 @@ # any specification. #CONFIGURATION +set wish /usr/bin/wish +set exmh(version) {version 2.1.0} +set exmh(name) exmh +set exmh(maintainer) welch@acm.org +set mh_path /usr/bin/mh +set exmh(slocal) /usr/lib/mh/slocal +set mime(dir) /usr/bin +set mailcap_default /etc/mailcap +set exmh(expect) /usr/bin/expect +set exmh(expectk) /usr/bin/expectk +set faces(dir) /usr/local/faces/faces +set faces(set,user) {local users usenix misc} +set faces(set,unknown) {domains unknown} +set faces(defaultDomain) eng.sun.com +set faces(suffix) {xpm gif xbm} +set pgp(path) /usr/bin +set glimpse(path) /usr/bin +set sound(cmd) {/usr/demo/SOUND/play -v 38} +set exmh(library) /usr/lib/exmh-2.1.0 +set install(dir,bin) /usr/bin +set install(dir,man) /usr/man/man1 +set install(dir,lib) /usr/lib/exmh-2.1.0 + #END CONFIGURATION wm withdraw . --- exmh-2.0alpha/exmh.marc Tue Dec 17 17:39:05 1996 +++ exmh-2.0alpha/exmh Tue Dec 17 18:01:09 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch @@ -16,6 +16,29 @@ # The following lines are patched by exmh.install #CONFIGURATION +set wish /usr/bin/wish +set exmh(version) {version 2.1.0} +set exmh(name) exmh +set exmh(maintainer) welch@acm.org +set mh_path /usr/bin/mh +set exmh(slocal) /usr/lib/mh/slocal +set mime(dir) /usr/bin +set mailcap_default /etc/mailcap +set exmh(expect) /usr/bin/expect +set exmh(expectk) /usr/bin/expectk +set faces(dir) /usr/local/faces/faces +set faces(set,user) {local users usenix misc} +set faces(set,unknown) {domains unknown} +set faces(defaultDomain) eng.sun.com +set faces(suffix) {xpm gif xbm} +set pgp(path) /usr/bin +set glimpse(path) /usr/bin +set sound(cmd) {/usr/demo/SOUND/play -v 38} +set exmh(library) /usr/lib/exmh-2.0.3 +set install(dir,bin) /usr/bin +set install(dir,man) /usr/man/man1 +set install(dir,lib) /usr/lib/exmh-2.1.0 + #END CONFIGURATION if {$tk_version < 4.1} { --- exmh-2.0alpha/ftp.expect.marc Tue Dec 17 17:40:55 1996 +++ exmh-2.0alpha/ftp.expect Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!expect -f +#!/usr/bin/expect -f set site [lindex $argv 0] set dir [lindex $argv 1] exmh-2.8.0/misc/RPM/exmh-2.1.0-conf.patch000640 001047 000144 00000006037 06770432614 017727 0ustar00welchusers000000 000000 --- exmh-2.1.0/exmh-async.sjl Tue Dec 17 17:37:47 1996 +++ exmh-2.1.0/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) *** exmh-2.1.0/exmh Thu Jul 23 19:02:17 1999 --- exmh-2.1.0/exmh~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # TK interface to the MH Mail utility # Brent Welch --- 1,4 ---- ! #!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch *************** *** 17,22 **** --- 17,49 ---- # The following lines are patched by exmh.install #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.0} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/local/faces/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set glimpse(path) /usr/local/bin + set sound(cmd) {/usr/demo/SOUND/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.0 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.0 + #END CONFIGURATION if [catch {file join a b}] { child process exited abnormally *** exmh-2.1.0/exmh-bg Thu Jul 22 19:02:17 1999 --- exmh-2.1.0/exmh-bg~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module --- 1,4 ---- ! #!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module *************** *** 17,22 **** --- 17,49 ---- #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.0} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/local/faces/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp, path) /usr/bin + set pgp(pgp5, path) /usr/bin + set pgp(gpg, path) /usr/bin + set glimpse(path) /usr/local/bin + set sound(cmd) {/usr/demo/SOUND/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.0 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.0 + #END CONFIGURATION exmh-2.8.0/misc/RPM/exmh-2.1.1-conf.patch000640 001047 000144 00000006006 06777533277 017742 0ustar00welchusers000000 000000 --- exmh-2.1.0/exmh-async.sjl Tue Dec 17 17:37:47 1996 +++ exmh-2.1.0/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) *** exmh-2.1.0/exmh Thu Jul 23 19:02:17 1999 --- exmh-2.1.0/exmh~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # TK interface to the MH Mail utility # Brent Welch --- 1,4 ---- ! #!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch *************** *** 17,22 **** --- 17,49 ---- # The following lines are patched by exmh.install #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.1 (devel)} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.1 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.1 + #END CONFIGURATION if [catch {file join a b}] { child process exited abnormally *** exmh-2.1.0/exmh-bg Thu Jul 22 19:02:17 1999 --- exmh-2.1.0/exmh-bg~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module --- 1,4 ---- ! #!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module *************** *** 17,22 **** --- 17,49 ---- #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.1 (devel)} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces/ + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp, path) /usr/bin + set pgp(pgp5, path) /usr/bin + set pgp(gpg, path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.1 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.1 + #END CONFIGURATION exmh-2.8.0/misc/RPM/exmh-2.1.2-conf.patch000644 001047 000144 00000006013 07117562462 017730 0ustar00welchusers000000 000000 --- exmh-2.1.0/exmh-async.sjl Tue Dec 17 17:37:47 1996 +++ exmh-2.1.0/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) *** exmh-2.1.2/exmh Thu Jul 23 19:02:17 1999 --- exmh-2.1.2/exmh~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # TK interface to the MH Mail utility # Brent Welch --- 1,4 ---- ! #!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch *************** *** 17,22 **** --- 17,49 ---- # The following lines are patched by exmh.install #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.2 06/07/2000} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.2 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.2 + #END CONFIGURATION if [catch {file join a b}] { child process exited abnormally *** exmh-2.1.2/exmh-bg Thu Jul 22 19:02:17 1999 --- exmh-2.1.2/exmh-bg~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module --- 1,4 ---- ! #!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module *************** *** 17,22 **** --- 17,49 ---- #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.1.2 (06/07/2000)} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces/ + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.1.2 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.1.2 + #END CONFIGURATION exmh-2.8.0/misc/RPM/exmh-2.2-conf.patch000644 001047 000144 00000006057 07150115633 017570 0ustar00welchusers000000 000000 --- exmh-2.2/exmh-async.sjl Tue Dec 17 17:37:47 1996 +++ exmh-2.2/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) *** exmh-2.2/exmh Thu Jul 23 19:02:17 1999 --- exmh-2.2/exmh~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # TK interface to the MH Mail utility # Brent Welch --- 1,4 ---- ! #!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch *************** *** 17,22 **** --- 17,49 ---- # The following lines are patched by exmh.install #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.2 06/23/2000} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set pgp(pgp6,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.2 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.2 + #END CONFIGURATION if [catch {file join a b}] { child process exited abnormally *** exmh-2.2/exmh-bg Thu Jul 22 19:02:17 1999 --- exmh-2.2/exmh-bg~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module --- 1,4 ---- ! #!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module *************** *** 17,22 **** --- 17,49 ---- #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version 2.2 (06/23/2000)} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces/ + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set pgp(pgp6,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-2.2 + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-2.2 + #END CONFIGURATION exmh-2.8.0/misc/RPM/exmh-conf.patch000644 001047 000144 00000006132 07625576537 017310 0ustar00welchusers000000 000000 --- exmh-VERSION/exmh-async.sjl Tue Dec 17 17:37:47 1996 +++ exmh-VERSION/exmh-async Tue Dec 17 18:01:10 1996 @@ -1,4 +1,4 @@ -#!wish -f +#!/usr/bin/wish -f # # async editor frontend for exmh # Arg1: invoking interpreter's name (from [winfo name .]) *** exmh-VERSION/exmh Thu Jul 23 19:02:17 1999 --- exmh-VERSION/exmh~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # TK interface to the MH Mail utility # Brent Welch --- 1,4 ---- ! #!/usr/bin/wish -f # # TK interface to the MH Mail utility # Brent Welch *************** *** 17,22 **** --- 17,50 ---- # The following lines are patched by exmh.install #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version VERSION RELDATE} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set pgp(pgp6,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-VERSION + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-VERSION + #END CONFIGURATION if [catch {file join a b}] { child process exited abnormally *** exmh-VERSION/exmh-bg Thu Jul 22 19:02:17 1999 --- exmh-VERSION/exmh-bg~ Thu Jul 29 21:31:11 1999 *************** *** 1,4 **** ! #!wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module --- 1,4 ---- ! #!/usr/bin/wish -f # # Background processing script for exmh. # This does stuff and then sends messages to the background module *************** *** 17,22 **** --- 17,50 ---- #CONFIGURATION + set wish /usr/bin/wish + set exmh(version) {version VERSION (RELDATE)} + set exmh(name) exmh + set exmh(maintainer) welch@acm.org + set mh_path /usr/bin + set exmh(slocal) /usr/lib/nmh/slocal + set mime(dir) /usr/bin + set mailcap_default /etc/mailcap + set mimetypes_default /etc/mime.types + set exmh(expect) /usr/bin/expect + set exmh(expectk) /usr/bin/expectk + set faces(dir) /usr/lib/faces/ + set faces(set,user) {local users usenix misc} + set faces(set,unknown) {domains unknown} + set faces(set,news) news + set faces(defaultDomain) eng.sun.com + set faces(suffix) {xpm gif xbm} + set pgp(pgp,path) /usr/bin + set pgp(pgp5,path) /usr/bin + set pgp(gpg,path) /usr/bin + set pgp(pgp6,path) /usr/bin + set glimpse(path) /usr/bin + set sound(cmd) {/usr/bin/play -v 38} + set exmh(library) /usr/lib/exmh-VERSION + set install(dir,bin) /usr/bin + set install(dir,man) /usr/man/manl + set install(dir,lib) /usr/lib/exmh-VERSION + #END CONFIGURATION exmh-2.8.0/misc/RPM/exmh.desktop000644 001047 000144 00000000273 07175547463 016733 0ustar00welchusers000000 000000 [Desktop Entry] Name=exmh Name[sv]=exmh Type=Application Comment=Mail reader which handles mh-style mail folders Comment[sv]=E-postläsare som kan hantera e-postmappar av mh-typ Exec=exmh exmh-2.8.0/misc/RPM/exmh.wmconfig000640 001047 000144 00000000145 06750203214 017042 0ustar00welchusers000000 000000 exmh name "exmh" exmh description "MH Mail Front End" exmh exec "exmh &" exmh group "Utilities/Mail" exmh-2.8.0/misc/RPM/exmh.spec000644 001047 000144 00000012073 10000654350 016164 0ustar00welchusers000000 000000 Summary: The exmh mail handling system. Name: exmh Version: EXMHVERSION Release: 1 BuildArchitectures: noarch Requires: mh, metamail Copyright: freeware Group: Applications/Mail Source0: ftp://ftp.tcl.tk/pub/tcl/exmh/exmh-%{version}.tar.gz Url: http://www.beedub.com/exmh/ Source1: exmh.wmconfig Source2: exmh.desktop # The conf patch includes the version number, so it needs to be # updated for every revision even if it applies without being # updated. Use the exmh.install script to make sure that we # keep up with new paths that exmh wants to know about, and # make sure to change all the paths that need to be changed # by comparing to the previous conf patch. Patch0: exmh-%{version}-conf.patch #BuildRoot: %{_tmppath}/%{name}-root Summary(de): EXMH-Mail-Programm Summary(fr): Programme de courrier EXMH Summary(tr): e-posta yazýlýmý Summary(es): Pograma lector de correo exmh %description exmh is a graphical interface to the MH mail system. It includes MIME support, faces, glimpse indexing, color highlighting, PGP interface, and more. Requires sox (or play) for sound support. %description -l es exmh es un interface grafico para el sistema de correo MH. Incluye soporte para tipos MIME, faces, indexacion mediante glimpse, marcado en colores de las cabeceras, PGP y GPGP, enlaces URL, y muchas mas cosas. Necesita sox (o play) para el sonido %description -l de exmh ist eine grafische Oberfläche für das MH-Mail-System. Zu den Funktionen gehören MIME-Unterstützung, Faces, Glimpse-Indexing, farbiges Markieren, PGP-Schnittstelle usw. Erfordert sox (oder play) für Sound-Unterstützung. %description -l fr exmh est uen interface graphique au système de courrier MH. Il gère MIME, les aspects, l'indexation glimpse, la mise en valeur par couleurs, PGP, et autres. Il faut sox (ou play) pour gérér le son. %description -l tr exmh, yaygýn olarak kullanýlan mh paketi için X11 arayüzüdür. MIME desteði, PGP desteði, faces, glimpse yardýmýyla dizin oluþturma gibi yetenekleri vardýr. Ses desteði için sox (ya da play) gerekir. %package misc Summary: exmh misc contributed utils Group: Applications/Mail %description misc The misc package contains user contributed programs which work well with exmh. %prep %setup -q -n exmh-%{PACKAGE_VERSION} for i in *.MASTER; do cp $i ${i%%.MASTER} done %patch0 -p1 -b .conf %build echo 'auto_mkindex ./lib *.tcl' | tclsh %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/etc/X11/wmconfig mkdir -p $RPM_BUILD_ROOT/etc/X11/applnk/Internet mkdir -p $RPM_BUILD_ROOT{%{_bindir},%{_mandir}/man1} mkdir -p $RPM_BUILD_ROOT%{_libdir}/exmh-%{version} mkdir -p $RPM_BUILD_ROOT%{_libdir}/exmh-%{version}/misc for i in exmh exmh-bg exmh-async ftp.expect inc.expect; do install -m755 $i $RPM_BUILD_ROOT/%{_bindir} done for i in *.l; do install -m644 $i $RPM_BUILD_ROOT%{_mandir}/man1/${i%%.l}.1 done cp -ar lib/* $RPM_BUILD_ROOT/usr/lib/exmh-%{version} cp -ar misc/* $RPM_BUILD_ROOT/usr/lib/exmh-%{version}/misc cp %SOURCE2 $RPM_BUILD_ROOT/etc/X11/applnk/Internet/ install -m644 $RPM_SOURCE_DIR/exmh.wmconfig $RPM_BUILD_ROOT/etc/X11/wmconfig/exmh find $RPM_BUILD_ROOT/usr/lib/exmh-%{version} -type f | grep -v $RPM_BUILD_ROOT/usr/lib/exmh-%{version}/misc |sed -e "s|$RPM_BUILD_ROOT||" > filelist cat filelist %clean rm -rf $RPM_BUILD_ROOT # # Maybe the /usr/lib stuff in the %dir clause and the find statement should # be changed to use %{_libdir}? Does %files -f support macros? # %files -f filelist %defattr(-,root,root) %dir /usr/lib/exmh-%{version} %dir /usr/lib/exmh-%{version}/html %dir /usr/lib/exmh-%{version}/bitmaps %doc COPYRIGHT exmh.BUGS exmh.CHANGES exmh.TODO exmh.README lib/html/ %config /etc/X11/wmconfig/exmh %config /etc/X11/applnk/Internet/exmh.desktop %{_bindir}/exmh %{_bindir}/exmh-bg %{_bindir}/exmh-async %{_bindir}/ftp.expect %{_bindir}/inc.expect #%{_libdir}/exmh-%{version} %{_mandir}/man1/exmh.1* %files misc %defattr(-,root,root) %{_libdir}/exmh-%{version}/misc %changelog * Sun Jul 29 2001 Anders Eriksson - Made the root package exclude the misc/ directory * Thu May 24 2001 Scott Lipcon - change rpm to build exmh-misc package as well. * Sat Oct 14 2000 Scott Lipcon - changes to support RPM4, bring specfile in line with Redhat's, hopefully * Sun Aug 20 2000 Scott Lipcon - overdue 2.2 patch, fixes pgp6 * Wed Jun 07 2000 Scott Lipcon - update for exmh 2.1.2, coming soon. * Fri Sep 17 1999 Scott Lipcon - Added Spanish translation, courtesy of Francisco Monserrat * Thu Jul 29 1999 Scott Lipcon - update to exmh 2.1.0, add spec file to distribution, and added a 'rpm' target to the Makefile * Tue Mar 03 1999 Scott Lipcon - update to exmh 2.0.3 * Sat Aug 15 1998 Jeff Johnson - build root * Fri Apr 24 1998 Prospector System - translations modified for de, fr, tr * Fri Apr 10 1998 Donnie Barnes - updated to 2.0.2 * Wed Oct 22 1997 Donnie Barnes - added wmconfig support exmh-2.8.0/lib/fdisp.tcl000644 001047 000144 00000072322 10167422514 015351 0ustar00welchusers000000 000000 # # fdisp.tcl # # Folder display, handling nesting and highlights to reflect folder state. # # Copyright (c) 1993 Xerox Corporation. # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # makes no warranty about the software, its performance or its conformity to # any specification. proc Fdisp_Init {} { global fdisp mhProfile exmh flist if {[info exists exmh(newuser)] && [info exists flist(allfolders)]} { set N [llength $flist(allfolders)] if {$N < 5} { set fdisp(maxLines) 1 } elseif {$N < 15} { set fdisp(maxLines) 2 } elseif {$N < 30} { set fdisp(maxLines) 3 } else { set fdisp(maxLines) 4 } } Preferences_Add "Folder Display" \ "These items affect the display of the labels in the folder display window. If you change key bindings on labels, you'll have to toggle one of the other options to force a redisplay because that's when the bindings are set." { {fdisp(maxLines) fdispLines 4 {Max fdisp rows} "The maximum number of rows of folder labels in the folder display. If there are more folders than will fit in this space, the display becomes scrollable." } {fdisp(toplevel) fl_toplevel OFF {Detached fdisp display} "The folder display area can be displayed in a separate toplevel window. You can use the *Fltop.position Xresource to control its initial placement on the screen, and the *Fltop.Canvas.width and *Fltop.Canvas.height to control its size."} {fdisp(oneCol) fdisp1Col OFF {Use one column} "Enabling this with a detached display aligns all the folders in one vertical column."} {fdisp(popdownStyle) fdispPopdownStyle {CHOICE polygon rectangle} {Subfolder popdown} "The style of the sub folder popdown menu used to display subfolders." } {fdisp(popdownAction) fdispPopdownAction {CHOICE navbutton enter redisplay} {Popdown action} "This determines how the popdown display is triggered: navbutton - press navigation button to get the popdown. enter - move the mouse over the button to get the popdown. redisplay - do not use popdowns at all. Instead, navbutton causes the whole folder display to change. The navigation button is settable via a X resource fl_navbutton." } {fdisp(popdownRemove) fdispPopdownRemove {CHOICE leave navbutton} {Remove popdown on...} "This determines what causes a popdown display to be removed: navbutton - press navigation button on another label. leave - leave the area of the popdown. This actually is implemented by triggering on to other labels. The navigation button is settable via a X resource fl_navbutton." } {fdisp(tarbuttonAction) fdispTarbuttonAction {CHOICE {select+move} {select+copy} {select only}} {Action when Target button clicked...} "This determines what action is taken when the \"target\" mouse button is clicked. The target button is usually mouse button 3 but can be changed by setting X resource fl_tarbutton. select+move - Selects the folder at the mouse cursor as the target folder and moves the current message to the target folder. select+copy - Selects the folder at the mouse cursor as the target folder and copies the current message to the target folder. select only - Selects the folder at the mouse cursor as the target folder." } {findSettings(defaultLoc) findSettingsDefaultLoc {CHOICE FTOC Msg} "Default search location" "Determines whether, initially, a search takes place in the \"folder table of contents\" window (if set to \"FTOC\") or the \"message\" window (if set to \"Msg\")."} } # The remaining parameters can be overridden by hand in the user resources Preferences_Resource fdisp(font) fl_font fixed Preferences_Resource fdisp(xgap) fl_xgap 8 Preferences_Resource fdisp(ygap) fl_ygap 8 Preferences_Resource fdisp(curbutton) fl_curbutton 1 Preferences_Resource fdisp(navbutton) fl_navbutton 2 Preferences_Resource fdisp(tarbutton) fl_tarbutton 3 Preferences_Resource fdisp(c_fg) c_foreground black Preferences_Resource fdisp(c_bg) c_background white Preferences_Resource fdisp(c_current) c_current red Preferences_Resource fdisp(c_unseen) c_unseen blue Preferences_Resource fdisp(c_unseenBg) c_unseenBg $fdisp(c_bg) Preferences_Resource fdisp(c_moved) c_moved yellow Preferences_Resource fdisp(c_movedFg) c_movedFg $fdisp(c_fg) Preferences_Resource fdisp(c_popup) c_popup wheat trace variable fdisp(font) w FdispFixupFont set fdisp(lastFont) $fdisp(font) trace variable fdisp(maxLines) w FdispFixupMaxLines set fdisp(lastMaxLines) $fdisp(maxLines) trace variable fdisp(toplevel) w FdispFixupToplevel set fdisp(lastToplevel) $fdisp(toplevel) trace variable fdisp(oneCol) w FdispFixupRedisplay trace variable fdisp(popdownStyle) w FdispFixupRedisplay } # Hooks for recreating the folder display when config changes proc FdispFixupMaxLines { args } { global exwin fdisp if [catch {expr {$fdisp(maxLines) * 2}}] { set fdisp(maxLines) $fdisp(lastMaxLines) return ;# bogus value } if {$fdisp(maxLines) != $fdisp(lastMaxLines)} { set fdisp(width,canvas) 0 set fdisp(maxLines,$fdisp(canvas)) $fdisp(maxLines) set fdisp(lastMaxLines) $fdisp(maxLines) set h [expr {$fdisp(maxLines)*($fdisp(itemHeight) + $fdisp(ygap)) + $fdisp(ygap)}] $fdisp(canvas) configure -height $h } } proc FdispFixupRedisplay { args } { Fdisp_Redisplay } proc FdispFixupToplevel { args } { global fdisp if {$fdisp(toplevel) != $fdisp(lastToplevel)} { if [info exists fdisp(topWidget)] { destroy $fdisp(topWidget) unset fdisp(topWidget) } else { destroy $fdisp(frame) unset fdisp(frame) } FdispMake } set fdisp(lastToplevel) $fdisp(toplevel) } # Make the folder display proc FdispMake {} { global fdisp if {$fdisp(toplevel)} { FdispMakeToplevel } else { FdispMakeFrame } } # Create folder list in a toplevel and make the canvas inside it proc FdispMakeToplevel { } { global fdisp Exwin_Toplevel .fl "Folder list" Fltop nomenu wm protocol .fl WM_TAKE_FOCUS { global exwin focus $exwin(mtext) } set fdisp(topWidget) .fl wm minsize $fdisp(topWidget) 100 30 wm protocol .fl WM_DELETE_WINDOW FdispDeleted FdispMakeCanvas $fdisp(topWidget) set icon [option get $fdisp(topWidget) iconposition IconPosition] catch { Exwin_IconPosition $fdisp(topWidget) $icon } set iconic [option get $fdisp(topWidget) iconic Iconic] if {$iconic == {}} { set iconic $exmh(iconic) } if {$iconic} { wm iconify $fdisp(topWidget) } } proc FdispDeleted {} { wm iconify .fl Exmh_Status "Folder display closed, not destroyed" } proc Fdisp_Checkpoint { varName } { # Add Xresources lines to $varName that save window size upvar $varName newstuff global fdisp catch { set can $fdisp(topWidget).can set width [winfo width $can] set height [winfo height $can] set bd [$can cget -borderwidth] incr bd [$can cget -highlightthickness] set width [expr $width - 2*$bd] set height [expr $height - 2*$bd] lappend newstuff "*Fltop.Canvas.height:\t$height" lappend newstuff "*Fltop.Canvas.width:\t$width" } } # Create folder list in a frame and make the canvas inside it proc FdispMakeFrame { } { global fdisp set fdisp(frame) [Widget_Frame $fdisp(parent) f1 Frame] FdispMakeCanvas $fdisp(frame) } # Create the canvas for the folder display proc FdispMakeCanvas { frame } { global fdisp exwin set fdisp(canvas) [canvas $frame.can -bd 2 -relief raised \ -highlightthickness 0] set s [scrollbar $frame.sv -command [list $fdisp(canvas) yview] \ -highlightthickness 0] $fdisp(canvas) configure -yscrollcommand [list $s set] # Find out how big labels are if [catch { set id [$fdisp(canvas) create text 0 0 \ -anchor nw -justify center -text 0123456789 -font $fdisp(font)] } err] { Exmh_Status $err set fdisp(font) fixed set id [$fdisp(canvas) create text 0 0 \ -anchor nw -justify center -text 0123456789 -font $fdisp(font)] } set size [$fdisp(canvas) bbox $id] set fdisp(itemHeight) [expr {[lindex $size 3] - [lindex $size 1]}] set fdisp(charWidth) [expr {([lindex $size 2] - [lindex $size 0])/10}] $fdisp(canvas) delete $id catch { $fdisp(canvas) configure -yscrollincrement \ [expr {$fdisp(itemHeight)+$fdisp(ygap)+1}] } if {!$fdisp(toplevel)} { set h [expr {$fdisp(maxLines)*($fdisp(itemHeight) + $fdisp(ygap)) + $fdisp(ygap)}] $fdisp(canvas) configure -height $h } bindtags $fdisp(canvas) \ [list $fdisp(canvas) Command [winfo toplevel $fdisp(canvas)] all] bind $fdisp(canvas) <2> {%W scan mark %x %y} bind $fdisp(canvas) {%W scan dragto %x %y} bind $fdisp(canvas) FdispCanvasConfigure pack $s -side $exwin(scrollbarSide) -fill y pack $fdisp(canvas) -side $exwin(scrollbarSide) -fill both -expand 1 # Enable wheelscroll if desired if {$exwin(wheelEnabled)} { mscroll $fdisp(canvas) 1 } # fdisp popup color hack if {[winfo depth $fdisp(canvas)] <= 4} { if {! [regexp {black|white} $fdisp(c_popup)]} { set fdisp(c_popup) [$fdisp(canvas) cget -bg] } } FdispDragAttach canvas } proc FdispFixupFont { args } { global exwin fdisp if {$fdisp(lastFont) != $fdisp(font)} { # Find out how big labels are if [catch { set id [$fdisp(canvas) create text 0 0 \ -anchor nw -justify center -text foo -font $fdisp(font)] } err] { Exmh_Status $err set fdisp(font) fixed set id [$fdisp(canvas) create text 0 0 \ -anchor nw -justify center -text foo -font $fdisp(font)] } set size [$fdisp(canvas) bbox $id] set fdisp(itemHeight) [expr {[lindex $size 3] - [lindex $size 1]}] $fdisp(canvas) delete $id set fdisp(lastFont) $fdisp(font) # Changing canvas size triggers redisplay set h [expr {$fdisp(maxLines)*($fdisp(itemHeight) + $fdisp(ygap)) + $fdisp(ygap)}] $fdisp(canvas) configure -height $h if [info exists fdisp(cache)] { set h [expr {($fdisp(itemHeight) + $fdisp(ygap)) + $fdisp(ygap)}] $fdisp(cache) configure -height $h } } } proc Fdisp_Window { parent } { global fdisp exwin set fdisp(parent) $parent # a bogus child is needed inside fdisp(parent) so it properly # shrinks down when the cache is removed or when the main display # is moved to a separate top-level Widget_Frame $parent bogus Frame # The following creates fdisp(canvas), either in a toplevel or a frame FdispMake global fcache if $fcache(enabled) { Fcache_CreateWindow FdispDragAttach cache } set fdisp(folder) . foreach can {canvas cache} { set fdisp(entered,$can) 0 ;# Display routine entered set fdisp(pending,$can) 0 ;# Display routine blocked set fdisp(width,$can) 0 ;# last display width set fdisp(fset,$can) {} ;# last folder set set fdisp(cur,$can) {} ;# current folder name set fdisp(tar,$can) {} ;# target folder name set fdisp(curid,$can) {} ;# canvas item ids set fdisp(boxid,$can) {} set fdisp(tarid,$can) {} set fdisp(tboxid,$can) {} set fdisp(leafs,$can) {} ;# list of leaf highlight tags } } proc Fdisp_Redisplay {} { global fdisp FdispMain $fdisp(folder) 1 Fcache_Display 1 } proc FdispCanvasConfigure {} { global fdisp FdispMain $fdisp(folder) 1 } proc FdispMain { {folder {.}} {force 0} } { # Layout the current level of folder buttons on the canvas global fdisp exmh Label_Main [expr {[string compare $folder "."]==0 ? {} : "$folder"}] set fdisp(folder) $folder Flist_FindAllFolders set folderSet [Flist_FolderSet $folder] set len [llength $folderSet] set msec [lindex [time [list Fdisp_Layout canvas $folderSet $folder $force]] 0] Exmh_Debug Fdisp_HighlightCanvas [time [list Fdisp_HighlightCanvas canvas]] } proc Fdisp_Layout { can folderSet {folder {}} {force 0} } { # Main layout routine. Because this is triggered by # events, and because it dinks with the # size of the canvas, it needs to be reentrant. # global fdisp set canvas $fdisp($can) if {$fdisp(entered,$can)} { set fdisp(pending,$can) 1 return } set width [winfo width $canvas] set bd [$canvas cget -borderwidth] incr bd [$canvas cget -highlightthickness] set width [expr $width - 2*$bd] if {! $force && ($width == $fdisp(width,$can)) && ($folderSet == $fdisp(fset,$can))} { if {$fdisp(pending,$can)} { set fdisp(pending,$can) 0 after 1 [list Fdisp_Layout $can $folderSet $folder] } return } incr fdisp(entered,$can) set fdisp(width,$can) $width set fdisp(fset,$can) $folderSet catch { $canvas delete all } Fdisp_ClearSpecials $canvas if {$can != "cache"} { FdispPopdownReset Exmh_Status "Building folder display... $folder" } set fdisp(maxy,$can) [FdispLayoutInner $can $fdisp(xgap) $fdisp(ygap) \ $width $folderSet $folder FdispBindLabel] set fdisp(bgid,$can) [$canvas create rect 0 0 0 0 \ -fill [$canvas cget -bg] -outline ""] $canvas lower $fdisp(bgid,$can) FdispSetCanvasSize $can $fdisp(maxy,$can) if {$can != "cache"} { Exmh_Status "" } incr fdisp(entered,$can) -1 if {$fdisp(pending,$can)} { set fdisp(pending,$can) 0 after 1 [list Fdisp_Layout $can $folderSet $folder] } } proc FdispLayoutInner { can x1 y1 width folderSet folder bindProc {skipSelf no} {tag _notag_} } { global fdisp set canvas $fdisp($can) set maxy $fdisp(itemHeight) ;# Per row max item height set x $x1 set y $y1 set iscache [string match cache $can] foreach f $folderSet { # Determine label text for the folder if {[string compare $f $folder] == 0} { if [string match skipSelf $skipSelf] { continue } else { set text ".." } } else { if $iscache { set text [Fcache_FolderName $f] } else { set text [file tail $f] } } # Create the text (or bitmap) at location 0 0 set id [Fdisp_Label $canvas $f $text] set bbox [$canvas bbox $id] set twidth [expr [lindex $bbox 2]-[lindex $bbox 0]] set theight [expr [lindex $bbox 3]-[lindex $bbox 1]] if {($twidth + $fdisp(xgap)/2 + $x > $width) || (($fdisp(oneCol) && !$iscache) && ($y > $y1 || $x > $x1))} { incr y [expr {$fdisp(ygap) + $maxy}] set x $x1 set maxy $fdisp(itemHeight) ;# Per row max item height } if {$theight > $maxy} { set maxy $theight } # Move it into position after we see how big it is. $canvas move $id $x $y incr x [expr {$fdisp(xgap) + $twidth}] # Determine style of the box, depending on nesting if {[string compare $f $folder] == 0} { set ftype goParent } else { if [Flist_SubFolders $f] { if $iscache { # This supresses the drop-shadow in the cache display, # but also turns off the redisplay mode behavior... set ftype leaf } else { set ftype hasNested } } else { set ftype leaf } } set box [Fdisp_Box $fdisp($can) $id $ftype $tag] FdispUpdateMap $can $f $id FdispUpdateBmap $can $f $box $bindProc $can $id $ftype $f if {$fdisp(popdownAction) != "enter"} { $bindProc $can $box $ftype $f } } return [expr $y + $maxy] } proc Fdisp_Label { canvas f text } { global fdisp folderInfo fdispSpecial if [info exists folderInfo(bitmap,$f)] { set special 0 if [info exists folderInfo(fg,$f)] { set fg $folderInfo(fg,$f) set special 1 } else { set fg black } if [info exists folderInfo(bg,$f)] { set bg $folderInfo(bg,$f) set special 1 } else { set bg white } set id [$canvas create bitmap 0 0 -anchor nw \ -bitmap $folderInfo(bitmap,$f) \ -foreground $fg -background $bg] if {! $special} { $canvas addtag bitmap withtag $id } else { lappend fdispSpecial($canvas) $id set fdispSpecial($canvas,$id) [list $fg $bg] } } else { set id [$canvas create text 0 0 -anchor nw \ -justify center -text $text -font $fdisp(font) -tag text] } return $id } proc Fdisp_FixupSpecials { canvas } { global fdispSpecial if ![info exists fdispSpecial($canvas)] { return } foreach id $fdispSpecial($canvas) { if [info exists fdispSpecial($canvas,$id)] { set fg [lindex $fdispSpecial($canvas,$id) 0] set bg [lindex $fdispSpecial($canvas,$id) 1] $canvas itemconfigure $id -background $bg -foreground $fg } } } proc Fdisp_ClearSpecials { canvas } { global fdispSpecial if ![info exists fdispSpecial($canvas)] { return } foreach id $fdispSpecial($canvas) { unset fdispSpecial($canvas,$id) } unset fdispSpecial($canvas) } proc Fdisp_Box { canvas tid ftype {tag {}} } { # outline box. I note that for variable width fonts, # the bbox is too long. Oh well. global fdisp if {$tag != {}} { $canvas addtag $tag withtag $tid } set bbox [$canvas bbox $tid] set x1 [expr {[lindex $bbox 0] - 1}] set x2 [expr {[lindex $bbox 2] + 1}] set y1 [expr {[lindex $bbox 1] - 1}] set y2 [expr {[lindex $bbox 3] + 1}] set box [$canvas create rect $x1 $y1 $x2 $y2 -fill $fdisp(c_bg) \ -tags [list box $tag]] # Need one box for a dropshadow, and then one extra box to ensure # a stippled foreground obscures the dropshadow box if {[string compare $ftype goParent] == 0} { $canvas lower [$canvas create rect $x1 $y1 $x2 $y2 \ -fill $fdisp(c_bg) -tags $tag] $canvas lower [$canvas create rect \ [expr $x1+3] [expr $y1+3] [expr $x2+3] [expr $y2+3] \ -fill $fdisp(c_bg) -tags $tag] } else { if {[string compare $ftype hasNested] == 0} { $canvas lower [$canvas create rect $x1 $y1 $x2 $y2 \ -fill $fdisp(c_bg) -tags $tag] $canvas lower [$canvas create rect \ [expr $x1+3] [expr $y1+3] [expr $x2+3] [expr $y2+3] \ -fill $fdisp(c_fg) -tags $tag] } } $canvas raise $tid ;# display text over top the box return $box } proc FdispBindLabel { can id ftype f } { global fdisp set canvas $fdisp($can) $canvas bind $id <$fdisp(curbutton)> [list Folder_Change $f] if {$fdisp(tarbuttonAction) == "select+move"} { $canvas bind $id <$fdisp(tarbutton)> \ [list Folder_TargetMove $f] } elseif {$fdisp(tarbuttonAction) == "select+copy"} { $canvas bind $id <$fdisp(tarbutton)> \ [list Folder_TargetCopy $f] } elseif {$fdisp(tarbuttonAction) == "select only"} { $canvas bind $id <$fdisp(tarbutton)> \ [list Folder_Target $f] } else { $canvas bind $id <$fdisp(tarbutton)> \ [list Folder_TargetMove $f] } $canvas bind $id \ [list Folder_TargetCopy $f] $canvas bind $id \ [list Folder_TargetClear] if {[string compare $ftype goParent] == 0} { $canvas bind $id <$fdisp(navbutton)> \ [list FdispMain [file dirname $f]] } else { if {[string compare $ftype hasNested] == 0} { if {$can != "cache"} { case $fdisp(popdownAction) { redisplay { $canvas bind $id <$fdisp(navbutton)> \ [list FdispMain $f] } enter { $canvas bind $id \ [list FdispDisplayPopdown $f down %x %y] } navbutton { $canvas bind $id <$fdisp(navbutton)> \ [list FdispDisplayPopdown $f down %x %y] } } } else { if {$fdisp(popdownAction) == "redisplay"} { $canvas bind $id <$fdisp(navbutton)> \ [list FdispMain $f] } } } else { # Leaf if {$fdisp(popdownAction) == "redisplay"} { $canvas bind $id <$fdisp(navbutton)> {} } else { if {$fdisp(popdownRemove) == "navbutton"} { $canvas bind $id <$fdisp(navbutton)> FdispPopdownRemove } else { # Use enter on another leaf label to simulate Leave # of the popdown. Cannot bind to on the popdown # background because that triggers when you enter one # of its own labels. $canvas bind $id FdispPopdownRemove } } } } } proc FdispSetCanvasSize { can maxy {noshrink 0}} { global fdisp set canvas $fdisp($can) set w $fdisp(width,$can) set height [winfo height $canvas] set bd [$canvas cget -borderwidth] incr bd [$canvas cget -highlightthickness] set height [expr $height - 2*$bd] set h [expr $maxy + $fdisp(ygap) + $fdisp(ygap)] if {$height > $h} {set h $height} #puts "SetSize $maxy->$h [lindex [$canvas cget -scrollregion] 3]" if {$noshrink && [lindex [$canvas cget -scrollregion] 3] > $h} { return } $canvas configure -scrollregion [list 0 0 $w $h] # adjust background to cover new scrollregion $canvas coords $fdisp(bgid,$can) 0 0 $w $h } proc FdispUpdateMap { can folder id } { global fdisp $fdisp($can) addtag Ftext=$folder withtag $id } proc FdispUpdateBmap { can folder box } { global fdisp $fdisp($can) addtag Fbox=$folder withtag $box } proc FdispGetMap { can folder } { global fdisp return [$fdisp($can) find withtag Ftext=$folder] } proc FdispGetBmap { can folder } { global fdisp return [$fdisp($can) find withtag Fbox=$folder] } # Routines to Highlight the folder display proc Fdisp_ResetHighlights {} { global fdisp Fdisp_ClearHighlights Fdisp_HighlightCanvas canvas if [info exists fdisp(cache)] { Fdisp_HighlightCanvas cache } } proc Fdisp_ClearHighlights {} { global fdisp FdispClearHighlights canvas if [info exists fdisp(cache)] { FdispClearHighlights cache } } proc Fdisp_HighlightCanvas { can } { global fdisp flist if ![info exist fdisp($can)] { return } if {$fdisp(cur,$can) != {}} { FdispHighlightCur $can $fdisp(cur,$can) } if {$fdisp(tar,$can) != {}} { FdispHighlightTarget $can $fdisp(tar,$can) } foreach f [Flist_UnseenFolders] { FdispHighlightUnseen $can $f } Fdisp_LabelConfigure $fdisp($can) } proc FdispWhichLabel { can f } { # Figure out what label to highlight, handling nesting global fdisp mhProfile if {"$can" == "cache" || [FdispNotDotDot $can $f]} { return $f } while {[string compare $f "."] && [string compare $f "/"]} { set nf [file dirname $f] if {[string compare $nf $f] == 0} { break } set f $nf if [FdispNotDotDot $can $f] { return $f } } return {} } proc FdispAllLabels { can f } { # Figure out what labels to highlight, returning # multiple labels if they are present because of popdowns. global fdisp mhProfile set res {} if [FdispNotDotDot $can $f] { lappend res $f } while {[string compare $f "."] && [string compare $f "/"]} { set nf [file dirname $f] if {[string compare $nf $f] == 0} { break } set f $nf if [FdispNotDotDot $can $f] { lappend res $f } } return $res } # See if the folder label displayed for $f is ".." (and is displayed at all) proc FdispNotDotDot { can f } { global fdisp set map [FdispGetMap $can $f] if {$map != {}} { if [catch {$fdisp($can) itemcget $map -text} l] { if [string compare $f ".."] { return 1 } } else { if [string compare $l ".."] { return 1 } } } return 0 } proc Fdisp_HighlightCur { f } { global fdisp Fcache_Folder $f foreach can {canvas cache} { if [info exists fdisp($can)] { FdispHighlightCur $can $f Fdisp_LabelConfigure $fdisp($can) } } } proc FdispHighlightCur { can f } { global fdisp set l [FdispWhichLabel $can $f] set canvas $fdisp($can) if {$fdisp(curid,$can) != {}} { $canvas dtag $fdisp(curid,$can) cur[$canvas type $fdisp(curid,$can)] $canvas dtag $fdisp(boxid,$can) curbox } set fdisp(cur,$can) $f if {[string compare $l {}]} { set id [FdispGetMap $can $l] set box [FdispGetBmap $can $l] $canvas addtag cur[$canvas type $id] withtag $id $canvas addtag curbox withtag $box set fdisp(curid,$can) $id set fdisp(boxid,$can) $box } } proc Fdisp_HighlightTarget { f } { global fdisp fcache if $fcache(cacheTarget) { Fcache_Folder $f } foreach can {canvas cache} { if [info exists fdisp($can)] { FdispHighlightTarget $can $f Fdisp_LabelConfigure $fdisp($can) } } } proc FdispHighlightTarget { can f } { global fdisp set l [FdispWhichLabel $can $f] set canvas $fdisp($can) if {$fdisp(tarid,$can) != {}} { $canvas dtag $fdisp(tarid,$can) tar[$canvas type $fdisp(tarid,$can)] $canvas dtag $fdisp(tboxid,$can) tarbox } set fdisp(tar,$can) $f if {[string compare $l {}]} { set id [FdispGetMap $can $l] set box [FdispGetBmap $can $l] $canvas addtag tar[$canvas type $id] withtag $id $canvas addtag tarbox withtag $box set fdisp(tarid,$can) $id set fdisp(tboxid,$can) $box } } proc Fdisp_HighlightUnseen { f } { global fdisp fcache if $fcache(cacheUnseen) { Fcache_Folder $f } foreach can {canvas cache} { if [info exists fdisp($can)] { FdispHighlightUnseen $can $f Fdisp_LabelConfigure $fdisp($can) } } } proc FdispHighlightUnseen { can f } { global exmh fdisp if {$can != "cache"} { set ll [FdispAllLabels $can $f] } else { set ll [list $f] } set canvas $fdisp($can) foreach l $ll { set id [FdispGetMap $can $l] set box [FdispGetBmap $can $l] $canvas addtag leaf=$f withtag $id if {[lsearch $fdisp(leafs,$can) leaf=$f] < 0} { # needed when resetting highlights lappend fdisp(leafs,$can) leaf=$f } $canvas addtag unsn[$canvas type $id] withtag $id $canvas addtag unsnbox withtag $box } } proc Fdisp_UnHighlightUnseen { f } { global fdisp foreach can {canvas cache} { if [info exists fdisp($can)] { FdispUnHighlightUnseen $fdisp($can) $can $f Fdisp_LabelConfigure $fdisp($can) } } } proc FdispUnHighlightUnseen { canvas can f } { global exmh fdisp set ll [FdispAllLabels $can $f] set canvas $fdisp($can) foreach l $ll { set id [FdispGetMap $can $l] set box [FdispGetBmap $can $l] set stillLight 0 foreach tag [$canvas gettags $id] { if [string match leaf=* $tag] { set leaf [lindex [split $tag =] 1] if {[string compare $leaf $f] == 0} { $canvas dtag $id $tag } else { set stillLight 1 } } } if {! $stillLight} { $canvas dtag $id unsn[$canvas type $id] $canvas dtag $box unsnbox } } } proc Fdisp_Lines { canvas labels } { # Return the number of lines needed to display the set of labels global fdisp set x $fdisp(xgap) set lines 1 set width [winfo width $canvas] set bd [$canvas cget -borderwidth] incr bd [$canvas cget -highlightthickness] set width [expr $width - 2*$bd] foreach folder $labels { set f [Fcache_FolderName $folder] set id [Fdisp_Label $canvas $f $f] set bbox [$canvas bbox $id] set twidth [expr [lindex $bbox 2]-[lindex $bbox 0]] if {$twidth + $fdisp(xgap)/2 + $x > $width} { incr lines set x $fdisp(xgap) } incr x [expr {$fdisp(xgap) + $twidth}] $canvas delete $id } return $lines } # # Interface to Drag & Drop # set fdispDrag(callback) FdispDragRelease set fdispDrag(types) {folder filename} set fdispDrag(formats) string set fdispDrag(format,folder) string set fdispDrag(format,filename) string set fdispDrag(type,string) folder set fdispDrag(decorate) FdispDragWindow proc FdispDragAttach {where} { global fdisp Drag_Attach $fdisp($where) FdispDragSelect Shift $fdisp(navbutton) if [string match cache $where] { Drop_Attach $fdisp(cache) FdispDropCache } else { Drop_Attach $fdisp(canvas) FdispDropCanvas } } # A drag was dropped on the cache proc FdispDropCache {w args} { global dragging if ![info exists dragging(data,folder)] return set folder $dragging(data,folder) # Add the folder to the cache Fcache_Folder $folder } # A drag was dropped on the canvas proc FdispDropCanvas {w args} { global fdisp dragging if ![info exists dragging(data,folder)] return set folder $dragging(data,folder) # If dropped on the folder display and source was cache, # remove the folder from the cache if {[info exists fdisp(cache)] && $dragging(source) == $fdisp(cache)} { Fcache_FolderDiscard $folder } } # Called when after a drag we sourced has been dropped proc FdispDragRelease {dstw args} { global fdisp dragging set folder $dragging(data,folder) tlog-add .t "released on $dstw" # If we tossed it somewhere unknown, Add the folder to the cache if {$dragging(source) == $fdisp(canvas) && $dstw != $fdisp(canvas) && "$dstw" != {}} { Fcache_Folder $folder } } # Drag Selected proc FdispDragSelect {c x y wx wy} { global fdisp set closest [$c find closest [$c canvasy $wx] [$c canvasy $wy]] # Find what folder we're over set tags [$c gettags $closest] set which [lsearch -glob $tags F*=*] if {$which >= 0} { set tag [lindex $tags $which] regsub -- .*=(.*) $tag {\1} folder } if ![info exists folder] return # Hand off to Drag code global fdispDrag mhProfile set fdispDrag(source) $c set fdispDrag(data,folder) $folder set fdispDrag(data,filename) $mhProfile(path)/$folder Drag_Source fdispDrag $x $y } # How do decorate the Drag window proc FdispDragWindow {w} { global fdisp dragging set c $w.fdisp if ![winfo exists $c] { set height [expr $fdisp(itemHeight) + $fdisp(ygap)] canvas $c -height $height } pack $c catch {$c delete all} set f $dragging(data,folder) set id [Fdisp_Label $c $f $f] set bbox [$c bbox $id] set twidth [expr [lindex $bbox 2]-[lindex $bbox 0]] set theight [expr [lindex $bbox 3]-[lindex $bbox 1]] $c move $id [expr $fdisp(xgap)/2 + 1] [expr $fdisp(ygap)/2] set width [expr $twidth + $fdisp(xgap)] $c config -width $width set bid [Fdisp_Box $c $id leaf {}] } exmh-2.8.0/lib/seditExtras.tcl000644 001047 000144 00000077533 11743564225 016563 0ustar00welchusers000000 000000 # seditExtras # # Extra functions for the edit # # Copyright (c) 1994 Xerox Corporation. # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # makes no warranty about the software, its performance or its conformity to # any specification. # # proc SeditWhom { draft f t } { global sedit set parent [file root $f] if {[winfo exists $parent.whom]} { destroy $parent.whom return } # Do an unformatted save so Mh_Whom gets the right info set format $sedit($t,format) set sedit($t,format) Never if [catch { SeditSave $draft $t SeditDirty $t } err] { set sedit($t,format) $format SeditMsg $t $err return } set sedit($t,format) $format set id [file tail $draft] catch {Mh_Whom $id} result set lines [llength [split $result \n]] set f2 [Widget_Frame $parent whom {top fill}] set height [expr {$lines > 8 ? 8 : $lines}] set t2 [Widget_Text $f2 $height] $t2 configure -height $height ;# Widget_Text broken $t2 insert 1.0 $result $t2 config -state disabled pack $f2 -before $f -side top } proc SeditSign { draft t {f ~/.signature} } { global sedit if {[catch {glob $f} sig] || [string length $f]==0} { return } set exec 0 if [file executable $sig] { set sig "|$sig $sedit($t,isigc) $sedit($t,isigf) $draft" set exec 1 } else { if ![file readable $sig] { return } } global sedit if [catch { set in [open $sig] set signature [read $in] # check for 8bit characters in the signature set 8bit 0 if [regexp "\[\x80-\xff\]" $signature] { set 8bit 1 } if {!$sedit($t,multi)} { if ($sedit(sigDashes)) { $t insert $sedit(sigPosition) "\n-- \n" } else { $t insert $sedit(sigPosition) \n\n } # check for 8bit characters in the signature if $8bit { set sedit($t,8bit) 1 } $t insert $sedit(sigPosition) $signature } else { set type text/plain if $8bit { append type "; charset=iso-8859-1" } $t mark set fileinsert [SeditAppendPart $type] $t insert fileinsert \n $t insert fileinsert $signature } close $in } err] { if $exec { SeditMsg $t "Bogus execute permission on signature file?" Exmh_Status "Check execute bit on signature file" } else { SeditMsg $t $err Exmh_Status $err } } } proc SeditSignIntelligent { draft t {f ~/.signature} } { global sedit intelligentSign global mhProfile set tmp_fmt $sedit($t,format) set sedit($t,format) Never set saveokay [SeditSave $draft $t {} 0] set sedit($t,format) $tmp_fmt set cmd {exec whom $draft} if {!$saveokay || [catch {eval $cmd} rcpts]} { Exmh_Status "Error finding recipients; using default signature $f" } else { regsub -all " at " $rcpts "@" rcpts regsub -all "(^|\n)(\[^@\n\]+(\n|\$))+" $rcpts "\\1" rcpts foreach domn $intelligentSign(domain) { regsub -all "(^|\n)(\[^\n\]+$domn\[^\n\]*(\n|\$))+" $rcpts {} rcpts } if {[regexp {[a-zA-Z0-9]} $rcpts]} { set f $intelligentSign(external) Exmh_Status "Using external signature $f" } else { set f $intelligentSign(internal) Exmh_Status "Using internal signature $f" } } SeditSign $draft $t $f } proc SeditInsertFile { draft t file {newpart 0} {encoding {}} {type text/plain} {desc {}}} { global sedit mime quote if {$newpart < 0} { return } Exmh_Status "SeditInsertFile $file $type $desc" if ![file readable $file] { SeditMsg $t "Cannot read $file" } else { if {[regexp ^text $type]} { if [catch {open $file r} in] { SeditMsg $t $in return } while {![eof $in]} { set buf [read $in 8192] if {[regexp "\[\x80-\xff\]" $buf]} { set sedit($t,8bit) 1 break } } close $in } set uuname [file tail $file] if ![regexp name= $type] { append type " ; name=\"$uuname\"" } if [$t compare insert <= hlimit] { $t mark set insert "hlimit +1c" } if {$file == $quote(filename)} { # Special case for inserting '@', which is a symlink to a message # Initially the encoding is text/plain, bug we auto-detect inserting QP set inheaders 1 set quoted 0 set continuation 0 Exmh_Debug "SeditInsertFile insert quote file" set in [open $file] while {[gets $in line] > -1} { if {! $inheaders || !$quote(symlink)} { if {!$quoted} { $t insert insert $sedit(pref,replPrefix)$line\n } else { if {$continuation} { $t insert insert [mime::qp_decode $line] ;# need leading space here? } else { $t insert insert $sedit(pref,replPrefix)[mime::qp_decode $line] } set continuation [regexp =$ $line] } } else { # This simple hack doesn't work for multiparts. # XXX - I don't know how to get to this code block, because if # quote(symlink) is ON, then the whole Quote menu is disabled. # If quote(symlink) is OFF, then we use the code above, and then # the quoted state bit is never set. XXX if [regexp -nocase {^content-transfer-encoding:.*quoted-printable} $line] { Exmh_Debug "SeditInsertFile detects QP" set quoted 1 set sedit($t,8bit) 1 if {$sedit($t,quote) < 0} { # Promote this part to quoted-printable set sedit($t,quote) 1 } } if {$quote(headers)} { $t insert insert $sedit(pref,replPrefix)$line\n } if {[string length $line] == 0} { set inheaders 0 } } } } else { if {$newpart} { set ix [SeditMimeType $type] if {[string length $ix] == 0} { return } set mark fileinsert $t mark set $mark $ix if {$desc != {}} { $t insert $mark "Content-Description: " set sel1 [$t index $mark] $t insert $mark "$desc\n" set sel2 [$t index "$mark -1 char"] $t tag add sel $sel1 $sel2 } if {$encoding != {}} { $t insert $mark "Content-Transfer-Encoding: $encoding\n" } if {$mime(eudora)} { if $mime(dosname) { set filename [Mime_EudoraFilename $file] } else { set filename [file tail $file] } $t insert $mark \ "Content-Disposition: attachment; filename=\"$filename\"\n" } $t insert $mark \n } else { set mark insert } switch -- $encoding { base64 { if {[info exist mime(encode)]} { $t insert $mark [exec $mime(encode) -b < $file] } elseif {[info exist mime(recode)]} { $t insert $mark [exec $mime(recode) data..base64 < $file] } else { Base64_EncodeInit state old length set in [open $file] fconfigure $in -encoding binary -translation binary while {![eof $in]} { $t insert $mark [Base64_EncodeBlock [read $in 4096] state old length] } $t insert $mark [Base64_EncodeTail state old length] } } quoted-printable { if {[info exist mime(encode)]} { $t insert $mark [exec $mime(encode) -q < $file] } elseif {[info exist mime(recode)]} { $t insert $mark [exec $mime(recode) data..qp < $file] } else { set line_cnt 0 ;# Accumulate lines before calling the encoder set buffer "" set in [open $file] while {[gets $in line] >= 0} { append buffer $line\n incr line_cnt if {$line_cnt > 1000} { $t insert $mark [::mime::qp_encode $buffer] set line_cnt 0 set buffer "" } } $t insert $mark [::mime::qp_encode $buffer] } } x-uuencode { $t insert $mark "Error: x-uuencode attachments not supported\n" } "" - none - default { set in [open $file] $t insert $mark [read $in] } } } catch {close $in} catch {close $filein} if [info exists tfile] { File_Delete $tfile } focus $t SeditDirty $t } } proc SeditCiteSelection { draft t } { global sedit address if [catch {selection get} line] { SeditMsg $t "No selection" return } # check for 8bit characters in the selection if [regexp "\[\x80-\xff\]" $line] { set sedit($t,8bit) 1 } $t insert insert "\n$address said:\n" # Divide selection into groups separated by blank lines # Control-A is used as a pseudo-newline regsub -all "\n\n+" $line \x01 line set space "" set limit [expr {$sedit(lineLength) - [string length $sedit(pref,replPrefix)]}] set cutoff [expr {int($limit * .8)}] regsub -all {]|[.^$*+|()\[\\]} $sedit(pref,replPrefix) {\\&} pattern foreach line [split $line \x01] { # Preserve line breaks that start with white space or the replPrefix regsub -all "\n(\[\ \t\n\]+)" $line \x01\\1 line regsub -all "\n$pattern" $line \x01 line # Eliminate leading replPrefix regsub "^$pattern" $line "" line # Eliminate other line breaks regsub -all \n $line " " line foreach line [split $line \x01] { while {[string length $line] > $limit} { set hit 0 for {set c $limit} {$c >= $cutoff} {incr c -1} { set char [string index $line $c] if [regexp \[\ \t\n>/\] $char] { set hit 1 break } } if !$hit { set c $limit } set newline [string trimright [string range $line 0 $c]] $t insert insert "$sedit(pref,replPrefix)$newline\n" set space \n incr c set line [string range $line $c end] } $t insert insert "$sedit(pref,replPrefix)$line\n" } $t insert insert $space } } proc Sedit_FormatParagraph { t } { global sedit address if [catch {$t index "sel.first linestart"} first] { set first [$t index "insert linestart"] set last [$t index "insert lineend"] while 1 { set line [$t get $first "$first lineend"] set len [string length $line] if {$len == 0} { break } set first [$t index "$first - 1line"] if {[regexp ^-- $line] || [$t compare $first <= hlimit]} { break } } set first [$t index "$first + 1line"] while 1 { set line [$t get "$last linestart" $last] set len [string length $line] if {($len == 0) || [regexp ^-- $line]} { set last [$t index "$last - 1line lineend +1char"] break } set nlast [$t index "$last + 1line lineend"] if {[$t compare $nlast == $last]} { break } set last $nlast } } else { set last [$t index "sel.last lineend"] } set line [$t get $first "$last -1char"] set tags [$t tag names $first] $t delete $first $last $t mark set insert $first # Divide selection into groups separated by blank lines # Control-A is used as a pseudo-newline regsub -all "\n\n+" $line \x01 line set space "" set limit $sedit(lineLength) set cutoff 0 # Escape Tcl specials regsub -all {]|[.^$*+|()\[\\]} $sedit(pref,replPrefix) {\\&} pattern foreach line [split $line \x01] { # Preserve line breaks that start with white space or the replPrefix regsub -all "\n(\[\ \t\n\]+)" $line \x01\\1 line regsub -all "\n$pattern" $line \x01 line # Eliminate other line breaks regsub -all " *\n" $line " " line $t insert insert $space set space \n foreach line [split $line \x01] { while {[string length $line] > $limit} { set hit 0 for {set c $limit} {$c >= $cutoff} {incr c -1} { set char [string index $line $c] if [regexp \[\ \t\n>/\] $char] { set hit 1 break } } if !$hit { set c $limit } set newline [string trimright [string range $line 0 $c]] $t insert insert "$newline\n" $tags incr c set line [string range $line $c end] } $t insert insert "$line\n" $tags } } $t mark set insert "insert -1char" } proc SeditInsertFileDirect { draft t } { global sedit set name [FSBox "Select file name" "" read] if {$name != ""} { if [file readable $name] { # check for 8bit characters in the file catch { set in [open $name] if [regexp "\[\x80-\xff\]" [read $in]] { set sedit($t,8bit) 1 } close $in } SeditInsertFile $draft $t $name } else { SeditMsg $t "Cannot read $name" } } } proc SeditInsertFileDialog { draft t } { global sedit set name [FSBox "Select file name" "" read] if {$name != ""} { if [file readable $name] { set options [SeditFormatDialog $t $name] eval {SeditInsertFile $draft $t $name} $options Sedit_FixPgpFormat [SeditId $draft] } else { SeditMsg $t "Cannot read $name" } } } # Thanks to Anders Klemets, klemets@it.kth.se, for the message/external feature. # Valdis Kletnieks, 12/15/1999 - re-write for sane support of RFC2017 URL # references - ask for type *first*, and handle the cases differently. proc SeditInsertExternalDialog { draft t } { global sedit env catch {destroy $t.format} set f [frame $t.format -bd 2 -relief ridge] message $f.msg -text "Access type?" -aspect 1000 pack $f.msg -side top -fill both set b1 [frame $f.but1 -bd 10 -relief flat] set b3 [frame $f.but3 -bd 10 -relief flat] pack $b1 $b3 -side top button $b3.plain -text "Cancel" -command [list SeditFormatNewPart $t $f -1] button $b3.newpart -text "OK" -command [list SeditFormatNewPart $t $f 1] pack $b3.plain $b3.newpart -side left -padx 3 radiobutton $b1.local -text "Local file" -variable sedit($t,extaccesstype) -value LOCAL-FILE radiobutton $b1.anon -text "Anonymous FTP" -variable sedit($t,extaccesstype) -value ANON-FTP radiobutton $b1.url -text "URL" -variable sedit($t,extaccesstype) -value URL pack $b1.local $b1.anon $b1.url -side left -padx 3 $b1.local select set sedit($t,encoding) {} set sedit($t,compress) {} set sedit($t,newpart) 0 set sedit($t,extaccesstype) local Widget_PlaceDialog $t $f tkwait window $f if {$sedit($t,extaccesstype) == "URL"} { set name {} set options [SeditExternalUrlDialog $t $name] } else { set name [FSBox "(Optionally) Select file name" "" read] set options [SeditExternalFileDialog $t $name] } set tmpfname [Mime_TempFile extern] if [catch {open $tmpfname w} fp] { SeditMsg $t $fp return } puts $fp "Content-Type: $sedit($t,exttype)" # Construct content-id regsub -all " |:" [exec date] _ date puts $fp [format "Content-ID: <%s_%s@%s>\n" $env(USER) $date \ [exec hostname]] close $fp eval {SeditInsertFile $draft $t $tmpfname} $options Sedit_FixPgpFormat [SeditId $draft] File_Delete $tmpfname } proc SeditExternalFileDialog { t name } { global sedit catch {destroy $t.format} set f [frame $t.format -bd 2 -relief ridge] message $f.msg1 -text "Insert external reference to file" -aspect 1000 pack $f.msg1 -side top -fill both Widget_BeginEntries 15 30 [list SeditFormatNewPart $t $f 1] set sedit($t,desc) [file tail $name] Widget_LabeledEntry $f.e0 Description: sedit($t,desc) catch {exec hostname} sedit($t,extsite) Widget_LabeledEntry $f.e1 Site: sedit($t,extsite) set sedit($t,extdirectory) [file dirname $name] Widget_LabeledEntry $f.e2 Directory: sedit($t,extdirectory) set sedit($t,extname) [file tail $name] Widget_LabeledEntry $f.e3 "File name" sedit($t,extname) Widget_BindEntryCmd $f.e3.entry \ [list SeditTweakContentType sedit($t,extname) sedit($t,exttype) $sedit($t,extname)] SeditTweakContentType sedit($t,extname) sedit($t,exttype) $name Widget_LabeledEntry $f.e4 "Content-Type:" sedit($t,exttype) set sedit($t,trans-mode) image Widget_LabeledEntry $f.e5 "Transfer mode:" sedit($t,trans-mode) Widget_EndEntries set b3 [frame $f.but3 -bd 10 -relief flat] button $b3.plain -text "Cancel" -command [list SeditFormatNewPart $t $f -1] button $b3.newpart -text "OK" -command [list SeditFormatNewPart $t $f 1] pack $b3.plain $b3.newpart -side left -padx 3 pack $b3 -side top Widget_PlaceDialog $t $f tkwait window $f if {$sedit($t,extaccesstype) == "LOCAL-FILE"} { set sedit($t,type) "message/external-body;\n\tname=\"$sedit($t,extdirectory)/$sedit($t,extname)\";\n\taccess-type=$sedit($t,extaccesstype)" if {[string length $sedit($t,extsite)] != 0} { append sedit($t,type) ";\n\tsite=\"$sedit($t,extsite)\"" } } else { set sedit($t,type) "message/external-body;\n\tname=\"$sedit($t,extname)\";\n\tsite=\"$sedit($t,extsite)\";\n\taccess-type=$sedit($t,extaccesstype);\n\tdirectory=\"$sedit($t,extdirectory)\";\n\tmode=\"$sedit($t,trans-mode)\"" } return [list $sedit($t,newpart) $sedit($t,encoding) $sedit($t,type) $sedit($t,desc)] } proc SeditExternalUrlDialog { t name } { global sedit catch {destroy $t.format} set f [frame $t.format -bd 2 -relief ridge] message $f.msg1 -text "Insert external reference to URL" -aspect 1000 pack $f.msg1 -side top -fill both Widget_BeginEntries 15 30 [list SeditFormatNewPart $t $f 1] set sedit($t,desc) {} Widget_LabeledEntry $f.e0 Description: sedit($t,desc) set sedit($t,url) {} Widget_LabeledEntry $f.e1 URL: sedit($t,url) Widget_BindEntryCmd $f.e1.entry \ [list SeditTweakContentType sedit($t,url) sedit($t,exttype) $sedit($t,url)] set sedit($t,exttype) "text/html" Widget_LabeledEntry $f.e2 "Content-Type:" sedit($t,exttype) Widget_EndEntries set b3 [frame $f.but3 -bd 10 -relief flat] button $b3.plain -text "Cancel" -command [list SeditFormatNewPart $t $f -1] button $b3.newpart -text "OK" -command [list SeditFormatNewPart $t $f 1] pack $b3.plain $b3.newpart -side left -padx 3 pack $b3 -side top Widget_PlaceDialog $t $f tkwait window $f set sedit($t,name) [file tail $sedit($t,url)]; set sedit($t,type) "message/external-body;\n\tURL=\"$sedit($t,url)\";\n\taccess-type=URL" return [list $sedit($t,newpart) $sedit($t,encoding) $sedit($t,type) $sedit($t,desc)] } proc SeditTweakContentType { nameVar contentVar filenameOrig } { global sedit upvar #0 $nameVar name upvar #0 $contentVar content if {[ string length $filenameOrig ] == 0 } { set filenameOrig $name } if [catch {SeditGuessContentType $filenameOrig} content] { Exmh_Status $content set content $sedit(defaultType) } } proc SeditFormatDialog { t name } { global sedit set f [frame $t.format -bd 2 -relief ridge] if [catch {SeditGuessContentType $name} sedit($t,type)] { Exmh_Status $sedit($t,type) set sedit($t,type) "$sedit(defaultType); name=\"[file tail $name]\"" } message $f.msg1 -text "File Insert [file tail $name]" -aspect 1000 pack $f.msg1 -side top -fill both Widget_BeginEntries 13 30 [list SeditFormatNewPart $t $f 1] Widget_LabeledEntry $f.e1 "Content-Type:" sedit($t,type) set sedit($t,desc) [file tail $name] Widget_LabeledEntry $f.e2 "Description:" sedit($t,desc) Widget_EndEntries message $f.msg -text "Transfer encoding?" -aspect 1000 pack $f.msg -side top -fill both set b1 [frame $f.but1 -bd 10 -relief flat] set b3 [frame $f.but3 -bd 10 -relief flat] pack $b1 $b3 -side top set sedit($t,encoding) {} set sedit($t,compress) {} set sedit($t,newpart) 0 button $b3.plain -text "Cancel" -command [list SeditFormatNewPart $t $f -1] button $b3.newpart -text "OK" -command [list SeditFormatNewPart $t $f 1] pack $b3.plain $b3.newpart -side left -padx 3 radiobutton $b1.none -text "None" -variable sedit($t,encoding) -value {} radiobutton $b1.base64 -text "Base64" -variable sedit($t,encoding) -value base64 radiobutton $b1.quoted -text "QuotedPrintable" -variable sedit($t,encoding) -value quoted-printable radiobutton $b1.uu -text "X-uuencode" -variable sedit($t,encoding) -value x-uuencode pack $b1.none $b1.base64 $b1.quoted $b1.uu -side left -padx 3 # Guess an appropriate content transfer encoding for this part, # based on recommendations in Appendix F of the MIME RFC. switch -glob -- $sedit($t,type) { text/plain { $b1.none select } text/* { $b1.quoted select } multipart/* { $b1.none select } message/* { $b1.none select } application/postscript { $b1.quoted select } application/* { $b1.base64 select } image/* { $b1.base64 select } audio/* { $b1.base64 select } video/* { $b1.base64 select } * { $b1.base64 select } } Widget_PlaceDialog $t $f tkwait window $f return [list $sedit($t,newpart) $sedit($t,encoding) $sedit($t,type) $sedit($t,desc)] } proc SeditFormatNewPart { t f {doit 0} } { global sedit set sedit($t,newpart) $doit destroy $f } proc SeditSpell { draft f t } { global sedit editor wish argv0 set parent [file root $f] if {[winfo exists $parent.spell]} { destroy $parent.spell return } # Do an unformatted save so spell gets the right info set path [Env_Tmp]/exmh.s[pid].[file tail $t] SeditSaveBody $t $path set async_hack 0 switch -- $sedit(spell) { ispell {set prog "exmh-async xterm -e ispell" ; set async_hack 1} custom {set prog $editor(spell)} default {set prog spell} } if {[regexp ^exmh-async $prog]} { set async_hack 1 } if {$async_hack} { # exmh-async isn't really right # craft a wish script instead set script [Env_Tmp]/exmh.w[pid].[file tail $t] if [catch {open $script w} out] { Exmh_Status $out return 0 } puts $out "wm withdraw ." puts $out "catch \{" puts $out "exec [lrange $prog 1 end] $path" puts $out "\}" puts $out [list send [winfo name .] [list SeditReplaceBody $t $path]] puts $out "file delete -force $path" puts $out "file delete -force $script" puts $out exit close $out exec $wish -f $script & return } # Display the results of the spell program catch {eval exec $prog {$path}} result catch {file delete -force $path} set f2 [Widget_Frame $parent spell {top fill}] set lines [llength [split $result \n]] set height [expr {$lines > 8 ? 8 : $lines}] set t2 [Widget_Text $f2 $height] $t2 configure -height $height ;# Widget_Text broken $t2 insert 1.0 $result $t2 config -state disabled pack $f2 -before $f -side top } proc Sedit_Find {draft t} { global sedit if [catch {selection get} string] { SeditMsg $t "Select a string first" return } # hack global find if ![info exists find(line)] { set find(line) {} } if ![info exists find(lasthit)] { set find(lasthit) {} } set sedit(searchWidget) $t set match [Find_Inner $string forw $find(line) [lindex [split [$t index end] .] 0] Sedit_FindMatch nofeedback] case $match { 0 { SeditMsg $t "Next search will wrap." } -1 { SeditMsg $t "$string not found" } default { SeditMsg $t $draft $t mark set insert sel.first focus $t } } } proc Sedit_FindMatch { L string } { global sedit return [FindTextMatch $sedit(searchWidget) $L $string] } proc SeditGuessContentType { filenameOrig } { global exmh mimeType sedit set filename [string tolower $filenameOrig] set type {} if ![info exists mimeType] { SeditLoadMimeTypes } if [regexp -- {^([1-9][0-9]*|@)$} [file tail $filename]] { return message/rfc822 } set suffix [file extension $filename] set newfilename [file rootname $filename] while {$newfilename != $filename} { if [info exists mimeType($suffix)] { set type $mimeType($suffix) } set filename $newfilename set suffix "[file extension $filename]$suffix" set newfilename [file rootname $filename] } if {[string length $type] == 0} { if [catch {set type [mailcap_guess_content_type $filename]}] { if {[string length [set type [Mime_Magic $filenameOrig]]] == 0} { return $sedit(defaultType) } } } return $type } proc SeditLoadMimeTypes {} { global exmh mimeType env mimetypes_default # A few defaults set mimeType(.au) audio/basic set mimeType(.gif) image/gif set mimeType(.ps) application/postscript set mimeType(.txt) text/plain SeditReadMimeTypes $exmh(library)/mime.types ;# depreciated SeditReadMimeTypes $exmh(library)/local.mime.types ;# depreciated SeditReadMimeTypes $mimetypes_default ;# new SeditReadMimeTypes $env(HOME)/.mime.types SeditReadMimeTypes $exmh(userLibrary)/user.mime.types } proc SeditReadMimeTypes {file} { global mimeType if [catch {open $file} in] { return } while {[gets $in line] >= 0} { if [regexp {^( )*$} $line] { continue } if [regexp {^( )*#} $line] { continue } if [regexp {([^ ]+)[ ]+(.+)$} $line match type rest] { foreach item [split $rest] { if [string length $item] { set mimeType(.$item) $type } } } } } proc SeditCheckForIsigHeader { t hdrline } { # Check whether there's an existing X-Exmh-Isig-Folder or # X-Exmh-Isig-CompType header line if {[catch {set end [$t index hlimit]}] && [catch {set end [$t index header]}]} { set end end } set X [$t get 1.0 $end] if {![regexp -nocase "(^|\n)x-exmh-isig-$hdrline:\[ \t\]*(\[^\n\]*)\n" $X bin1 bin2 cont]} { return {} } return $cont } proc SeditSetIsigHeader { t hook svar evar } { global exmh sedit intelligentSign set cont [eval SeditCheckForIsigHeader $t $hook] if {$cont == {}} { set sedit($t,$svar) $exmh($evar) if {$intelligentSign(showhdrs)} { $t insert 1.0 "X-Exmh-Isig-$hook: $sedit($t,$svar)\n" } } else { set sedit($t,$svar) $cont if {!$intelligentSign(showhdrs)} { if {[catch {set end [$t index hlimit]}] && [catch {set end [$t index header]}]} { set end end } for {set spos [$t search -regexp -nocase "^x-exmh-isig-$hook:.*\$" 1.0 $end]} {$spos != {}} {} { set sidx [$t index $spos] regexp {([0-9]*)\..*} $sidx bin1 line incr line $t delete $spos $line.0 set spos [$t search -regexp -nocase "^x-exmh-isig-$hook:.*\$" 1.0 $end] } } } } proc SeditCheckForIsigHeaders { t } { global sedit set cont [SeditCheckForIsigHeader $t CompType] if {$cont != {}} { set sedit($t,isigc) $cont } set cont [SeditCheckForIsigHeader $t Folder] if {$cont != {}} { set sedit($t,isigf) $cont } } proc SeditSetIsigHeaders { t ctype} { global exmh SeditSetIsigHeader $t CompType isigc $ctype SeditSetIsigHeader $t Folder isigf folder } # proc SeditClip: Use Clip from Sedit as a previewer proc SeditClip {draft t} { global mhProfile if [SeditIsDirty $t] { if ![SeditSave $draft $t] { return 0 } SeditDirty $t ;# force abort check } set id [SeditId $draft] if [regexp {^[0-9]+$} $id] { set f $mhProfile(draft-folder) } else { set f [file dirname $id] set id [file tail $id] } Msg_Clip $f $id } # Stub for users of Sedit_Mailto proc Sedit_Mailto { url } { Msg_Mailto $url } # Run MHN now to format a message proc SeditMHN {draft t} { global env sedit editor set format $sedit($t,format) set sedit($t,format) Never # add these two clauses from SeditSend if {$sedit($t,mhn)} { SeditFixupMhn $draft $t } if {$sedit(iso)} { SeditFixupCharset $draft $t } if [catch {SeditSave $draft $t {} 0} err] { SeditMsg $t $err set sedit($t,format) $format return } set sedit($t,format) $format set env(mhdraft) $draft if [catch {exec $editor(mhn) $draft} err] { SeditMsg $t $err } else { if [catch {open $draft r} in] { SeditMsg $t "Cannot open $draft" } else { $t delete 1.0 end SeditMimeReset $t $t insert 1.0 [read $in] close $in SeditPositionCursor $t SeditMimeParse $t } } } # The next three procedures add widgets that let you filter selected # text through an arbitrary Unix filter. proc SeditShellDo {t e m b} { global SeditShellUndoText if {![info exists SeditShellUndoText]} { set SeditShellUndoText "" } set c [string trim [$e get]] set last_idx [$m index last] set insert 1 if {[string compare $last_idx none]} { for {set idx 0} {$idx <= $last_idx} {incr idx} { set label [lindex [$m entryconfigure $idx -label] end] if {![string compare $label $c]} { set insert 0 break } } } if {$insert == 1} { set fh [open [glob ~]/.exmh/exmh-shell-history a] puts $fh \ "\$m add command -label {$c} -command \[list SeditShellMenu \$e {$c} \$b\]" close $fh $m add command -label $c -command [list SeditShellMenu $e $c $b] } if {![catch {set tndx [$t index sel.first]}] && ![catch {set selection [selection get]}]} { set SeditShellUndoText $selection if {![catch {set res [exec -keepnewline sh -c "$c" << $selection]}]} { $t delete sel.first sel.last $t mark set insert $tndx $t insert insert $res sel } } } proc SeditShellUndo {t} { global SeditShellUndoText if {![info exists SeditShellUndoText]} { set SeditShellUndoText "" } if {![catch {set tndx [$t index sel.first]}]} { $t delete sel.first sel.last $t mark set insert $tndx $t insert insert $SeditShellUndoText sel } } proc SeditShellMenu {e c b} { $e delete 0 end $e insert end $c $b invoke } proc SeditShellCreate {t} { set w [winfo parent [winfo parent $t]] if {![winfo exists $w.jkf]} { set w $w.jkf pack [frame $w] -side top -fill x -ipady 2 -expand no pack [frame $w.f1] -side top -fill x -expand no set f1 $w.f1 set e $f1.e set m $f1.m.m set b $f1.b1 set b2 $f1.b2 pack [label $f1.l -text Filter] -side left pack [entry $e] -side left -expand yes -fill x -ipady 2 pack [button $b -text Filter \ -command [list SeditShellDo $t $e $m $b]] -side left -ipady 2 pack [button $b2 -text Undo \ -command [list SeditShellUndo $t]] -side left -ipady 2 pack [menubutton $f1.m -text History -menu $m] -side left -ipady 2 menu $m -tearoff false if {![catch { source [glob ~]/.exmh/exmh-shell-history } res]} { Exmh_Debug "Couldn't source shell history: $res" } # Without this, the new widgets aren't always visible. event generate $t } } proc SeditExternalCmd { draft t cmd } { # Save message, process with external command, and reload # last argument to command will be draft file name. SeditSave $draft $t if [catch {eval exec $cmd $draft} err] { Exmh_Debug "$err while executing external command." } else { if [catch {open $draft r} in] { SeditMsg $t "Cannot open $draft" } else { $t delete 1.0 end SeditMimeReset $t $t insert 1.0 [read $in] close $in SeditPositionCursor $t SeditMimeParse $t } } } proc SeditAttachQuotedMessage { draft t name } { global sedit if {$name != ""} { if [file readable $name] { set options [SeditFormatDialog $t $name] eval {SeditInsertFile $draft $t $name} $options } else { SeditMsg $t "Cannot read $name" } } } proc SeditInsertMessageDialog { draft t } { global sedit msg set name [FSBox "Select message" $msg(path) read] if {$name != ""} { if [file readable $name] { set options [SeditFormatDialog $t $name] eval {SeditInsertFile $draft $t $name} $options Sedit_FixPgpFormat [SeditId $draft] } else { SeditMsg $t "Cannot read $name" } } } # I had this in pgp.tcl, but I don't want that entire file loaded # if this is called. proc Sedit_FixPgpFormat {id} { global pgp if {$pgp(enabled) && ($pgp(format,$id) == "plain")} { Exmh_Status "Changed PGP encoding from plain to multipart" set pgp(format,$id) "pm" } } exmh-2.8.0/lib/seditSel.tcl000644 001047 000144 00000012771 11743564225 016031 0ustar00welchusers000000 000000 proc SeditCiteSelectionPar { draft t } { global sedit address if [catch {selection get} txt] { SeditMsg $t "No selection" return } $t insert insert "\n$address wrote:\n" regsub -all "(\n|^)" $txt "\\1$sedit(pref,replPrefix)" txt set res [exec par -rTbgqR -B=.\?_A_a -Q=_s\>\| $sedit(lineLength) << $txt] $t insert insert "$res\n" } proc SeditCiteSelectionNoFmt { draft t } { global sedit address if [catch {selection get} txt] { SeditMsg $t "No selection" return } $t insert insert "\n$address wrote:\n" regsub -all "(\n|^)" $txt "\\1$sedit(pref,replPrefix)" txt $t insert insert "$txt\n" } proc Sedit_FormatParagraphPar { t } { global sedit address if [catch {$t index "sel.first linestart"} first] { set first [$t index "insert linestart"] set last [$t index "insert lineend"] while 1 { set line [$t get $first "$first lineend"] set len [string length $line] if {$len == 0} { break } set first [$t index "$first - 1line"] if {[regexp ^-- $line] || [$t compare $first <= hlimit]} { break } } set first [$t index "$first + 1line"] while 1 { set line [$t get "$last linestart" $last] set len [string length $line] if {($len == 0) || [regexp ^-- $line]} { set last [$t index "$last - 1line lineend +1char"] break } set nlast [$t index "$last + 1line lineend"] if {[$t compare $nlast == $last]} { break } set last $nlast } } else { set last [$t index "sel.last lineend"] } set line [$t get $first "$last -1char"] set tags [$t tag names $first] SeditMsg $t "Reformatting paragraph..." if [catch {set fmtline [exec par -rTbgqR -B=.\?_A_a -Q=_s\>\| $sedit(lineLength) << [set line]]}] { SeditMsg $t "par error" } else { $t delete $first $last $t mark set insert $first if {[string compare "" $fmtline] != 0} { $t insert insert "$fmtline\n" } SeditMsg $t "" } $t mark set insert "insert -1char" } proc SeditSelFmt {t} { global sedit if [catch {selection get} txt] { SeditMsg $t "No selection" return } set res [exec par -rTbgqR -B=.\?_A_a -Q=_s\>\| $sedit(lineLength) << $txt] if ![catch {$t index sel.first} tndx] { $t delete sel.first sel.last } else { set tndx [$t index insert] } $t mark set insert $tndx $t insert insert "$res\n" } proc SeditSelFmtArg {t} { global par sedit set par(t) $t if [catch {selection get} par(txt)] { SeditMsg $t "No selection" return } if [Exwin_Toplevel .par "Format" Format] { set par(options) "rTbgqR" set par(body) ".?_A_a" set par(quote) "_s>|" set par(protect) "" set par(width) $sedit(lineLength) .par.but.quit configure -command {Exwin_Dismiss .par nosize} Widget_BeginEntries 7 17 Widget_LabeledEntry .par.options "Options:" par(options) Widget_LabeledEntry .par.body "Body:" par(body) Widget_LabeledEntry .par.quote "Quote:" par(quote) Widget_LabeledEntry .par.protect "Protect:" par(protect) Widget_LabeledEntry .par.width "Width:" par(width) Widget_AddBut .par.but format "Format" { Exmh_Status "Formatting Selection" if [catch {exec par -$par(options) -B=$par(body) -Q=$par(quote) -P=$par(protect) $par(width) << $par(txt)} res] { Exmh_Status "Error: Invalid options for Par" warning } else { if ![catch {$par(t) index sel.first} tndx] { $par(t) delete sel.first sel.last } else { set tndx [$par(t) index insert] } $par(t) mark set insert $tndx $par(t) insert insert "$res\n" Exmh_Status "" Exwin_Dismiss .par nosize } } } } proc SeditSelSpell { f t } { global sedit editor wish argv0 set parent [file root $f] catch {[destroy $parent.spell]} if [catch {selection get} txt] { SeditMsg $t "No selection" return } set path [Env_Tmp]/exmh.s[pid].[file tail $t] set out [open $path w 0600] puts $out $txt close $out set async_hack 0 switch -- $sedit(spell) { ispell {set prog "exmh-async xterm -e ispell" ; set async_hack 1} custom {set prog $editor(spell)} default {set prog spell} } if {[regexp ^exmh-async $prog]} { set async_hack 1 } if {$async_hack} { # exmh-async isn't really right # craft a wish script instead set script [Env_Tmp]/exmh.w[pid].[file tail $t] if [catch {open $script w 0600} out] { Exmh_Status $out return 0 } puts $out "wm withdraw ." puts $out "catch \{" puts $out "exec [lrange $prog 1 end] $path" puts $out "\}" puts $out [list send [winfo name .] [list SeditReplaceSel $t $path]] puts $out "file delete -force $path" puts $out "file delete -force $script" puts $out exit close $out exec $wish -f $script & return } # Display the results of the spell program catch {eval exec $prog {$path}} result catch {file delete -force $path} set f2 [Widget_Frame $parent spell {top fill}] set lines [llength [split $result \n]] set height [expr {$lines > 8 ? 8 : $lines}] set t2 [Widget_Text $f2 $height] $t2 configure -height $height ;# Widget_Text broken $t2 insert 1.0 $result $t2 config -state disabled pack $f2 -before $f -side top } proc SeditReplaceSel { t infile } { set in [open $infile] if ![catch {$t index sel.first} tndx] { $t delete sel.first sel.last } else { set tndx [$t index insert] } $t mark set insert $tndx $t insert insert [read -nonewline $in] close $in } exmh-2.8.0/lib/seditQP.tcl000640 001047 000144 00000012161 10120761454 015602 0ustar00welchusers000000 000000 # seditQP # # Crude quoted-printable support for sedit # # Copyright (c) 1994 Xerox Corporation. # Use and copying of this software and preparation of derivative works based # upon this software are permitted. Any distribution of this software or # derivative works must comply with all applicable United States export # control laws. This software is made available AS IS, and Xerox Corporation # makes no warranty about the software, its performance or its conformity to # any specification. proc SeditInitMimeType { draft t } { # This is really lame. # The code from mime.tcl needs to be generalized so it can # reparse draft files. global sedit exmh set id $sedit($t,id) if {$exmh($id,action) == "dist"} { return } $t mark set cursor insert for {set i 1} {1} {incr i} { set line [$t get $i.0 $i.end] set len [string length $line] if [regexp -nocase {content-type:(.*)$} $line match type] { return } if {$len == 0 || [regexp ^-- $line]} { break } } SeditMsg $t "MIME type text/plain ; charset=$sedit(charset)" SeditMimeType text/plain promote $t mark set insert cursor } proc SeditFixupEncoding { draft t quote } { if [catch {open $draft} in] { SeditMsg $t $out error "Cannot read draft to quote it" } global mime if [catch {open $draft.new w} out] { close $in SeditMsg $t $out error "Cannot fix encoding: $out" } if {$quote} { SeditMsg $t "Quoting text" Exmh_Debug Quoting text } else { SeditMsg $t "8-bit encoding" Exmh_Debug 8-bit encoding } set state header set done 0 set needCoder 0 set type text set typeActive 0 set boundaries {} for {set len [gets $in line]} {$len >= 0} {set len [gets $in line]} { if {$state == "header"} { if [regexp -nocase content-transfer-encoding $line] { Exmh_Debug coding already done set done 1 } if {[regexp "^\[ \t]" $line] && $typeActive} { append type $line } if [regexp -nocase {content-type:(.*)$} $line match type] { set typeActive 1 } else { set typeActive 0 } if {$len == 0 || [regexp ^-- $line]} { set state body set params [split $type \;] set type [string tolower [string trim [lindex $params 0]]] Exmh_Debug type $type foreach sub [lrange $params 1 end] { if [regexp {([^=]+)=(.+)} $sub match key val] { set key [string trim [string tolower $key]] set val [string trim $val \ \"] if {[string compare $key boundary] == 0} { # push new boundary onto the stack set boundaries [linsert $boundaries 0 $val] } } } if {! $done && [regexp -nocase text $type]} { set needCoder 1 Exmh_Debug needCoder $type } } if {$needCoder} { set savedLine $line } else { if {$quote} { puts $out [SeditQuoteHeader $line] } else { puts $out $line } } } else { foreach b $boundaries { if [regexp ^--$b\(--\)?\$ $line match alldone] { catch {unset do_qp} set type text if {[string compare $alldone --] == 0} { # should pop boundary stack set done 1 } else { set state header set typeActive 0 set type text set done 0 } set needCoder 0 Exmh_Debug no coder $line } } if {$needCoder} { set needCoder 0 Exmh_Debug coding if {$quote} { puts $out "Content-Transfer-Encoding: quoted-printable" set do_qp 1 } else { puts $out "Content-Transfer-Encoding: 8bit" } puts $out $savedLine flush $out } if [info exists do_qp] { # don't bother with mime(encode) line-at-a-time puts $out [mime::qp_encode $line] } else { puts $out $line } } } close $out close $in Mh_Rename $draft.new $draft } proc SeditQuoteHeader { line } { global sedit set newline {} set begin 1 if [regexp {^([ ]+)(.*)} $line match space value] { set newline $space set line $value } elseif [regexp {^([^: ]+:[ ]*)(.*)} $line match key value] { set newline $key set line $value } set hithit 0 while {[string length $line] > 0} { if [regexp -indices {^([^][\(\)<>@,;:"/\?\.= ]*)([][\(\)<>@,;:"/\?\.= ]*)} $line match word special] { set x [expr [lindex $special 1]+1] set word [eval {string range $line} $word] set special [eval {string range $line} $special] if {[string length $special] == 0} { set line {} } else { set line [string range $line $x end] } set hit 0 foreach char [split $word {}] { scan $char %c code if {$code > 127} { set hit 1 Exmh_Debug Hit $code $char break } } if {! $hit} { set hithit 0 append newline $word $special } else { append newline =?$sedit(charset)?Q? if {$hithit} { append newline _ } foreach char [split $word {}] { scan $char %c code if {$code > 127 || $char == "_" || $char == "=" || $char == {?}} { append newline [format =%X $code] } else { append newline $char } } append newline ?= $special set hithit 1 } } else { Exmh_Debug Fail <$line> append newline $line set line {} } } return $newline } exmh-2.8.0/lib/pgpWWW.tcl000644 001047 000144 00000011234 10101246044 015420 0ustar00welchusers000000 000000 # # PGP functions to query for public keys via WWW # author: Carl Roth # # query the keyserver: # # # # Added keyfetching method hkp # -- Markus Gruber # proc Pgp_WWW_Init {} { global pgp # preferences set pgp(pref,keyserver) { keyserver KeyServer "pgp-public-keys@keys.pgp.net" {Favorite public key server} "When a signature check fails because of a missing key, exmh allows you to ask a key server for the key. Please select a key server that's close to you so as to spread the load. Examples include pgp-public-keys@pgp.mit.edu pgp-public-keys@keys.pgp.net pgp-public-keys@keys.us.pgp.net There are pgp-public-keys@keys.*.pgp.net servers for these domains: ch de es fi kr nl no uk us pt se hr tw pl See also http://www.pgp.net/pgpnet/" } # set pgp(pref,keyserverUrl) { keyserverUrl KeyServerURL {http://keys.pgp.com:11371/pks/lookup?op=get&exact=on&search=0x%s} {URL to fetch keys interactively} "The WWW keyserver is forms based. Enter a URL here where the key id (sans 0x) is substituted with %s (using format)" } # set pgp(pref,keyquerymethod) { keyquerymethod KeyQueryMethod {CHOICE hkp WWW email other} {Method for querying