diff options
Diffstat (limited to 'mac')
-rw-r--r-- | mac/README | 105 | ||||
-rw-r--r-- | mac/bugs.doc | 8 | ||||
-rw-r--r-- | mac/tkMac.h | 10 | ||||
-rw-r--r-- | mac/tkMacAppInit.c | 16 | ||||
-rw-r--r-- | mac/tkMacBitmap.c | 35 | ||||
-rw-r--r-- | mac/tkMacButton.c | 665 | ||||
-rw-r--r-- | mac/tkMacClipboard.c | 6 | ||||
-rw-r--r-- | mac/tkMacColor.c | 127 | ||||
-rw-r--r-- | mac/tkMacConfig.c | 45 | ||||
-rw-r--r-- | mac/tkMacCursor.c | 26 | ||||
-rw-r--r-- | mac/tkMacDefault.h | 11 | ||||
-rw-r--r-- | mac/tkMacDialog.c | 776 | ||||
-rw-r--r-- | mac/tkMacDraw.c | 240 | ||||
-rw-r--r-- | mac/tkMacEmbed.c | 6 | ||||
-rw-r--r-- | mac/tkMacFont.c | 1988 | ||||
-rw-r--r-- | mac/tkMacHLEvents.c | 18 | ||||
-rw-r--r-- | mac/tkMacInit.c | 6 | ||||
-rw-r--r-- | mac/tkMacInt.h | 8 | ||||
-rw-r--r-- | mac/tkMacKeyboard.c | 70 | ||||
-rw-r--r-- | mac/tkMacMenu.c | 495 | ||||
-rw-r--r-- | mac/tkMacMenubutton.c | 18 | ||||
-rw-r--r-- | mac/tkMacMenus.c | 10 | ||||
-rw-r--r-- | mac/tkMacPort.h | 6 | ||||
-rw-r--r-- | mac/tkMacProjects.sea.hqx | 1274 | ||||
-rw-r--r-- | mac/tkMacResource.r | 23 | ||||
-rw-r--r-- | mac/tkMacSend.c | 330 | ||||
-rw-r--r-- | mac/tkMacShLib.exp | 1 | ||||
-rw-r--r-- | mac/tkMacSubwindows.c | 5 | ||||
-rw-r--r-- | mac/tkMacTest.c | 3 | ||||
-rw-r--r-- | mac/tkMacWindowMgr.c | 103 | ||||
-rw-r--r-- | mac/tkMacWm.c | 164 | ||||
-rw-r--r-- | mac/tkMacXStubs.c | 93 |
32 files changed, 4757 insertions, 1934 deletions
@@ -1,4 +1,4 @@ -Tk 8.0.5 for Macintosh +Tk 8.1 for Macintosh by Ray Johnson Scriptics Corporation @@ -8,7 +8,7 @@ Jim Ingham Cygnus Solutions jingham@cygnus.com -RCS: @(#) $Id: README,v 1.7 1999/04/16 01:25:54 stanton Exp $ +RCS: @(#) $Id: README,v 1.8 1999/04/16 01:51:29 stanton Exp $ 1. Introduction --------------- @@ -22,51 +22,12 @@ directory. 2. What's new? ------------- -Native Look & Feel!!! We now try really hard to support the -Macintosh Look & Feel with Tcl/Tk 8.0. We aren't finished but -it look pretty good. Let me know what are the most "un-mac like" -problems and I'll fix them as quickly as I can. - -The button, checkbutton, radiobutton, and scrollbar widgets actually -use the Mac toolbox controls. This means that they will track the -look&feel if you use extension that change the appearance of -applications (like Aaron.) We also use "system" colors so the default -backgrounds etc. will also change colors. We plan to support this -feature - so let me know if something doesn't work quite right. -Unfortunantly, we are not able to change the colors of buttons under -MacOS 8. Doing this is discouraged under Appearance, and we will probably -not implement it anytime soon. - -We also now support native menus! By using the new -menu option -on toplevels you can have a menubar that is cross platform. You -can also place Tk menus in the Apple and Help menus! Check out -the documentation for more details. Syd Polk <icepick@eng.sun.com> is -the author of the new menu code. Feel free to contact him if you -have questions or comments about the menu mechanism. - -As of Tk 8.0.4, MacTk menus will adopt the backgrounds, shape, separator, etc -of the current theme. - -The "tk_messageBox" command on the Macintosh is now much more -mac-like. I'll probably still need to adjust this more - but it -looks a hell of alot better than it did before. - -I've also added a command that allows you to get more native window -styles. However, we have yet to decide on a cross platform solution -to the problem of varying window styles. None the less, I thought -it would be use full to add the capability in an unsupported means -to tide you over until a better solution is available. The command -is called "unsupported1". It can be used in the following way: - - toplevel .foo; unsupported1 style .foo zoomDocProc - -The above command will create a document window with a zoom box. -Type "unsupported1 style . ???" to get a list of the supported -styles. The command works like "wm overrideredirect" - you must -make the call before the window is mapped. - -As always - report the bugs you find - including asthetic ones -in the look & feel of widgets. +All the widgets will now display internationalized text! + +The widget configuration package has been changed to support the new object +model introduced with the 8.0 compiler. For now the old configuration +package is retained, and in fact, only the menu and button widgets use +the new package. 3. Mac specific features ------------------------ @@ -99,8 +60,8 @@ pointers to where you can find more information about the feature. Mac version of Tk allows you to use several Mac specific icons. See the GetBitmap.3 man page for a complete list. -* The send command does not yet work on the Macintosh. We hope to - have it available in Tk 8.1. +* The send command works among interpreters in the same application. We hope to + have the complete implementation available in Tk 8.1. * The -use and -container options almost work. The focus bugs that were in Tk8.0 final have been fixed. But there are still some @@ -114,7 +75,7 @@ Macintosh Tk is distributed in three different forms. This should make it easier to only download what you need. The packages are as follows: -mactk8.0.5.sea.hqx +mactk8.1.sea.hqx This distribution is a "binary" only release. It contains an installer program that will install a 68k, PowerPC, or Fat @@ -122,13 +83,13 @@ mactk8.0.5.sea.hqx the Tcl & Tk libraries in the Extensions folder inside your System Folder. (No "INIT"'s or Control Pannels are installed.) -mactcltk-full-8.0.5.sea.hqx +mactcltk-full-8.1.sea.hqx This release contains the full release of Tcl and Tk for the Macintosh plus the More Files package on which Macintosh Tcl and Tk rely. -mactk-source-8.0.5.sea.hqx +mactk-source-8.1.sea.hqx This release contains the complete source to Tk for the Macintosh In addition, Metrowerks CodeWarrior libraries and project files @@ -163,7 +124,7 @@ developed. We are working are having better documentation for the Macintosh platform in the future. However, if you have WWW access you may access the Man pages at the following URL: - http://www.scriptics.com/man/tcl8.0/contents.html + http://www.scriptics.com/man/tcl8.1/contents.html Other documentation and sample Tcl scripts can be found at the Tcl ftp site: @@ -180,18 +141,15 @@ available (see below). In order to compile Macintosh Tk you must have the following items: - CodeWarrior Pro 1 or higher (CodeWarrior release 9 or higher can work - and we have project files, but we are depricating support) - 8.0.5 was build with CW Pro 4. - Mac Tcl 8.0 (source) - (which requires More Files 1.4.2 or greater - except not 1.4.4) - Mac Tk 8.0 (source) + CodeWarrior Pro 3 or higher + Mac Tcl 8.1 (source) + (which requires More Files 1.4.2 or 1.4.3) + Mac Tk 8.1 (source) The project files included with the Mac Tcl source should work fine. The only thing you may need to update are the access paths. -As with Tcl, there is something in the initial release of the CW Pro 2 -linker that rendersthe CFM68K version of Wish very unstable. I am -working with Metrowerks to resolve the issue. +As with Tcl, you need to upgrade to the 2.0.1 version of the C +compilers or later to build the CFM68K version of Tcl/Tk. Special notes: @@ -203,20 +161,18 @@ Special notes: to the menu system, though you have to have Appearance 1.0.1 or later installed for this to work. -* If you get the Unix tar file, it will untar into a directory - tcl8.0.5. However, the Macintosh project files expect the folder to - be called tcl8.0. You will need to rename the folder to tcl8.0, or - change all the paths in the project files. +* If you get the Unix tar file, it will untar into a directory tcl8.0.4. However, + the Macintosh project files expect the folder to be called tcl8.0. You will need + to rename the folder to tcl8.0, or change all the paths in the project files. + 7. About Dialog --------------- -There is now a way to replace the default dialog box for the Wish -application. If you create the tcl procedure "tkAboutDialog" it will -be called instead of creating the default dialog box. Your procedure -is then responsible for displaying a window, removing it, etc. This -interface is experimental and may change in the future - tell me what -you think of it. +The prefered method for replacing the about dialog is to replace the +main menubar of the application, using the -menu option for the "." +window. Then add a cascade called .mainMenu.apple to your mainMenu, +and you can put an about item in here WITH YOUR OWN LABEL! 8. Apple Events --------------- @@ -304,3 +260,8 @@ future. If you have comments or Bug reports send them to: Jim Ingham jingham@cygnus.com + +or use our on-line bug form at + +http://www.scriptics.com/support/bugForm.html + diff --git a/mac/bugs.doc b/mac/bugs.doc index 071153e..a405487 100644 --- a/mac/bugs.doc +++ b/mac/bugs.doc @@ -4,7 +4,7 @@ by Ray Johnson Sun Microsystems Laboratories rjohnson@eng.sun.com -RCS: @(#) $Id: bugs.doc,v 1.3 1998/11/12 05:59:07 jingham Exp $ +RCS: @(#) $Id: bugs.doc,v 1.4 1999/04/16 01:51:29 stanton Exp $ We are now very close to passing the test suite for Tk. We are very interested in finding remaining bugs that still linger. Please let us @@ -26,7 +26,11 @@ Known bugs: container, so you can watch that instead. All the focus bugs in Tk8.0 have been fixed, however. -* The send command is not yet implemented. +* The send command is only implemented within the same app. + +* You cannot color buttons, and the indicators for radiobuttons and + checkbuttons under Appearance. They will always use the current + Theme color. But, then, you are not supposed to... * Drawing is not really correct. This shows up mostly in the canvas when line widths are greater than one. Unfortunantly, this will not diff --git a/mac/tkMac.h b/mac/tkMac.h index 4c3d362..214822a 100644 --- a/mac/tkMac.h +++ b/mac/tkMac.h @@ -1,5 +1,5 @@ /* - * Tkmacint.h -- + * tkMacInt.h -- * * Declarations of Macintosh specific exported variables and procedures. * @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMac.h,v 1.5 1999/03/10 07:04:44 stanton Exp $ + * RCS: @(#) $Id: tkMac.h,v 1.6 1999/04/16 01:51:29 stanton Exp $ */ #ifndef _TKMAC @@ -44,11 +44,11 @@ typedef int (Tk_MacEmbedMakeContainerExistProc) (Tk_Window window); typedef void (Tk_MacEmbedGetClipProc) (Tk_Window window, RgnHandle rgn); typedef void (Tk_MacEmbedGetOffsetInParentProc) (Tk_Window window, Point *ulCorner); -/* - * Mac Specific functions that are available to extension writers. +/* + * These functions are currently in tkMacInt.h. They are just copied over here + * so they can be exported. */ -#include "tkPlatDecls.h" #pragma export reset diff --git a/mac/tkMacAppInit.c b/mac/tkMacAppInit.c index e95e448..16e83c0 100644 --- a/mac/tkMacAppInit.c +++ b/mac/tkMacAppInit.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacAppInit.c,v 1.7 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacAppInit.c,v 1.8 1999/04/16 01:51:29 stanton Exp $ */ #include <Gestalt.h> @@ -26,14 +26,14 @@ #include "tclMac.h" #ifdef TK_TEST -EXTERN int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +extern int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* TK_TEST */ #ifdef TCL_TEST -EXTERN int Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp)); -EXTERN int Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); -EXTERN int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); -EXTERN int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +extern int Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +extern int Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); +extern int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +extern int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* TCL_TEST */ Tcl_Interp *gStdoutInterp = NULL; @@ -111,7 +111,7 @@ main( * * Results: * Returns a standard Tcl completion code, and leaves an error - * message in interp->result if an error occurs. + * message in the interp's result if an error occurs. * * Side effects: * Depends on the startup script. @@ -325,7 +325,7 @@ SetupMainInterp( return TCL_OK; error: - panic(interp->result); + panic(Tcl_GetStringResult(interp)); return TCL_ERROR; } diff --git a/mac/tkMacBitmap.c b/mac/tkMacBitmap.c index 6f09434..0b71837 100644 --- a/mac/tkMacBitmap.c +++ b/mac/tkMacBitmap.c @@ -3,12 +3,12 @@ * * This file handles the implementation of native bitmaps. * - * Copyright (c) 1996 Sun Microsystems, Inc. + * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacBitmap.c,v 1.2 1998/09/14 18:23:34 stanton Exp $ + * RCS: @(#) $Id: tkMacBitmap.c,v 1.3 1999/04/16 01:51:29 stanton Exp $ */ #include "tkPort.h" @@ -82,7 +82,7 @@ static BuiltInIcon builtInIcons[] = { * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in interp->result. + * returned and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from @@ -100,10 +100,14 @@ TkpDefineNativeBitmaps() char * name; BuiltInIcon *builtInPtr; NativeIcon *nativeIconPtr; + Tcl_HashTable *tablePtr; + ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); for (builtInPtr = builtInIcons; builtInPtr->name != NULL; builtInPtr++) { name = Tk_GetUid(builtInPtr->name); - predefHashPtr = Tcl_CreateHashEntry(&tkPredefBitmapTable, name, &new); + tablePtr = TkGetBitmapPredefTable(); + predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &new); if (!new) { continue; } @@ -128,7 +132,7 @@ TkpDefineNativeBitmaps() * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in interp->result. + * returned and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from @@ -188,7 +192,7 @@ TkpCreateNativeBitmap( * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is - * returned and a message is left in interp->result. + * returned and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from @@ -210,19 +214,28 @@ TkpGetNativeAppBitmap( GWorldPtr destPort; Rect destRect; Handle resource; - int type; + int type, destWrote; + Str255 nativeName; + + /* + * macRoman is the encoding that the resource fork uses. + */ + + Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), name, + strlen(name), 0, NULL, + (char *) &nativeName[1], + 255, NULL, &destWrote, NULL); /* Internalize native */ + nativeName[0] = destWrote; - c2pstr(name); - resource = GetNamedResource('cicn', (StringPtr) name); + resource = GetNamedResource('cicn', nativeName); if (resource != NULL) { type = TYPE3; } else { - resource = GetNamedResource('ICON', (StringPtr) name); + resource = GetNamedResource('ICON', nativeName); if (resource != NULL) { type = TYPE2; } } - p2cstr((StringPtr) name); if (resource == NULL) { return NULL; diff --git a/mac/tkMacButton.c b/mac/tkMacButton.c index 237f0b2..cdc609b 100644 --- a/mac/tkMacButton.c +++ b/mac/tkMacButton.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacButton.c,v 1.4 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacButton.c,v 1.5 1999/04/16 01:51:29 stanton Exp $ */ #include "tkButton.h" @@ -28,7 +28,7 @@ #define DRAW_LABEL 0 /* Labels are treated genericly. */ #define DRAW_CONTROL 1 /* Draw using the Native control. */ #define DRAW_CUSTOM 2 /* Make our own button drawing. */ -#define DRAW_BEVEL 3 +#define DRAW_BEVEL 3 /* * The following structures are used to draw our controls. Rather than @@ -85,17 +85,17 @@ static pascal void UserPaneBackgroundProc(ControlHandle, */ static int UpdateControlColors _ANSI_ARGS_((TkButton *butPtr, - ControlRef controlHandle, CCTabHandle ccTabHandle, - RGBColor *saveColorPtr)); + ControlRef controlHandle, CCTabHandle ccTabHandle, + RGBColor *saveColorPtr)); static void DrawBufferedControl _ANSI_ARGS_((TkButton *butPtr, - GWorldPtr destPort, GC gc, Pixmap pixmap)); + GWorldPtr destPort, GC gc, Pixmap pixmap)); static void InitSampleControls(); static void SetupBevelButton _ANSI_ARGS_((TkButton *butPtr, - ControlRef controlHandle, - GWorldPtr destPort, GC gc, Pixmap pixmap)); + ControlRef controlHandle, + GWorldPtr destPort, GC gc, Pixmap pixmap)); static void ChangeBackgroundWindowColor _ANSI_ARGS_(( - WindowRef macintoshWindow, RGBColor rgbColor, - RGBColor *oldColor)); + WindowRef macintoshWindow, RGBColor rgbColor, + RGBColor *oldColor)); static void ButtonExitProc _ANSI_ARGS_((ClientData clientData)); /* @@ -193,17 +193,17 @@ TkpDisplayButton( offset = (butPtr->type == TYPE_BUTTON) && hasImageOrBitmap; border = butPtr->normalBorder; - if ((butPtr->state == tkDisabledUid) && (butPtr->disabledFg != NULL)) { + if ((butPtr->state == STATE_DISABLED) && (butPtr->disabledFg != NULL)) { gc = butPtr->disabledGC; } else if ((butPtr->type == TYPE_BUTTON) - && (butPtr->state == tkActiveUid)) { + && (butPtr->state == STATE_ACTIVE)) { gc = butPtr->activeTextGC; border = butPtr->activeBorder; } else { gc = butPtr->normalTextGC; } - if ((butPtr->flags & SELECTED) && (butPtr->state != tkActiveUid) + if ((butPtr->flags & SELECTED) && (butPtr->state != STATE_ACTIVE) && (butPtr->selectBorder != NULL) && !butPtr->indicatorOn) { border = butPtr->selectBorder; } @@ -218,10 +218,10 @@ TkpDisplayButton( relief = butPtr->relief; if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) { - if (!TkMacHaveAppearance() || !hasImageOrBitmap) { + if (!TkMacHaveAppearance() || !hasImageOrBitmap) { relief = (butPtr->flags & SELECTED) ? TK_RELIEF_SUNKEN - : TK_RELIEF_RAISED; - } + : TK_RELIEF_RAISED; + } } /* @@ -230,11 +230,11 @@ TkpDisplayButton( */ if (butPtr->type == TYPE_BUTTON) { - Tk_Fill3DRectangle(tkwin, pixmap, butPtr->highlightBorder, 0, 0, - Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); + Tk_Fill3DRectangle(tkwin, pixmap, butPtr->highlightBorder, 0, 0, + Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); } else { - Tk_Fill3DRectangle(tkwin, pixmap, butPtr->normalBorder, 0, 0, - Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); + Tk_Fill3DRectangle(tkwin, pixmap, butPtr->normalBorder, 0, 0, + Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); } if (butPtr->type == TYPE_LABEL) { @@ -251,21 +251,21 @@ TkpDisplayButton( * does not record this call, and so we can't use the * Appearance bevel button here. The only case that would * exercise this is if you use a bitmap, with - * -data & -mask specified. We should probably draw the + * -data & -mask specified. We should probably draw the * appearance button and overprint the image in this case. * This just punts and draws the old-style, ugly, button. */ if (gc->clip_mask == 0) { - drawType = DRAW_BEVEL; + drawType = DRAW_BEVEL; } else { - TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; - if ((clipPtr->type == TKP_CLIP_PIXMAP) && - (clipPtr->value.pixmap != butPtr->bitmap)) { - drawType = DRAW_CUSTOM; - } else { - drawType = DRAW_BEVEL; - } + TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; + if ((clipPtr->type == TKP_CLIP_PIXMAP) && + (clipPtr->value.pixmap != butPtr->bitmap)) { + drawType = DRAW_CUSTOM; + } else { + drawType = DRAW_BEVEL; + } } } } else { @@ -273,15 +273,15 @@ TkpDisplayButton( drawType = DRAW_CONTROL; } else if (hasImageOrBitmap) { if (gc->clip_mask == 0) { - drawType = DRAW_BEVEL; + drawType = DRAW_BEVEL; } else { - TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; - if ((clipPtr->type == TKP_CLIP_PIXMAP) && - (clipPtr->value.pixmap != butPtr->bitmap)) { - drawType = DRAW_CUSTOM; - } else { - drawType = DRAW_BEVEL; - } + TkpClipMask *clipPtr = (TkpClipMask*) gc->clip_mask; + if ((clipPtr->type == TKP_CLIP_PIXMAP) && + (clipPtr->value.pixmap != butPtr->bitmap)) { + drawType = DRAW_CUSTOM; + } else { + drawType = DRAW_BEVEL; + } } } else { drawType = DRAW_CUSTOM; @@ -289,13 +289,13 @@ TkpDisplayButton( } /* - * Draw the native portion of the buttons. Start by creating the control + * Draw the native portion of the buttons. Start by creating the control * if it doesn't already exist. Then configure the Macintosh control from * the Tk info. Finally, we call Draw1Control to draw to the screen. */ if ((drawType == DRAW_CONTROL) || - ((drawType == DRAW_BEVEL) && TkMacHaveAppearance())) { + ((drawType == DRAW_BEVEL) && TkMacHaveAppearance())) { borderWidth = 0; /* @@ -319,7 +319,7 @@ TkpDisplayButton( */ if ((drawType == DRAW_BEVEL) && TkMacHaveAppearance()) { - /* Empty Body */ + /* Empty Body */ } else if (butPtr->image != None) { Tk_SizeOfImage(butPtr->image, &width, &height); @@ -369,12 +369,12 @@ TkpDisplayButton( /* * If the button is disabled with a stipple rather than a special - * foreground color, generate the stippled effect. If the widget + * foreground color, generate the stippled effect. If the widget * is selected and we use a different background color when selected, * must temporarily modify the GC. */ - if ((butPtr->state == tkDisabledUid) + if ((butPtr->state == STATE_DISABLED) && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { @@ -471,7 +471,7 @@ TkpComputeButtonGeometry( } else { Tk_FreeTextLayout(butPtr->textLayout); butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont, - butPtr->text, -1, butPtr->wrapLength, + Tcl_GetString(butPtr->text), -1, butPtr->wrapLength, butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight); width = butPtr->textWidth; @@ -504,7 +504,7 @@ TkpComputeButtonGeometry( /* * The width and height calculation for Appearance buttons with images & - * non-Appearance buttons with images is different. In the latter case, + * non-Appearance buttons with images is different. In the latter case, * we add the borderwidth to the inset, since we are going to stamp a * 3-D border over the image. In the former, we add it to the height, * directly, since Appearance will draw the border as part of our control. @@ -516,7 +516,7 @@ TkpComputeButtonGeometry( * * The highlight width corresponds to the default ring on the Macintosh. * As such, the highlight width is only added if the button is the default - * button. The actual width of the default ring is one less than the + * button. The actual width of the default ring is one less than the * highlight width as there is also one pixel of spacing. * Appearance buttons with images do not have a highlight ring, because the * Bevel button type does not support one. @@ -528,48 +528,48 @@ TkpComputeButtonGeometry( } if ((butPtr->type == TYPE_BUTTON)) { - if ((butPtr->image == None) && (butPtr->bitmap == None)) { + if ((butPtr->image == None) && (butPtr->bitmap == None)) { + butPtr->inset = 0; + if (butPtr->defaultState != STATE_DISABLED) { + butPtr->inset += butPtr->highlightWidth; + } + } else if (TkMacHaveAppearance()) { butPtr->inset = 0; - if (butPtr->defaultState != tkDisabledUid) { - butPtr->inset += butPtr->highlightWidth; - } - } else if (TkMacHaveAppearance()) { - butPtr->inset = 0; - width += (2 * butPtr->borderWidth + 4); - height += (2 * butPtr->borderWidth + 4); + width += (2 * butPtr->borderWidth + 4); + height += (2 * butPtr->borderWidth + 4); } else { - butPtr->inset = butPtr->borderWidth; - width += 2; - height += 2; - if (butPtr->defaultState != tkDisabledUid) { - butPtr->inset += butPtr->highlightWidth; - } - } + butPtr->inset = butPtr->borderWidth; + width += 2; + height += 2; + if (butPtr->defaultState != STATE_DISABLED) { + butPtr->inset += butPtr->highlightWidth; + } + } } else if ((butPtr->type != TYPE_LABEL)) { - if (butPtr->indicatorOn) { + if (butPtr->indicatorOn) { butPtr->inset = 0; } else { - /* - * Under Appearance, the Checkbutton or radiobutton with an image - * is represented by a BevelButton with the Sticky defProc... - * So we must set its height in the same way as the Button - * with an image or bitmap. - */ - if (((butPtr->image != None) || (butPtr->bitmap != None)) - && TkMacHaveAppearance()) { - int border; - butPtr->inset = 0; - if ( butPtr->borderWidth <= 2 ) { - border = 6; - } else { - border = 2 * butPtr->borderWidth + 2; - } - width += border; - height += border; - } else { - butPtr->inset = butPtr->borderWidth; - } - } + /* + * Under Appearance, the Checkbutton or radiobutton with an image + * is represented by a BevelButton with the Sticky defProc... + * So we must set its height in the same way as the Button + * with an image or bitmap. + */ + if (((butPtr->image != None) || (butPtr->bitmap != None)) + && TkMacHaveAppearance()) { + int border; + butPtr->inset = 0; + if ( butPtr->borderWidth <= 2 ) { + border = 6; + } else { + border = 2 * butPtr->borderWidth + 2; + } + width += border; + height += border; + } else { + butPtr->inset = butPtr->borderWidth; + } + } } else { butPtr->inset = butPtr->borderWidth; } @@ -629,9 +629,9 @@ DrawBufferedControl( TkButton *butPtr, /* Tk button. */ GWorldPtr destPort, /* Off screen GWorld. */ GC gc, /* The GC we are drawing into - needed for - * the bevel button */ + * the bevel button */ Pixmap pixmap /* The pixmap we are drawing into - needed - for the bevel button */ + for the bevel button */ ) { ControlRef controlHandle; @@ -641,19 +641,19 @@ DrawBufferedControl( int isBevel = 0; if (windowRef == NULL) { - InitSampleControls(); + InitSampleControls(); } /* * Now swap in the passed in GWorld for the portBits of our fake - * window. We also adjust various fields in the WindowRecord to make + * window. We also adjust various fields in the WindowRecord to make * the system think this is a normal window. * Note, we can use DrawControlInCurrentPort under Appearance, so we don't * need to swap pixmaps. */ if (!TkMacHaveAppearance()) { - ((CWindowPeek) windowRef)->port.portPixMap = destPort->portPixMap; + ((CWindowPeek) windowRef)->port.portPixMap = destPort->portPixMap; } ((CWindowPeek) windowRef)->port.portRect = destPort->portRect; @@ -665,90 +665,90 @@ DrawBufferedControl( /* * Set up control in hidden window to match what we need - * to draw in the buffered window. + * to draw in the buffered window. */ isBevel = 0; switch (butPtr->type) { case TYPE_BUTTON: - if (TkMacHaveAppearance()) { - if ((butPtr->image == None) && (butPtr->bitmap == None)) { - controlHandle = buttonHandle; - ccTabHandle = buttonTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medBevelHandle; - } else { - controlHandle = largeBevelHandle; - } - ccTabHandle = buttonTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } + if (TkMacHaveAppearance()) { + if ((butPtr->image == None) && (butPtr->bitmap == None)) { + controlHandle = buttonHandle; + ccTabHandle = buttonTabHandle; + } else { + if (butPtr->borderWidth <= 2) { + controlHandle = smallBevelHandle; + } else if (butPtr->borderWidth == 3) { + controlHandle = medBevelHandle; + } else { + controlHandle = largeBevelHandle; + } + ccTabHandle = buttonTabHandle; + SetupBevelButton(butPtr, controlHandle, destPort, + gc, pixmap); + isBevel = 1; + } } else { - controlHandle = buttonHandle; - ccTabHandle = buttonTabHandle; + controlHandle = buttonHandle; + ccTabHandle = buttonTabHandle; } break; case TYPE_RADIO_BUTTON: if (TkMacHaveAppearance()) { - if (((butPtr->image == None) && (butPtr->bitmap == None)) - || (butPtr->indicatorOn)) { - controlHandle = radioHandle; - ccTabHandle = radioTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallStickyBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medStickyBevelHandle; - } else { - controlHandle = largeStickyBevelHandle; - } - ccTabHandle = radioTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } + if (((butPtr->image == None) && (butPtr->bitmap == None)) + || (butPtr->indicatorOn)) { + controlHandle = radioHandle; + ccTabHandle = radioTabHandle; + } else { + if (butPtr->borderWidth <= 2) { + controlHandle = smallStickyBevelHandle; + } else if (butPtr->borderWidth == 3) { + controlHandle = medStickyBevelHandle; + } else { + controlHandle = largeStickyBevelHandle; + } + ccTabHandle = radioTabHandle; + SetupBevelButton(butPtr, controlHandle, destPort, + gc, pixmap); + isBevel = 1; + } } else { - controlHandle = radioHandle; - ccTabHandle = radioTabHandle; - } + controlHandle = radioHandle; + ccTabHandle = radioTabHandle; + } break; case TYPE_CHECK_BUTTON: if (TkMacHaveAppearance()) { - if (((butPtr->image == None) && (butPtr->bitmap == None)) - || (butPtr->indicatorOn)) { - controlHandle = checkHandle; - ccTabHandle = checkTabHandle; - } else { - if (butPtr->borderWidth <= 2) { - controlHandle = smallStickyBevelHandle; - } else if (butPtr->borderWidth == 3) { - controlHandle = medStickyBevelHandle; - } else { - controlHandle = largeStickyBevelHandle; - } - ccTabHandle = checkTabHandle; - SetupBevelButton(butPtr, controlHandle, destPort, - gc, pixmap); - isBevel = 1; - } + if (((butPtr->image == None) && (butPtr->bitmap == None)) + || (butPtr->indicatorOn)) { + controlHandle = checkHandle; + ccTabHandle = checkTabHandle; + } else { + if (butPtr->borderWidth <= 2) { + controlHandle = smallStickyBevelHandle; + } else if (butPtr->borderWidth == 3) { + controlHandle = medStickyBevelHandle; + } else { + controlHandle = largeStickyBevelHandle; + } + ccTabHandle = checkTabHandle; + SetupBevelButton(butPtr, controlHandle, destPort, + gc, pixmap); + isBevel = 1; + } } else { - controlHandle = checkHandle; - ccTabHandle = checkTabHandle; - } + controlHandle = checkHandle; + ccTabHandle = checkTabHandle; + } break; } (**controlHandle).contrlRect.left = butPtr->inset; (**controlHandle).contrlRect.top = butPtr->inset; (**controlHandle).contrlRect.right = Tk_Width(butPtr->tkwin) - - butPtr->inset; + - butPtr->inset; (**controlHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin) - - butPtr->inset; + - butPtr->inset; /* * Setting the control visibility by hand does not @@ -756,16 +756,16 @@ DrawBufferedControl( */ if (TkMacHaveAppearance()) { - SetControlVisibility(controlHandle, true, false); - (**userPaneHandle).contrlRect.left = 0; - (**userPaneHandle).contrlRect.top = 0; - (**userPaneHandle).contrlRect.right = Tk_Width(butPtr->tkwin); - (**userPaneHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin); - } else { - (**controlHandle).contrlVis = 255; - } + SetControlVisibility(controlHandle, true, false); + (**userPaneHandle).contrlRect.left = 0; + (**userPaneHandle).contrlRect.top = 0; + (**userPaneHandle).contrlRect.right = Tk_Width(butPtr->tkwin); + (**userPaneHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin); + } else { + (**controlHandle).contrlVis = 255; + } - + if (butPtr->flags & SELECTED) { (**controlHandle).contrlValue = 1; @@ -773,23 +773,23 @@ DrawBufferedControl( (**controlHandle).contrlValue = 0; } - if (butPtr->state == tkActiveUid) { - if (isBevel) { - (**controlHandle).contrlHilite = kControlButtonPart; - } else { + if (butPtr->state == STATE_ACTIVE) { + if (isBevel) { + (**controlHandle).contrlHilite = kControlButtonPart; + } else { switch (butPtr->type) { - case TYPE_BUTTON: + case TYPE_BUTTON: (**controlHandle).contrlHilite = kControlButtonPart; break; - case TYPE_RADIO_BUTTON: + case TYPE_RADIO_BUTTON: (**controlHandle).contrlHilite = kControlRadioButtonPart; break; - case TYPE_CHECK_BUTTON: + case TYPE_CHECK_BUTTON: (**controlHandle).contrlHilite = kControlCheckBoxPart; break; } } - } else if (butPtr->state == tkDisabledUid) { + } else if (butPtr->state == STATE_DISABLED) { (**controlHandle).contrlHilite = kControlInactivePart; } else { (**controlHandle).contrlHilite = kControlNoPart; @@ -815,36 +815,36 @@ DrawBufferedControl( */ if (TkMacHaveAppearance()) { - SetPort((GrafPort *) destPort); + SetPort((GrafPort *) destPort); } else { - SetPort(windowRef); + SetPort(windowRef); } windowColorChanged = UpdateControlColors(butPtr, controlHandle, - ccTabHandle, &saveBackColor); + ccTabHandle, &saveBackColor); if ((butPtr->type == TYPE_BUTTON) && TkMacHaveAppearance()) { - Boolean isDefault; - - if (butPtr->defaultState == tkActiveUid) { + Boolean isDefault; + + if (butPtr->defaultState == STATE_ACTIVE) { isDefault = true; } else { isDefault = false; } SetControlData(controlHandle, kControlNoPart, - kControlPushButtonDefaultTag, - sizeof(isDefault), (Ptr) &isDefault); + kControlPushButtonDefaultTag, + sizeof(isDefault), (Ptr) &isDefault); } if (TkMacHaveAppearance()) { - DrawControlInCurrentPort(userPaneHandle); + DrawControlInCurrentPort(userPaneHandle); } else { - Draw1Control(controlHandle); + Draw1Control(controlHandle); } if (!TkMacHaveAppearance() && - (butPtr->type == TYPE_BUTTON) && - (butPtr->defaultState == tkActiveUid)) { + (butPtr->type == TYPE_BUTTON) && + (butPtr->defaultState == STATE_ACTIVE)) { Rect box = (**controlHandle).contrlRect; RGBColor rgbColor; @@ -866,13 +866,13 @@ DrawBufferedControl( */ if (TkMacHaveAppearance()) { - SetControlVisibility(controlHandle, false, false); - if (isBevel) { - KillPicture(bevelButtonContent.u.picture); - } - } else { - (**controlHandle).contrlVis = 0; - } + SetControlVisibility(controlHandle, false, false); + if (isBevel) { + KillPicture(bevelButtonContent.u.picture); + } + } else { + (**controlHandle).contrlVis = 0; + } LMSetWindowList((WindowRef) ((CWindowPeek) windowRef)->nextWindow); } @@ -882,8 +882,8 @@ DrawBufferedControl( * InitSampleControls -- * * This function initializes a dummy Macintosh window and - * sample controls to allow drawing Mac controls to any GWorld - * (including off-screen bitmaps). + * sample controls to allow drawing Mac controls to any GWorld + * (including off-screen bitmaps). * * Results: * None. @@ -907,9 +907,9 @@ InitSampleControls() * the data structures attached to it are only deallocated * on exit of the application. */ - + windowRef = NewCWindow(NULL, &geometry, "\pempty", false, - zoomDocProc, (WindowRef) -1, true, 0); + zoomDocProc, (WindowRef) -1, true, 0); if (windowRef == NULL) { panic("Can't allocate buffer window."); } @@ -926,15 +926,15 @@ InitSampleControls() SetPort(windowRef); if (TkMacHaveAppearance()) { - OSErr err; - ControlRef dontCare; - - /* - * Adding UserPaneBackgroundProcs to the root control does - * not seem to work, so we have to add another UserPane to - * the root control. - */ - + + OSErr err; + ControlRef dontCare; + + /* Adding UserPaneBackgroundProcs to the root control does + * not seem to work, so we have to add another UserPane to + * the root control. + */ + err = CreateRootControl(windowRef, &dontCare); if (err != noErr) { panic("Can't create root control in DrawBufferedControl"); @@ -942,60 +942,66 @@ InitSampleControls() userPaneHandle = NewControl(windowRef, &geometry, "\p", true, kControlSupportsEmbedding|kControlHasSpecialBackground, - 0, 1, kControlUserPaneProc, (SInt32) 0); + 0, 1, kControlUserPaneProc, (SInt32) 0); SetUserPaneSetUpSpecialBackgroundProc(userPaneHandle, UserPaneBackgroundProc); SetUserPaneDrawProc(userPaneHandle, UserPaneDraw); buttonHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlPushButtonProc, (SInt32) 0); + false, 1, 0, 1, kControlPushButtonProc, (SInt32) 0); EmbedControl(buttonHandle, userPaneHandle); - checkHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlCheckBoxProc, (SInt32) 0); + checkHandle = NewControl(windowRef, &geometry, "\p", + false, 1, 0, 1, kControlCheckBoxProc, (SInt32) 0); EmbedControl(checkHandle, userPaneHandle); - radioHandle = NewControl(windowRef, &geometry, "\p", - false, 1, 0, 1, kControlRadioButtonProc, (SInt32) 0); + radioHandle = NewControl(windowRef, &geometry, "\p", + false, 1, 0, 1, kControlRadioButtonProc, (SInt32) 0); EmbedControl(radioHandle, userPaneHandle); - smallBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 | kControlContentPictHandle, - kControlBevelButtonSmallBevelProc, (SInt32) 0); - EmbedControl(smallBevelHandle, userPaneHandle); - medBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 | kControlContentPictHandle, - kControlBevelButtonNormalBevelProc, (SInt32) 0); - EmbedControl(medBevelHandle, userPaneHandle); - largeBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - kControlBehaviorOffsetContents << 16 | kControlContentPictHandle, - kControlBevelButtonLargeBevelProc, (SInt32) 0); - EmbedControl(largeBevelHandle, userPaneHandle); - bevelButtonContent.contentType = kControlContentPictHandle; - smallStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonSmallBevelProc, (SInt32) 0); - EmbedControl(smallStickyBevelHandle, userPaneHandle); - medStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonNormalBevelProc, (SInt32) 0); - EmbedControl(medStickyBevelHandle, userPaneHandle); - largeStickyBevelHandle = NewControl(windowRef, &geometry, "\p", - false, 0, 0, - (kControlBehaviorOffsetContents | kControlBehaviorSticky) << 16 - | kControlContentPictHandle, - kControlBevelButtonLargeBevelProc, (SInt32) 0); - EmbedControl(largeStickyBevelHandle, userPaneHandle); + smallBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + kControlBehaviorOffsetContents << 16 + | kControlContentPictHandle, + kControlBevelButtonSmallBevelProc, (SInt32) 0); + EmbedControl(smallBevelHandle, userPaneHandle); + medBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + kControlBehaviorOffsetContents << 16 + | kControlContentPictHandle, + kControlBevelButtonNormalBevelProc, (SInt32) 0); + EmbedControl(medBevelHandle, userPaneHandle); + largeBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + kControlBehaviorOffsetContents << 16 + | kControlContentPictHandle, + kControlBevelButtonLargeBevelProc, (SInt32) 0); + EmbedControl(largeBevelHandle, userPaneHandle); + bevelButtonContent.contentType = kControlContentPictHandle; + smallStickyBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + (kControlBehaviorOffsetContents + | kControlBehaviorSticky) << 16 + | kControlContentPictHandle, + kControlBevelButtonSmallBevelProc, (SInt32) 0); + EmbedControl(smallStickyBevelHandle, userPaneHandle); + medStickyBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + (kControlBehaviorOffsetContents + | kControlBehaviorSticky) << 16 + | kControlContentPictHandle, + kControlBevelButtonNormalBevelProc, (SInt32) 0); + EmbedControl(medStickyBevelHandle, userPaneHandle); + largeStickyBevelHandle = NewControl(windowRef, &geometry, "\p", + false, 0, 0, + (kControlBehaviorOffsetContents + | kControlBehaviorSticky) << 16 + | kControlContentPictHandle, + kControlBevelButtonLargeBevelProc, (SInt32) 0); + EmbedControl(largeStickyBevelHandle, userPaneHandle); - picParams.version = -2; - picParams.hRes = 0x00480000; - picParams.vRes = 0x00480000; - picParams.srcRect.top = 0; - picParams.srcRect.left = 0; + picParams.version = -2; + picParams.hRes = 0x00480000; + picParams.vRes = 0x00480000; + picParams.srcRect.top = 0; + picParams.srcRect.left = 0; ((CWindowPeek) windowRef)->visible = true; } else { @@ -1013,8 +1019,8 @@ InitSampleControls() } /* - * Remove our window from the window list. This way our - * applications ad others will not be confused that this + * Remove our window from the window list. This way our + * applications and others will not be confused that this * window exists - but no one knows about it. */ @@ -1040,9 +1046,9 @@ InitSampleControls() * TODO: The ButtonExitProc doesn't currently work and the * code it includes will crash the Mac on exit from Tk. - oldPixPtr = ((CWindowPeek) windowRef)->port.portPixMap; - Tcl_CreateExitHandler(ButtonExitProc, (ClientData) NULL); - */ + oldPixPtr = ((CWindowPeek) windowRef)->port.portPixMap; + Tcl_CreateExitHandler(ButtonExitProc, (ClientData) NULL); + */ } @@ -1065,12 +1071,12 @@ InitSampleControls() void SetupBevelButton( TkButton *butPtr, /* Tk button. */ - ControlRef controlHandle, /* The control to set this picture to */ + ControlRef controlHandle, /* The control to set this picture to */ GWorldPtr destPort, /* Off screen GWorld. */ GC gc, /* The GC we are drawing into - needed for - * the bevel button */ + * the bevel button */ Pixmap pixmap /* The pixmap we are drawing into - needed - for the bevel button */ + for the bevel button */ ) { int height, width; @@ -1079,13 +1085,13 @@ SetupBevelButton( SetPort((GrafPtr) destPort); if (butPtr->image != None) { - Tk_SizeOfImage(butPtr->image, - &width, &height); + Tk_SizeOfImage(butPtr->image, + &width, &height); } else { - Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, - &width, &height); + Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, + &width, &height); } - + if ((butPtr->width > 0) && (butPtr->width < width)) { width = butPtr->width; } @@ -1105,48 +1111,48 @@ SetupBevelButton( */ if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { - Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height, - pixmap, 0, 0); + Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height, + pixmap, 0, 0); } else if (butPtr->image != NULL) { - Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, 0, 0); - } else { - XSetClipOrigin(butPtr->display, gc, 0, 0); - XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, 0, 0, - (unsigned int) width, (unsigned int) height, 0, 0, 1); + Tk_RedrawImage(butPtr->image, 0, 0, width, + height, pixmap, 0, 0); + } else { + XSetClipOrigin(butPtr->display, gc, 0, 0); + XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, 0, 0, + (unsigned int) width, (unsigned int) height, 0, 0, 1); } ClosePicture(); SetControlData(controlHandle, kControlButtonPart, - kControlBevelButtonContentTag, - sizeof(ControlButtonContentInfo), - (char *) &bevelButtonContent); - + kControlBevelButtonContentTag, + sizeof(ControlButtonContentInfo), + (char *) &bevelButtonContent); + if (butPtr->anchor == TK_ANCHOR_N) { - theAlignment = kControlBevelButtonAlignTop; - } else if (butPtr->anchor == TK_ANCHOR_NE) { - theAlignment = kControlBevelButtonAlignTopRight; - } else if (butPtr->anchor == TK_ANCHOR_E) { - theAlignment = kControlBevelButtonAlignRight; - } else if (butPtr->anchor == TK_ANCHOR_SE) { - theAlignment = kControlBevelButtonAlignBottomRight; - } else if (butPtr->anchor == TK_ANCHOR_S) { - theAlignment = kControlBevelButtonAlignBottom; - } else if (butPtr->anchor == TK_ANCHOR_SW) { - theAlignment = kControlBevelButtonAlignBottomLeft; - } else if (butPtr->anchor == TK_ANCHOR_W) { - theAlignment = kControlBevelButtonAlignLeft; - } else if (butPtr->anchor == TK_ANCHOR_NW) { - theAlignment = kControlBevelButtonAlignTopLeft; - } else if (butPtr->anchor == TK_ANCHOR_CENTER) { - theAlignment = kControlBevelButtonAlignCenter; + theAlignment = kControlBevelButtonAlignTop; + } else if (butPtr->anchor == TK_ANCHOR_NE) { + theAlignment = kControlBevelButtonAlignTopRight; + } else if (butPtr->anchor == TK_ANCHOR_E) { + theAlignment = kControlBevelButtonAlignRight; + } else if (butPtr->anchor == TK_ANCHOR_SE) { + theAlignment = kControlBevelButtonAlignBottomRight; + } else if (butPtr->anchor == TK_ANCHOR_S) { + theAlignment = kControlBevelButtonAlignBottom; + } else if (butPtr->anchor == TK_ANCHOR_SW) { + theAlignment = kControlBevelButtonAlignBottomLeft; + } else if (butPtr->anchor == TK_ANCHOR_W) { + theAlignment = kControlBevelButtonAlignLeft; + } else if (butPtr->anchor == TK_ANCHOR_NW) { + theAlignment = kControlBevelButtonAlignTopLeft; + } else if (butPtr->anchor == TK_ANCHOR_CENTER) { + theAlignment = kControlBevelButtonAlignCenter; } SetControlData(controlHandle, kControlButtonPart, - kControlBevelButtonGraphicAlignTag, - sizeof(ControlButtonGraphicAlignment), - (char *) &theAlignment); + kControlBevelButtonGraphicAlignTag, + sizeof(ControlButtonGraphicAlignment), + (char *) &theAlignment); } @@ -1156,8 +1162,8 @@ SetupBevelButton( * SetUserPaneDrawProc -- * * Utility function to add a UserPaneDrawProc - * to a userPane control. From MoreControls code - * from Apple DTS. + * to a userPane control. From MoreControls code + * from Apple DTS. * * Results: * MacOS system error. @@ -1168,15 +1174,15 @@ SetupBevelButton( *-------------------------------------------------------------- */ pascal OSErr SetUserPaneDrawProc ( - ControlRef control, - ControlUserPaneDrawProcPtr upp) + ControlRef control, + ControlUserPaneDrawProcPtr upp) { ControlUserPaneDrawUPP myControlUserPaneDrawUPP; myControlUserPaneDrawUPP = NewControlUserPaneDrawProc(upp); return SetControlData (control, - kControlNoPart, kControlUserPaneDrawProcTag, - sizeof(myControlUserPaneDrawUPP), - (Ptr) &myControlUserPaneDrawUPP); + kControlNoPart, kControlUserPaneDrawProcTag, + sizeof(myControlUserPaneDrawUPP), + (Ptr) &myControlUserPaneDrawUPP); } /* @@ -1185,7 +1191,7 @@ pascal OSErr SetUserPaneDrawProc ( * SetUserPaneSetUpSpecialBackgroundProc -- * * Utility function to add a UserPaneBackgroundProc - * to a userPane control + * to a userPane control * * Results: * MacOS system error. @@ -1203,9 +1209,9 @@ SetUserPaneSetUpSpecialBackgroundProc( ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP; myControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundProc(upp); return SetControlData (control, kControlNoPart, - kControlUserPaneBackgroundProcTag, - sizeof(myControlUserPaneBackgroundUPP), - (Ptr) &myControlUserPaneBackgroundUPP); + kControlUserPaneBackgroundProcTag, + sizeof(myControlUserPaneBackgroundUPP), + (Ptr) &myControlUserPaneBackgroundUPP); } /* @@ -1214,7 +1220,7 @@ SetUserPaneSetUpSpecialBackgroundProc( * UserPaneDraw -- * * This function draws the background of the user pane that will - * lie under checkboxes and radiobuttons. + * lie under checkboxes and radiobuttons. * * Results: * None. @@ -1229,9 +1235,9 @@ UserPaneDraw( ControlRef control, ControlPartCode cpc) { - Rect contrlRect = (**control).contrlRect; - RGBBackColor (&gUserPaneBackground); - EraseRect (&contrlRect); + Rect contrlRect = (**control).contrlRect; + RGBBackColor (&gUserPaneBackground); + EraseRect (&contrlRect); } /* @@ -1240,7 +1246,7 @@ UserPaneDraw( * UserPaneBackgroundProc -- * * This function sets up the background of the user pane that will - * lie under checkboxes and radiobuttons. + * lie under checkboxes and radiobuttons. * * Results: * None. @@ -1257,7 +1263,7 @@ UserPaneBackgroundProc( ControlBackgroundPtr info) { if (info->colorDevice) { - RGBBackColor (&gUserPaneBackground); + RGBBackColor (&gUserPaneBackground); } } @@ -1271,8 +1277,8 @@ UserPaneBackgroundProc( * used we create a custom palette for the button, populate * with the colors for the button and install the palette. * - * Under Appearance, we just set the pointer that will be - * used by the UserPaneDrawProc. + * Under Appearance, we just set the pointer that will be + * used by the UserPaneDrawProc. * * Results: * None. @@ -1295,7 +1301,7 @@ UpdateControlColors( /* * Under Appearance we cannot change the background of the * button itself. However, the color we are setting is the color - * of the containing userPane. This will be the color that peeks + * of the containing userPane. This will be the color that peeks * around the rounded corners of the button. * We make this the highlightbackground rather than the background, * because if you color the background of a frame containing a @@ -1304,38 +1310,37 @@ UpdateControlColors( */ if (TkMacHaveAppearance() && (butPtr->type == TYPE_BUTTON)) { - xcolor = Tk_3DBorderColor(butPtr->highlightBorder); + xcolor = Tk_3DBorderColor(butPtr->highlightBorder); } else { - xcolor = Tk_3DBorderColor(butPtr->normalBorder); + xcolor = Tk_3DBorderColor(butPtr->normalBorder); } if (TkMacHaveAppearance()) { - TkSetMacColor(xcolor->pixel, &gUserPaneBackground); + TkSetMacColor(xcolor->pixel, &gUserPaneBackground); } else { (**ccTabHandle).ccSeed = 0; - (**ccTabHandle).ccRider = 0; - (**ccTabHandle).ctSize = 3; - (**ccTabHandle).ctTable[0].value = cBodyColor; - TkSetMacColor(xcolor->pixel, + (**ccTabHandle).ccRider = 0; + (**ccTabHandle).ctSize = 3; + (**ccTabHandle).ctTable[0].value = cBodyColor; + TkSetMacColor(xcolor->pixel, &(**ccTabHandle).ctTable[0].rgb); - (**ccTabHandle).ctTable[1].value = cTextColor; - TkSetMacColor(butPtr->normalFg->pixel, + (**ccTabHandle).ctTable[1].value = cTextColor; + TkSetMacColor(butPtr->normalFg->pixel, &(**ccTabHandle).ctTable[1].rgb); - (**ccTabHandle).ctTable[2].value = cFrameColor; - TkSetMacColor(butPtr->highlightColorPtr->pixel, + (**ccTabHandle).ctTable[2].value = cFrameColor; + TkSetMacColor(butPtr->highlightColorPtr->pixel, &(**ccTabHandle).ctTable[2].rgb); - SetControlColor(controlHandle, ccTabHandle); - - if (((xcolor->pixel >> 24) != CONTROL_BODY_PIXEL) && - ((butPtr->type == TYPE_CHECK_BUTTON) || - (butPtr->type == TYPE_RADIO_BUTTON))) { + SetControlColor(controlHandle, ccTabHandle); + + if (((xcolor->pixel >> 24) != CONTROL_BODY_PIXEL) && + ((butPtr->type == TYPE_CHECK_BUTTON) || + (butPtr->type == TYPE_RADIO_BUTTON))) { RGBColor newColor; - if (TkSetMacColor(xcolor->pixel, &newColor)) { - ChangeBackgroundWindowColor((**controlHandle).contrlOwner, - newColor, saveColorPtr); - } + TkSetMacColor(xcolor->pixel, &newColor); + ChangeBackgroundWindowColor((**controlHandle).contrlOwner, + newColor, saveColorPtr); return true; - } + } } return false; @@ -1348,7 +1353,7 @@ UpdateControlColors( * * This procedure will change the background color entry * in the Window's colortable. The system isn't notified - * of the change. This call should only be used to fool + * of the change. This call should only be used to fool * the drawing routines for checkboxes and radiobuttons. * Any change should be temporary and be reverted after * the widget is drawn. @@ -1422,7 +1427,7 @@ ButtonExitProc(clientData) /* * Restore our dummy window to it's origional state by putting it - * back in the window list and restoring it's bits. The destroy + * back in the window list and restoring it's bits. The destroy * the controls and window. */ diff --git a/mac/tkMacClipboard.c b/mac/tkMacClipboard.c index 9d387f5..75bc131 100644 --- a/mac/tkMacClipboard.c +++ b/mac/tkMacClipboard.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacClipboard.c,v 1.2 1998/09/14 18:23:34 stanton Exp $ + * RCS: @(#) $Id: tkMacClipboard.c,v 1.3 1999/04/16 01:51:30 stanton Exp $ */ #include "tkInt.h" @@ -32,7 +32,7 @@ * Results: * The return value is a standard Tcl return value. * If an error occurs (such as no selection exists) - * then an error message is left in interp->result. + * then an error message is left in the interp's result. * * Side effects: * None. @@ -241,7 +241,7 @@ TkSuspendClipboard() char *buffer, *p, *endPtr, *buffPtr; long length; - dispPtr = tkDisplayList; + dispPtr = TkGetDisplayList(); if ((dispPtr == NULL) || !dispPtr->clipboardActive) { return; } diff --git a/mac/tkMacColor.c b/mac/tkMacColor.c index 856ebe5..1b7e948 100644 --- a/mac/tkMacColor.c +++ b/mac/tkMacColor.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacColor.c,v 1.4 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacColor.c,v 1.5 1999/04/16 01:51:30 stanton Exp $ */ #include <tkColor.h> @@ -88,7 +88,8 @@ TkSetMacColor( case MENU_BACKGROUND_PIXEL: case MENU_DISABLED_PIXEL: case MENU_TEXT_PIXEL: - return GetMenuPartColor((pixel >> 24), macColor); + GetMenuPartColor((pixel >> 24), macColor); + return true; case APPEARANCE_PIXEL: return false; case PIXEL_MAGIC: @@ -430,75 +431,63 @@ GetMenuPartColor( RGBColor backColor, foreColor; GDHandle maxDevice; Rect globalRect; - MCEntryPtr mcEntryPtr; + MCEntryPtr mcEntryPtr = GetMCEntry(0, 0); - /* Under Appearance, we don't want to set any menu colors when we - are asked for the standard menu colors. So we return false (which - means don't use this color... */ - - if (TkMacHaveAppearance()) { - macColor->red = 0xFFFF; - macColor->green = 0; - macColor->blue = 0; - return false; - } else { - mcEntryPtr = GetMCEntry(0, 0); - switch (pixel) { - case MENU_ACTIVE_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0; - } else { - *macColor = mcEntryPtr->mctRGB3; - } - return true; - case MENU_ACTIVE_TEXT_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0xFFFF; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - return true; - case MENU_BACKGROUND_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->blue = macColor->green = 0xFFFF; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - return true; - case MENU_DISABLED_PIXEL: - if (mcEntryPtr == NULL) { - backColor.red = backColor.blue = backColor.green = 0xFFFF; - foreColor.red = foreColor.blue = foreColor.green = 0x0000; - } else { - backColor = mcEntryPtr->mctRGB2; - foreColor = mcEntryPtr->mctRGB3; - } - SetRect(&globalRect, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); - maxDevice = GetMaxDevice(&globalRect); - if (GetGray(maxDevice, &backColor, &foreColor)) { - *macColor = foreColor; - } else { + switch (pixel) { + case MENU_ACTIVE_PIXEL: + if (mcEntryPtr == NULL) { + macColor->red = macColor->blue = macColor->green = 0; + } else { + *macColor = mcEntryPtr->mctRGB3; + } + return 1; + case MENU_ACTIVE_TEXT_PIXEL: + if (mcEntryPtr == NULL) { + macColor->red = macColor->blue = macColor->green = 0xFFFF; + } else { + *macColor = mcEntryPtr->mctRGB2; + } + return 1; + case MENU_BACKGROUND_PIXEL: + if (mcEntryPtr == NULL) { + macColor->red = macColor->blue = macColor->green = 0xFFFF; + } else { + *macColor = mcEntryPtr->mctRGB2; + } + return 1; + case MENU_DISABLED_PIXEL: + if (mcEntryPtr == NULL) { + backColor.red = backColor.blue = backColor.green = 0xFFFF; + foreColor.red = foreColor.blue = foreColor.green = 0x0000; + } else { + backColor = mcEntryPtr->mctRGB2; + foreColor = mcEntryPtr->mctRGB3; + } + SetRect(&globalRect, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); + maxDevice = GetMaxDevice(&globalRect); + if (GetGray(maxDevice, &backColor, &foreColor)) { + *macColor = foreColor; + } else { - /* - * Pointer may have been moved by GetMaxDevice or GetGray. - */ + /* + * Pointer may have been moved by GetMaxDevice or GetGray. + */ - mcEntryPtr = GetMCEntry(0,0); - if (mcEntryPtr == NULL) { - macColor->red = macColor->green = macColor->blue = 0x7777; - } else { - *macColor = mcEntryPtr->mctRGB2; - } - } - return true; - case MENU_TEXT_PIXEL: - if (mcEntryPtr == NULL) { - macColor->red = macColor->green = macColor->blue = 0; - } else { - *macColor = mcEntryPtr->mctRGB3; - } - return true; - } - return false; + mcEntryPtr = GetMCEntry(0,0); + if (mcEntryPtr == NULL) { + macColor->red = macColor->green = macColor->blue = 0x7777; + } else { + *macColor = mcEntryPtr->mctRGB2; + } + } + return 1; + case MENU_TEXT_PIXEL: + if (mcEntryPtr == NULL) { + macColor->red = macColor->green = macColor->blue = 0; + } else { + *macColor = mcEntryPtr->mctRGB3; + } + return 1; } + return 0; } diff --git a/mac/tkMacConfig.c b/mac/tkMacConfig.c new file mode 100644 index 0000000..951f553 --- /dev/null +++ b/mac/tkMacConfig.c @@ -0,0 +1,45 @@ +/* + * tkMacConfig.c -- + * + * This module implements the Macintosh system defaults for + * the configuration package. + * + * Copyright (c) 1997 by Sun Microsystems, Inc. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tkMacConfig.c,v 1.2 1999/04/16 01:51:30 stanton Exp $ + */ + +#include "tk.h" +#include "tkInt.h" + + +/* + *---------------------------------------------------------------------- + * + * TkpGetSystemDefault -- + * + * Given a dbName and className for a configuration option, + * return a string representation of the option. + * + * Results: + * Returns a Tk_Uid that is the string identifier that identifies + * this option. Returns NULL if there are no system defaults + * that match this pair. + * + * Side effects: + * None, once the package is initialized. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TkpGetSystemDefault( + Tk_Window tkwin, /* A window to use. */ + char *dbName, /* The option database name. */ + char *className) /* The name of the option class. */ +{ + return NULL; +} diff --git a/mac/tkMacCursor.c b/mac/tkMacCursor.c index 604e8f0..f03f207 100644 --- a/mac/tkMacCursor.c +++ b/mac/tkMacCursor.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacCursor.c,v 1.4 1999/03/10 07:04:44 stanton Exp $ + * RCS: @(#) $Id: tkMacCursor.c,v 1.5 1999/04/16 01:51:30 stanton Exp $ */ #include "tkPort.h" @@ -109,13 +109,23 @@ FindCursorByName( { Handle resource; Str255 curName; + int destWrote, inCurLen; - curName[0] = strlen(string); - if (curName[0] > 255) { + inCurLen = strlen(string); + if (inCurLen > 255) { return; } - - strcpy((char *) curName + 1, string); + + /* + * macRoman is the encoding that the resource fork uses. + */ + + Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), string, + inCurLen, 0, NULL, + (char *) &curName[1], + 255, NULL, &destWrote, NULL); /* Internalize native */ + curName[0] = destWrote; + resource = GetNamedResource('crsr', curName); if (resource != NULL) { @@ -252,7 +262,7 @@ TkCreateCursorFromData( /* *---------------------------------------------------------------------- * - * TkFreeCursor -- + * TkpFreeCursor -- * * This procedure is called to release a cursor allocated by * TkGetCursorByName. @@ -267,7 +277,7 @@ TkCreateCursorFromData( */ void -TkFreeCursor( +TkpFreeCursor( TkCursor *cursorPtr) { TkMacCursor *macCursorPtr = (TkMacCursor *) cursorPtr; @@ -284,8 +294,6 @@ TkFreeCursor( if (macCursorPtr == gCurrentCursor) { gCurrentCursor = NULL; } - - ckfree((char *) macCursorPtr); } /* diff --git a/mac/tkMacDefault.h b/mac/tkMacDefault.h index 886bdd3..a09d3be 100644 --- a/mac/tkMacDefault.h +++ b/mac/tkMacDefault.h @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacDefault.h,v 1.2 1998/09/14 18:23:35 stanton Exp $ + * RCS: @(#) $Id: tkMacDefault.h,v 1.3 1999/04/16 01:51:30 stanton Exp $ */ #ifndef _TKMACDEFAULT @@ -61,7 +61,8 @@ #define DEF_CHKRAD_FG DEF_BUTTON_FG #define DEF_BUTTON_FONT "system" #define DEF_BUTTON_HEIGHT "0" -#define DEF_BUTTON_HIGHLIGHT_BG NORMAL_BG +#define DEF_BUTTON_HIGHLIGHT_BG_COLOR DEF_BUTTON_BG_COLOR +#define DEF_BUTTON_HIGHLIGHT_BG_MONO DEF_BUTTON_BG_MONO #define DEF_BUTTON_HIGHLIGHT "systemButtonFrame" #define DEF_LABEL_HIGHLIGHT_WIDTH "0" #define DEF_BUTTON_HIGHLIGHT_WIDTH "4" @@ -288,7 +289,8 @@ #define DEF_MENUBUTTON_FONT "system" #define DEF_MENUBUTTON_FG BLACK #define DEF_MENUBUTTON_HEIGHT "0" -#define DEF_MENUBUTTON_HIGHLIGHT_BG NORMAL_BG +#define DEF_MENUBUTTON_HIGHLIGHT_BG_COLOR DEF_MENUBUTTON_BG_COLOR +#define DEF_MENUBUTTON_HIGHLIGHT_BG_MONO DEF_MENUBUTTON_BG_MONO #define DEF_MENUBUTTON_HIGHLIGHT BLACK #define DEF_MENUBUTTON_HIGHLIGHT_WIDTH "0" #define DEF_MENUBUTTON_IMAGE (char *) NULL @@ -348,7 +350,8 @@ #define DEF_SCALE_FG_COLOR BLACK #define DEF_SCALE_FG_MONO BLACK #define DEF_SCALE_FROM "0" -#define DEF_SCALE_HIGHLIGHT_BG NORMAL_BG +#define DEF_SCALE_HIGHLIGHT_BG_COLOR DEF_SCALE_BG_COLOR +#define DEF_SCALE_HIGHLIGHT_BG_MONO DEF_SCALE_BG_MONO #define DEF_SCALE_HIGHLIGHT BLACK #define DEF_SCALE_HIGHLIGHT_WIDTH "0" #define DEF_SCALE_LABEL "" diff --git a/mac/tkMacDialog.c b/mac/tkMacDialog.c index a2a98fd..736f157 100644 --- a/mac/tkMacDialog.c +++ b/mac/tkMacDialog.c @@ -3,13 +3,12 @@ * * Contains the Mac implementation of the common dialog boxes. * - * Copyright (c) 1996 Sun Microsystems, Inc. + * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacDialog.c,v 1.2 1998/09/14 18:23:35 stanton Exp $ - * + * RCS: @(#) $Id: tkMacDialog.c,v 1.3 1999/04/16 01:51:30 stanton Exp $ */ #include <Gestalt.h> @@ -26,6 +25,13 @@ #include "tclMacInt.h" #include "tkFileFilter.h" +#ifndef StrLength +#define StrLength(s) (*((unsigned char *) (s))) +#endif +#ifndef StrBody +#define StrBody(s) ((char *) (s) + 1) +#endif + /* * The following are ID's for resources that are defined in tkMacResource.r */ @@ -45,38 +51,27 @@ * information about the file dialog and the file filters. */ typedef struct _OpenFileData { - Tcl_Interp * interp; - char * initialFile; /* default file to appear in the - * save dialog */ - char * defExt; /* default extension (not used on the - * Mac) */ FileFilterList fl; /* List of file filters. */ SInt16 curType; /* The filetype currently being - * listed */ - int isOpen; /* True if this is an Open dialog, - * false if it is a Save dialog. */ - MenuHandle menu; /* Handle of the menu in the popup*/ - short dialogId; /* resource ID of the dialog */ - int popupId; /* resource ID of the popup */ - short popupItem; /* item number of the popup in the - * dialog */ + * listed. */ + short popupItem; /* Item number of the popup in the + * dialog. */ int usePopup; /* True if we show the popup menu (this * is an open operation and the - * -filetypes option is set) - */ + * -filetypes option is set). */ } OpenFileData; static pascal Boolean FileFilterProc _ANSI_ARGS_((CInfoPBPtr pb, void *myData)); -static int GetFileName _ANSI_ARGS_ (( - ClientData clientData, Tcl_Interp *interp, - int argc, char **argv, int isOpen )); +static int GetFileName _ANSI_ARGS_ ((ClientData clientData, + Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[], int isOpen)); static Boolean MatchOneType _ANSI_ARGS_((CInfoPBPtr pb, - OpenFileData * myDataPtr, FileFilter * filterPtr)); + OpenFileData *myofdPtr, FileFilter *filterPtr)); static pascal short OpenHookProc _ANSI_ARGS_((short item, - DialogPtr theDialog, OpenFileData * myDataPtr)); + DialogPtr theDialog, OpenFileData * myofdPtr)); static int ParseFileDlgArgs _ANSI_ARGS_ ((Tcl_Interp * interp, - OpenFileData * myDataPtr, int argc, char ** argv, + OpenFileData * myofdPtr, int argc, char ** argv, int isOpen)); /* @@ -92,68 +87,7 @@ static DlgHookYDUPP saveHook = NULL; /* *---------------------------------------------------------------------- * - * EvalArgv -- - * - * Invokes the Tcl procedure with the arguments. argv[0] is set by - * the caller of this function. It may be different than cmdName. - * The TCL command will see argv[0], not cmdName, as its name if it - * invokes [lindex [info level 0] 0] - * - * Results: - * TCL_ERROR if the command does not exist and cannot be autoloaded. - * Otherwise, return the result of the evaluation of the command. - * - * Side effects: - * The command may be autoloaded. - * - *---------------------------------------------------------------------- - */ - -static int -EvalArgv( - Tcl_Interp *interp, /* Current interpreter. */ - char * cmdName, /* Name of the TCL command to call */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ -{ - Tcl_CmdInfo cmdInfo; - - if (!Tcl_GetCommandInfo(interp, cmdName, &cmdInfo)) { - char * cmdArgv[2]; - - /* - * This comand is not in the interpreter yet -- looks like we - * have to auto-load it - */ - if (!Tcl_GetCommandInfo(interp, "auto_load", &cmdInfo)) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "cannot execute command \"auto_load\"", - NULL); - return TCL_ERROR; - } - - cmdArgv[0] = "auto_load"; - cmdArgv[1] = cmdName; - - if ((*cmdInfo.proc)(cmdInfo.clientData, interp, 2, cmdArgv)!= TCL_OK){ - return TCL_ERROR; - } - - if (!Tcl_GetCommandInfo(interp, cmdName, &cmdInfo)) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "cannot auto-load command \"", - cmdName, "\"",NULL); - return TCL_ERROR; - } - } - - return (*cmdInfo.proc)(cmdInfo.clientData, interp, argc, argv); -} - -/* - *---------------------------------------------------------------------- - * - * Tk_ChooseColorCmd -- + * Tk_ChooseColorObjCmd -- * * This procedure implements the color dialog box for the Mac * platform. See the user documentation for details on what it @@ -169,23 +103,86 @@ EvalArgv( */ int -Tk_ChooseColorCmd( +Tk_ChooseColorObjCmd( ClientData clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - Tk_Window parent = Tk_MainWindow(interp); - char * colorStr = NULL; - XColor * colorPtr = NULL; - char * title = "Choose a color:"; - int i, version; - long response = 0; - OSErr err = noErr; - char buff[40]; - static RGBColor in; + Tk_Window parent; + char *title; + int i, picked, srcRead, dstWrote; + long response; + OSErr err; static inited = 0; - + static RGBColor in; + static char *optionStrings[] = { + "-initialcolor", "-parent", "-title", NULL + }; + enum options { + COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE + }; + + if (inited == 0) { + /* + * 'in' stores the last color picked. The next time the color dialog + * pops up, the last color will remain in the dialog. + */ + + in.red = 0xffff; + in.green = 0xffff; + in.blue = 0xffff; + inited = 1; + } + + parent = (Tk_Window) clientData; + title = "Choose a color:"; + picked = 0; + + for (i = 1; i < objc; i += 2) { + int index; + char *option, *value; + + if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option", + TCL_EXACT, &index) != TCL_OK) { + return TCL_ERROR; + } + if (i + 1 == objc) { + option = Tcl_GetStringFromObj(objv[i], NULL); + Tcl_AppendResult(interp, "value for \"", option, "\" missing", + (char *) NULL); + return TCL_ERROR; + } + value = Tcl_GetStringFromObj(objv[i + 1], NULL); + + switch ((enum options) index) { + case COLOR_INITIAL: { + XColor *colorPtr; + + colorPtr = Tk_GetColor(interp, parent, value); + if (colorPtr == NULL) { + return TCL_ERROR; + } + in.red = colorPtr->red; + in.green = colorPtr->green; + in.blue = colorPtr->blue; + Tk_FreeColor(colorPtr); + break; + } + case COLOR_PARENT: { + parent = Tk_NameToWindow(interp, value, parent); + if (parent == NULL) { + return TCL_ERROR; + } + break; + } + case COLOR_TITLE: { + title = value; + break; + } + } + } + /* * Use the gestalt manager to determine how to bring * up the color picker. If versin 2.0 isn't available @@ -194,92 +191,12 @@ Tk_ChooseColorCmd( */ err = Gestalt(gestaltColorPicker, &response); - if ((err == noErr) || (response == 0x0200L)) { - version = 2; - } else { - version = 1; - } - - for (i=1; i<argc; i+=2) { - int v = i+1; - int len = strlen(argv[i]); - - if (strncmp(argv[i], "-initialcolor", len)==0) { - if (v==argc) {goto arg_missing;} - - colorStr = argv[v]; - } else if (strncmp(argv[i], "-parent", len)==0) { - if (v==argc) {goto arg_missing;} - - parent=Tk_NameToWindow(interp, argv[v], Tk_MainWindow(interp)); - if (parent == NULL) { - return TCL_ERROR; - } - } else if (strncmp(argv[i], "-title", len)==0) { - if (v==argc) {goto arg_missing;} - - title = argv[v]; - } else { - Tcl_AppendResult(interp, "unknown option \"", - argv[i], "\", must be -initialcolor, -parent or -title", - NULL); - return TCL_ERROR; - } - } - - if (colorStr) { - colorPtr = Tk_GetColor(interp, parent, colorStr); - if (colorPtr == NULL) { - return TCL_ERROR; - } - } - - if (!inited) { - inited = 1; - in.red = 0xffff; - in.green = 0xffff; - in.blue = 0xffff; - } - if (colorPtr) { - in.red = colorPtr->red; - in.green = colorPtr->green; - in.blue = colorPtr->blue; - } - - if (version == 1) { - /* - * Use version 1.0 of the color picker - */ - - RGBColor out; - Str255 prompt; - Point point = {-1, -1}; - - prompt[0] = strlen(title); - strncpy((char*) prompt+1, title, 255); - - if (GetColor(point, prompt, &in, &out)) { - /* - * user selected a color - */ - sprintf(buff, "#%02x%02x%02x", out.red >> 8, out.green >> 8, - out.blue >> 8); - Tcl_SetResult(interp, buff, TCL_VOLATILE); + if ((err == noErr) && (response == 0x0200L)) { + ColorPickerInfo cpinfo; - /* - * Save it for the next time - */ - in.red = out.red; - in.green = out.green; - in.blue = out.blue; - } else { - Tcl_ResetResult(interp); - } - } else { /* * Version 2.0 of the color picker is available. Let's use it */ - ColorPickerInfo cpinfo; cpinfo.theColor.profile = 0L; cpinfo.theColor.color.rgb.red = in.red; @@ -292,41 +209,50 @@ Tk_ChooseColorCmd( cpinfo.eventProc = NULL; cpinfo.colorProc = NULL; cpinfo.colorProcData = NULL; + + Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL, + StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL); + StrLength(cpinfo.prompt) = (unsigned char) dstWrote; + + if ((PickColor(&cpinfo) == noErr) && (cpinfo.newColorChosen != 0)) { + in.red = cpinfo.theColor.color.rgb.red; + in.green = cpinfo.theColor.color.rgb.green; + in.blue = cpinfo.theColor.color.rgb.blue; + picked = 1; + } + } else { + RGBColor out; + Str255 prompt; + Point point = {-1, -1}; + + /* + * Use version 1.0 of the color picker + */ + + Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL, StrBody(prompt), + 255, &srcRead, &dstWrote, NULL); + StrLength(prompt) = (unsigned char) dstWrote; - cpinfo.prompt[0] = strlen(title); - strncpy((char*)cpinfo.prompt+1, title, 255); - - if ((PickColor(&cpinfo) == noErr) && cpinfo.newColorChosen) { - sprintf(buff, "#%02x%02x%02x", - cpinfo.theColor.color.rgb.red >> 8, - cpinfo.theColor.color.rgb.green >> 8, - cpinfo.theColor.color.rgb.blue >> 8); - Tcl_SetResult(interp, buff, TCL_VOLATILE); - - in.blue = cpinfo.theColor.color.rgb.red; - in.green = cpinfo.theColor.color.rgb.green; - in.blue = cpinfo.theColor.color.rgb.blue; - } else { - Tcl_ResetResult(interp); + if (GetColor(point, prompt, &in, &out)) { + in = out; + picked = 1; } - } + } + + if (picked != 0) { + char result[32]; - if (colorPtr) { - Tk_FreeColor(colorPtr); + sprintf(result, "#%02x%02x%02x", in.red >> 8, in.green >> 8, + in.blue >> 8); + Tcl_AppendResult(interp, result, NULL); } - return TCL_OK; - - arg_missing: - Tcl_AppendResult(interp, "value for \"", argv[argc-1], "\" missing", - NULL); - return TCL_ERROR; } /* *---------------------------------------------------------------------- * - * Tk_GetOpenFileCmd -- + * Tk_GetOpenFileObjCmd -- * * This procedure implements the "open file" dialog box for the * Mac platform. See the user documentation for details on what @@ -341,19 +267,19 @@ Tk_ChooseColorCmd( */ int -Tk_GetOpenFileCmd( +Tk_GetOpenFileObjCmd( ClientData clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - return GetFileName(clientData, interp, argc, argv, OPEN_FILE); + return GetFileName(clientData, interp, objc, objv, OPEN_FILE); } /* *---------------------------------------------------------------------- * - * Tk_GetSaveFileCmd -- + * Tk_GetSaveFileObjCmd -- * * Same as Tk_GetOpenFileCmd but opens a "save file" dialog box * instead @@ -367,13 +293,13 @@ Tk_GetOpenFileCmd( */ int -Tk_GetSaveFileCmd( +Tk_GetSaveFileObjCmd( ClientData clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - return GetFileName(clientData, interp, argc, argv, SAVE_FILE); + return GetFileName(clientData, interp, objc, objv, SAVE_FILE); } /* @@ -389,8 +315,8 @@ Tk_GetSaveFileCmd( * * Side effects: * If the user selects a file, the native pathname of the file - * is returned in interp->result. Otherwise an empty string - * is returned in interp->result. + * is returned in the interp's result. Otherwise an empty string + * is returned in the interp's result. * *---------------------------------------------------------------------- */ @@ -399,32 +325,124 @@ static int GetFileName( ClientData clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv, /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *CONST objv[], /* Argument objects. */ int isOpen) /* true if we should call GetOpenFileName(), * false if we should call GetSaveFileName() */ { - int code = TCL_OK; - int i; - OpenFileData myData, *myDataPtr; + int i, result; + OpenFileData ofd; StandardFileReply reply; Point mypoint; - Str255 str; - - myDataPtr = &myData; + MenuHandle menu; + Str255 initialFile; + char *choice[6]; + Tk_Window parent; + static char *optionStrings[] = { + "-defaultextension", "-filetypes", "-initialdir", "-initialfile", + "-parent", "-title", NULL + }; + enum options { + FILE_DEFAULT, FILE_TYPES, FILE_INITDIR, FILE_INITFILE, + FILE_PARENT, FILE_TITLE + }; if (openFilter == NULL) { openFilter = NewFileFilterYDProc(FileFilterProc); openHook = NewDlgHookYDProc(OpenHookProc); saveHook = NewDlgHookYDProc(OpenHookProc); } + + result = TCL_ERROR; + parent = (Tk_Window) clientData; + memset(choice, 0, sizeof(choice)); - /* - * 1. Parse the arguments. - */ - if (ParseFileDlgArgs(interp, myDataPtr, argc, argv, isOpen) - != TCL_OK) { - return TCL_ERROR; + for (i = 1; i < objc; i += 2) { + int index; + char *string; + + if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option", + TCL_EXACT, &index) != TCL_OK) { + return TCL_ERROR; + } + if (i + 1 == objc) { + string = Tcl_GetStringFromObj(objv[i], NULL); + Tcl_AppendResult(interp, "value for \"", string, "\" missing", + (char *) NULL); + return TCL_ERROR; + } + choice[index] = Tcl_GetStringFromObj(objv[i + 1], NULL); + } + + StrLength(initialFile) = 0; + menu = NULL; + + TkInitFileFilters(&ofd.fl); + ofd.curType = 0; + ofd.popupItem = OPEN_POPUP_ITEM; + ofd.usePopup = isOpen; + + if (choice[FILE_TYPES] != NULL) { + if (TkGetFileFilters(interp, &ofd.fl, choice[FILE_TYPES], 0) != TCL_OK) { + goto end; + } + } + if (choice[FILE_INITDIR] != NULL) { + FSSpec dirSpec; + Tcl_DString ds; + long dirID; + OSErr err; + Boolean isDirectory; + char *string; + Str255 dir; + int srcRead, dstWrote; + + string = choice[FILE_INITDIR]; + if (Tcl_TranslateFileName(interp, string, &ds) == NULL) { + goto end; + } + Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&ds), + Tcl_DStringLength(&ds), 0, NULL, StrBody(dir), 255, + &srcRead, &dstWrote, NULL); + StrLength(dir) = (unsigned char) dstWrote; + Tcl_DStringFree(&ds); + + err = FSpLocationFromPath(StrLength(dir), StrBody(dir), &dirSpec); + if (err != noErr) { + Tcl_AppendResult(interp, "bad directory \"", string, "\"", NULL); + goto end; + } + err = FSpGetDirectoryID(&dirSpec, &dirID, &isDirectory); + if ((err != noErr) || !isDirectory) { + Tcl_AppendResult(interp, "bad directory \"", string, "\"", NULL); + goto end; + } + /* + * Make sure you negate -dirSpec.vRefNum because the + * standard file package wants it that way ! + */ + + LMSetSFSaveDisk(-dirSpec.vRefNum); + LMSetCurDirStore(dirID); + } + if (choice[FILE_INITFILE] != NULL) { + Tcl_DString ds; + int srcRead, dstWrote; + + if (Tcl_TranslateFileName(interp, choice[FILE_INITFILE], &ds) == NULL) { + goto end; + } + Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&ds), + Tcl_DStringLength(&ds), 0, NULL, + StrBody(initialFile), 255, &srcRead, &dstWrote, NULL); + StrLength(initialFile) = (unsigned char) dstWrote; + Tcl_DStringFree(&ds); + } + if (choice[FILE_PARENT] != NULL) { + parent = Tk_NameToWindow(interp, choice[FILE_PARENT], parent); + if (parent == NULL) { + return TCL_ERROR; + } } /* @@ -436,237 +454,89 @@ GetFileName( * left overs from previous invocation of this command */ - if (myDataPtr->usePopup) { - FileFilter * filterPtr; - - for (i=CountMItems(myDataPtr->menu); i>0; i--) { + if (ofd.usePopup) { + FileFilter *filterPtr; + + menu = GetMenu(OPEN_MENU); + for (i = CountMItems(menu); i > 0; i--) { /* * The item indices are one based. Also, if we delete from * the beginning, the items may be re-numbered. So we * delete from the end */ - DeleteMenuItem(myDataPtr->menu, i); + + DeleteMenuItem(menu, i); } - if (myDataPtr->fl.filters) { - for (filterPtr=myDataPtr->fl.filters; filterPtr; - filterPtr=filterPtr->next) { - strncpy((char*)str+1, filterPtr->name, 254); - str[0] = strlen(filterPtr->name); - AppendMenu(myDataPtr->menu, (ConstStr255Param) str); - } + filterPtr = ofd.fl.filters; + if (filterPtr == NULL) { + ofd.usePopup = 0; } else { - myDataPtr->usePopup = 0; + for ( ; filterPtr != NULL; filterPtr = filterPtr->next) { + Str255 str; + + StrLength(str) = (unsigned char) strlen(filterPtr->name); + strcpy(StrBody(str), filterPtr->name); + AppendMenu(menu, str); + } } } /* * 3. Call the toolbox file dialog function. */ + SetPt(&mypoint, -1, -1); TkpSetCursor(NULL); - - if (myDataPtr->isOpen) { - if (myDataPtr->usePopup) { - CustomGetFile(openFilter, (short) -1, NULL, &reply, - myDataPtr->dialogId, - mypoint, openHook, NULL, NULL, NULL, (void*)myDataPtr); + if (isOpen) { + if (ofd.usePopup) { + CustomGetFile(openFilter, (short) -1, NULL, &reply, OPEN_BOX, + mypoint, openHook, NULL, NULL, NULL, (void*) &ofd); } else { StandardGetFile(NULL, -1, NULL, &reply); } } else { - Str255 prompt, def; - - strcpy((char*)prompt+1, "Save as"); - prompt[0] = strlen("Save as"); - if (myDataPtr->initialFile) { - strncpy((char*)def+1, myDataPtr->initialFile, 254); - def[0] = strlen(myDataPtr->initialFile); - } else { - def[0] = 0; - } - if (myDataPtr->usePopup) { + static Str255 prompt = "\pSave as"; + + if (ofd.usePopup) { /* * Currently this never gets called because we don't use * popup for the save dialog. */ - CustomPutFile(prompt, def, &reply, myDataPtr->dialogId, mypoint, - saveHook, NULL, NULL, NULL, myDataPtr); + CustomPutFile(prompt, initialFile, &reply, OPEN_BOX, + mypoint, saveHook, NULL, NULL, NULL, (void *) &ofd); } else { - StandardPutFile(prompt, def, &reply); + StandardPutFile(prompt, initialFile, &reply); } } - Tcl_ResetResult(interp); if (reply.sfGood) { int length; - Handle pathHandle = NULL; - char * pathName = NULL; + Handle pathHandle; + pathHandle = NULL; FSpPathFromLocation(&reply.sfFile, &length, &pathHandle); - if (pathHandle != NULL) { + Tcl_DString ds; + HLock(pathHandle); - pathName = (char *) ckalloc((unsigned) (length + 1)); - strcpy(pathName, *pathHandle); + Tcl_ExternalToUtfDString(NULL, (char *) *pathHandle, -1, &ds); + Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL); + Tcl_DStringFree(&ds); HUnlock(pathHandle); DisposeHandle(pathHandle); - - /* - * Return the full pathname of the selected file - */ - - Tcl_SetResult(interp, pathName, TCL_DYNAMIC); } } - - done: - TkFreeFileFilters(&myDataPtr->fl); - return code; -} - -/* - *---------------------------------------------------------------------- - * - * ParseFileDlgArgs -- - * - * Parses the arguments passed to tk_getOpenFile and tk_getSaveFile. - * - * Results: - * A standard TCL return value. - * - * Side effects: - * The OpenFileData structure is initialized and modified according - * to the arguments. - * - *---------------------------------------------------------------------- - */ - -static int -ParseFileDlgArgs( - Tcl_Interp * interp, /* Current interpreter. */ - OpenFileData * myDataPtr, /* Information about the file dialog */ - int argc, /* Number of arguments */ - char ** argv, /* Argument strings */ - int isOpen) /* TRUE if this is an "open" dialog */ -{ - int i; - - myDataPtr->interp = interp; - myDataPtr->initialFile = NULL; - myDataPtr->curType = 0; - - TkInitFileFilters(&myDataPtr->fl); - if (isOpen) { - myDataPtr->isOpen = 1; - myDataPtr->usePopup = 1; - myDataPtr->menu = GetMenu(OPEN_MENU); - myDataPtr->dialogId = OPEN_BOX; - myDataPtr->popupId = OPEN_POPUP; - myDataPtr->popupItem = OPEN_POPUP_ITEM; - if (myDataPtr->menu == NULL) { - Debugger(); - } - } else { - myDataPtr->isOpen = 0; - myDataPtr->usePopup = 0; - } - - for (i=1; i<argc; i+=2) { - int v = i+1; - int len = strlen(argv[i]); - - if (strncmp(argv[i], "-defaultextension", len)==0) { - if (v==argc) {goto arg_missing;} + result = TCL_OK; - myDataPtr->defExt = argv[v]; - } - else if (strncmp(argv[i], "-filetypes", len)==0) { - if (v==argc) {goto arg_missing;} - - if (TkGetFileFilters(interp, &myDataPtr->fl,argv[v],0) != TCL_OK) { - return TCL_ERROR; - } - } - else if (strncmp(argv[i], "-initialdir", len)==0) { - FSSpec dirSpec; - char * dirName; - Tcl_DString dstring; - long dirID; - OSErr err; - Boolean isDirectory; - - if (v==argc) {goto arg_missing;} - - if (Tcl_TranslateFileName(interp, argv[v], &dstring) == NULL) { - return TCL_ERROR; - } - dirName = dstring.string; - if (FSpLocationFromPath(strlen(dirName), dirName, &dirSpec) != - noErr) { - Tcl_AppendResult(interp, "bad directory \"", argv[v], - "\"", NULL); - return TCL_ERROR; - } - err = FSpGetDirectoryID(&dirSpec, &dirID, &isDirectory); - if ((err != noErr) || !isDirectory) { - Tcl_AppendResult(interp, "bad directory \"", argv[v], - "\"", NULL); - return TCL_ERROR; - } - /* - * Make sure you negate -dirSpec.vRefNum because the standard file - * package wants it that way ! - */ - LMSetSFSaveDisk(-dirSpec.vRefNum); - LMSetCurDirStore(dirID); - Tcl_DStringFree(&dstring); - } - else if (strncmp(argv[i], "-initialfile", len)==0) { - if (v==argc) {goto arg_missing;} - - myDataPtr->initialFile = argv[v]; - } - else if (strncmp(argv[i], "-parent", len)==0) { - /* - * Ignored on the Mac, but make sure that it's a valid window - * pathname - */ - Tk_Window parent; - - if (v==argc) {goto arg_missing;} - - parent=Tk_NameToWindow(interp, argv[v], Tk_MainWindow(interp)); - if (parent == NULL) { - return TCL_ERROR; - } - } - else if (strncmp(argv[i], "-title", len)==0) { - if (v==argc) {goto arg_missing;} - - /* - * This option is ignored on the Mac because the Mac file - * dialog do not support titles. - */ - } - else { - Tcl_AppendResult(interp, "unknown option \"", - argv[i], "\", must be -defaultextension, ", - "-filetypes, -initialdir, -initialfile, -parent or -title", - NULL); - return TCL_ERROR; - } + end: + TkFreeFileFilters(&ofd.fl); + if (menu != NULL) { + DisposeMenu(menu); } - - return TCL_OK; - - arg_missing: - Tcl_AppendResult(interp, "value for \"", argv[argc-1], "\" missing", - NULL); - return TCL_ERROR; + return result; } - /* *---------------------------------------------------------------------- * @@ -689,7 +559,7 @@ static pascal short OpenHookProc( short item, /* Event description. */ DialogPtr theDialog, /* The dialog where the event occurs. */ - OpenFileData * myDataPtr) /* Information about the file dialog. */ + OpenFileData *ofdPtr) /* Information about the file dialog. */ { short ignore; Rect rect; @@ -698,29 +568,29 @@ OpenHookProc( switch (item) { case sfHookFirstCall: - if (myDataPtr->usePopup) { + if (ofdPtr->usePopup) { /* * Set the popup list to display the selected type. */ - GetDialogItem(theDialog, myDataPtr->popupItem, - &ignore, &handle, &rect); - SetControlValue((ControlRef) handle, myDataPtr->curType + 1); + GetDialogItem(theDialog, ofdPtr->popupItem, &ignore, &handle, + &rect); + SetControlValue((ControlRef) handle, ofdPtr->curType + 1); } return sfHookNullEvent; case OPEN_POPUP_ITEM: - if (myDataPtr->usePopup) { - GetDialogItem(theDialog, myDataPtr->popupItem, + if (ofdPtr->usePopup) { + GetDialogItem(theDialog, ofdPtr->popupItem, &ignore, &handle, &rect); newType = GetCtlValue((ControlRef) handle) - 1; - if (myDataPtr->curType != newType) { - if (newType<0 || newType>myDataPtr->fl.numFilters) { + if (ofdPtr->curType != newType) { + if (newType<0 || newType>ofdPtr->fl.numFilters) { /* * Sanity check. Looks like the user selected an * non-existent menu item?? Don't do anything. */ } else { - myDataPtr->curType = newType; + ofdPtr->curType = newType; } return sfHookRebuildList; } @@ -755,10 +625,10 @@ FileFilterProc( void *myData) /* Client data for this file dialog */ { int i; - OpenFileData * myDataPtr = (OpenFileData*)myData; + OpenFileData * ofdPtr = (OpenFileData*)myData; FileFilter * filterPtr; - if (myDataPtr->fl.numFilters == 0) { + if (ofdPtr->fl.numFilters == 0) { /* * No types have been specified. List all files by default */ @@ -772,13 +642,13 @@ FileFilterProc( return MATCHED; } - if (myDataPtr->usePopup) { - i = myDataPtr->curType; - for (filterPtr=myDataPtr->fl.filters; filterPtr && i>0; i--) { + if (ofdPtr->usePopup) { + i = ofdPtr->curType; + for (filterPtr=ofdPtr->fl.filters; filterPtr && i>0; i--) { filterPtr = filterPtr->next; } if (filterPtr) { - return MatchOneType(pb, myDataPtr, filterPtr); + return MatchOneType(pb, ofdPtr, filterPtr); } else { return UNMATCHED; } @@ -788,9 +658,9 @@ FileFilterProc( * considered matched if it matches any of the file filters. */ - for (filterPtr=myDataPtr->fl.filters; filterPtr; + for (filterPtr=ofdPtr->fl.filters; filterPtr; filterPtr=filterPtr->next) { - if (MatchOneType(pb, myDataPtr, filterPtr) == MATCHED) { + if (MatchOneType(pb, ofdPtr, filterPtr) == MATCHED) { return MATCHED; } } @@ -818,7 +688,7 @@ FileFilterProc( static Boolean MatchOneType( CInfoPBPtr pb, /* Information about the file */ - OpenFileData * myDataPtr, /* Information about this file dialog */ + OpenFileData * ofdPtr, /* Information about this file dialog */ FileFilter * filterPtr) /* Match the file described by pb against * this filter */ { @@ -909,31 +779,33 @@ MatchOneType( return UNMATCHED; } - /* *---------------------------------------------------------------------- * - * Tk_MessageBoxCmd -- + * Tk_ChooseDirectoryObjCmd -- * - * This procedure implements the MessageBox window for the - * Mac platform. See the user documentation for details on what - * it does. + * This procedure implements the "tk_chooseDirectory" dialog box + * for the Windows platform. See the user documentation for details + * on what it does. * * Results: - * A standard Tcl result. + * See user documentation. * * Side effects: - * See user documentation. + * A modal dialog window is created. Tcl_SetServiceMode() is + * called to allow background events to be processed * *---------------------------------------------------------------------- */ int -Tk_MessageBoxCmd( - ClientData clientData, /* Main window associated with interpreter. */ - Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ +Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv) + ClientData clientData; /* Main window associated with interpreter. */ + Tcl_Interp *interp; /* Current interpreter. */ + int objc; /* Number of arguments. */ + Tcl_Obj *CONST objv[]; /* Argument objects. */ { - return EvalArgv(interp, "tkMessageBox", argc, argv); + return TCL_ERROR; } + + diff --git a/mac/tkMacDraw.c b/mac/tkMacDraw.c index 6e0b617..425e3b9 100644 --- a/mac/tkMacDraw.c +++ b/mac/tkMacDraw.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacDraw.c,v 1.3 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacDraw.c,v 1.4 1999/04/16 01:51:30 stanton Exp $ */ #include "tkInt.h" @@ -220,7 +220,7 @@ XCopyPlane( tmode = srcOr; tmode = srcCopy + transparent; - if (TkSetMacColor(gc->foreground, &macColor)) { + if (TkSetMacColor(gc->foreground, &macColor) == true) { RGBForeColor(&macColor); } @@ -230,9 +230,8 @@ XCopyPlane( * Case 1: opaque bitmaps. */ - if (TkSetMacColor(gc->background, &macColor)) { + TkSetMacColor(gc->background, &macColor); RGBBackColor(&macColor); - } tmode = srcCopy; CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL); } else if (clipPtr->type == TKP_CLIP_PIXMAP) { @@ -672,73 +671,6 @@ XDrawRectangle( /* *---------------------------------------------------------------------- * - * XDrawRectangles -- - * - * Draws the outlines of the specified rectangles as if a - * five-point PolyLine protocol request were specified for each - * rectangle: - * - * [x,y] [x+width,y] [x+width,y+height] [x,y+height] - * [x,y] - * - * For the specified rectangles, these functions do not draw a - * pixel more than once. XDrawRectangles draws the rectangles in - * the order listed in the array. If rectangles intersect, the - * intersecting pixels are drawn multiple times. Draws a - * rectangle. - * - * Results: - * None. - * - * Side effects: - * Draws rectangles on the specified drawable. - * - *---------------------------------------------------------------------- - */ -void -XDrawRectangles(display, d, gc, rectArr, numRects) - Display *display; - Drawable d; - GC gc; - XRectangle *rectArr; - int numRects; -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - register XRectangle *rectPtr; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - ShowPen(); - PenPixPat(gPenPat); - - for (rectPtr = rectArr; numRects > 0; numRects--, rectPtr++) { - theRect.left = (short) (macWin->xOff + rectPtr->x); - theRect.top = (short) (macWin->yOff + rectPtr->y); - theRect.right = (short) (theRect.left + rectPtr->width); - theRect.bottom = (short) (theRect.top + rectPtr->height); - - FrameRect(&theRect); - } - - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * * XDrawArc -- * * Draw an arc. @@ -798,65 +730,6 @@ XDrawArc( /* *---------------------------------------------------------------------- * - * XDrawArcs -- - * - * Draw an array of arcs. - * - * Results: - * None. - * - * Side effects: - * Draws the arcs on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XDrawArcs( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - XArc *arcArr, - int numArcs) - -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - short start, extent; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - register XArc *arcPtr; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - ShowPen(); - PenPixPat(gPenPat); - - for (arcPtr = arcArr; numArcs > 0; numArcs--, arcPtr++) { - theRect.left = (short) (macWin->xOff + arcPtr->x ); - theRect.top = (short) (macWin->yOff + arcPtr->y); - theRect.right = (short) (theRect.left + arcPtr->width); - theRect.bottom = (short) (theRect.top + arcPtr->height); - start = (short) (90 - (arcPtr->angle1 / 64)); - extent = (short) (-(arcPtr->angle2 / 64)); - - FrameArc(&theRect, start, extent); - } - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * * XFillArc -- * * Draw a filled arc. @@ -950,97 +823,6 @@ XFillArc( /* *---------------------------------------------------------------------- * - * XFillArc -- - * - * Draw an array of filled arcs. - * - * Results: - * None. - * - * Side effects: - * Draws the filled arcs on the specified drawable. - * - *---------------------------------------------------------------------- - */ - -void -XFillArcs( - Display* display, /* Display. */ - Drawable d, /* Draw on this. */ - GC gc, /* Use this GC. */ - XArc *arcArr, /* Array of arcs */ - int numArcs) /* number of arcs */ -{ - MacDrawable *macWin = (MacDrawable *) d; - Rect theRect; - short start, extent; - PolyHandle polygon; - XArc *arcPtr; - double sin1, cos1, sin2, cos2, angle; - double boxWidth, boxHeight; - double vertex[2], center1[2], center2[2]; - CGrafPtr saveWorld; - GDHandle saveDevice; - GWorldPtr destPort; - - destPort = TkMacGetDrawablePort(d); - - display->request++; - GetGWorld(&saveWorld, &saveDevice); - SetGWorld(destPort, NULL); - - TkMacSetUpClippingRgn(d); - - TkMacSetUpGraphicsPort(gc); - - for (arcPtr = arcArr; numArcs > 0; numArcs--, arcPtr++) { - theRect.left = (short) (macWin->xOff + arcPtr->x); - theRect.top = (short) (macWin->yOff + arcPtr->y); - theRect.right = (short) (theRect.left + arcPtr->width); - theRect.bottom = (short) (theRect.top + arcPtr->height); - start = (short) (90 - (arcPtr->angle1 / 64)); - extent = (short) (- (arcPtr->angle2 / 64)); - - if (gc->arc_mode == ArcChord) { - boxWidth = theRect.right - theRect.left; - boxHeight = theRect.bottom - theRect.top; - angle = -(arcPtr->angle1/64.0)*PI/180.0; - sin1 = sin(angle); - cos1 = cos(angle); - angle -= (arcPtr->angle2/64.0)*PI/180.0; - sin2 = sin(angle); - cos2 = cos(angle); - vertex[0] = (theRect.left + theRect.right)/2.0; - vertex[1] = (theRect.top + theRect.bottom)/2.0; - center1[0] = vertex[0] + cos1*boxWidth/2.0; - center1[1] = vertex[1] + sin1*boxHeight/2.0; - center2[0] = vertex[0] + cos2*boxWidth/2.0; - center2[1] = vertex[1] + sin2*boxHeight/2.0; - - polygon = OpenPoly(); - MoveTo((short) ((theRect.left + theRect.right)/2), - (short) ((theRect.top + theRect.bottom)/2)); - - LineTo((short) (center1[0] + 0.5), (short) (center1[1] + 0.5)); - LineTo((short) (center2[0] + 0.5), (short) (center2[1] + 0.5)); - ClosePoly(); - - ShowPen(); - FillCArc(&theRect, start, extent, gPenPat); - FillCPoly(polygon, gPenPat); - - KillPoly(polygon); - } else { - ShowPen(); - FillCArc(&theRect, start, extent, gPenPat); - } - } - SetGWorld(saveWorld, saveDevice); -} - -/* - *---------------------------------------------------------------------- - * * TkScrollWindow -- * * Scroll a rectangle of the specified window and accumulate @@ -1142,7 +924,7 @@ TkScrollWindow( SetGWorld(saveWorld, saveDevice); /* - * Fortunantly, the region returned by ScrollRect is symanticly + * Fortunantly, the region returned by ScrollRect is symanticlly * the same as what we need to return in this function. If the * region is empty we return zero to denote that no damage was * created. @@ -1183,14 +965,14 @@ TkMacSetUpGraphicsPort( if (TkSetMacColor(gc->foreground, &macColor) == true) { /* TODO: cache RGBPats for preformace - measure gains... */ MakeRGBPat(gPenPat, &macColor); + } - PenNormal(); - if(gc->function == GXxor) { - PenMode(patXor); - } - if (gc->line_width > 1) { - PenSize(gc->line_width, gc->line_width); - } + PenNormal(); + if(gc->function == GXxor) { + PenMode(patXor); + } + if (gc->line_width > 1) { + PenSize(gc->line_width, gc->line_width); } } diff --git a/mac/tkMacEmbed.c b/mac/tkMacEmbed.c index 58f4c88..a5e97f8 100644 --- a/mac/tkMacEmbed.c +++ b/mac/tkMacEmbed.c @@ -8,12 +8,12 @@ * Currently only Toplevel embedding within the same Tk application is * allowed on the Macintosh. * - * Copyright (c) 1996-97 Sun Microsystems, Inc. + * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacEmbed.c,v 1.3 1998/09/14 18:23:35 stanton Exp $ + * RCS: @(#) $Id: tkMacEmbed.c,v 1.4 1999/04/16 01:51:30 stanton Exp $ */ #include "tkInt.h" @@ -217,7 +217,7 @@ TkpMakeWindow( * Results: * The return value is normally TCL_OK. If an error occurs (such * as string not being a valid window spec), then the return value - * is TCL_ERROR and an error message is left in interp->result if + * is TCL_ERROR and an error message is left in the interp's result if * interp is non-NULL. * * Side effects: diff --git a/mac/tkMacFont.c b/mac/tkMacFont.c index 1a75249..b68f414 100644 --- a/mac/tkMacFont.c +++ b/mac/tkMacFont.c @@ -10,36 +10,389 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacFont.c,v 1.3 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacFont.c,v 1.4 1999/04/16 01:51:30 stanton Exp $ */ #include <Windows.h> #include <Strings.h> #include <Fonts.h> +#include <Script.h> #include <Resources.h> +#include <TextUtils.h> #include "tkMacInt.h" #include "tkFont.h" -#include "tkPort.h" /* - * The following structure represents the Macintosh's' implementation of a - * font. + * For doing things with Mac strings and Fixed numbers. This probably should move + * the mac header file. */ +#ifndef StrLength +#define StrLength(s) (*((unsigned char *) (s))) +#endif +#ifndef StrBody +#define StrBody(s) ((char *) (s) + 1) +#endif +#define pstrcmp(s1, s2) RelString((s1), (s2), 1, 1) +#define pstrcasecmp(s1, s2) RelString((s1), (s2), 0, 1) + +#ifndef Fixed2Int +#define Fixed2Int(f) ((f) >> 16) +#define Int2Fixed(i) ((i) << 16) +#endif + +/* + * The preferred font encodings. + */ + +static CONST char *encodingList[] = { + "macRoman", "macJapan", NULL +}; + +/* + * The following structures are used to map the script/language codes of a + * font to the name that should be passed to Tcl_GetTextEncoding() to obtain + * the encoding for that font. The set of numeric constants is fixed and + * defined by Apple. + */ + +static TkStateMap scriptMap[] = { + {smRoman, "macRoman"}, + {smJapanese, "macJapan"}, + {smTradChinese, "macChinese"}, + {smKorean, "macKorean"}, + {smArabic, "macArabic"}, + {smHebrew, "macHebrew"}, + {smGreek, "macGreek"}, + {smCyrillic, "macCyrillic"}, + {smRSymbol, "macRSymbol"}, + {smDevanagari, "macDevanagari"}, + {smGurmukhi, "macGurmukhi"}, + {smGujarati, "macGujarati"}, + {smOriya, "macOriya"}, + {smBengali, "macBengali"}, + {smTamil, "macTamil"}, + {smTelugu, "macTelugu"}, + {smKannada, "macKannada"}, + {smMalayalam, "macMalayalam"}, + {smSinhalese, "macSinhalese"}, + {smBurmese, "macBurmese"}, + {smKhmer, "macKhmer"}, + {smThai, "macThailand"}, + {smLaotian, "macLaos"}, + {smGeorgian, "macGeorgia"}, + {smArmenian, "macArmenia"}, + {smSimpChinese, "macSimpChinese"}, + {smTibetan, "macTIbet"}, + {smMongolian, "macMongolia"}, + {smGeez, "macEthiopia"}, + {smEastEurRoman, "macCentEuro"}, + {smVietnamese, "macVietnam"}, + {smExtArabic, "macSindhi"}, + {NULL, NULL} +}; + +static TkStateMap romanMap[] = { + {langCroatian, "macCroatian"}, + {langSlovenian, "macCroatian"}, + {langIcelandic, "macIceland"}, + {langRomanian, "macRomania"}, + {langTurkish, "macTurkish"}, + {langGreek, "macGreek"}, + {NULL, NULL} +}; + +static TkStateMap cyrillicMap[] = { + {langUkrainian, "macUkraine"}, + {langBulgarian, "macBulgaria"}, + {NULL, NULL} +}; + +/* + * The following structure represents a font family. It is assumed that + * all screen fonts constructed from the same "font family" share certain + * properties; all screen fonts with the same "font family" point to a + * shared instance of this structure. The most important shared property + * is the character existence metrics, used to determine if a screen font + * can display a given Unicode character. + * + * Under Macintosh, a "font family" is uniquely identified by its face number. + */ + + +#define FONTMAP_SHIFT 10 + +#define FONTMAP_PAGES (1 << (sizeof(Tcl_UniChar) * 8 - FONTMAP_SHIFT)) +#define FONTMAP_BITSPERPAGE (1 << FONTMAP_SHIFT) + +typedef struct FontFamily { + struct FontFamily *nextPtr; /* Next in list of all known font families. */ + int refCount; /* How many SubFonts are referring to this + * FontFamily. When the refCount drops to + * zero, this FontFamily may be freed. */ + /* + * Key. + */ + + short faceNum; /* Unique face number key for this FontFamily. */ + + /* + * Derived properties. + */ + + Tcl_Encoding encoding; /* Encoding for this font family. */ + int isSymbolFont; /* Non-zero if this is a symbol family. */ + int isMultiByteFont; /* Non-zero if this is a multi-byte family. */ + char typeTable[256]; /* Table that identfies all lead bytes for a + * multi-byte family, used when measuring chars. + * If a byte is a lead byte, the value at the + * corresponding position in the typeTable is 1, + * otherwise 0. If this is a single-byte font, + * all entries are 0. */ + char *fontMap[FONTMAP_PAGES]; + /* Two-level sparse table used to determine + * quickly if the specified character exists. + * As characters are encountered, more pages + * in this table are dynamically added. The + * contents of each page is a bitmask + * consisting of FONTMAP_BITSPERPAGE bits, + * representing whether this font can be used + * to display the given character at the + * corresponding bit position. The high bits + * of the character are used to pick which + * page of the table is used. */ +} FontFamily; + +/* + * The following structure encapsulates an individual screen font. A font + * object is made up of however many SubFonts are necessary to display a + * stream of multilingual characters. + */ + +typedef struct SubFont { + char **fontMap; /* Pointer to font map from the FontFamily, + * cached here to save a dereference. */ + FontFamily *familyPtr; /* The FontFamily for this SubFont. */ +} SubFont; + +/* + * The following structure represents Macintosh's implementation of a font + * object. + */ + +#define SUBFONT_SPACE 3 + typedef struct MacFont { TkFont font; /* Stuff used by generic font package. Must * be first in structure. */ - short family; - short size; - short style; + SubFont staticSubFonts[SUBFONT_SPACE]; + /* Builtin space for a limited number of + * SubFonts. */ + int numSubFonts; /* Length of following array. */ + SubFont *subFontArray; /* Array of SubFonts that have been loaded + * in order to draw/measure all the characters + * encountered by this font so far. All fonts + * start off with one SubFont initialized by + * AllocFont() from the original set of font + * attributes. Usually points to + * staticSubFonts, but may point to malloced + * space if there are lots of SubFonts. */ + + short size; /* Font size in pixels, constructed from + * font attributes. */ + short style; /* Style bits, constructed from font + * attributes. */ } MacFont; +/* + * The following structure is used to map between the UTF-8 name for a font and + * the name that the Macintosh uses to refer to the font, in order to determine + * if a font exists. The Macintosh names for fonts are stored in the encoding + * of the font itself. + */ + +typedef struct FontNameMap { + Tk_Uid utfName; /* The name of the font in UTF-8. */ + StringPtr nativeName; /* The name of the font in the font's encoding. */ + short faceNum; /* Unique face number for this font. */ +} FontNameMap; + +/* + * The list of font families that are currently loaded. As screen fonts + * are loaded, this list grows to hold information about what characters + * exist in each font family. + */ + +static FontFamily *fontFamilyList = NULL; + +/* + * Information cached about the system at startup time. + */ + +static FontNameMap *gFontNameMap = NULL; static GWorldPtr gWorld = NULL; -static TkFont * AllocMacFont _ANSI_ARGS_((TkFont *tkfont, - Tk_Window tkwin, int family, int size, int style)); +/* + * Procedures used only in this file. + */ + +static FontFamily * AllocFontFamily(CONST MacFont *fontPtr, int family); +static SubFont * CanUseFallback(MacFont *fontPtr, + CONST char *fallbackName, int ch); +static SubFont * CanUseFallbackWithAliases(MacFont *fontPtr, + char *faceName, int ch, Tcl_DString *nameTriedPtr); +static SubFont * FindSubFontForChar(MacFont *fontPtr, int ch); +static void FontMapInsert(SubFont *subFontPtr, int ch); +static void FontMapLoadPage(SubFont *subFontPtr, int row); +static int FontMapLookup(SubFont *subFontPtr, int ch); +static void FreeFontFamily(FontFamily *familyPtr); +static void InitFont(Tk_Window tkwin, int family, int size, + int style, MacFont *fontPtr); +static void InitSubFont(CONST MacFont *fontPtr, int family, + SubFont *subFontPtr); +static void MultiFontDrawText(MacFont *fontPtr, + CONST char *source, int numBytes, int x, int y); +static void ReleaseFont(MacFont *fontPtr); +static void ReleaseSubFont(SubFont *subFontPtr); +static int SeenName(CONST char *name, Tcl_DString *dsPtr); + +static char * BreakLine(FontFamily *familyPtr, int flags, + CONST char *source, int numBytes, int *widthPtr); +static int GetFamilyNum(CONST char *faceName, short *familyPtr); +static int GetFamilyOrAliasNum(CONST char *faceName, + short *familyPtr); +static Tcl_Encoding GetFontEncoding(int faceNum, int allowSymbol, + int *isSymbolPtr); +static Tk_Uid GetUtfFaceName(StringPtr faceNameStr); + + +/* + *------------------------------------------------------------------------- + * + * TkpFontPkgInit -- + * + * This procedure is called when an application is created. It + * initializes all the structures that are used by the + * platform-dependant code on a per application basis. + * + * Results: + * None. + * + * Side effects: + * See comments below. + * + *------------------------------------------------------------------------- + */ +void +TkpFontPkgInit(mainPtr) + TkMainInfo *mainPtr; /* The application being created. */ +{ + MenuHandle fontMenu; + FontNameMap *tmpFontNameMap, *newFontNameMap, *mapPtr; + int i, j, numFonts, fontMapOffset, isSymbol; + Str255 nativeName; + Tcl_DString ds; + Tcl_Encoding encoding; + Tcl_Encoding *encodings; + + if (gWorld == NULL) { + /* + * Do the following one time only. + */ + + Rect rect = {0, 0, 1, 1}; + + SetFractEnable(0); + + /* + * Used for saving and restoring state while drawing and measuring. + */ + + if (NewGWorld(&gWorld, 0, &rect, NULL, NULL, 0) != noErr) { + panic("TkpFontPkgInit: NewGWorld failed"); + } + + /* + * The name of each font is stored in the encoding of that font. + * How would we translate a name from UTF-8 into the native encoding + * of the font unless we knew the encoding of that font? We can't. + * So, precompute the UTF-8 and native names of all fonts on the + * system. The when the user asks for font by its UTF-8 name, we + * lookup the name in that table and really ask for the font by its + * native name. Any unknown UTF-8 names will be mapped to the system + * font. + */ + + fontMenu = NewMenu('FT', "\px"); + AddResMenu(fontMenu, 'FONT'); + + numFonts = CountMItems(fontMenu); + tmpFontNameMap = (FontNameMap *) ckalloc(sizeof(FontNameMap) * numFonts); + encodings = (Tcl_Encoding *) ckalloc(sizeof(Tcl_Encoding) * numFonts); + + mapPtr = tmpFontNameMap; + for (i = 0; i < numFonts; i++) { + GetMenuItemText(fontMenu, i + 1, nativeName); + GetFNum(nativeName, &mapPtr->faceNum); + encodings[i] = GetFontEncoding(mapPtr->faceNum, 0, &isSymbol); + Tcl_ExternalToUtfDString(encodings[i], StrBody(nativeName), + StrLength(nativeName), &ds); + mapPtr->utfName = Tk_GetUid(Tcl_DStringValue(&ds)); + mapPtr->nativeName = (StringPtr) ckalloc(StrLength(nativeName) + 1); + memcpy(mapPtr->nativeName, nativeName, StrLength(nativeName) + 1); + Tcl_DStringFree(&ds); + mapPtr++; + } + DisposeMenu(fontMenu); + + /* + * Reorder FontNameMap so fonts with the preferred encodings are at + * the front of the list. The relative order of fonts that all have + * the same encoding is preserved. Fonts with unknown encodings get + * stuck at the end. + */ + + newFontNameMap = (FontNameMap *) ckalloc(sizeof(FontNameMap) * (numFonts + 1)); + fontMapOffset = 0; + for (i = 0; encodingList[i] != NULL; i++) { + encoding = Tcl_GetEncoding(NULL, encodingList[i]); + if (encoding == NULL) { + continue; + } + for (j = 0; j < numFonts; j++) { + if (encodings[j] == encoding) { + newFontNameMap[fontMapOffset] = tmpFontNameMap[j]; + fontMapOffset++; + Tcl_FreeEncoding(encodings[j]); + tmpFontNameMap[j].utfName = NULL; + } + } + Tcl_FreeEncoding(encoding); + } + for (i = 0; i < numFonts; i++) { + if (tmpFontNameMap[i].utfName != NULL) { + newFontNameMap[fontMapOffset] = tmpFontNameMap[i]; + fontMapOffset++; + Tcl_FreeEncoding(encodings[i]); + } + } + if (fontMapOffset != numFonts) { + panic("TkpFontPkgInit: unexpected number of fonts"); + } + + mapPtr = &newFontNameMap[numFonts]; + mapPtr->utfName = NULL; + mapPtr->nativeName = NULL; + mapPtr->faceNum = 0; + + ckfree((char *) tmpFontNameMap); + ckfree((char *) encodings); + + gFontNameMap = newFontNameMap; + } +} /* *--------------------------------------------------------------------------- @@ -73,6 +426,7 @@ TkpGetNativeFont( CONST char *name) /* Platform-specific font name. */ { short family; + MacFont *fontPtr; if (strcmp(name, "system") == 0) { family = GetSysFont(); @@ -81,8 +435,11 @@ TkpGetNativeFont( } else { return NULL; } - - return AllocMacFont(NULL, tkwin, family, 0, 0); + + fontPtr = (MacFont *) ckalloc(sizeof(MacFont)); + InitFont(tkwin, family, 0, 0, fontPtr); + + return (TkFont *) fontPtr; } /* @@ -122,41 +479,47 @@ TkpGetFontFromAttributes( * will be released. If NULL, a new TkFont * structure is allocated. */ Tk_Window tkwin, /* For display where font will be used. */ - CONST TkFontAttributes *faPtr) /* Set of attributes to match. */ + CONST TkFontAttributes *faPtr) + /* Set of attributes to match. */ { - char buf[257]; - size_t len; - short family, size, style; - - if (faPtr->family == NULL) { - family = 0; - } else { - CONST char *familyName; - - familyName = faPtr->family; - if (strcasecmp(familyName, "Times New Roman") == 0) { - familyName = "Times"; - } else if (strcasecmp(familyName, "Courier New") == 0) { - familyName = "Courier"; - } else if (strcasecmp(familyName, "Arial") == 0) { - familyName = "Helvetica"; - } - - len = strlen(familyName); - if (len > 255) { - len = 255; + short faceNum, style; + int i, j; + char *faceName, *fallback; + char ***fallbacks; + MacFont *fontPtr; + + /* + * Algorithm to get the closest font to the one requested. + * + * try fontname + * try all aliases for fontname + * foreach fallback for fontname + * try the fallback + * try all aliases for the fallback + */ + + faceNum = 0; + faceName = faPtr->family; + if (faceName != NULL) { + if (GetFamilyOrAliasNum(faceName, &faceNum) != 0) { + goto found; + } + fallbacks = TkFontGetFallbacks(); + for (i = 0; fallbacks[i] != NULL; i++) { + for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) { + if (strcasecmp(faceName, fallback) == 0) { + for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) { + if (GetFamilyOrAliasNum(fallback, &faceNum)) { + goto found; + } + } + } + break; + } } - buf[0] = (char) len; - memcpy(buf + 1, familyName, len); - buf[len + 1] = '\0'; - GetFNum((StringPtr) buf, &family); } - - size = faPtr->pointsize; - if (size <= 0) { - size = GetDefFontSize(); - } - + + found: style = 0; if (faPtr->weight != TK_FW_NORMAL) { style |= bold; @@ -167,8 +530,15 @@ TkpGetFontFromAttributes( if (faPtr->underline) { style |= underline; } - - return AllocMacFont(tkFontPtr, tkwin, family, size, style); + if (tkFontPtr == NULL) { + fontPtr = (MacFont *) ckalloc(sizeof(MacFont)); + } else { + fontPtr = (MacFont *) tkFontPtr; + ReleaseFont(fontPtr); + } + InitFont(tkwin, faceNum, faPtr->size, style, fontPtr); + + return (TkFont *) fontPtr; } /* @@ -194,7 +564,10 @@ void TkpDeleteFont( TkFont *tkFontPtr) /* Token of font to be deleted. */ { - ckfree((char *) tkFontPtr); + MacFont *fontPtr; + + fontPtr = (MacFont *) tkFontPtr; + ReleaseFont(fontPtr); } /* @@ -206,7 +579,7 @@ TkpDeleteFont( * on the display of the given window. * * Results: - * interp->result is modified to hold a list of all the available + * Modifies interp's result object to hold a list of all the available * font families. * * Side effects: @@ -220,76 +593,54 @@ TkpGetFontFamilies( Tcl_Interp *interp, /* Interp to hold result. */ Tk_Window tkwin) /* For display to query. */ { - MenuHandle fontMenu; - int i; - char itemText[257]; - - fontMenu = NewMenu(1, "\px"); - AddResMenu(fontMenu, 'FONT'); - - for (i = 1; i < CountMItems(fontMenu); i++) { - /* - * Each item is a pascal string. Convert it to C and append. - */ - GetMenuItemText(fontMenu, i, (unsigned char *) itemText); - itemText[itemText[0] + 1] = '\0'; - Tcl_AppendElement(interp, &itemText[1]); + FontNameMap *mapPtr; + Tcl_Obj *resultPtr, *strPtr; + + resultPtr = Tcl_GetObjResult(interp); + for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { + strPtr = Tcl_NewStringObj(mapPtr->utfName, -1); + Tcl_ListObjAppendElement(NULL, resultPtr, strPtr); } - DisposeMenu(fontMenu); } - /* - *--------------------------------------------------------------------------- + *------------------------------------------------------------------------- * - * TkMacIsCharacterMissing -- + * TkpGetSubFonts -- * - * Given a tkFont and a character determines whether the character has - * a glyph defined in the font or not. Note that this is potentially - * not compatible with Mac OS 8 as it looks at the font handle - * structure directly. Looks into the character array of the font - * handle to determine whether the glyph is defined or not. + * A function used by the testing package for querying the actual + * screen fonts that make up a font object. * * Results: - * Returns a 1 if the character is missing, a 0 if it is not. + * Modifies interp's result object to hold a list containing the + * names of the screen fonts that make up the given font object. * * Side effects: * None. * - *--------------------------------------------------------------------------- + *------------------------------------------------------------------------- */ - -int -TkMacIsCharacterMissing( - Tk_Font tkfont, /* The font we are looking in. */ - unsigned int searchChar) /* The character we are looking for. */ + +void +TkpGetSubFonts(interp, tkfont) + Tcl_Interp *interp; /* Interp to hold result. */ + Tk_Font tkfont; /* Font object to query. */ { - MacFont *fontPtr = (MacFont *) tkfont; - FMInput fm; - FontRec **fontRecHandle; - - fm.family = fontPtr->family; - fm.size = fontPtr->size; - fm.face = fontPtr->style; - fm.needBits = 0; - fm.device = 0; - fm.numer.h = fm.numer.v = fm.denom.h = fm.denom.v = 1; + int i; + Tcl_Obj *resultPtr, *strPtr; + MacFont *fontPtr; + FontFamily *familyPtr; + Str255 nativeName; - /* - * This element of the FMOutput structure was changed between the 2.0 & 3.0 - * versions of the Universal Headers. - */ - -#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) - fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontResult; -#else - fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontHandle; -#endif - return *(short *) ((long) &(*fontRecHandle)->owTLoc - + ((long)((*fontRecHandle)->owTLoc + searchChar - - (*fontRecHandle)->firstChar) * sizeof(short))) == -1; + resultPtr = Tcl_GetObjResult(interp); + fontPtr = (MacFont *) tkfont; + for (i = 0; i < fontPtr->numSubFonts; i++) { + familyPtr = fontPtr->subFontArray[i].familyPtr; + GetFontName(familyPtr->faceNum, nativeName); + strPtr = Tcl_NewStringObj(GetUtfFaceName(nativeName), -1); + Tcl_ListObjAppendElement(NULL, resultPtr, strPtr); + } } - /* *--------------------------------------------------------------------------- @@ -302,7 +653,7 @@ TkMacIsCharacterMissing( * the characters. * * Results: - * The return value is the number of characters from source that + * The return value is the number of bytes from source that * fit into the span that extends from 0 to maxLength. *lengthPtr is * filled with the x-coordinate of the right edge of the last * character that did fit. @@ -316,14 +667,14 @@ TkMacIsCharacterMissing( int Tk_MeasureChars( Tk_Font tkfont, /* Font in which characters will be drawn. */ - CONST char *source, /* Characters to be displayed. Need not be + CONST char *source, /* UTF-8 string to be displayed. Need not be * '\0' terminated. */ - int numChars, /* Maximum number of characters to consider + int numBytes, /* Maximum number of bytes to consider * from source string. */ - int maxLength, /* If > 0, maxLength specifies the longest + int maxLength, /* If >= 0, maxLength specifies the longest * permissible line length; don't consider any * character that would cross this - * x-position. If <= 0, then line length is + * x-position. If < 0, then line length is * unbounded and the flags argument is * ignored. */ int flags, /* Various flag bits OR-ed together: @@ -336,134 +687,270 @@ Tk_MeasureChars( int *lengthPtr) /* Filled with x-location just after the * terminating character. */ { - short staticWidths[128]; - short *widths; - CONST char *p, *term; - int curX, termX, curIdx, sawNonSpace; MacFont *fontPtr; + FontFamily *lastFamilyPtr; CGrafPtr saveWorld; GDHandle saveDevice; + int curX, curByte; - if (numChars == 0) { - *lengthPtr = 0; - return 0; - } - - if (gWorld == NULL) { - Rect rect = {0, 0, 1, 1}; + /* + * According to "Inside Macintosh: Text", the Macintosh may + * automatically substitute + * ligatures or context-sensitive presentation forms when + * measuring/displaying text within a font run. We cannot safely + * measure individual characters and add up the widths w/o errors. + * However, if we convert a range of text from UTF-8 to, say, + * Shift-JIS, and get the offset into the Shift-JIS string as to + * where a word or line break would occur, then can we map that + * number back to UTF-8? + */ + + fontPtr = (MacFont *) tkfont; - if (NewGWorld(&gWorld, 0, &rect, NULL, NULL, 0) != noErr) { - panic("NewGWorld failed in Tk_MeasureChars"); - } - } GetGWorld(&saveWorld, &saveDevice); SetGWorld(gWorld, NULL); - - fontPtr = (MacFont *) tkfont; - TextFont(fontPtr->family); + TextSize(fontPtr->size); TextFace(fontPtr->style); - if (maxLength <= 0) { - *lengthPtr = TextWidth(source, 0, numChars); - SetGWorld(saveWorld, saveDevice); - return numChars; - } - - if (numChars > maxLength) { - /* - * Assume that all chars are at least 1 pixel wide, so there's no - * need to measure more characters than there are pixels. This - * assumption could be refined to an iterative approach that would - * use that as a starting point and try more chars if necessary (if - * there actually were some zero-width chars). - */ - - numChars = maxLength; - } - if (numChars > SHRT_MAX) { - /* - * If they are trying to measure more than 32767 chars at one time, - * it would require several separate measurements. - */ - - numChars = SHRT_MAX; - } - - widths = staticWidths; - if (numChars >= sizeof(staticWidths) / sizeof(staticWidths[0])) { - widths = (short *) ckalloc((numChars + 1) * sizeof(short)); - } + lastFamilyPtr = fontPtr->subFontArray[0].familyPtr; - MeasureText((short) numChars, source, widths); - - if (widths[numChars] <= maxLength) { - curX = widths[numChars]; - curIdx = numChars; + if (numBytes == 0) { + curX = 0; + curByte = 0; + } else if (maxLength < 0) { + CONST char *p, *end, *next; + Tcl_UniChar ch; + FontFamily *thisFamilyPtr; + Tcl_DString runString; + + /* + * A three step process: + * 1. Find a contiguous range of characters that can all be + * represented by a single screen font. + * 2. Convert those chars to the encoding of that font. + * 3. Measure converted chars. + */ + + curX = 0; + end = source + numBytes; + for (p = source; p < end; ) { + next = p + Tcl_UtfToUniChar(p, &ch); + thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; + if (thisFamilyPtr != lastFamilyPtr) { + TextFont(lastFamilyPtr->faceNum); + Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, + p - source, &runString); + curX += TextWidth(Tcl_DStringValue(&runString), 0, + Tcl_DStringLength(&runString)); + Tcl_DStringFree(&runString); + lastFamilyPtr = thisFamilyPtr; + source = p; + } + p = next; + } + TextFont(lastFamilyPtr->faceNum); + Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, p - source, + &runString); + curX += TextWidth(Tcl_DStringValue(&runString), 0, + Tcl_DStringLength(&runString)); + Tcl_DStringFree(&runString); + curByte = numBytes; } else { - p = term = source; - curX = termX = 0; - - sawNonSpace = !isspace(UCHAR(*p)); - for (curIdx = 1; ; curIdx++) { - if (isspace(UCHAR(*p))) { - if (sawNonSpace) { - term = p; - termX = widths[curIdx - 1]; - sawNonSpace = 0; - } - } else { - sawNonSpace = 1; - } - if (widths[curIdx] > maxLength) { - curIdx--; - curX = widths[curIdx]; - break; + CONST char *p, *end, *next, *sourceOrig; + int widthLeft; + FontFamily *thisFamilyPtr; + Tcl_UniChar ch; + char *rest; + + /* + * How many chars will fit in the space allotted? + */ + + if (maxLength > 32767) { + maxLength = 32767; + } + + widthLeft = maxLength; + sourceOrig = source; + end = source + numBytes; + for (p = source; p < end; p = next) { + next = p + Tcl_UtfToUniChar(p, &ch); + thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; + if (thisFamilyPtr != lastFamilyPtr) { + if (p > source) { + rest = BreakLine(lastFamilyPtr, flags, source, + p - source, &widthLeft); + flags &= ~TK_AT_LEAST_ONE; + if (rest != NULL) { + p = source; + break; + } + } + lastFamilyPtr = thisFamilyPtr; + source = p; } - p++; } - if (flags & TK_PARTIAL_OK) { - curIdx++; - curX = widths[curIdx]; + + if (p > source) { + rest = BreakLine(lastFamilyPtr, flags, source, p - source, + &widthLeft); } - if ((curIdx == 0) && (flags & TK_AT_LEAST_ONE)) { - /* - * The space was too small to hold even one character. Since at - * least one character must always fit on a line, return the width - * of the first character. - */ - - curX = TextWidth(source, 0, 1); - curIdx = 1; - } else if (flags & TK_WHOLE_WORDS) { - /* - * Break at last word that fits on the line. - */ - - if ((flags & TK_AT_LEAST_ONE) && (term == source)) { - /* - * The space was too small to hold an entire word. This - * is the only word on the line, so just return the part of th - * word that fit. - */ - - ; - } else { - curIdx = term - source; - curX = termX; - } - } + + if (rest == NULL) { + curByte = numBytes; + } else { + curByte = rest - sourceOrig; + } + curX = maxLength - widthLeft; } - if (widths != staticWidths) { - ckfree((char *) widths); - } + SetGWorld(saveWorld, saveDevice); *lengthPtr = curX; + return curByte; +} + +/* + *--------------------------------------------------------------------------- + * + * BreakLine -- + * + * Determine where the given line of text should be broken so that it + * fits in the specified range. Before calling this function, the + * font values and graphics port must be set. + * + * Results: + * The return value is NULL if the specified range is larger that the + * space the text needs, and *widthLeftPtr is filled with how much + * space is left in the range after measuring the whole text buffer. + * Otherwise, the return value is a pointer into the text buffer that + * indicates where the line should be broken (up to, but not including + * that character), and *widthLeftPtr is filled with how much space is + * left in the range after measuring up to that character. + * + * Side effects: + * None. + * + *--------------------------------------------------------------------------- + */ + +static char * +BreakLine( + FontFamily *familyPtr, /* FontFamily that describes the font values + * that are already selected into the graphics + * port. */ + int flags, /* Various flag bits OR-ed together: + * TK_PARTIAL_OK means include the last char + * which only partially fit on this line. + * TK_WHOLE_WORDS means stop on a word + * boundary, if possible. + * TK_AT_LEAST_ONE means return at least one + * character even if no characters fit. */ + CONST char *source, /* UTF-8 string to be displayed. Need not be + * '\0' terminated. */ + int numBytes, /* Maximum number of bytes to consider + * from source string. */ + int *widthLeftPtr) /* On input, specifies size of range into + * which characters from source buffer should + * be fit. On output, filled with how much + * space is left after fitting as many + * characters as possible into the range. + * Result may be negative if TK_AT_LEAST_ONE + * was specified in the flags argument. */ +{ + Fixed pixelWidth, widthLeft; + StyledLineBreakCode breakCode; + Tcl_DString runString; + long textOffset; + Boolean leadingEdge; + Point point; + int charOffset, thisCharWasDoubleByte; + char *p, *end, *typeTable; - SetGWorld(saveWorld, saveDevice); + TextFont(familyPtr->faceNum); + Tcl_UtfToExternalDString(familyPtr->encoding, source, numBytes, + &runString); + pixelWidth = Int2Fixed(*widthLeftPtr) + 1; + if (flags & TK_WHOLE_WORDS) { + textOffset = (flags & TK_AT_LEAST_ONE); + widthLeft = pixelWidth; + breakCode = StyledLineBreak(Tcl_DStringValue(&runString), + Tcl_DStringLength(&runString), 0, Tcl_DStringLength(&runString), + 0, &widthLeft, &textOffset); + if (breakCode != smBreakOverflow) { + /* + * StyledLineBreak includes all the space characters at the end of + * line that we want to suppress. + */ + + textOffset = VisibleLength(Tcl_DStringValue(&runString), textOffset); + goto getoffset; + } + } else { + point.v = 1; + point.h = 1; + textOffset = PixelToChar(Tcl_DStringValue(&runString), + Tcl_DStringLength(&runString), 0, pixelWidth, &leadingEdge, + &widthLeft, smOnlyStyleRun, point, point); + if (Fixed2Int(widthLeft) < 0) { + goto getoffset; + } + } + *widthLeftPtr = Fixed2Int(widthLeft); + Tcl_DStringFree(&runString); + return NULL; + + /* + * The conversion routine that converts UTF-8 to the target encoding + * must map one UTF-8 character to exactly one encoding-specific + * character, so that the following algorithm works: + * + * 1. Get byte offset of where line should be broken. + * 2. Get char offset corresponding to that byte offset. + * 3. Map that char offset to byte offset in UTF-8 string. + */ + + getoffset: + thisCharWasDoubleByte = 0; + if (familyPtr->isMultiByteFont == 0) { + charOffset = textOffset; + } else { + charOffset = 0; + typeTable = familyPtr->typeTable; + + p = Tcl_DStringValue(&runString); + end = p + textOffset; + thisCharWasDoubleByte = typeTable[*((unsigned char *) p)]; + for ( ; p < end; p++) { + thisCharWasDoubleByte = typeTable[*((unsigned char *) p)]; + p += thisCharWasDoubleByte; + charOffset++; + } + } - return curIdx; + if ((flags & TK_WHOLE_WORDS) == 0) { + if ((flags & TK_PARTIAL_OK) && (leadingEdge != 0)) { + textOffset += thisCharWasDoubleByte; + textOffset++; + charOffset++; + } else if (((flags & TK_PARTIAL_OK) == 0) && (leadingEdge == 0)) { + textOffset -= thisCharWasDoubleByte; + textOffset--; + charOffset--; + } + } + if ((textOffset == 0) && (Tcl_DStringLength(&runString) > 0) + && (flags & TK_AT_LEAST_ONE)) { + p = Tcl_DStringValue(&runString); + textOffset += familyPtr->typeTable[*((unsigned char *) p)]; + textOffset++; + charOffset++; + } + *widthLeftPtr = Fixed2Int(pixelWidth) + - TextWidth(Tcl_DStringValue(&runString), 0, textOffset); + Tcl_DStringFree(&runString); + return Tcl_UtfAtIndex(source, charOffset); } /* @@ -489,14 +976,14 @@ Tk_DrawChars( GC gc, /* Graphics context for drawing characters. */ Tk_Font tkfont, /* Font in which characters will be drawn; * must be the same as font used in GC. */ - CONST char *source, /* Characters to be displayed. Need not be + CONST char *source, /* UTF-8 string to be displayed. Need not be * '\0' terminated. All Tk meta-characters * (tabs, control characters, and newlines) * should be stripped out of the string that * is passed to this function. If they are * not stripped out, they will be displayed as * regular printing characters. */ - int numChars, /* Number of characters in string. */ + int numBytes, /* Number of bytes in string. */ int x, int y) /* Coordinates at which to place origin of * string when drawing. */ { @@ -538,19 +1025,12 @@ Tk_DrawChars( bufferPort = TkMacGetDrawablePort(pixmap); SetGWorld(bufferPort, NULL); - TextFont(fontPtr->family); - TextSize(fontPtr->size); - TextFace(fontPtr->style); - - if (TkSetMacColor(gc->foreground, &macColor)) { + if (TkSetMacColor(gc->foreground, &macColor) == true) { RGBForeColor(&macColor); } - ShowPen(); - MoveTo((short) 0, (short) 0); FillRect(&stippleMap->bounds, &tcl_macQdPtr->white); - MoveTo((short) x, (short) y); - DrawText(source, 0, (short) numChars); + MultiFontDrawText(fontPtr, source, numBytes, 0, 0); SetGWorld(destPort, NULL); CopyDeepMask(&((GrafPtr) bufferPort)->portBits, stippleMap, @@ -565,18 +1045,13 @@ Tk_DrawChars( Tk_FreePixmap(display, pixmap); ckfree(stippleMap->baseAddr); ckfree((char *)stippleMap); - } else { - TextFont(fontPtr->family); - TextSize(fontPtr->size); - TextFace(fontPtr->style); - + } else { if (TkSetMacColor(gc->foreground, &macColor) == true) { RGBForeColor(&macColor); } - ShowPen(); - MoveTo((short) (macWin->xOff + x), (short) (macWin->yOff + y)); - DrawText(source, 0, (short) numChars); + MultiFontDrawText(fontPtr, source, numBytes, macWin->xOff + x, + macWin->yOff + y); } TextFont(txFont); @@ -587,92 +1062,1057 @@ Tk_DrawChars( } /* + *------------------------------------------------------------------------- + * + * MultiFontDrawText -- + * + * Helper function for Tk_DrawChars. Draws characters, using the + * various screen fonts in fontPtr to draw multilingual characters. + * Note: No bidirectional support. + * + * Results: + * None. + * + * Side effects: + * Information gets drawn on the screen. + * Contents of fontPtr may be modified if more subfonts were loaded + * in order to draw all the multilingual characters in the given + * string. + * + *------------------------------------------------------------------------- + */ + +static void +MultiFontDrawText( + MacFont *fontPtr, /* Contains set of fonts to use when drawing + * following string. */ + CONST char *source, /* Potentially multilingual UTF-8 string. */ + int numBytes, /* Length of string in bytes. */ + int x, int y) /* Coordinates at which to place origin * + * of string when drawing. */ +{ + FontFamily *lastFamilyPtr, *thisFamilyPtr; + Tcl_DString runString; + CONST char *p, *end, *next; + Tcl_UniChar ch; + + TextSize(fontPtr->size); + TextFace(fontPtr->style); + + lastFamilyPtr = fontPtr->subFontArray[0].familyPtr; + + end = source + numBytes; + for (p = source; p < end; ) { + next = p + Tcl_UtfToUniChar(p, &ch); + thisFamilyPtr = FindSubFontForChar(fontPtr, ch)->familyPtr; + if (thisFamilyPtr != lastFamilyPtr) { + if (p > source) { + TextFont(lastFamilyPtr->faceNum); + Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, + p - source, &runString); + MoveTo((short) x, (short) y); + DrawText(Tcl_DStringValue(&runString), 0, + Tcl_DStringLength(&runString)); + x += TextWidth(Tcl_DStringValue(&runString), 0, + Tcl_DStringLength(&runString)); + Tcl_DStringFree(&runString); + source = p; + } + lastFamilyPtr = thisFamilyPtr; + } + p = next; + } + if (p > source) { + TextFont(thisFamilyPtr->faceNum); + Tcl_UtfToExternalDString(lastFamilyPtr->encoding, source, + p - source, &runString); + MoveTo((short) x, (short) y); + DrawText(Tcl_DStringValue(&runString), 0, + Tcl_DStringLength(&runString)); + Tcl_DStringFree(&runString); + } +} + +/* *--------------------------------------------------------------------------- * - * AllocMacFont -- + * TkMacIsCharacterMissing -- * - * Helper for TkpGetNativeFont() and TkpGetFontFromAttributes(). - * Allocates and intializes the memory for a new TkFont that - * wraps the platform-specific data. + * Given a tkFont and a character determines whether the character has + * a glyph defined in the font or not. Note that this is potentially + * not compatible with Mac OS 8 as it looks at the font handle + * structure directly. Looks into the character array of the font + * handle to determine whether the glyph is defined or not. * * Results: - * Returns pointer to newly constructed TkFont. + * Returns a 1 if the character is missing, a 0 if it is not. + * + * Side effects: + * None. + * + *--------------------------------------------------------------------------- + */ + +int +TkMacIsCharacterMissing( + Tk_Font tkfont, /* The font we are looking in. */ + unsigned int searchChar) /* The character we are looking for. */ +{ + MacFont *fontPtr = (MacFont *) tkfont; + FMInput fm; + FontRec **fontRecHandle; + + fm.family = fontPtr->subFontArray[0].familyPtr->faceNum; + fm.size = fontPtr->size; + fm.face = fontPtr->style; + fm.needBits = 0; + fm.device = 0; + fm.numer.h = fm.numer.v = fm.denom.h = fm.denom.v = 1; + +#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) + fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontResult; +#else + fontRecHandle = (FontRec **) FMSwapFont(&fm)->fontHandle; +#endif + return *(short *) ((long) &(*fontRecHandle)->owTLoc + + ((long)((*fontRecHandle)->owTLoc + searchChar + - (*fontRecHandle)->firstChar) * sizeof(short))) == -1; +} + +/* + *--------------------------------------------------------------------------- + * + * InitFont -- + * + * Helper for TkpGetNativeFont() and TkpGetFontFromAttributes(). + * Initializes the memory for a MacFont that wraps the platform-specific + * data. * * The caller is responsible for initializing the fields of the * TkFont that are used exclusively by the generic TkFont code, and * for releasing those fields before calling TkpDeleteFont(). * + * Results: + * Fills the MacFont structure. + * * Side effects: * Memory allocated. * *--------------------------------------------------------------------------- */ -static TkFont * -AllocMacFont( - TkFont *tkFontPtr, /* If non-NULL, store the information in - * this existing TkFont structure, rather than - * allocating a new structure to hold the - * font; the existing contents of the font - * will be released. If NULL, a new TkFont - * structure is allocated. */ +static void +InitFont( Tk_Window tkwin, /* For display where font will be used. */ - int family, /* Macintosh font family. */ + int faceNum, /* Macintosh font number. */ int size, /* Point size for Macintosh font. */ - int style) /* Macintosh style bits. */ + int style, /* Macintosh style bits. */ + MacFont *fontPtr) /* Filled with information constructed from + * the above arguments. */ { - char buf[257]; + Str255 nativeName; FontInfo fi; - MacFont *fontPtr; TkFontAttributes *faPtr; TkFontMetrics *fmPtr; CGrafPtr saveWorld; GDHandle saveDevice; + short pixels; - if (gWorld == NULL) { - Rect rect = {0, 0, 1, 1}; - - if (NewGWorld(&gWorld, 0, &rect, NULL, NULL, 0) != noErr) { - panic("NewGWorld failed in AllocMacFont"); - } + if (size == 0) { + size = -GetDefFontSize(); } + pixels = (short) TkFontGetPixels(tkwin, size); + GetGWorld(&saveWorld, &saveDevice); SetGWorld(gWorld, NULL); + TextFont(faceNum); + TextSize(pixels); + TextFace(style); - if (tkFontPtr == NULL) { - fontPtr = (MacFont *) ckalloc(sizeof(MacFont)); - } else { - fontPtr = (MacFont *) tkFontPtr; - } + GetFontInfo(&fi); + GetFontName(faceNum, nativeName); fontPtr->font.fid = (Font) fontPtr; - faPtr = &fontPtr->font.fa; - GetFontName(family, (StringPtr) buf); - buf[UCHAR(buf[0]) + 1] = '\0'; - faPtr->family = Tk_GetUid(buf + 1); - faPtr->pointsize = size; + faPtr = &fontPtr->font.fa; + faPtr->family = GetUtfFaceName(nativeName); + faPtr->size = TkFontGetPoints(tkwin, size); faPtr->weight = (style & bold) ? TK_FW_BOLD : TK_FW_NORMAL; faPtr->slant = (style & italic) ? TK_FS_ITALIC : TK_FS_ROMAN; faPtr->underline = ((style & underline) != 0); faPtr->overstrike = 0; - fmPtr = &fontPtr->font.fm; - TextFont(family); - TextSize(size); - TextFace(style); - GetFontInfo(&fi); + fmPtr = &fontPtr->font.fm; fmPtr->ascent = fi.ascent; fmPtr->descent = fi.descent; fmPtr->maxWidth = fi.widMax; fmPtr->fixed = (CharWidth('i') == CharWidth('w')); - - fontPtr->family = (short) family; - fontPtr->size = (short) size; + + fontPtr->size = pixels; fontPtr->style = (short) style; + + fontPtr->numSubFonts = 1; + fontPtr->subFontArray = fontPtr->staticSubFonts; + InitSubFont(fontPtr, faceNum, &fontPtr->subFontArray[0]); SetGWorld(saveWorld, saveDevice); +} + +/* + *------------------------------------------------------------------------- + * + * ReleaseFont -- + * + * Called to release the Macintosh-specific contents of a TkFont. + * The caller is responsible for freeing the memory used by the + * font itself. + * + * Results: + * None. + * + * Side effects: + * Memory is freed. + * + *--------------------------------------------------------------------------- + */ + +static void +ReleaseFont( + MacFont *fontPtr) /* The font to delete. */ +{ + int i; - return (TkFont *) fontPtr; + for (i = 0; i < fontPtr->numSubFonts; i++) { + ReleaseSubFont(&fontPtr->subFontArray[i]); + } + if (fontPtr->subFontArray != fontPtr->staticSubFonts) { + ckfree((char *) fontPtr->subFontArray); + } +} + +/* + *------------------------------------------------------------------------- + * + * InitSubFont -- + * + * Wrap a screen font and load the FontFamily that represents + * it. Used to prepare a SubFont so that characters can be mapped + * from UTF-8 to the charset of the font. + * + * Results: + * The subFontPtr is filled with information about the font. + * + * Side effects: + * None. + * + *------------------------------------------------------------------------- + */ + +static void +InitSubFont( + CONST MacFont *fontPtr, /* Font object in which the SubFont will be + * used. */ + int faceNum, /* The font number. */ + SubFont *subFontPtr) /* Filled with SubFont constructed from + * above attributes. */ +{ + subFontPtr->familyPtr = AllocFontFamily(fontPtr, faceNum); + subFontPtr->fontMap = subFontPtr->familyPtr->fontMap; +} + +/* + *------------------------------------------------------------------------- + * + * ReleaseSubFont -- + * + * Called to release the contents of a SubFont. The caller is + * responsible for freeing the memory used by the SubFont itself. + * + * Results: + * None. + * + * Side effects: + * Memory and resources are freed. + * + *--------------------------------------------------------------------------- + */ + +static void +ReleaseSubFont( + SubFont *subFontPtr) /* The SubFont to delete. */ +{ + FreeFontFamily(subFontPtr->familyPtr); +} + +/* + *------------------------------------------------------------------------- + * + * AllocFontFamily -- + * + * Find the FontFamily structure associated with the given font + * family. The information should be stored by the caller in a + * SubFont and used when determining if that SubFont supports a + * character. + * + * Results: + * A pointer to a FontFamily. The reference count in the FontFamily + * is automatically incremented. When the SubFont is released, the + * reference count is decremented. When no SubFont is using this + * FontFamily, it may be deleted. + * + * Side effects: + * A new FontFamily structure will be allocated if this font family + * has not been seen. + * + *------------------------------------------------------------------------- + */ + +static FontFamily * +AllocFontFamily( + CONST MacFont *fontPtr, /* Font object in which the FontFamily will + * be used. */ + int faceNum) /* The font number. */ +{ + FontFamily *familyPtr; + int i; + + familyPtr = fontFamilyList; + for (; familyPtr != NULL; familyPtr = familyPtr->nextPtr) { + if (familyPtr->faceNum == faceNum) { + familyPtr->refCount++; + return familyPtr; + } + } + + familyPtr = (FontFamily *) ckalloc(sizeof(FontFamily)); + memset(familyPtr, 0, sizeof(FontFamily)); + familyPtr->nextPtr = fontFamilyList; + fontFamilyList = familyPtr; + + /* + * Set key for this FontFamily. + */ + + familyPtr->faceNum = faceNum; + + /* + * An initial refCount of 2 means that FontFamily information will + * persist even when the SubFont that loaded the FontFamily is released. + * Change it to 1 to cause FontFamilies to be unloaded when not in use. + */ + + familyPtr->refCount = 2; + familyPtr->encoding = GetFontEncoding(faceNum, 1, &familyPtr->isSymbolFont); + familyPtr->isMultiByteFont = 0; + FillParseTable(familyPtr->typeTable, FontToScript(faceNum)); + for (i = 0; i < 256; i++) { + if (familyPtr->typeTable[i] != 0) { + familyPtr->isMultiByteFont = 1; + break; + } + } + return familyPtr; +} + +/* + *------------------------------------------------------------------------- + * + * FreeFontFamily -- + * + * Called to free a FontFamily when the SubFont is finished using it. + * Frees the contents of the FontFamily and the memory used by the + * FontFamily itself. + * + * Results: + * None. + * + * Side effects: + * None. + * + *------------------------------------------------------------------------- + */ + +static void +FreeFontFamily( + FontFamily *familyPtr) /* The FontFamily to delete. */ +{ + FontFamily **familyPtrPtr; + int i; + + if (familyPtr == NULL) { + return; + } + familyPtr->refCount--; + if (familyPtr->refCount > 0) { + return; + } + Tcl_FreeEncoding(familyPtr->encoding); + for (i = 0; i < FONTMAP_PAGES; i++) { + if (familyPtr->fontMap[i] != NULL) { + ckfree((char *) familyPtr->fontMap[i]); + } + } + + /* + * Delete from list. + */ + + for (familyPtrPtr = &fontFamilyList; ; ) { + if (*familyPtrPtr == familyPtr) { + *familyPtrPtr = familyPtr->nextPtr; + break; + } + familyPtrPtr = &(*familyPtrPtr)->nextPtr; + } + + ckfree((char *) familyPtr); } + +/* + *------------------------------------------------------------------------- + * + * FindSubFontForChar -- + * + * Determine which physical screen font is necessary to use to + * display the given character. If the font object does not have + * a screen font that can display the character, another screen font + * may be loaded into the font object, following a set of preferred + * fallback rules. + * + * Results: + * The return value is the SubFont to use to display the given + * character. + * + * Side effects: + * The contents of fontPtr are modified to cache the results + * of the lookup and remember any SubFonts that were dynamically + * loaded. + * + *------------------------------------------------------------------------- + */ + +static SubFont * +FindSubFontForChar( + MacFont *fontPtr, /* The font object with which the character + * will be displayed. */ + int ch) /* The Unicode character to be displayed. */ +{ + int i, j, k; + char *fallbackName; + char **aliases; + SubFont *subFontPtr; + FontNameMap *mapPtr; + Tcl_DString faceNames; + char ***fontFallbacks; + char **anyFallbacks; + + if (FontMapLookup(&fontPtr->subFontArray[0], ch)) { + return &fontPtr->subFontArray[0]; + } + + for (i = 1; i < fontPtr->numSubFonts; i++) { + if (FontMapLookup(&fontPtr->subFontArray[i], ch)) { + return &fontPtr->subFontArray[i]; + } + } + /* + * Keep track of all face names that we check, so we don't check some + * name multiple times if it can be reached by multiple paths. + */ + + Tcl_DStringInit(&faceNames); + + aliases = TkFontGetAliasList(fontPtr->font.fa.family); + + subFontPtr = NULL; + fontFallbacks = TkFontGetFallbacks(); + for (i = 0; fontFallbacks[i] != NULL; i++) { + for (j = 0; fontFallbacks[i][j] != NULL; j++) { + fallbackName = fontFallbacks[i][j]; + if (strcasecmp(fallbackName, fontPtr->font.fa.family) == 0) { + /* + * If the base font has a fallback... + */ + + goto tryfallbacks; + } else if (aliases != NULL) { + /* + * Or if an alias for the base font has a fallback... + */ + + for (k = 0; aliases[k] != NULL; k++) { + if (strcasecmp(aliases[k], fallbackName) == 0) { + goto tryfallbacks; + } + } + } + } + continue; + + /* + * ...then see if we can use one of the fallbacks, or an + * alias for one of the fallbacks. + */ + + tryfallbacks: + for (j = 0; fontFallbacks[i][j] != NULL; j++) { + fallbackName = fontFallbacks[i][j]; + subFontPtr = CanUseFallbackWithAliases(fontPtr, fallbackName, + ch, &faceNames); + if (subFontPtr != NULL) { + goto end; + } + } + } + + /* + * See if we can use something from the global fallback list. + */ + + anyFallbacks = TkFontGetGlobalClass(); + for (i = 0; anyFallbacks[i] != NULL; i++) { + fallbackName = anyFallbacks[i]; + subFontPtr = CanUseFallbackWithAliases(fontPtr, fallbackName, ch, + &faceNames); + if (subFontPtr != NULL) { + goto end; + } + } + + /* + * Try all face names available in the whole system until we + * find one that can be used. + */ + + for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { + fallbackName = mapPtr->utfName; + if (SeenName(fallbackName, &faceNames) == 0) { + subFontPtr = CanUseFallback(fontPtr, fallbackName, ch); + if (subFontPtr != NULL) { + goto end; + } + } + } + + end: + Tcl_DStringFree(&faceNames); + + if (subFontPtr == NULL) { + /* + * No font can display this character. We will use the base font + * and have it display the "unknown" character. + */ + + subFontPtr = &fontPtr->subFontArray[0]; + FontMapInsert(subFontPtr, ch); + } + return subFontPtr; +} + +/* + *------------------------------------------------------------------------- + * + * FontMapLookup -- + * + * See if the screen font can display the given character. + * + * Results: + * The return value is 0 if the screen font cannot display the + * character, non-zero otherwise. + * + * Side effects: + * New pages are added to the font mapping cache whenever the + * character belongs to a page that hasn't been seen before. + * When a page is loaded, information about all the characters on + * that page is stored, not just for the single character in + * question. + * + *------------------------------------------------------------------------- + */ + +static int +FontMapLookup( + SubFont *subFontPtr, /* Contains font mapping cache to be queried + * and possibly updated. */ + int ch) /* Character to be tested. */ +{ + int row, bitOffset; + + row = ch >> FONTMAP_SHIFT; + if (subFontPtr->fontMap[row] == NULL) { + FontMapLoadPage(subFontPtr, row); + } + bitOffset = ch & (FONTMAP_BITSPERPAGE - 1); + return (subFontPtr->fontMap[row][bitOffset >> 3] >> (bitOffset & 7)) & 1; +} + +/* + *------------------------------------------------------------------------- + * + * FontMapInsert -- + * + * Tell the font mapping cache that the given screen font should be + * used to display the specified character. This is called when no + * font on the system can be be found that can display that + * character; we lie to the font and tell it that it can display + * the character, otherwise we would end up re-searching the entire + * fallback hierarchy every time that character was seen. + * + * Results: + * None. + * + * Side effects: + * New pages are added to the font mapping cache whenever the + * character belongs to a page that hasn't been seen before. + * When a page is loaded, information about all the characters on + * that page is stored, not just for the single character in + * question. + * + *------------------------------------------------------------------------- + */ + +static void +FontMapInsert( + SubFont *subFontPtr, /* Contains font mapping cache to be + * updated. */ + int ch) /* Character to be added to cache. */ +{ + int row, bitOffset; + + row = ch >> FONTMAP_SHIFT; + if (subFontPtr->fontMap[row] == NULL) { + FontMapLoadPage(subFontPtr, row); + } + bitOffset = ch & (FONTMAP_BITSPERPAGE - 1); + subFontPtr->fontMap[row][bitOffset >> 3] |= 1 << (bitOffset & 7); +} + +/* + *------------------------------------------------------------------------- + * + * FontMapLoadPage -- + * + * Load information about all the characters on a given page. + * This information consists of one bit per character that indicates + * whether the associated HFONT can (1) or cannot (0) display the + * characters on the page. + * + * Results: + * None. + * + * Side effects: + * Mempry allocated. + * + *------------------------------------------------------------------------- + */ +static void +FontMapLoadPage( + SubFont *subFontPtr, /* Contains font mapping cache to be + * updated. */ + int row) /* Index of the page to be loaded into + * the cache. */ +{ + FMInput fm; + FontRec *fontRecPtr; + short *widths; + int i, end, bitOffset, isMultiByteFont; + char src[TCL_UTF_MAX]; + unsigned char buf[16]; + int srcRead, dstWrote; + Tcl_Encoding encoding; + + subFontPtr->fontMap[row] = (char *) ckalloc(FONTMAP_BITSPERPAGE / 8); + memset(subFontPtr->fontMap[row], 0, FONTMAP_BITSPERPAGE / 8); + + encoding = subFontPtr->familyPtr->encoding; + + fm.family = subFontPtr->familyPtr->faceNum; + fm.size = 12; + fm.face = 0; + fm.needBits = 0; + fm.device = 0; + fm.numer.h = 1; + fm.numer.v = 1; + fm.denom.h = 1; + fm.denom.v = 1; + +#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300) + fontRecPtr = *((FontRec **) FMSwapFont(&fm)->fontResult); +#else + fontRecPtr = *((FontRec **) FMSwapFont(&fm)->fontHandle); +#endif + widths = (short *) ((long) &fontRecPtr->owTLoc + + ((long) (fontRecPtr->owTLoc - fontRecPtr->firstChar) + * sizeof(short))); + isMultiByteFont = subFontPtr->familyPtr->isMultiByteFont; + + end = (row + 1) << FONTMAP_SHIFT; + for (i = row << FONTMAP_SHIFT; i < end; i++) { + if (Tcl_UtfToExternal(NULL, encoding, src, Tcl_UniCharToUtf(i, src), + TCL_ENCODING_STOPONERROR, NULL, (char *) buf, sizeof(buf), + &srcRead, &dstWrote, NULL) == TCL_OK) { + + if (((isMultiByteFont != 0) && (buf[0] > 31)) + || (widths[buf[0]] != -1)) { + if ((buf[0] == 0x11) && (widths[0x12] == -1)) { + continue; + } + + /* + * Mac's char existence metrics are only for one-byte + * characters. If we have a double-byte char, just + * assume that the font supports that char if the font's + * encoding supports that char. + */ + + bitOffset = i & (FONTMAP_BITSPERPAGE - 1); + subFontPtr->fontMap[row][bitOffset >> 3] |= 1 << (bitOffset & 7); + } + } + } +} + +/* + *--------------------------------------------------------------------------- + * + * CanUseFallbackWithAliases -- + * + * Helper function for FindSubFontForChar. Determine if the + * specified face name (or an alias of the specified face name) + * can be used to construct a screen font that can display the + * given character. + * + * Results: + * See CanUseFallback(). + * + * Side effects: + * If the name and/or one of its aliases was rejected, the + * rejected string is recorded in nameTriedPtr so that it won't + * be tried again. + * + *--------------------------------------------------------------------------- + */ + +static SubFont * +CanUseFallbackWithAliases( + MacFont *fontPtr, /* The font object that will own the new + * screen font. */ + char *faceName, /* Desired face name for new screen font. */ + int ch, /* The Unicode character that the new + * screen font must be able to display. */ + Tcl_DString *nameTriedPtr) /* Records face names that have already + * been tried. It is possible for the same + * face name to be queried multiple times when + * trying to find a suitable screen font. */ +{ + SubFont *subFontPtr; + char **aliases; + int i; + + if (SeenName(faceName, nameTriedPtr) == 0) { + subFontPtr = CanUseFallback(fontPtr, faceName, ch); + if (subFontPtr != NULL) { + return subFontPtr; + } + } + aliases = TkFontGetAliasList(faceName); + if (aliases != NULL) { + for (i = 0; aliases[i] != NULL; i++) { + if (SeenName(aliases[i], nameTriedPtr) == 0) { + subFontPtr = CanUseFallback(fontPtr, aliases[i], ch); + if (subFontPtr != NULL) { + return subFontPtr; + } + } + } + } + return NULL; +} + +/* + *--------------------------------------------------------------------------- + * + * SeenName -- + * + * Used to determine we have already tried and rejected the given + * face name when looking for a screen font that can support some + * Unicode character. + * + * Results: + * The return value is 0 if this face name has not already been seen, + * non-zero otherwise. + * + * Side effects: + * None. + * + *--------------------------------------------------------------------------- + */ + +static int +SeenName( + CONST char *name, /* The name to check. */ + Tcl_DString *dsPtr) /* Contains names that have already been + * seen. */ +{ + CONST char *seen, *end; + + seen = Tcl_DStringValue(dsPtr); + end = seen + Tcl_DStringLength(dsPtr); + while (seen < end) { + if (strcasecmp(seen, name) == 0) { + return 1; + } + seen += strlen(seen) + 1; + } + Tcl_DStringAppend(dsPtr, (char *) name, (int) (strlen(name) + 1)); + return 0; +} + +/* + *------------------------------------------------------------------------- + * + * CanUseFallback -- + * + * If the specified physical screen font has not already been loaded + * into the font object, determine if the specified physical screen + * font can display the given character. + * + * Results: + * The return value is a pointer to a newly allocated SubFont, owned + * by the font object. This SubFont can be used to display the given + * character. The SubFont represents the screen font with the base set + * of font attributes from the font object, but using the specified + * font name. NULL is returned if the font object already holds + * a reference to the specified physical font or if the specified + * physical font cannot display the given character. + * + * Side effects: + * The font object's subFontArray is updated to contain a reference + * to the newly allocated SubFont. + * + *------------------------------------------------------------------------- + */ + +static SubFont * +CanUseFallback( + MacFont *fontPtr, /* The font object that will own the new + * screen font. */ + CONST char *faceName, /* Desired face name for new screen font. */ + int ch) /* The Unicode character that the new + * screen font must be able to display. */ +{ + int i; + SubFont subFont; + short faceNum; + + if (GetFamilyNum(faceName, &faceNum) == 0) { + return NULL; + } + + /* + * Skip all fonts we've already used. + */ + + for (i = 0; i < fontPtr->numSubFonts; i++) { + if (faceNum == fontPtr->subFontArray[i].familyPtr->faceNum) { + return NULL; + } + } + + /* + * Load this font and see if it has the desired character. + */ + + InitSubFont(fontPtr, faceNum, &subFont); + if (((ch < 256) && (subFont.familyPtr->isSymbolFont)) + || (FontMapLookup(&subFont, ch) == 0)) { + ReleaseSubFont(&subFont); + return NULL; + } + + if (fontPtr->numSubFonts >= SUBFONT_SPACE) { + SubFont *newPtr; + + newPtr = (SubFont *) ckalloc(sizeof(SubFont) + * (fontPtr->numSubFonts + 1)); + memcpy((char *) newPtr, fontPtr->subFontArray, + fontPtr->numSubFonts * sizeof(SubFont)); + if (fontPtr->subFontArray != fontPtr->staticSubFonts) { + ckfree((char *) fontPtr->subFontArray); + } + fontPtr->subFontArray = newPtr; + } + fontPtr->subFontArray[fontPtr->numSubFonts] = subFont; + fontPtr->numSubFonts++; + return &fontPtr->subFontArray[fontPtr->numSubFonts - 1]; +} + +/* + *------------------------------------------------------------------------- + * + * GetFamilyNum -- + * + * Determines if any physical screen font exists on the system with + * the given family name. If the family exists, then it should be + * possible to construct some physical screen font with that family + * name. + * + * Results: + * The return value is 0 if the specified font family does not exist, + * non-zero otherwise. *faceNumPtr is filled with the unique face + * number that identifies the screen font, or 0 if the font family + * did not exist. + * + * Side effects: + * None. + * + *------------------------------------------------------------------------- + */ + +static int +GetFamilyNum( + CONST char *faceName, /* UTF-8 name of font family to query. */ + short *faceNumPtr) /* Filled with font number for above family. */ +{ + FontNameMap *mapPtr; + + if (faceName != NULL) { + for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { + if (strcasecmp(faceName, mapPtr->utfName) == 0) { + *faceNumPtr = mapPtr->faceNum; + return 1; + } + } + } + *faceNumPtr = 0; + return 0; +} + +static int +GetFamilyOrAliasNum( + CONST char *faceName, /* UTF-8 name of font family to query. */ + short *faceNumPtr) /* Filled with font number for above family. */ +{ + char **aliases; + int i; + + if (GetFamilyNum(faceName, faceNumPtr) != 0) { + return 1; + } + aliases = TkFontGetAliasList(faceName); + if (aliases != NULL) { + for (i = 0; aliases[i] != NULL; i++) { + if (GetFamilyNum(aliases[i], faceNumPtr) != 0) { + return 1; + } + } + } + return 0; +} + +/* + *------------------------------------------------------------------------- + * + * GetUtfFaceName -- + * + * Given the native name for a Macintosh font (in which the name of + * the font is in the encoding of the font itself), return the UTF-8 + * name that corresponds to that font. The specified font name must + * refer to a font that actually exists on the machine. + * + * This function is used to obtain the UTF-8 name when querying the + * properties of a Macintosh font object. + * + * Results: + * The return value is a pointer to the UTF-8 of the specified font. + * + * Side effects: + * None. + * + *------------------------------------------------------------------------ + */ + +static Tk_Uid +GetUtfFaceName( + StringPtr nativeName) /* Pascal name for font in native encoding. */ +{ + FontNameMap *mapPtr; + + for (mapPtr = gFontNameMap; mapPtr->utfName != NULL; mapPtr++) { + if (pstrcmp(nativeName, mapPtr->nativeName) == 0) { + return mapPtr->utfName; + } + } + panic("GetUtfFaceName: unexpected nativeName"); + return NULL; +} + +/* + *------------------------------------------------------------------------ + * + * GetFontEncoding -- + * + * Return a string that can be passed to Tcl_GetTextEncoding() and + * used to convert bytes from UTF-8 into the encoding of the + * specified font. + * + * The desired encoding to use to convert the name of a symbolic + * font into UTF-8 is macRoman, while the desired encoding to use + * to convert bytes in a symbolic font to UTF-8 is the corresponding + * symbolic encoding. Due to this dual interpretatation of symbolic + * fonts, the caller can specify what type of encoding to return + * should the specified font be symbolic. + * + * Results: + * The return value is a string that specifies the font's encoding. + * If the font's encoding could not be identified, NULL is returned. + * + * Side effects: + * None. + * + *------------------------------------------------------------------------ + */ + +static Tcl_Encoding +GetFontEncoding( + int faceNum, /* Macintosh font number. */ + int allowSymbol, /* If non-zero, then the encoding string + * for symbol fonts will be the corresponding + * symbol encoding. Otherwise, the encoding + * string for symbol fonts will be + * "macRoman". */ + int *isSymbolPtr) /* Filled with non-zero if this font is a + * symbol font, 0 otherwise. */ +{ + Str255 faceName; + int script, lang; + char *name; + + if (allowSymbol != 0) { + GetFontName(faceNum, faceName); + if (pstrcasecmp(faceName, "\psymbol") == 0) { + *isSymbolPtr = 1; + return Tcl_GetEncoding(NULL, "symbol"); + } + if (pstrcasecmp(faceName, "\pzapf dingbats") == 0) { + *isSymbolPtr = 1; + return Tcl_GetEncoding(NULL, "macDingbats"); + } + } + + *isSymbolPtr = 0; + + script = FontToScript(faceNum); + lang = GetScriptVariable(script, smScriptLang); + name = NULL; + if (script == smRoman) { + name = TkFindStateString(romanMap, lang); + } else if (script == smCyrillic) { + name = TkFindStateString(cyrillicMap, lang); + } + if (name == NULL) { + name = TkFindStateString(scriptMap, script); + } + return Tcl_GetEncoding(NULL, name); +} diff --git a/mac/tkMacHLEvents.c b/mac/tkMacHLEvents.c index 71ce38c..f86d2fa 100644 --- a/mac/tkMacHLEvents.c +++ b/mac/tkMacHLEvents.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacHLEvents.c,v 1.2 1998/09/14 18:23:35 stanton Exp $ + * RCS: @(#) $Id: tkMacHLEvents.c,v 1.3 1999/04/16 01:51:31 stanton Exp $ */ #include "tcl.h" @@ -228,13 +228,11 @@ OdocHandler( } Tcl_DStringInit(&command); - Tcl_DStringInit(&pathName); Tcl_DStringAppend(&command, "tkOpenDocument", -1); for (index = 1; index <= count; index++) { int length; Handle fullPath; - Tcl_DStringSetLength(&pathName, 0); err = AEGetNthPtr(&fileSpecList, index, typeFSS, &keyword, &type, (Ptr) &file, sizeof(FSSpec), &actual); if ( err != noErr ) { @@ -243,17 +241,17 @@ OdocHandler( err = FSpPathFromLocation(&file, &length, &fullPath); HLock(fullPath); - Tcl_DStringAppend(&pathName, *fullPath, length); + Tcl_ExternalToUtfDString(NULL, *fullPath, length, &pathName); HUnlock(fullPath); DisposeHandle(fullPath); - Tcl_DStringAppendElement(&command, pathName.string); + Tcl_DStringAppendElement(&command, Tcl_DStringValue(&pathName)); + Tcl_DStringFree(&pathName); } - Tcl_GlobalEval(interp, command.string); + Tcl_GlobalEval(interp, Tcl_DStringValue(&command)); Tcl_DStringFree(&command); - Tcl_DStringFree(&pathName); return noErr; } @@ -361,10 +359,12 @@ ScriptHandler( if (tclErr >= 0) { if (tclErr == TCL_OK) { AEPutParamPtr(reply, keyDirectObject, typeChar, - interp->result, strlen(interp->result)); + Tcl_GetStringResult(interp), + strlen(Tcl_GetStringResult(interp))); } else { AEPutParamPtr(reply, keyErrorString, typeChar, - interp->result, strlen(interp->result)); + Tcl_GetStringResult(interp), + strlen(Tcl_GetStringResult(interp))); AEPutParamPtr(reply, keyErrorNumber, typeInteger, (Ptr) &tclErr, sizeof(int)); } diff --git a/mac/tkMacInit.c b/mac/tkMacInit.c index 08c1fe6..ba90fc9 100644 --- a/mac/tkMacInit.c +++ b/mac/tkMacInit.c @@ -4,12 +4,12 @@ * This file contains Mac-specific interpreter initialization * functions. * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. + * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacInit.c,v 1.2 1998/09/14 18:23:36 stanton Exp $ + * RCS: @(#) $Id: tkMacInit.c,v 1.3 1999/04/16 01:51:31 stanton Exp $ */ #include <Resources.h> @@ -41,7 +41,7 @@ QDGlobalsPtr tcl_macQdPtr = NULL; * * Results: * A standard Tcl completion code (TCL_OK or TCL_ERROR). Also - * leaves information in interp->result. + * leaves information in the interp's result. * * Side effects: * Sets "tk_library" Tcl variable, runs initialization scripts diff --git a/mac/tkMacInt.h b/mac/tkMacInt.h index 1a8f1fc..e6478ab 100644 --- a/mac/tkMacInt.h +++ b/mac/tkMacInt.h @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacInt.h,v 1.6 1999/03/10 07:04:44 stanton Exp $ + * RCS: @(#) $Id: tkMacInt.h,v 1.7 1999/04/16 01:51:31 stanton Exp $ */ #ifndef _TKMACINT @@ -208,10 +208,4 @@ typedef TkMenuDefProcPtr TkMenuDefUPP; (whichItemPtr), (globalsPtr)) #endif -/* - * Internal procedures shared among Macintosh Tk modules but not exported - * to the outside world: - */ -#include "tkIntPlatDecls.h" - #endif /* _TKMACINT */ diff --git a/mac/tkMacKeyboard.c b/mac/tkMacKeyboard.c index 94f272d..122cf06 100644 --- a/mac/tkMacKeyboard.c +++ b/mac/tkMacKeyboard.c @@ -3,12 +3,12 @@ * * Routines to support keyboard events on the Macintosh. * - * Copyright (c) 1995-1996 Sun Microsystems, Inc. + * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacKeyboard.c,v 1.2 1998/09/14 18:23:37 stanton Exp $ + * RCS: @(#) $Id: tkMacKeyboard.c,v 1.3 1999/04/16 01:51:31 stanton Exp $ */ #include "tkInt.h" @@ -137,7 +137,7 @@ XKeycodeToKeysym( int index) { register Tcl_HashEntry *hPtr; - register char c; + int c; char virtualKey; int newKeycode; unsigned long dummy, newChar; @@ -146,8 +146,11 @@ XKeycodeToKeysym( InitKeyMaps(); } - c = keycode & charCodeMask; - virtualKey = (keycode & keyCodeMask) >> 8; + virtualKey = (char) (keycode >> 16); + c = (keycode) & 0xffff; + if (c > 255) { + return NoSymbol; + } /* * When determining what keysym to produce we firt check to see if @@ -161,8 +164,6 @@ XKeycodeToKeysym( return (KeySym) Tcl_GetHashValue(hPtr); } } - - hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey); if (hPtr != NULL) { return (KeySym) Tcl_GetHashValue(hPtr); @@ -190,60 +191,63 @@ XKeycodeToKeysym( /* *---------------------------------------------------------------------- * - * XLookupString -- + * TkpGetString -- * * Retrieve the string equivalent for the given keyboard event. * * Results: - * Returns the number of characters stored in buffer_return. + * Returns the UTF string. * * Side effects: - * Retrieves the characters stored in the event and inserts them - * into buffer_return. + * None. * *---------------------------------------------------------------------- */ -int -XLookupString( - XKeyEvent* event_struct, - char* buffer_return, - int bytes_buffer, - KeySym* keysym_return, - XComposeStatus* status_in_out) +char * +TkpGetString( + TkWindow *winPtr, /* Window where event occurred: needed to + * get input context. */ + XEvent *eventPtr, /* X keyboard event. */ + Tcl_DString *dsPtr) /* Uninitialized or empty string to hold + * result. */ { register Tcl_HashEntry *hPtr; char string[3]; char virtualKey; - char c; + int c, len; if (!initialized) { InitKeyMaps(); } - - c = event_struct->keycode & charCodeMask; - string[0] = c; - string[1] = '\0'; + + Tcl_DStringInit(dsPtr); + + virtualKey = (char) (eventPtr->xkey.keycode >> 16); + c = (eventPtr->xkey.keycode) & 0xffff; + + if (c < 256) { + string[0] = (char) c; + len = 1; + } else { + string[0] = (char) (c >> 8); + string[1] = (char) c; + len = 2; + } /* * Just return NULL if the character is a function key or another * non-printing key. */ if (c == 0x10) { - string[0] = '\0'; + len = 0; } else { - virtualKey = (event_struct->keycode & keyCodeMask) >> 8; hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey); if (hPtr != NULL) { - string[0] = '\0'; + len = 0; } } - - if (buffer_return != NULL) { - strncpy(buffer_return, string, bytes_buffer); - } - - return strlen(string); + return Tcl_ExternalToUtfDString(NULL, string, len, dsPtr); } /* @@ -377,7 +381,7 @@ XKeysymToKeycode( virtualKeyCode = 0x24; keysym = '\r'; } - keycode = keysym + ((virtualKeyCode << 8) & keyCodeMask); + keycode = keysym + (virtualKeyCode <<16); } return keycode; diff --git a/mac/tkMacMenu.c b/mac/tkMacMenu.c index 30d4af8..2ad0e18 100644 --- a/mac/tkMacMenu.c +++ b/mac/tkMacMenu.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacMenu.c,v 1.7 1999/04/16 01:25:54 stanton Exp $ + * RCS: @(#) $Id: tkMacMenu.c,v 1.8 1999/04/16 01:51:31 stanton Exp $ */ #include <Menus.h> @@ -54,7 +54,7 @@ typedef struct MenuEntryUserData { * The following are constants relating to the SICNs used for drawing the MDEF. */ -#define SICN_RESOURCE_NUMBER 128 +#define SICN_RESOURCE_NUMBER 128 #define SICN_HEIGHT 16 #define SICN_ROWS 2 @@ -176,6 +176,9 @@ static char *currentMenuBarName; * DString. */ static Tk_Window currentMenuBarOwner; /* Which window owns the current menu bar. */ +static char elipsisString[TCL_UTF_MAX + 1]; + /* The UTF representation of the elipsis (ƒ) + * character. */ static int helpItemCount; /* The number of items in the help menu. * -1 means that the help menu is * unavailable. This does not include @@ -192,7 +195,8 @@ static MacDrawable macMDEFDrawable; static MDEFScrollFlag = 0; /* Used so that popups don't scroll too soon. */ static int menuBarFlags; /* Used for whether the menu bar needs * redrawing or not. */ -static TkMenuDefUPP menuDefProc;/* The routine descriptor to the MDEF proc. +static TkMenuDefUPP menuDefProc = NULL ; + /* The routine descriptor to the MDEF proc. * The MDEF is needed to draw menus with * non-standard attributes and to support * tearoff menus. */ @@ -214,6 +218,11 @@ static TopLevelMenubarList *windowListPtr; static MenuItemDrawingUPP tkThemeMenuItemDrawingUPP; /* Points to the UPP for theme Item drawing. */ +static GC appearanceGC = NULL; /* The fake appearance GC. If you + pass the foreground of this to TkMacSetColor, + it will return false, so you will know + not to set the foreground color */ + /* * Forward declarations for procedures defined later in this file: @@ -254,7 +263,9 @@ static void DrawTearoffEntry _ANSI_ARGS_((TkMenu *menuPtr, TkMenuEntry *mePtr, Drawable d, GC gc, Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, int x, int y, int width, int height)); -static Handle FixMDEF _ANSI_ARGS_((void)); +static void FixMDEF _ANSI_ARGS_((void)); +static void GetEntryText _ANSI_ARGS_((TkMenuEntry *mePtr, + Tcl_DString *dStringPtr)); static void GetMenuAccelGeometry _ANSI_ARGS_((TkMenu *menuPtr, TkMenuEntry *mePtr, Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr, int *modWidthPtr, @@ -299,6 +310,8 @@ static void RecursivelyInsertMenu _ANSI_ARGS_(( static void SetDefaultMenubar _ANSI_ARGS_((void)); static int SetMenuCascade _ANSI_ARGS_((TkMenu *menuPtr)); static void SetMenuIndicator _ANSI_ARGS_((TkMenuEntry *mePtr)); +static void SetMenuTitle _ANSI_ARGS_((MenuHandle menuHdl, + Tcl_Obj *titlePtr)); static void AppearanceEntryDrawWrapper _ANSI_ARGS_((TkMenuEntry *mePtr, Rect * menuRectPtr, TkMenuLowMemGlobals *globalsPtr, Drawable d, Tk_FontMetrics *fmPtr, Tk_Font tkfont, @@ -330,7 +343,7 @@ pascal void tkThemeMenuItemDrawingProc _ANSI_ARGS_ ((const Rect *inBounds, int TkMacUseMenuID( - short macID) /* The id to take out of the table */ + short macID) /* The id to take out of the table */ { Tcl_HashEntry *commandEntryPtr; int newEntry; @@ -441,6 +454,7 @@ GetNewID( *menuIDPtr = returnID; return TCL_OK; } else { + Tcl_ResetResult(interp); Tcl_AppendResult(interp, "No more menus can be allocated.", (char *) NULL); return TCL_ERROR; @@ -676,7 +690,8 @@ TkpDestroyMenuEntry( * * Given a menu entry, gives back the text that should go in it. * Separators should be done by the caller, as they have to be - * handled specially. + * handled specially. This is primarily used to do a substitution + * between "..." and "ƒ". * * Results: * itemText points to the new text for the item. @@ -690,36 +705,41 @@ TkpDestroyMenuEntry( static void GetEntryText( TkMenuEntry *mePtr, /* A pointer to the menu entry. */ - Str255 itemText) /* The pascal string containing the text */ + Tcl_DString *dStringPtr) /* The DString to put the text into. This + * will be initialized by this routine. */ { + Tcl_DStringInit(dStringPtr); if (mePtr->type == TEAROFF_ENTRY) { - strcpy((char *)itemText, (const char *)"\p(Tear-off)"); - } else if (mePtr->imageString != NULL) { - strcpy((char *)itemText, (const char *)"\p(Image)"); - } else if (mePtr->bitmap != None) { - strcpy((char *)itemText, (const char *)"\p(Pixmap)"); - } else if (mePtr->label == NULL || mePtr->labelLength == 0) { + Tcl_DStringAppend(dStringPtr, "(Tear-off)", -1); + } else if (mePtr->imagePtr != NULL) { + Tcl_DStringAppend(dStringPtr, "(Image)", -1); + } else if (mePtr->bitmapPtr != NULL) { + Tcl_DStringAppend(dStringPtr, "(Pixmap)", -1); + } else if (mePtr->labelPtr == NULL || mePtr->labelLength == 0) { /* * The Mac menu manager does not like null strings. */ - strcpy((char *)itemText, (const char *)"\p "); + Tcl_DStringAppend(dStringPtr, " ", -1); } else { - char *text = mePtr->label; + int length; + char *text = Tcl_GetStringFromObj(mePtr->labelPtr, &length); + char *dStringText; int i; - itemText[0] = 0; - for (i = 1; (*text != '\0') && (i <= 230); i++, text++) { + for (i = 0; i < length; text++, i++) { if ((*text == '.') && (*(text + 1) != '\0') && (*(text + 1) == '.') && (*(text + 2) != '\0') && (*(text + 2) == '.')) { - itemText[i] = 'É'; - text += 2; - } else { - itemText[i] = *text; + Tcl_DStringAppend(dStringPtr, elipsisString, -1); + i += strlen(elipsisString) - 1; + } else { + Tcl_DStringSetLength(dStringPtr, + Tcl_DStringLength(dStringPtr) + 1); + dStringText = Tcl_DStringValue(dStringPtr); + dStringText[i] = *text; } - itemText[0] += 1; } } } @@ -736,10 +756,10 @@ GetEntryText( * We try the following special mac characters. If none of them * are present, just use the check mark. * '' - Check mark character - * '¥' - Bullet character + * '´' - Bullet character * '' - Filled diamond * '×' - Hollow diamond - * 'Ñ' = Long dash ("em dash") + * '„' = Long dash ("em dash") * '-' = short dash (minus, "en dash"); * * Results: @@ -757,19 +777,22 @@ FindMarkCharacter( * for. */ { char markChar; - Tk_Font tkfont = (mePtr->tkfont == NULL) ? mePtr->menuPtr->tkfont - : mePtr->tkfont; + Tk_Font tkfont; + + tkfont = Tk_GetFontFromObj(mePtr->menuPtr->tkwin, + (mePtr->fontPtr == NULL) ? mePtr->menuPtr->fontPtr + : mePtr->fontPtr); if (!TkMacIsCharacterMissing(tkfont, '')) { markChar = ''; - } else if (!TkMacIsCharacterMissing(tkfont, '¥')) { - markChar = '¥'; + } else if (!TkMacIsCharacterMissing(tkfont, '´')) { + markChar = '´'; } else if (!TkMacIsCharacterMissing(tkfont, '')) { markChar = ''; } else if (!TkMacIsCharacterMissing(tkfont, '×')) { markChar = '×'; - } else if (!TkMacIsCharacterMissing(tkfont, 'Ñ')) { - markChar = 'Ñ'; + } else if (!TkMacIsCharacterMissing(tkfont, '„')) { + markChar = '„'; } else if (!TkMacIsCharacterMissing(tkfont, '-')) { markChar = '-'; } else { @@ -816,14 +839,13 @@ SetMenuIndicator( if (mePtr->type == CASCADE_ENTRY) { return; } - - if (((mePtr->type == RADIO_BUTTON_ENTRY) - || (mePtr->type == CHECK_BUTTON_ENTRY)) - && (mePtr->indicatorOn) - && (mePtr->entryFlags & ENTRY_SELECTED)) { - markChar = FindMarkCharacter(mePtr); - } else { - markChar = 0; + + markChar = 0; + if ((mePtr->type == RADIO_BUTTON_ENTRY) + || (mePtr->type == CHECK_BUTTON_ENTRY)) { + if (mePtr->indicatorOn && (mePtr->entryFlags & ENTRY_SELECTED)) { + markChar = FindMarkCharacter(mePtr); + } } SetItemMark(macMenuHdl, mePtr->index + 1, markChar); } @@ -850,10 +872,12 @@ SetMenuIndicator( static void SetMenuTitle( MenuHandle menuHdl, /* The menu we are setting the title of. */ - char *title) /* The C string to set the title to. */ + Tcl_Obj *titlePtr) /* The C string to set the title to. */ { int oldLength, newLength, oldHandleSize, dataLength; Ptr menuDataPtr; + char *title = (titlePtr == NULL) ? "" + : Tcl_GetStringFromObj(titlePtr, NULL); menuDataPtr = (Ptr) (*menuHdl)->menuData; @@ -890,7 +914,7 @@ SetMenuTitle( * * Results: * Returns standard TCL result. If TCL_ERROR is returned, then - * interp->result contains an error message. + * the interp's result contains an error message. * * Side effects: * Configuration information get set for mePtr; old resources @@ -930,7 +954,7 @@ TkpConfigureMenuEntry( } if (menuPtr->menuType == MENUBAR) { - SetMenuTitle(childMenuHdl, mePtr->label); + SetMenuTitle(childMenuHdl, mePtr->labelPtr); } } } @@ -946,7 +970,9 @@ TkpConfigureMenuEntry( if (0 == mePtr->accelLength) { ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart = -1; } else { - char *accelString = mePtr->accel; + char *accelString = (mePtr->accelPtr == NULL) ? "" + : Tcl_GetStringFromObj(mePtr->accelPtr, NULL); + char *accel = accelString; mePtr->entryFlags |= ~ENTRY_ACCEL_MASK; while (1) { @@ -992,7 +1018,7 @@ TkpConfigureMenuEntry( } ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart - = ((long) accelString - (long) mePtr->accel); + = ((long) accelString - (long) accel); } if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) { @@ -1039,11 +1065,15 @@ ReconfigureIndividualMenu( TkMenuEntry *mePtr; Str255 itemText; int parentDisabled = 0; + int state; for (mePtr = menuPtr->menuRefPtr->parentEntryPtr; mePtr != NULL; mePtr = mePtr->nextCascadePtr) { - if (strcmp(Tk_PathName(menuPtr->tkwin), mePtr->name) == 0) { - if (mePtr->state == tkDisabledUid) { + char *name = (mePtr->namePtr == NULL) ? "" + : Tcl_GetStringFromObj(mePtr->namePtr, NULL); + + if (strcmp(Tk_PathName(menuPtr->tkwin), name) == 0) { + if (mePtr->state == ENTRY_DISABLED) { parentDisabled = 1; } break; @@ -1072,15 +1102,25 @@ ReconfigureIndividualMenu( if (mePtr->type == SEPARATOR_ENTRY) { AppendMenu(macMenuHdl, SEPARATOR_TEXT); } else { - GetEntryText(mePtr, itemText); + Tcl_DString itemTextDString; + int destWrote; + + GetEntryText(mePtr, &itemTextDString); + Tcl_UtfToExternal(NULL, NULL, Tcl_DStringValue(&itemTextDString), + Tcl_DStringLength(&itemTextDString), 0, NULL, + (char *) &itemText[1], + 231, NULL, &destWrote, NULL); + itemText[0] = destWrote; + AppendMenu(macMenuHdl, "\px"); SetMenuItemText(macMenuHdl, base + index, itemText); + Tcl_DStringFree(&itemTextDString); /* * Set enabling and disabling correctly. */ - if (parentDisabled || (mePtr->state == tkDisabledUid)) { + if (parentDisabled || (mePtr->state == ENTRY_DISABLED)) { DisableItem(macMenuHdl, base + index); } else { EnableItem(macMenuHdl, base + index); @@ -1094,8 +1134,8 @@ ReconfigureIndividualMenu( if ((mePtr->type == CHECK_BUTTON_ENTRY) || (mePtr->type == RADIO_BUTTON_ENTRY)) { CheckItem(macMenuHdl, base + index, (mePtr->entryFlags - & ENTRY_SELECTED) && (mePtr->indicatorOn)); - if ((mePtr->indicatorOn) + & ENTRY_SELECTED) && mePtr->indicatorOn); + if (mePtr->indicatorOn && (mePtr->entryFlags & ENTRY_SELECTED)) { SetItemMark(macMenuHdl, base + index, FindMarkCharacter(mePtr)); @@ -1142,9 +1182,9 @@ ReconfigureIndividualMenu( if ((mePtr->type != CASCADE_ENTRY) && (ENTRY_COMMAND_ACCEL == (mePtr->entryFlags & ENTRY_ACCEL_MASK))) { - SetItemCmd(macMenuHdl, index, mePtr - ->accel[((EntryGeometry *)mePtr->platformEntryData) - ->accelTextStart]); + char *accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL); + SetItemCmd(macMenuHdl, index, accel[((EntryGeometry *) + mePtr->platformEntryData)->accelTextStart]); } } } @@ -1586,9 +1626,9 @@ DrawMenuBarWhenIdle( if (menuBarPtr == NULL) { SetDefaultMenubar(); - } else { - if (menuBarPtr->tearOff != menuPtr->tearOff) { - if (menuBarPtr->tearOff) { + } else { + if (menuBarPtr->tearoff != menuPtr->tearoff) { + if (menuBarPtr->tearoff) { appleIndex = (-1 == appleIndex) ? appleIndex : appleIndex + 1; helpIndex = (-1 == helpIndex) ? helpIndex @@ -1636,7 +1676,7 @@ DrawMenuBarWhenIdle( for (i = 0; i < menuBarPtr->numEntries; i++) { if (i == appleIndex) { - if (menuBarPtr->entries[i]->state == tkDisabledUid) { + if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) { DisableItem(((MacMenu *) menuBarPtr->entries[i] ->childMenuRefPtr->menuPtr ->platformData)->menuHdl, @@ -1679,7 +1719,7 @@ DrawMenuBarWhenIdle( DeleteMenu((*macMenuHdl)->menuID); InsertMenu(macMenuHdl, 0); RecursivelyInsertMenu(cascadeMenuPtr); - if (menuBarPtr->entries[i]->state == tkDisabledUid) { + if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) { DisableItem(((MacMenu *) menuBarPtr->entries[i] ->childMenuRefPtr->menuPtr ->platformData)->menuHdl, @@ -1734,7 +1774,8 @@ RecursivelyInsertMenu( && (menuPtr->entries[i]->childMenuRefPtr->menuPtr != NULL)) { cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr; - macMenuHdl = ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; + macMenuHdl = + ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; InsertMenu(macMenuHdl, -1); RecursivelyInsertMenu(cascadeMenuPtr); } @@ -1775,7 +1816,8 @@ RecursivelyDeleteMenu( && (menuPtr->entries[i]->childMenuRefPtr->menuPtr != NULL)) { cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr; - macMenuHdl = ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; + macMenuHdl = + ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl; DeleteMenu((*macMenuHdl)->menuID); RecursivelyInsertMenu(cascadeMenuPtr); } @@ -1885,7 +1927,8 @@ TkpSetMainMenubar( } } if (listPtr != NULL) { - menuName = Tk_PathName(listPtr->menuPtr->masterMenuPtr->tkwin); + menuName = Tk_PathName(listPtr->menuPtr->masterMenuPtr + ->tkwin); break; } } @@ -2087,15 +2130,15 @@ GetMenuAccelGeometry ( } else if (0 == mePtr->accelLength) { *textWidthPtr = 0; } else { + char *accel = (mePtr->accelPtr == NULL) ? "" + : Tcl_GetStringFromObj(mePtr->accelPtr, NULL); if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) { - *textWidthPtr = Tk_TextWidth(tkfont, mePtr->accel, - mePtr->accelLength); + *textWidthPtr = Tk_TextWidth(tkfont, accel, mePtr->accelLength); } else { int emWidth = Tk_TextWidth(tkfont, "W", 1) + 1; if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) { - int width = Tk_TextWidth(tkfont, mePtr->accel, - mePtr->accelLength); + int width = Tk_TextWidth(tkfont, accel, mePtr->accelLength); *textWidthPtr = emWidth; if (width < emWidth) { *modWidthPtr = 0; @@ -2120,7 +2163,7 @@ GetMenuAccelGeometry ( if (1 == (mePtr->accelLength - length)) { *textWidthPtr = emWidth; } else { - *textWidthPtr += Tk_TextWidth(tkfont, mePtr->accel + *textWidthPtr += Tk_TextWidth(tkfont, accel + length, mePtr->accelLength - length); } } @@ -2230,21 +2273,27 @@ DrawMenuEntryIndicator( int width, /* width of entry */ int height) /* height of entry */ { - if (((mePtr->type == CHECK_BUTTON_ENTRY) || - (mePtr->type == RADIO_BUTTON_ENTRY)) - && (mePtr->indicatorOn) - && (mePtr->entryFlags & ENTRY_SELECTED)) { - int baseline; - short markShort; - char markChar; + if ((mePtr->type == CHECK_BUTTON_ENTRY) || + (mePtr->type == RADIO_BUTTON_ENTRY)) { + if (mePtr->indicatorOn + && (mePtr->entryFlags & ENTRY_SELECTED)) { + int baseline; + short markShort; - baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; - GetItemMark(((MacMenu *) menuPtr->platformData)->menuHdl, - mePtr->index + 1, &markShort); - if (markShort != 0) { - markChar = (char) markShort; - Tk_DrawChars(menuPtr->display, d, gc, tkfont, &markChar, 1, - x + 2, baseline); + baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; + GetItemMark(((MacMenu *) menuPtr->platformData)->menuHdl, + mePtr->index + 1, &markShort); + if (markShort != 0) { + char markChar; + char markCharUTF[TCL_UTF_MAX + 1]; + int dstWrote; + + markChar = (char) markShort; + Tcl_ExternalToUtf(NULL, NULL, &markChar, 1, 0, NULL, + markCharUTF, TCL_UTF_MAX + 1, NULL, &dstWrote, NULL); + Tk_DrawChars(menuPtr->display, d, gc, tkfont, markCharUTF, + dstWrote, x + 2, baseline); + } } } } @@ -2338,11 +2387,11 @@ DrawSICN( GetForeColor(&origForeColor); GetBackColor(&origBackColor); - if (TkSetMacColor(gc->foreground, &foreColor)) { + if (TkSetMacColor(gc->foreground, &foreColor) == true) { RGBForeColor(&foreColor); } - if (TkSetMacColor(gc->background, &backColor)) { + if (TkSetMacColor(gc->background, &backColor) == true) { RGBBackColor(&backColor); } @@ -2396,6 +2445,10 @@ DrawMenuEntryAccelerator( int height, /* The height of the entry */ int drawArrow) /* Whether or not to draw cascade arrow */ { + int activeBorderWidth; + + Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr, + &activeBorderWidth); if (mePtr->type == CASCADE_ENTRY) { /* * Under Appearance, we let the Appearance Manager draw the icon @@ -2409,7 +2462,7 @@ DrawMenuEntryAccelerator( Tk_Window tkwin = menuPtr->tkwin; if (mePtr->type == CASCADE_ENTRY) { - points[0].x = width - menuPtr->activeBorderWidth + points[0].x = width - activeBorderWidth - MAC_MARGIN_WIDTH - CASCADE_ARROW_WIDTH; points[0].y = y + (height - CASCADE_ARROW_HEIGHT)/2; points[1].x = points[0].x; @@ -2424,11 +2477,14 @@ DrawMenuEntryAccelerator( } else if (mePtr->accelLength != 0) { int leftEdge = x + width; int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2; + char *accel; + + accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL); if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) { leftEdge -= ((EntryGeometry *) mePtr->platformEntryData) ->accelTextWidth; - Tk_DrawChars(menuPtr->display, d, gc, tkfont, mePtr->accel, + Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel, mePtr->accelLength, leftEdge, baseline); } else { EntryGeometry *geometryPtr = @@ -2440,7 +2496,7 @@ DrawMenuEntryAccelerator( leftEdge -= geometryPtr->modifierWidth; } - Tk_DrawChars(menuPtr->display, d, gc, tkfont, mePtr->accel + Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel + geometryPtr->accelTextStart, length, leftEdge, baseline); if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) { @@ -2524,10 +2580,8 @@ DrawMenuSeparator( TkMacSetUpGraphicsPort(mePtr->disabledGC != None ? mePtr->disabledGC : menuPtr->disabledGC); - MoveTo(x, y + (height / 2)); Line(width, 0); - SetGWorld(saveWorld, saveDevice); } } @@ -2569,7 +2623,7 @@ MenuDefProc( TkMenuEntry *parentEntryPtr; Tcl_HashEntry *commandEntryPtr; GrafPtr windowMgrPort; - Tk_Font tkfont; + Tk_Font tkfont, menuFont; Tk_FontMetrics fontMetrics, entryMetrics; Tk_FontMetrics *fmPtr; TkMenuEntry *mePtr; @@ -2703,7 +2757,8 @@ MenuDefProc( * that are lower than the bottom. */ - Tk_GetFontMetrics(menuPtr->tkfont, &fontMetrics); + menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); + Tk_GetFontMetrics(menuFont, &fontMetrics); for (i = 0; i < menuPtr->numEntries; i++) { mePtr = menuPtr->entries[i]; if (globalsPtr->menuTop + mePtr->y + mePtr->height @@ -2714,11 +2769,11 @@ MenuDefProc( continue; } /* ClipRect(&menuClipRect); */ - if (mePtr->tkfont == NULL) { + if (mePtr->fontPtr == NULL) { fmPtr = &fontMetrics; - tkfont = menuPtr->tkfont; + tkfont = menuFont; } else { - tkfont = mePtr->tkfont; + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); Tk_GetFontMetrics(tkfont, &entryMetrics); fmPtr = &entryMetrics; } @@ -2753,16 +2808,16 @@ MenuDefProc( GetBackColor(&origBackColor); if (TkSetMacColor(menuPtr->textGC->foreground, - &foreColor)) { - /* if (!TkMacHaveAppearance()) { */ + &foreColor) == true) { + if (!TkMacHaveAppearance()) { RGBForeColor(&foreColor); - /* } */ + } } if (TkSetMacColor(menuPtr->textGC->background, - &backColor)) { - /* if (!TkMacHaveAppearance()) { */ + &backColor) == true) { + if (!TkMacHaveAppearance()) { RGBBackColor(&backColor); - /* } */ + } } /* @@ -2787,7 +2842,7 @@ MenuDefProc( + menuPtr->entries[i]->height; if (PtInRect(hitPt, &itemRect)) { if ((mePtr->type == SEPARATOR_ENTRY) - || (mePtr->state == tkDisabledUid)) { + || (mePtr->state == ENTRY_DISABLED)) { newItem = -1; } else { TkMenuEntry *cascadeEntryPtr; @@ -2798,10 +2853,13 @@ MenuDefProc( cascadeEntryPtr != NULL; cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) { - if (strcmp(cascadeEntryPtr->name, - Tk_PathName(menuPtr->tkwin)) == 0) { - if (cascadeEntryPtr->state - == tkDisabledUid) { + char *name; + + name = Tcl_GetStringFromObj( + cascadeEntryPtr->namePtr, NULL); + if (strcmp(name, Tk_PathName(menuPtr->tkwin)) + == 0) { + if (cascadeEntryPtr->state == ENTRY_DISABLED) { parentDisabled = 1; } break; @@ -2855,7 +2913,13 @@ MenuDefProc( if (oldItem != newItem) { if (oldItem >= 0) { mePtr = menuPtr->entries[oldItem]; - tkfont = mePtr->tkfont ? mePtr->tkfont : menuPtr->tkfont; + if (mePtr->fontPtr == NULL) { + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, + menuPtr->fontPtr); + } else { + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, + mePtr->fontPtr); + } Tk_GetFontMetrics(tkfont, &fontMetrics); AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, (Drawable) &macMDEFDrawable, &fontMetrics, tkfont, @@ -2869,10 +2933,16 @@ MenuDefProc( int oldActiveItem = menuPtr->active; mePtr = menuPtr->entries[newItem]; - if (mePtr->state != tkDisabledUid) { + if (mePtr->state != ENTRY_DISABLED) { TkActivateMenuEntry(menuPtr, newItem); } - tkfont = mePtr->tkfont ? mePtr->tkfont : menuPtr->tkfont; + if (mePtr->fontPtr == NULL) { + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, + menuPtr->fontPtr); + } else { + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, + mePtr->fontPtr); + } Tk_GetFontMetrics(tkfont, &fontMetrics); AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr, (Drawable) &macMDEFDrawable, &fontMetrics, tkfont, @@ -2887,7 +2957,7 @@ MenuDefProc( MenuSelectEvent(menuPtr); Tcl_ServiceAll(); tkUseMenuCascadeRgn = 0; - if (mePtr->state != tkDisabledUid) { + if (mePtr->state != ENTRY_DISABLED) { TkActivateMenuEntry(menuPtr, -1); } *whichItem = newItem + 1; @@ -2900,7 +2970,8 @@ MenuDefProc( - globalsPtr->menuBottom) { scrollAmt = menuRectPtr->bottom - globalsPtr->menuBottom; } - if (!hasTopScroll && ((globalsPtr->menuTop + scrollAmt) < menuRectPtr->top)) { + if (!hasTopScroll && ((globalsPtr->menuTop + scrollAmt) + < menuRectPtr->top)) { SetRect(&updateRect, menuRectPtr->left, globalsPtr->menuTop, menuRectPtr->right, globalsPtr->menuTop + SICN_HEIGHT); @@ -2932,6 +3003,7 @@ MenuDefProc( } } if (scrollDirection != DONT_SCROLL) { + Tk_Font menuFont; RgnHandle updateRgn = NewRgn(); ScrollRect(&menuClipRect, 0, scrollAmt, updateRgn); updateRect = (*updateRgn)->rgnBBox; @@ -2946,7 +3018,8 @@ MenuDefProc( } ClipRect(&updateRect); EraseRect(&updateRect); - Tk_GetFontMetrics(menuPtr->tkfont, &fontMetrics); + menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); + Tk_GetFontMetrics(menuFont, &fontMetrics); for (i = 0; i < menuPtr->numEntries; i++) { mePtr = menuPtr->entries[i]; if (globalsPtr->menuTop + mePtr->y + mePtr->height @@ -2956,11 +3029,12 @@ MenuDefProc( > updateRect.bottom) { continue; } - if (mePtr->tkfont == NULL) { + if (mePtr->fontPtr == NULL) { fmPtr = &fontMetrics; - tkfont = menuPtr->tkfont; + tkfont = menuFont; } else { - tkfont = mePtr->tkfont; + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, + mePtr->fontPtr); Tk_GetFontMetrics(tkfont, &entryMetrics); fmPtr = &entryMetrics; } @@ -2990,18 +3064,23 @@ MenuDefProc( menuRefPtr = TkFindMenuReferences(menuPtr->interp, Tk_PathName(menuPtr->tkwin)); if ((menuRefPtr != NULL) && (menuRefPtr->parentEntryPtr != NULL)) { + char *name; for (parentEntryPtr = menuRefPtr->parentEntryPtr; - strcmp(parentEntryPtr->name, - Tk_PathName(menuPtr->tkwin)) == 0; - parentEntryPtr = parentEntryPtr->nextCascadePtr) { + parentEntryPtr != NULL + ; parentEntryPtr = parentEntryPtr->nextCascadePtr) { + name = Tcl_GetStringFromObj(parentEntryPtr->namePtr, + NULL); + if (strcmp(name, Tk_PathName(menuPtr->tkwin)) != 0) { + break; + } } if (parentEntryPtr != NULL) { TkActivateMenuEntry(parentEntryPtr->menuPtr, - parentEntryPtr->index); + parentEntryPtr->index); } } - if (menuPtr->tearOff) { + if (menuPtr->tearoff) { scratchRect = *menuRectPtr; if (tearoffStruct.menuPtr == NULL) { scratchRect.top -= 10; @@ -3152,9 +3231,9 @@ AppearanceEntryDrawWrapper( itemRect.bottom = itemRect.top + height; itemRect.right = itemRect.left + width; - if (mePtr->state == tkActiveUid) { + if (mePtr->state == ENTRY_ACTIVE) { theState = kThemeMenuSelected; - } else if (mePtr->state == tkDisabledUid) { + } else if (mePtr->state == ENTRY_DISABLED) { theState = kThemeMenuDisabled; } else { theState = kThemeMenuActive; @@ -3230,7 +3309,7 @@ TkMacHandleTearoffMenu(void) { if (tearoffStruct.menuPtr != NULL) { Tcl_DString tearoffCmdStr; - char intString[20]; + char intString[TCL_INTEGER_SPACE]; short windowPart; WindowRef whichWindow; @@ -3340,6 +3419,7 @@ DrawTearoffEntry( { XPoint points[2]; int margin, segmentWidth, maxX; + Tk_3DBorder border; if ((menuPtr->menuType != MASTER_MENU) || (FixMDEF() != NULL)) { return; @@ -3351,13 +3431,14 @@ DrawTearoffEntry( points[1].y = points[0].y; segmentWidth = 6; maxX = width - 1; + border = Tk_Get3DBorderFromObj(menuPtr->tkwin, menuPtr->borderPtr); while (points[0].x < maxX) { points[1].x = points[0].x + segmentWidth; if (points[1].x > maxX) { points[1].x = maxX; } - Tk_Draw3DPolygon(menuPtr->tkwin, d, menuPtr->border, points, 2, 1, + Tk_Draw3DPolygon(menuPtr->tkwin, d, border, points, 2, 1, TK_RELIEF_RAISED); points[0].x += 2*segmentWidth; } @@ -3476,6 +3557,7 @@ TkpDrawMenuEntry( int padY = (menuPtr->menuType == MENUBAR) ? 3 : 0; int adjustedY = y + padY; int adjustedHeight = height - 2 * padY; + int state; /* * Choose the gc for drawing the foreground part of the entry. @@ -3483,11 +3565,15 @@ TkpDrawMenuEntry( * ourselves not to change whatever color the appearance manager has set. */ - if ((mePtr->state == tkActiveUid) - && !strictMotif) { + if ((mePtr->state == ENTRY_ACTIVE) && !strictMotif) { gc = mePtr->activeGC; if (gc == NULL) { + if ((TkMacHaveAppearance() > 1) && (menuPtr->menuType != TEAROFF_MENU)) { + SetThemeTextColor(kThemeSelectedMenuItemTextColor,32,true); + gc = appearanceGC; + } else { gc = menuPtr->activeGC; + } } } else { TkMenuEntry *cascadeEntryPtr; @@ -3496,25 +3582,37 @@ TkpDrawMenuEntry( for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr; cascadeEntryPtr != NULL; cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) { - if (strcmp(cascadeEntryPtr->name, - Tk_PathName(menuPtr->tkwin)) == 0) { - if (cascadeEntryPtr->state == tkDisabledUid) { + char *name = (cascadeEntryPtr->namePtr == NULL) ? "" + : Tcl_GetStringFromObj(cascadeEntryPtr->namePtr, NULL); + + if (strcmp(name, Tk_PathName(menuPtr->tkwin)) == 0) { + if (cascadeEntryPtr->state == ENTRY_DISABLED) { parentDisabled = 1; } break; } } - if (((parentDisabled || (mePtr->state == tkDisabledUid))) - && (menuPtr->disabledFg != NULL)) { + if (((parentDisabled || (state == ENTRY_DISABLED))) + && (menuPtr->disabledFgPtr != NULL)) { gc = mePtr->disabledGC; if (gc == NULL) { + if ((TkMacHaveAppearance() > 1) && (mePtr->bitmap == NULL)) { + SetThemeTextColor(kThemeDisabledMenuItemTextColor,32,true); + gc = appearanceGC; + } else { gc = menuPtr->disabledGC; } + } } else { gc = mePtr->textGC; if (gc == NULL) { + if ((TkMacHaveAppearance() > 1) && (mePtr->bitmap == NULL)) { + SetThemeTextColor(kThemeActiveMenuItemTextColor,32,true); + gc = appearanceGC; + } else { gc = menuPtr->textGC; + } } } } @@ -3523,24 +3621,22 @@ TkpDrawMenuEntry( if (indicatorGC == NULL) { indicatorGC = menuPtr->indicatorGC; } - - bgBorder = mePtr->border; - if (bgBorder == NULL) { - bgBorder = menuPtr->border; - } + + bgBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin, + (mePtr->borderPtr == NULL) + ? menuPtr->borderPtr : mePtr->borderPtr); if (strictMotif) { activeBorder = bgBorder; } else { - activeBorder = mePtr->activeBorder; - if (activeBorder == NULL) { - activeBorder = menuPtr->activeBorder; - } + activeBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin, + (mePtr->activeBorderPtr == NULL) + ? menuPtr->activeBorderPtr : mePtr->activeBorderPtr); } - if (mePtr->tkfont == NULL) { + if (mePtr->fontPtr == NULL) { fmPtr = menuMetricsPtr; } else { - tkfont = mePtr->tkfont; + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); Tk_GetFontMetrics(tkfont, &entryMetrics); fmPtr = &entryMetrics; } @@ -3596,13 +3692,13 @@ void TkpComputeStandardMenuGeometry( TkMenu *menuPtr) /* Structure describing menu. */ { - Tk_Font tkfont; + Tk_Font tkfont, menuFont; Tk_FontMetrics menuMetrics, entryMetrics, *fmPtr; int x, y, height, modifierWidth, labelWidth, indicatorSpace; int windowWidth, windowHeight, accelWidth, maxAccelTextWidth; int i, j, lastColumnBreak, maxModifierWidth, maxWidth, nonAccelMargin; int maxNonAccelMargin, maxEntryWithAccelWidth, maxEntryWithoutAccelWidth; - int entryWidth, maxIndicatorSpace; + int entryWidth, maxIndicatorSpace, borderWidth, activeBorderWidth; TkMenuEntry *mePtr, *columnEntryPtr; EntryGeometry *geometryPtr; @@ -3610,7 +3706,11 @@ TkpComputeStandardMenuGeometry( return; } - x = y = menuPtr->borderWidth; + Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->borderWidthPtr, + &borderWidth); + Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr, + &activeBorderWidth); + x = y = borderWidth; indicatorSpace = labelWidth = accelWidth = maxAccelTextWidth = 0; windowHeight = windowWidth = maxWidth = lastColumnBreak = 0; maxModifierWidth = nonAccelMargin = maxNonAccelMargin = 0; @@ -3628,15 +3728,16 @@ TkpComputeStandardMenuGeometry( * give all of the geometry/drawing the entry's font and metrics. */ - Tk_GetFontMetrics(menuPtr->tkfont, &menuMetrics); + menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr); + Tk_GetFontMetrics(menuFont, &menuMetrics); for (i = 0; i < menuPtr->numEntries; i++) { mePtr = menuPtr->entries[i]; - tkfont = mePtr->tkfont; - if (tkfont == NULL) { - tkfont = menuPtr->tkfont; - fmPtr = &menuMetrics; + if (mePtr->fontPtr == NULL) { + tkfont = menuFont; + fmPtr = &menuMetrics; } else { + tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr); Tk_GetFontMetrics(tkfont, &entryMetrics); fmPtr = &entryMetrics; } @@ -3652,7 +3753,7 @@ TkpComputeStandardMenuGeometry( columnEntryPtr->indicatorSpace = maxIndicatorSpace; columnEntryPtr->width = maxIndicatorSpace + maxWidth - + 2 * menuPtr->activeBorderWidth; + + 2 * activeBorderWidth; geometryPtr->accelTextWidth = maxAccelTextWidth; geometryPtr->modifierWidth = maxModifierWidth; columnEntryPtr->x = x; @@ -3667,13 +3768,13 @@ TkpComputeStandardMenuGeometry( geometryPtr->nonAccelMargin = 0; } } - x += maxIndicatorSpace + maxWidth + 2 * menuPtr->borderWidth; + x += maxIndicatorSpace + maxWidth + 2 * borderWidth; windowWidth = x; maxWidth = maxIndicatorSpace = maxAccelTextWidth = 0; maxModifierWidth = maxNonAccelMargin = maxEntryWithAccelWidth = 0; maxEntryWithoutAccelWidth = 0; lastColumnBreak = i; - y = menuPtr->borderWidth; + y = borderWidth; } if (mePtr->type == SEPARATOR_ENTRY) { @@ -3685,7 +3786,6 @@ TkpComputeStandardMenuGeometry( fmPtr, &entryWidth, &height); mePtr->height = height; } else { - /* * For each entry, compute the height required by that * particular entry, plus three widths: the width of the @@ -3705,8 +3805,8 @@ TkpComputeStandardMenuGeometry( &modifierWidth, &accelWidth, &height); nonAccelMargin = 0; } else if (mePtr->accelLength == 0) { - nonAccelMargin = mePtr->hideMargin ? 0 - : Tk_TextWidth(tkfont, "m", 1); + nonAccelMargin = mePtr->hideMargin ? 0 + : Tk_TextWidth(tkfont, "m", 1); accelWidth = modifierWidth = 0; } else { labelWidth += Tk_TextWidth(tkfont, "m", 1); @@ -3758,10 +3858,10 @@ TkpComputeStandardMenuGeometry( } } - mePtr->height += 2 * menuPtr->activeBorderWidth; + mePtr->height += 2 * activeBorderWidth; } mePtr->y = y; - y += menuPtr->entries[i]->height + menuPtr->borderWidth; + y += menuPtr->entries[i]->height + borderWidth; if (y > windowHeight) { windowHeight = y; } @@ -3773,7 +3873,7 @@ TkpComputeStandardMenuGeometry( columnEntryPtr->indicatorSpace = maxIndicatorSpace; columnEntryPtr->width = maxIndicatorSpace + maxWidth - + 2 * menuPtr->activeBorderWidth; + + 2 * activeBorderWidth; geometryPtr->accelTextWidth = maxAccelTextWidth; geometryPtr->modifierWidth = maxModifierWidth; columnEntryPtr->x = x; @@ -3789,8 +3889,8 @@ TkpComputeStandardMenuGeometry( } } windowWidth = x + maxIndicatorSpace + maxWidth - + 2 * menuPtr->activeBorderWidth + menuPtr->borderWidth; - windowHeight += menuPtr->borderWidth; + + 2 * activeBorderWidth + borderWidth; + windowHeight += borderWidth; /* * The X server doesn't like zero dimensions, so round up to at least @@ -3841,6 +3941,7 @@ DrawMenuEntryLabel( int indicatorSpace = mePtr->indicatorSpace; int leftEdge = x + indicatorSpace; int imageHeight, imageWidth; + int state; /* * Draw label or bitmap or image for entry. @@ -3859,30 +3960,29 @@ DrawMenuEntryLabel( imageHeight, d, leftEdge, (int) (y + (mePtr->height - imageHeight)/2)); } - } else if (mePtr->bitmap != None) { + } else if (mePtr->bitmapPtr != NULL) { int width, height; - + Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr); Tk_SizeOfBitmap(menuPtr->display, - mePtr->bitmap, &width, &height); - XCopyPlane(menuPtr->display, - mePtr->bitmap, d, - gc, 0, 0, (unsigned) width, (unsigned) height, leftEdge, + bitmap, &width, &height); + XCopyPlane(menuPtr->display, bitmap, d, gc, 0, 0, + (unsigned) width, (unsigned) height, leftEdge, (int) (y + (mePtr->height - height)/2), 1); } else { if (mePtr->labelLength > 0) { - Str255 itemText; + Tcl_DString itemTextDString; - GetEntryText(mePtr, itemText); + GetEntryText(mePtr, &itemTextDString); Tk_DrawChars(menuPtr->display, d, gc, - tkfont, (char *) itemText + 1, itemText[0], + tkfont, Tcl_DStringValue(&itemTextDString), + Tcl_DStringLength(&itemTextDString), leftEdge, baseline); -/* TkpDrawMenuUnderline(menuPtr, mePtr, d, gc, tkfont, fmPtr, x, y, - width, height);*/ + Tcl_DStringFree(&itemTextDString); } } - if (mePtr->state == tkDisabledUid) { - if (menuPtr->disabledFg == NULL) { + if (mePtr->state == ENTRY_DISABLED) { + if (menuPtr->disabledFgPtr == NULL) { if (!TkMacHaveAppearance()) { XFillRectangle(menuPtr->display, d, menuPtr->disabledGC, x, y, (unsigned) width, (unsigned) height); @@ -3930,9 +4030,10 @@ DrawMenuEntryBackground( { if (!TkMacHaveAppearance() || (menuPtr->menuType == TEAROFF_MENU) - || ((mePtr->state == tkActiveUid) && (mePtr->activeBorder != NULL)) - || ((mePtr->state != tkActiveUid) && (mePtr->border != NULL))) { - if (mePtr->state == tkActiveUid) { + || ((mePtr->state == ENTRY_ACTIVE) + && (mePtr->activeBorder != NULL)) + || ((mePtr->state != ENTRY_ACTIVE) && (mePtr->border != NULL))) { + if (mePtr->state == ENTRY_ACTIVE) { bgBorder = activeBorder; } Tk_Fill3DRectangle(menuPtr->tkwin, d, bgBorder, @@ -3971,17 +4072,20 @@ GetMenuLabelGeometry( if (mePtr->image != NULL) { Tk_SizeOfImage(mePtr->image, widthPtr, heightPtr); - } else if (mePtr->bitmap != (Pixmap) NULL) { - Tk_SizeOfBitmap(menuPtr->display, mePtr->bitmap, widthPtr, heightPtr); + } else if (mePtr->bitmapPtr != NULL) { + Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr); + Tk_SizeOfBitmap(menuPtr->display, bitmap, widthPtr, heightPtr); } else { *heightPtr = fmPtr->linespace; - if (mePtr->label != NULL) { - Str255 itemText; + if (mePtr->labelPtr != NULL) { + Tcl_DString itemTextDString; - GetEntryText(mePtr, itemText); - *widthPtr = Tk_TextWidth(tkfont, (char *) itemText + 1, - itemText[0]); + GetEntryText(mePtr, &itemTextDString); + *widthPtr = Tk_TextWidth(tkfont, + Tcl_DStringValue(&itemTextDString), + Tcl_DStringLength(&itemTextDString)); + Tcl_DStringFree(&itemTextDString); } else { *widthPtr = 0; } @@ -4242,7 +4346,7 @@ FixMDEF(void) * None. * * Side effects: - * Allcates a hash table. + * Allocates a hash table. * *---------------------------------------------------------------------- */ @@ -4272,10 +4376,39 @@ TkpMenuInit(void) tmpColorPtr = TkpGetColor(NULL, "systemAppearanceColor"); tmpValues.foreground = tmpColorPtr->color.pixel; tmpValues.background = tmpColorPtr->color.pixel; + appearanceGC = XCreateGC(NULL, NULL, GCForeground | GCBackground, &tmpValues); ckfree((char *) tmpColorPtr); tkThemeMenuItemDrawingUPP = NewMenuItemDrawingProc(tkThemeMenuItemDrawingProc); } FixMDEF(); + + Tcl_ExternalToUtf(NULL, NULL, "É", -1, 0, NULL, elipsisString, + TCL_UTF_MAX + 1, NULL, NULL, NULL); +} + +/* + *---------------------------------------------------------------------- + * + * TkpMenuThreadInit -- + * + * Does platform-specific initialization of thread-specific + * menu state. + * + * Results: + * None. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +void +TkpMenuThreadInit() +{ + /* + * Nothing to do. + */ } diff --git a/mac/tkMacMenubutton.c b/mac/tkMacMenubutton.c index 6f7c8cb..7c169fe 100644 --- a/mac/tkMacMenubutton.c +++ b/mac/tkMacMenubutton.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacMenubutton.c,v 1.2 1998/09/14 18:23:38 stanton Exp $ + * RCS: @(#) $Id: tkMacMenubutton.c,v 1.3 1999/04/16 01:51:31 stanton Exp $ */ #include "tkMenubutton.h" @@ -110,9 +110,10 @@ TkpDisplayMenuButton( SetGWorld(destPort, NULL); macDraw = (MacDrawable *) Tk_WindowId(tkwin); - if ((mbPtr->state == tkDisabledUid) && (mbPtr->disabledFg != NULL)) { + if ((mbPtr->state == STATE_DISABLED) && (mbPtr->disabledFg != NULL)) { gc = mbPtr->disabledGC; - } else if ((mbPtr->state == tkActiveUid) && !Tk_StrictMotif(mbPtr->tkwin)) { + } else if ((mbPtr->state == STATE_ACTIVE) + && !Tk_StrictMotif(mbPtr->tkwin)) { gc = mbPtr->activeTextGC; } else { gc = mbPtr->normalTextGC; @@ -162,10 +163,10 @@ TkpDisplayMenuButton( * foreground color, generate the stippled effect. */ - if ((mbPtr->state == tkDisabledUid) - && ((mbPtr->disabledFg == NULL) || (mbPtr->image != NULL))) { - XFillRectangle(mbPtr->display, Tk_WindowId(tkwin), mbPtr->disabledGC, - mbPtr->inset, mbPtr->inset, + if (mbPtr->state == STATE_DISABLED && mbPtr->disabledFg != NULL) { + || (mbPtr->image != NULL))) { + XFillRectangle(mbPtr->display, Tk_WindowId(tkwin), + mbPtr->disabledGC, mbPtr->inset, mbPtr->inset, (unsigned) (Tk_Width(tkwin) - 2*mbPtr->inset), (unsigned) (Tk_Height(tkwin) - 2*mbPtr->inset)); } @@ -221,9 +222,6 @@ TkpDisplayMenuButton( LineTo(r.left + kShadowOffset, r.bottom); } - if (mbPtr->state == tkDisabledUid) { - } - if (mbPtr->highlightWidth != 0) { GC gc; diff --git a/mac/tkMacMenus.c b/mac/tkMacMenus.c index 7e95391..b624e63f5 100644 --- a/mac/tkMacMenus.c +++ b/mac/tkMacMenus.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacMenus.c,v 1.2 1998/09/14 18:23:38 stanton Exp $ + * RCS: @(#) $Id: tkMacMenus.c,v 1.3 1999/04/16 01:51:31 stanton Exp $ */ #include "tcl.h" @@ -80,6 +80,7 @@ TkMacHandleMenuSelect( Str255 name; Tk_Window tkwin; Window window; + TkDisplay *dispPtr; if (mResult == 0) { TkMacHandleTearoffMenu(); @@ -120,7 +121,8 @@ TkMacHandleMenuSelect( case kCloseItem: /* Send close event */ window = TkMacGetXWindow(FrontWindow()); - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); TkGenWMDestroyEvent(tkwin); break; case kQuitItem: @@ -251,9 +253,11 @@ GenerateEditEvent( Point where; Tk_Window tkwin; Window window; + TkDisplay *dispPtr; window = TkMacGetXWindow(FrontWindow()); - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr; if (tkwin == NULL) { return; diff --git a/mac/tkMacPort.h b/mac/tkMacPort.h index 76a61b4..620379b 100644 --- a/mac/tkMacPort.h +++ b/mac/tkMacPort.h @@ -6,12 +6,11 @@ * #includes for system include files and a few other things. * * Copyright (c) 1994-1996 Sun Microsystems, Inc. - * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacPort.h,v 1.5 1999/03/10 07:04:44 stanton Exp $ + * RCS: @(#) $Id: tkMacPort.h,v 1.6 1999/04/16 01:51:31 stanton Exp $ */ #ifndef _TKMACPORT @@ -91,11 +90,12 @@ extern int strncasecmp _ANSI_ARGS_((CONST char *s1, #define XVisualIDFromVisual(visual) (visual->visualid) /* - * The following functions are not used on the Mac, so we stub it out. + * The following functions are not used on the Mac, so we stub them out. */ #define TkFreeWindowId(dispPtr,w) #define TkInitXId(dispPtr) +#define TkpButtonSetDefaults(specPtr) {} #define TkpCmapStressed(tkwin,colormap) (0) #define TkpFreeColor(tkColPtr) #define TkSetPixmapColormap(p,c) {} diff --git a/mac/tkMacProjects.sea.hqx b/mac/tkMacProjects.sea.hqx index 6ac0a54..de12b03 100644 --- a/mac/tkMacProjects.sea.hqx +++ b/mac/tkMacProjects.sea.hqx @@ -1 +1,1273 @@ -(This file must be converted with BinHex 4.0)
:#d&bBfKTGQ8ZFf9K!%&38%aKGA0d)!#3!k+*!!"Cp0Ej8dP8)3!$!!#LLA*-BA8
#r`#3!aErr`!0#94VAde%48BZZ8qk"T+XA!DE&S)!N!J'QaL%eK)!N"311`#3"2q
3"%e08(*$9dP&!3#[m-k-Xad6fJ#3"Qp6!*!'$E8!!"0L!*!'fT81!&eef[8q0h[
c8cahHe&qXD+EA8pi,%Sii8pE'h"kR-U8d#pkr$*#qIVKQ5HlGE*ALjqj*GXMQpb
@F(+EE-)PR($bl2D4fbIC4rC,ET2E*pRQ4ID6falCK&mRZAeN1mJQ4QiIfH6h'q&
NNpmcXQe!J38im8fbj%HId`QRaJRh6"lC(Z&("Mab@m)IJ'aJ[!'2[!EK4#)UK2!
)BC`Pa0"(KBMF,F5+1mMQ)X-dk&H*,c&Jp`C6U8JLC395LEef1*faeD6)5N1-M,M
+N4%$!Y9Qp3XjI&L)5dE`NBNK9Uhd*q,"F')ZUM*aPUJd[QAHP2N[#N@b3SK92I[
kr8h0,I8()NRG5YQp*&He"DcfaLXDm9EllA3UFCfGfZGBlF&VJeEhPLlVE'2EAAF
DfrCFZV[6kVTX5*aKGH0[CehY4F,Bp68K6[pH6@fl',4fGe)i@qQpP)$aUbK5eUm
AUf@STbS6X8'BK9T&f4Y8X[MSf@TH,`jjRLDGCq-K3EkiLKZD"b,T4#UMENR%daQ
P6*H,X+j4)1L%Je(,PiJP)e%lkjRY#*MMNILJNl96rUhQrHP8-'[Q'hE5LCKeZAh
pGBR830DZ-4bf(FF+"00$@D1G`j(S`&J%&qbiR,)`B,IDmB*08m3*1SiG#q@c!m1
15(aId@3XZElhq,CZ(FqY-MZ5@Pq,Ri,)CMVJ1j)3f%`N")E&K-!Nd0`bUKqV[S#
[dBP4HF6YD-DSbci`RV1HB'V36P[GGMTG5&S,HE(m`@45@VR9+Ddk)NifdVBZUc1
CMX3L"h*"qB2KcQl,Ee0Sa4`dfD(K`8%lCDQiXq(f")UHpZqiJ%SjE&0`L6JU2@q
mhHS)aJH(Ja6INFbG+k[,S[+b8d%iceLH0ekEjeZ0!`4Yj)9!#BQN@-H6e68FTa6
E"8aSM5C#l(-dqDM(DH2H5,`,j9qX3L4l$"0J-ad(M)Zi!"-p!FmpPGjDHLek6kG
h#ld9p&E5H`DpUqJ&b5LRed[['RUVk+d'"DAh(I4ZiPM@+hiS6T08"!4$L)hd%TQ
A"+@'hK2S2C2HYI5H51mkHNqLPdLP1*RH8qKp*leeS,,d8K0!R%h[Zl3&,-h0!A+
'2#!(b"9bM*`MAmJ*FSYD3Ik41q3518DqN@2N$h@#A+-Z8#ZS)p32DJNeJTST%$4
i!dNAiNC*jA0rjF6C&(h,LV+4*U$KN[%ckeIrNZbaMJ9jF4RJZ#$,bJ(5Y$[39Tp
-fAXLqqFU*KZ+qjr2+r+-'S"XjeU#Y,Qj)!PbM8!3+ZS-FT!!k`Eb@DiIb0HjKL$
IjjU#r)CV$[)debE5JUabCJeJ$I)$h89FYp"GcV80A6rA0(6)"c!"1QSq5@b!lK1
-$p"pLA%#ZJFB(k$l+H-%G,pR[%"T),r!#ZKJ!lb!VMk,RHCPM%(3AF2B"ef+m4Q
k@aQRSIX#ic9d$c*Z3rF6aQ6SrX`BMT*%2D!@S%2V!"J,(H)'eN+(1J$H3ZF`lN+
(ZQ6mpAb'IZ"Imb*-bN4V+M'FY,D6RMJa,1V$3V,MqQJN*"VB6Ah+5B9&4b4NYF@
5L96D3Vr!(qM0UhF'Sp&%)QjGCNH6`YpVU@D$G04,l&Kf9D!PPLqS29#)40,aA'p
MV+XbfNdTGJ4'1`'&(XXBQmrh@Sld@(,ajhXUa9j+XBI#[C0XHk$3EbKd0#C)ZIC
4A2i,cZVbAr",Prq#flRm&hc,jErRdq[bAaqp,[rYiPJJi')Zrm9!K-Yr$p$VmYm
2dH[bhir4braAI**HPpPrN9lQ[q)ER"r)GqPPrL[!@jRrLPr6braAr)9HPrmL[bl
rKEh,Im&6AIi,MZMbh`[TKrQ[!Bl*r0G!+j[jVh%Pe`KdHqL(qDm"lXRmGdUm9(U
QV,Nb+V#9k%NdD)%!6HmK!1-4%TU4J0*Sd,i"JSX(p1XKTU#Ai`Hb(Gl3d*!!$NG
he'r6YJ'$L`I82eJK1c-6!a+k&DN3jZT#drSeJG[AA8m)FQ'LDB4@fQlMS&&KIP"
l8!9Ve"$0%SD-LG[`QhHLhj(qILFG6'NH*V`0f@j86FGMrZMYkZcX+4LeGZd1Z,T
bGhb%`QTTkfJQM`ErQmPCf*LdT"C(CK$[@CI`kZ%"HKiLbjV,d5,P4cC9XhlFA[D
S(aN[[3b8d+&K5m0*aLd-JG$AF'[l"+iDYmNX4mJUe!4Tjr$VCAd*5@-Jd#&c@GE
8dGSAhKFC`1"*EhI!9kL5mNa,IVafB,''4ZZNj4YB,6&+l`"8lZL!IND)h*Hl%eX
P,"%'E6c!LeRl[[Xe#,Na%$RV6"(J58d0$'9F9qIVE'UZXqUD'RXDk6I3jZ[K+89
pLUK"hM`P+C1k&AHIGZ)M3VarVri&)l3ZJS'Z+ZDdeFclaVQf'MFlN4&N(GZIa2V
0r(mbfjh#ifEVHBcX92DrJ6YDTmQi4TQ*XS(`U,U*B)i-T'TACD(AS%-4,G`dTK4
690BS-TKEG&58$DVYpUCJB8CM-SNjD3e!((jramk5Rp`Z"mVXT!prS'14!Kb0SpI
AT!I)DeGhee5%,mI4dpcA8amD%Q((Z8Ci(Ve&V0hmPBb$Y3mqMYr#0JXA$1i*B)N
IE65j@Hi`NA%XM!PP&Q&-9iFEapEjR53[aI&m3Pk+irQYH2q1Bck3!18il2dDJ$9
p-SkK0qX9b`GN(![Cb1imQ8QXLS2@P'J#iJM2ClD89m`,Z((-)G&b(!Xp-fb"19U
[MKLD`fQe5%j)S(C0ah#kcpHjb'2J)l16CLUh!iR`m0XB"2kK"aJZ4"c18$48mT2
EY$-0)%jk@"-3"k5HLZ50['+dM"Rh62Y9rm'i+E162PjKh$0aD!-BGqI1GYl@052
&09!6S[PJlY0CIB@j,mDaa0`AieKLlLr%FBbjPq,3,c$hUAbmaYaR%[XbFbr&XF6
FTm*iPEQAiY!)-(Gl8-cL0!+4QhNRQ2YY%UHe(ialZ["IBGbc#+X0B0bdp[@mFkh
FdYDL92k(-9%FmmK`R$%YaV(%G&k)iaM6+F9a(-QRiRJ9b8Ya,)!Ha5(ArCB3iQf
%bF5"PC+cNZYXc&BDaC%)cBq1GSEf,XC4iApZR)2&krIlX290!b"(NC0@,U1LAiJ
MqMcRT$LLY0%bZh4b#KN'E'bVd`(Np5eNb($b"@kr(%F*J4IU,&-IkINb1bUV*,Q
GaCJUfF@mmCpaBVdc,2NCbE2N6"G6#a#(,qSiJL#'!'3k$Z)-b+ZBklI,lU-@)"q
bDkJ&L-2Y'Xl&XG`e(%V(SZ+aJ)UMphlckSCEc)1NAeYpPpRf5dXFI1`4dKmdVlc
`,R**Zb4Vrd6kQmcJNk[0pM*jM)+-BbqUD#BI,pBCGfXLbGPk4EGQTXZLiX#C"`*
h-,a9pl*ES`@S9pQYd3,%!9&`4XfErq99aN(P-GI0HM'1ABQi28mC$,mrS!'B0FI
fb-AjpBhkY`Q+1AQ@#if*jRD#)TQFReSSj996-)RaPZL6*M&bPiP-1LRA6c"h638
ce3)JTei"U9k8dKS+$8K24q1bKf*10!5p'2hU(SVPAXaN)&U#I4Ec`[XXjN@rYFq
L0&`VeZJUTQZA'*aqBdTA(c$lH*c"6H9MH@C4fc)el#iCedY-$5q[6YF"L"jSjli
Z68jblmGL[GSiA6J2J+r+dXf),"+MM#K0rYUZjm5pZSGNPJ39YRhV*2+XR4'XhFB
e4[MhdM,f*dC'lR1[-0,0LCk'0qPC4!q(!ZTiKcI&($mZjVqLMMDTh0@jUp(IA0r
FeccT4Kj6*B1Q(rjrjJJE$mhFP)QBNbj1Ce63&AmHf"8R)X[*R`'lq+LG"eH&R89
fN9'le45('jrRbDaG$GNC0kRimRCHLNr!MZ,,fq'N9,%0*`k+kXMYUJbNA4rpY#Z
ld-pPT5Ql6p1EPRC9MhmE#H+m)ViGbYrjZ(k-kp*c-IfX8IjqJ6Y,qH)c$biG@kI
mQIH3!)k[2r2qMRif+(rhiSSr[J4Y,9hUj`dSIpZIJL0PYi%QMSabCGHl$BRJI-!
[ahF19ZrcY@JHc&YAU[MZr`MTq(+d#PaJ9UAm$@$+P2XA'fqJq&BUZiEVN8YPYqR
$p(1aX[-m$0mF"bi%9(&8r32E@[M5Y%ed1)RaK2,AMf[AZ2p9J80q1%p"e!aIS&E
ahNbHUSIqK3*3GYDep21!LZqTQdR(PkQG6MNfeLYr(d$qq%Ue,ELJl8jPGi9ld52
*jSr6McaY894hi5)X[PjY#ef0D+j@mAd60F'AV0AG4bA+GPrq)aR`9@[[TU[CkQY
8(&GKLS`[A+[&a)-95c[!Z4c1eej"2i&B@Ni%jqcUk)K6!UPd&"L4prFje!Vj!rl
Pl-iN[$!haG+$4C`,IBVXcSNP(I+AYp[m%,!ld%'AI&EI#JcLkpYUlmhLDpjI,6#
2mT(%I&dZlJV-UA!Gr1T[!!MfKb[K3US1HX!%q2#F!DS2db[Ya#(NQ#pkZjVSKHG
FCIF3-)Q[HkX&VLRm%`1`i8XA,I!#EibQGdGj3"fZA,`K&KbEX1krMY+QF0hc-+D
8H@[-0CqRRajPpr52!"aXphIkZ9hDPE8q#L"3GN%kEmG3p9h@LU%k[U4ac`mSVfA
5cR[iVf6!9cA@`UqU$qm"i$&If'KKpjfbUcJ$H-EA0Vl[CiK9fDe%I(c6LS8MJ43
ZHRm)MX*A10EKNMZ1liirN!#1,h)FqM(ph+EX[N-Bi&lR'!&Z+"lMr5fQfH9%drm
"!!d09'Y-D@*bBA*TCA-ZZDaF"TX@JJ#3#!DE')6+@`#3%4B!!%e)!*!%rj!%68e
3FN0A588"!+r"3l5c(48I!*!&!Q*A!*!'2Td!!%m%!*!'kU-'q)i[acX[&djBLqG
LC-G[iHXb)0a+XP"Z(pQ%GB56@lLECKGYSA*k#r2D62),*hc"8m0c'TlT'mGI&H9
fba&qC,Z3!)8[%NjfE2&kIYChZ[#&Nq0jbj&p(FmRQbb5KI!D%%i@XL@h*6X*Maa
Ib%+iQqc)mQ6KLaF[,l,MC1&NS9MKG4f`cQA%VPZimTF!Ne[)L*2"3QiKYj!!`5B
,AhIVT2Hl[!CQ&q9R'JTXB*1FqGREfmRe1MZEfU9E1krc'Q6QphPpqi8%EUM3-kr
c%YSH`*fM6,)0DTj0c'[BQ9HhiHlD"afe)9R)!'S%(VRP"-!#1&[2*XbcDEHbLfj
pZ+%Xb'q4,'ebF-IG!*[J$hL80V#4CFdSLNk+SXTj8AAU&k*UrD%SHXY(mIPQT9T
"09pYYTMXM[-mcI,D6*lY64VG[UmMj3X0DX(h&DT&UH2h4p&CC[Fp%Te@qRifqSj
5Ic+URXLT3(A(jq8@1QcmIeq![+)M"&jH[G%E$XV`m0S4VD!59AJY2dVXdB`$pS+
H@Em[1K@4AiR@bJci[Vp'E"2LjU$bNHhD0IdkEZ6NHYD1'pRa0`T(jd@R9RkrHQ0
I6hmkNeqSRPjjjU3YdINm`rZLk+NVSY-(lVlSe&dcNf1G2,NkA6fDTANK(MGCfmU
B&ipP+mF4F9fSED1)[V0bS(*+pITKP,bb'U3LiT9N%)9[42N'rZMdqZkVjTB[6q,
&*(rAjKprmDe5Ael[q6aRRDa1NcF01'V&([dIdDdI5lUb1S3m(&lFYlGA&bi(",Q
'&MD@"8NThGCUUhVZ5AF033JB24GA&i9aLjFr"H`#D!mF)*rT1h5j+jN%6A6Mh3%
RlJcJL,FCNHLN8qH@Ia5%VfbQ#rp6+f[YF`I8AM+AMJl'6I$P9FYkYK9Z)+#cZ6"
9EaY0Ir5HbSh9aNQ9)G+Q3Yii4)MP5-R)Ya0T-IGfj5qf9`T$a2C[bcF`hq-P#TM
[$j%4XrfPLPe5*Tp#Xde#-F-#Ad@e0-*XV5L#&2i9P"+cr8Z8N@Cl$mSSXcf"-YT
Xr`9PM0Rq(U8df!*kil&Q@i"5CVE0+12-eSibhQ`[4lR"E,q#8Qkf$eLpB2X#LTj
l+0YIS%`)YU"UifDc68DCD,E9+"9QiiejIfcdbm6"pPU8+@Cl1mT8XrdZbM5cI3P
PZYNBZF`)YT!!kQUQfI#ICECDP0PQ1i`baf`2SX`efbqMc$2Eqe%UcICP&)8EfNB
G8cY!!4Lad'bmk5+cmFC9CJ-r&TZ0iGS5XldDCDRCIK0PQGNqB[L$l3p3EM(EAk1
X#,CmiFK+Xr(@Umbf(SAFXHe(@@-f@J["kI`$+(VqS'c89VAC2SC5BlErK%+pB2Y
E&2)#iXLlcQc8r`DcmEiEcEBGCC2C`-YkXrdF#ML$lGG3C%a4m!$+9V0p&DA"E05
CB(4B'%eHf-#D4V04-lHDMGbS0@`d4deQHaLPf@cr"Q@RfIipbLkcI3+Pa@bmr@k
cr3q82F%@%HD#9pM!NEeQSrEfQBdFU$YXGk%F-0[2Sa`d'cA(*!-EHB0&f,k*)Ne
Gj1p3MJCE9*MHCMB`kjMCU-rMCL2[fma'Vh$#E,q%!TjM8cf2QTSB'pK*E@,l,JU
i4%Y#hh+(fF$I1me'VY,f&ZTp6jX0A1'GX9&EGj[YJbKRc2B8LXc##[m#KIG4Aj&
UqPkcd62FCcD`4&VK)YAULme'$QV%UQhr'NAkc#,e3'!iYLqL[04Xp#)2QBdq(aa
3h`Me-0+9Ma$q[XaXB!Ip$MEHpa9Q!kI",Qcr$S@q$p[(89jPYQqJ812Bk%9q)GL
+e5[qSYR!bhpK0[S(mX)'YVl'E03@[3mfhZ"4Xj%rI4qf0k+!iGMS`rk9fHJlAfF
fqNjU"0YISB!$f+L$e`GELIT*DKBE24+p$cEk!ASpE'#I(Y!T'lM`UfEMhAN(E2L
rb@c[4!(EXAd8jGI0"Ukrf@arMX*#!6Ckdpm)YT(#ZEHDM4k2RKSEr3rp%6E`J"V
%"MDpc@c8&EL+M9M[-"Y[`*YJqaS+Q)m0I(eAX)e5IrjECU-AIEIC`(@`"4[iqPk
cJD&J+6B`JMi4'r9!2@)$rhlEE*p&`Bi0r+2I8GpSc4SqC$EkC,9SS@eJdSI04Jr
cQ0R)Qpi3'lMf(ma'$G-ABq10H(0Xj2elCL0[qMYXe"cBTEiaHQp`!a[p)Id)0Yl
lNfB$FcpP0R,pY0QSQFqBM4N!m`GXp'hNMJfmH6,B5Y8Id`YJSmrmR0RSH6j[0M#
GA,#"(H!j0Yk,RJAERk$3Mf2lRbKI#EDakJ["'@c8lZqEMCk02KSE[3SiJ!fX"#H
a8EGI0aZjJHIB`+Sr#VBbp8Erd@c-'ZJ6XG&hdVYK!b2rXpR!k'qCMEVmBl2a4V`
KYVp"B9DM[R'DZAcEE-`)[Q-fHY6rDMCkT$me'aK0A@-$8hJVE,`T[3mfHRIU8Ah
MKDrd!YMSArqEfHM$k3'a8B[d,kk8,cj*Pmm*-dah!(`(VbUkF6lLB4h-cdU!A64
ki4hG$SqTCJHj25+Qlp8c-dc2r%`dN!"-pRCEGqFfU,$ih&qeX@SA4jZB4-r65&4
*ZMdQASI#(T'H20'a2b,39I+KrScF2I1j+&EqA!)EEGRGTX3L4m*Q2l9(8,)MhKH
20q1L5)UarDP0(q0Ikq4-EFH@pfKbj5dF*YH#p(V'iAm2lTVjE#NK5qT*0mqZ6I,
PSUB+V*Mp`CfeYeFfIH+HbUDV,pXeAGYjqClSKfZcdQSfRR0T9,Q#BG@N4cHFXb0
DUZd+!hXTk)IA4N(mf6Ip[cRi4N+mSk[QRhaVZEADTZ8P2m2*r,-URlhm`FUG&iI
PS6I+6`qUJqSbITbPVcI5C*6*#*24*@YDM0-C$l)Q3L2-5KHVA)cG@-9L"B[9*-D
*M'MT4eKlS!eQ6-Xk#@XNM+0C!f"eK28"eUKBf@*9Lj%MDeUm*'YCV$,B0Sre!ND
JGZ'0F5pM5ITaqM('RS`''A-bhQ4%cQLF%5*MFFEKM-iCSc2DC3c1q*Xa2#0(4Vf
-faRc-XjN"-lSQp%TSfj'h)`K'@NcbQBFb4LEm69MDmE9M+NChc1HY'0L4T+-)Zd
D#L08"J@XQl$'`TS+24ZM@pC,@(0KQ-"k#3dTkb5XN6!DC@f%G4&'eV5GV)@`$X+
iR282"L5X`l$b`DS(ihY@+aJj-fTQa-ciPh8`eX!Bhl)#aZSA)e2@EeMGB1@,95r
@*KMh-R"KABD9,0#'NESHILM*U*J9(dDVV$@`NXCU''XZM)3Cp6,bCj@*Y5r@Z9J
(B1f"G5r@jKLQ-*TRE-c)RM8jaYk-NKPc-pjQ$-dSPa%bke5X8E''aIS9De4dBka
0XDE&b*Ra2QXpV(L`JX+)Rj8M9SeBm@,0L28LQQV'pDaCX5,$@*Ue"&DU@-GJ2-d
D'#0heJCBR@)&MG8c9J8BA6-UBN$!+*j9$9CI@(PKeB99%PCN@(9KaB@a15XfV0#
`fX+BRP8@9PKBA@%&J989aYqXRV#5`ZS&b-lU#@X$V1+`EX+D#HXPXPEL%2J5G@I
A5XKAeN8d,P+[e"LB5fe4#l`K1![ZJTrJ+$J,6S&$e!A[bAZ"SI3*i"SB#Rk"-q!
`'%aGJ*rJ(,J+jS#Ai$le3Sm#lS10p#VJ)(9&6B'cp!J@Pm&0DSYk!5ZT4@V-eLJ
e4ef#RhEe"`bPcX"DqK5`P0UQVk"r!$[!D[SMm*@q)i'ae$FB4Xh5Xi$(p&2J-aK
16d3YJrr816K2cG1$d+23(p",d(r3$e$rp!2J,cd,[Bc&@c!BA!@[,BjEM,IiRX"
eLmmCE,DB$-k$Gf!F@!FQ@ibcH!QfJUYJ+IJ)lS,&B$*B$GD"er4hp),dFI5#p(r
d1r5+p*!!p&$dNEE(T,qN$k,rSFqNpdVdQ,CAT%qNMl+p)[d!r5*p&,dL23*p!6d
"[B(&p`bf@dbR6`",`A$EUpSqeIBkYXqK2k%IX[d%[34p)IdKI5)p(RdTZ%r25Kp
-cf0lRI0IpZT&iibYUbDrl#$92A$A`N6apeD1ZliJ%@4&ZZX,%@%`IKi4q[eG!Z2
Ch$f1h%[Ef`YL*9Kk86pfAd6'X[lbNSlDbMG@*BmLfj!!aj!!aj'h)8mJfj%[3R+
&L(M%c81U-`k-H[@1F!3C44BLf5mGJ5a'PL"()8FMab",N@14CFKab!R)#Z3Nj'6
N&148j$6NG13-j%cN,14Xj"cNA13mC#9b2R)"FL&b%E)+Z35j&,N-Z4aj#h)&FL9
b&A)eFJeb,A)GXKTCJka&VNI@)6FJ0b)h)HZ4Qj&EN!"EN3h)EFMYb%ENVFJGb#C
N-h)RFKHb"ENEZ3ICLYb,h)IFMcb!2)JmK$a-E6ID14J(c"j8kFEakDd6'fXEYfk
Cfi,D1$NqCrF&A#QI-qDdM'V',lC@&ll%MYEZIlN'mdrja)aG&eId(TKEi,-0pk8
['d-eP4hYT0Dm3dKUl(1qK9CIYKIhQp-r,!NYhEamppcb9,U3!-IjGG&-RM5b9LG
YTXPL,8`6cN6eZ&'E@ilQDq0CUj@eSqe*1mR6dXHE1P4f'RZLlM,"DY*Z+qk-0Fa
k6lHEYA[@fUbCjAhM2ANaY*j-1`YCR#rf(0DRF60EkP[[MUrYf6CNl@l2YQPUBPr
5lKBpHhdllIYZ5Djl,U1'T,ebf(ENZEI")jD'ZZ6R*EmM@8S(JCSDHA1Krfj05EZ
IB02+`V9THc'lYTp(5fPZ@1U(DfRe,,YRZbX,#R4r3e@K,@hKPHpIDNKVEm9,L3c
hG00Q'6EfmM[EkHT&)@p-6BfiU8KRPmfT1PrD&`aRXj!!F3d[)BCBIAV&@4Zhpfh
*PEDa(3j2L+QQ&`jMI5Y8"EDYD6XNME%aDeih--DM0bHViFN`lZ`p*%CU`aL6T9r
E@V6S-E#ScGTATjEhUAD4f9Yl!&,AlZBKrESmlrN!$&)f4kfd0k60"(N@`0,QZq0
@b'AMHC5ffSN`U'j-3IQ-H,jLK2Ea4[98QPY[kpD&X'bHhp8b0-r@qk86@cAV
'@!eX6B[Z3VCUH0$HaaG9&h'N5KML'*J'Vf0&dAZ2lCeZ$kSDimCb-*b-'m'l-8[
E[EII`DA+lI[Lm"Ca!&(SGUVCA)K$N!#QT%NBEBS9-SDDZ6`*mE#Z6iY3!4MMYD'
YGbiQiBQa0X4jH"+-cA%SD@`a,'M1VG"MCE)V,9EXP3bD+Y2T6Q2BYKKVdalX[SR
96TChDkSYAqP4dH"!Cm@jY6`TXT@mN434M8YcSeRMEKM4PHZCPBk#qN)qlB4S5H*
PFVK6bT(#`*eX+T296Y4Y0,&,pUPZjXaBEZLHYYYSBQlB1V%0QcTKTXDeqS5CHT,
PBj['LMh0K@K54AUFSZ9&UkqBRDb0MbN1jSDi@ckdISiG+qeZ#S*TaaDcBY6BfCJ
fPT0FjKA$@fR84(fVV",PiU[2l$jXVSQEc5aVdrfGl*!!8XAiqH2[H%F)e&+EL3Y
`3PYh*2ZMQBPYKd16T(e0,dRP%Np%M*))9L@VLeBd2ckpVCq0pSXRKeNP&bZ2KYQ
TQVdeqDkIQLTG1LT#1F8,aq+&UZr+6j9eV)2@6qqDlmG36hF(81dEheER4@1JXL(
0LfjY0PPUd9(i,JPM%#P%%kVL[(HQ9feHI(Xrlm4MQ"!aed5K'PFTISQMheKja)V
*[(h#@j93(+bDPfR0fj*"pajVhMA1a32aT!TlF&,[S&0,2H+'q2!cfYFhkI-BjQ8
bMj&b6i'MIS*Np+20B4PUk,B`[Z,`Qc1B5$SU"qfS`IjSXrFdUHaddDDG%dmP,Pi
`HH0Bd2LJ!(3q'($k60lS'arV@DJ,cem(VQXY*1TMUMZG*-lMGN"`jEKp9K#T@`T
9PXC"[CTeU&dTk0-V'&MFPq@,4E5P3D0b"TJmZiIk2T`[*B+IXpfd[95!4LH6@Mh
ZG%TVc8VDA+a0V(EcZ)Lf*JXV5dY*AJXaH@+0$@TQSffU8@-SG-G#Nk5p"m&NMaF
ES&E$(T!!4$f00UX,ahH@k3TJECLEiAAZ6*V4j-kDHXild[d%8ee"2$,[Dj2(PNc
HHha-#Zf0,SpJZJ**F@&Y+Qi[VG"@aSYJ8CPD46Q-1Ub@ehI4i*%@elBX,UEb8Nf
'kBJeqP9XEfB,jQ)HM*c21EP@2MCJe6CP)GY5q[BLpSrC#FH2fk6amImi4h"Ye(K
UlqjC'VPrL+QH)ADkmXHI%q*kLEj9DMZEl1FHZ%9kpI1ZPcbl$TBpFCdqE'f(fUV
ULd-3ir[$1kr+%UNRp$)9drqlH4$E1L$jd0DTlI10jA44MBE')`pDe0-c4!mJJmJ
38LeZq8j'&L$$b(CN""P&&L+,N!!MN!$&b",N+#6Rc-BJ5j&MN@A)FFL*b!VN*14
Nj"6N913dj(6N$14-j#cNE13Fj&cN2'3PFMjb!A)KFK&b-A)*FLPb'A)jmKEN#Z4
+j#VNDZ3Dj&VN1Q3eXJCCLeb2V%0Z3'j%EN,@)cFMYb#h)KZ3!0Z3!0Z4MFKEN6Z
3!%h)CZ41j#jN#h)hFJqb&ENAZ3qj(hN!H4$*rCXMb+2)0Z3aj((NEFJ64ii9C`p
bLdF-(biJQbV5EG0AE+P2M%h-fk(1c2I-+U$,l$D@+q[ZNQaFZ3lk3,@D&8!'N5%
Nji`,N!"Pb2()3Q3%14*CJLa'PL-RP2Hp6,0,[pJe*NPrFV(D&-R3UrGiHMQkR%i
jkBk@h6ep#NH1k*KY2Zp%MZHAq61qQGLpX6,jCGqdp`d5-TGIpZd'hhE`rE)e-2J
'[Ikp-AVIldSY$Vp4IcedC$4B6fi"$"KqlfGU0peeF',$0LHFVl!-!$JCBZFKR!D
a$!!irf%C!("+`c)!i$5'lE)j6@)C!($+aAD(R')4"J$k[)S`!0"R5i3"J$i4BlN
LF1*&'!$SNbUfRf*`,3`!p&NPB3$Jdq9bb`#!0a)'!(lj#!-!c6a!'!$iG3*&'!$
iGG*%'!$iGE*%'!$iGIC$'!$iG8*''!$iG@*'cP[iGFC''!$iG8C''!$ipFE#!-#
[8bebjX1[%bl#!-#[8cM#!-#[Fb(#!-#[dcE#!-#[mc(#!-#[dcV#!-#[8dUbSHp
A(FJZXIpV+-)!`2qXe6*P6Ud+!i#!DN)B!!6dAX)!)#"rB3!3d!NBB3!3d&NAB3!
3d0N8B3!380d,!`$0SN!B!!48(m)!)+!c1F)!)+"62-)!)+#c2m)!)#!-%!B!!Cd
)%JB!!ChU%3B!!Cd"%JB!!Ch6%3B!!CdJ%`B!!CeH%JB!JDqLf)ZGIiFL$!##UJ0
K!"!8eJJ$J+"U@dkU"&@(`J!JU$U4`@*3lbJ-!),+64J!"(A@4KJ!"(9#4KJ!"(8
H4KJ!"(@D4KJ!"(9#5"J!"(9H5"J!"(8L4aJ!"(8+5"J!D%B)`J!JU(-b`J!JU(0
,`J"!Xd-3"J""eB3`!!MUI*8`!0#X%B3"3&#AT)8"3%Ki+3`!3X*CB3!3%MB)!i#
3!$"&'!#%922#!##NZK)'!#'pSc!!##Q@-!!)#4Z%!8")f#!-!%)kJ55V%L'p[6!
!#1RXN6!!#1N%Mc!!#2A1,'(MA*3`!!MTe*3`!!MTa*)`!!MT9*N`!!LT2a!'!#&
GL4B'!(RU2B3"3&l[K"!fF&BB!15TlQAfNLFX%!B!HDSa@56+dhX*!i#mhUNfE*b
a%JB!H6SA*3`!mY3I#!1!2*e[NL@*2*eh%JB!QKQ$-!$)dkNSQ9IRU3F5"J"j1MX
R$!$b[SiL$!"BCl!-!2,9,mQ0K(c9Y$!!b"IH#`1!I''Z-!$)&ji+!i"miC3`!-J
A4JJ$J(c9RM!!b0GE#`1!I18M$!$bT3X$J(cK[6!!b0Fj-'%!N!#[%dR#!#"Ijlf
%!8#qDPFB!16VA*i`!-JAPJX$J!,eKm)!S%#e+``!#P5l`J"!-h83"J!&kKq%!8#
"-&%B!"5SYS8"3)(H9"J!&261V@'MEa-'!!A#(Q%!8+"6Cm)!S%"pUM!!+&"r*J`
!#S5l`J"!YmR#!%!cHj!!8fhKhKN[E244`J!JV$j%'!#%KIA#!%!cIK!'!'(KN6!
!#+[1K3&!@$8Q$!$#HNYK!""@2X)!)#bm%3B!BCe5Nj0ZBI86`J!JV,1+`J!J,&B
@`J!JV2j5'!"%p,$#!#!L["%'!"(eaX)!3,1)%!B!%G@P-!$3M#+%!8"%rC)`!0$
X)S3"3%3pJ$!!L!K$K3'!CKSK$!!LUQGK!""4r3J$J)MH3Qj%D`B5`J!JSMF@"J!
4eDX`!)J)Ei3"3%4[,!`!SZSGK3&!9$fd-!#)USFA"J"4pFE#!##URPBB!%5($!#
LkZZ%!8"8IC3`!)LUKa%'!&(e!-)!)#SX&JB!8G@d-!#)#V1%!8"805d-!++U(f%
!%&A1`J!JU[Q"-!#)kSf&!B!Hb`J$!1I"TbVSh*kXFr9,(H0aXRaU[8q'HUkhcf&
rISma'mZ@kPb,h(T64q,8c3jeam[FjRRkBr(BcZ$rmG1TQrbENlb9YZ2ZDqNV320
c$L*fKDBRakd[1VX0[X3j#"I#k3A[BrH@h5Up@mD3!&S2Tqef'G0T2C@f$SbPhdr
)m9`0d!lf$,q1S"cCCG#H$*)rM-1%-T)6L[P%piULcEarTG,'L+mkpXG)A'V1a1j
IPdhNPhL*e*+PrXkp35,E91E$+jMCGqTperiBESCIPICEh[[TbThADmNRIKT9Vej
'Y2Lf'qc9Li2Ijh-K[%C@6bh'$UrAjYD6&I-*YpP4%,[Xl(ejAAAXMTILG-B-iZ`
&k&($imGb&#rpZ3!S&`cF!1Q,%U!cB6[erda5%JjkNU+#Kc3`86SM[IJN46Nm)%I
A`Q'ZIbS,VdAV,CGcQEJS,Yq`3qTITmc`*M)H["Iqkkp3DRMc1U@'iC,k)H90,qk
P5MXI)8QA3DRjaXSe6V["TL'EfmU,PbVSar&S[+EMm&TKMd0"4$`1k"Ve11cE&hS
F"TP&(SIGfa%HKlXFa4i(A#[a1#b1M[3ih2SBjA%dICbRih#hBBc(B6qme11`Vec
QF4KiMI-il!D2pcMF+,R"ih#rT0cMF0[N4Sr$V[a0(SIGlFRp1"U&Zq*`ff4D2dk
#+QiU$RG2TRXFpUPRH"cZG-cd11c@cr)ih&QClA'i,c$(il$#0GIMd*I0mcMFi+M
d11cCcrFiQYl2dh'iJE,3ih"(CT((B94FjA'i2l2Bic#b@q*af-eIkR'iEl,-ih#
RBER(iAl)#Sr$ECb9(SHl1DXm$[F(9RXFERqXm6LXlDle10cC@1GaZ2Y3lA'i4e,
MFEMp8qYa@(jDlh'iE92RFEJRY-(MF!0LSmGKD@U6aq%f5,h(i@E0CSr$ED-Y(SH
l4eXp$UXK$4j(8hCk1Jkh3ECl()DdM4k(fcDhHKcZ'Zh`10aZD[)iV%XeHaaZ2Zh
d10b$fZ9aZ"r6iR'i)lAEih$rD)r(iGC1UmIK0Y9HMm0GQ(dHKhY&qcd1pki1H"a
ZB4hd10bq1Z4aZ2ebf10`AqZ)aq(feP'2`efZ0Sr$cDjM(SGlAXFp$[HpTV``[ih
&-lHrTRSFEJ*0m$MF$,[Cih$6DU,(i8j2KFIK$YNNMm10XXG'"m4aCr"SM$qVRYG
EfQl-P#d011EIPL)@-fP,-5j"$F[0m'AHV2Hp,+@Yc*XaEmj3f-V5c'+HDkPSC@M
3@ITc'5TCPLiEXe(QRZi$5Q#@qYS`(6",cme5Gl1dh4*dh3CTH9RDACNDT2kS`jr
@)(@@U82U`P)#Xc6$h!9e51e4Lp6KMfLCZ3pU%%`km$T6"hF")MX)ER-V9fF!Yi$
H(Z*([Pi-Cm$Va'kbH@`pR+YILQQ3!*2PFp2IC-Yp6KL-F-4m%Bl'Rk-,GHec$ja
#Zh5dcRaZ!J"c3$!4-Kq$68e"9XhpfT%2)CZ3!-h)RFKGb"ENEZ3HC#Yb,h)IFMr
b!2)JmK$b#2)SXJej$(NFH4[b",)4'88@)SZ3!#13!-A)%Z4)j#MND13BC#Pb,,)
-13ij(RN$XKaj)r)Qj!6NcFL*b!VN*14Nj"6N913dj(6N$14-j#cNE13Fj&cN2'3
PFMjb!A)KFK'b#VNBZ35j&,N-Z4aj#h)&FL9b&A)eFJeb,A)GXKTCJka&VNI@)6F
J0b)h)HZ4Qj&jb(aN!6+-I""j'RNAmQlN'H4Cj$h)Hj%Kj!2)qj!!3H6Yb*2)1jq
l$lc#U&*9e01LmIcTi"A`C0XKlP9#a#VPI2rQG`djB@8mBi5`-Sk5EYT6L*ceT#V
H-9j@+Hmk+&UGqZH3!$$F5l[SUh-pk8X0#2fYP(1'9&I+1dQa+q@DT059FNd4kXT
iTZPeCGblDLY"[5[pILNLAPRRRXU5Hd6T@[(SH(9i$MbG0rc[F)5i9kGAGl8Q5(f
PA*2%`9+Z'ITMDEa)NL&,6QY6#*Pb650NbMQ"N!!GRP)+(Blfd91HJR)T*iebkFG
+)fQAGkcH8pj*K1bZ!8'cP(-')92H5B4-Z5B4-Z@D3-J1cb6-G,Khe9B#)G2[Pd,
)V(02a3K#TQ[&3mJ1ci'Rma#b`a'%l26UVYB%3UCFN`LCFXdJC"TV1K&5Fjh,iU0
al%*(ipU"MA'rC!R%h9*2,DPhS9h50efjaMH*TXE&`e,Md)Q'UIG1iTCal8C#ipZ
*JmDa%`@0B`F'a[dkB56Zh&P"(HJR,jE&[S4V9rdNF8qUiKcUaIhk(ZXFiXAGiRM
Rq@5VX32VM'-RdKR(ET`6&%LLR+edlD@j3+DkaL4T[FjTJlTTGjSYk8l2AI8MAQC
"cTc#bq*f-YA1YNe5lI48UDDmHP-e&G#CU)H(b63p[eL5aUFMa439aR0!QAC2BQA
D0e1qDIG8"DHGNe#EpNfJEDGV%X-kr3A'1MdYDQ9+)%f3!$$VRHC,Q-(IY&HbG01
qLHV0Z[BmNLhZY0[&qXidCYhZ[FqEk#8kA3G,-F''XF16TL,Ve[hibGBLlC[X,Y+
qkEihlCeSI6YGZam[d3$hBQJAH2DLCMGFGZ&N&L$lN!#a%a+c@0J$JMhSPiDp,Vc
,!PdA`Q@JV4r6HX'X&m@bm0@(@jf!P8'U,%4eB9-A+2@J84D'1[%R#cb$$9aIpcE
BZ[AhEAe0@fr(0Y5ZpI4U[BhD3*Ffd+*epQGpc9P[CpEAPQ9lX[-0f@!h0YL+pIC
K3deB6`H@EEpkHkqqaUZ[kdS08$SiLbDmid4$1eC5kPBE55$hf69jb55@mSiReM(
*ldR-2'9h@S+&kD6L8(`ZT84eG*5!"kpH!D6DbXk8%K@5C8fDLY$"S66Plc%U66P
fm5Y0P9%fqe5%MZa6rPlf+FH"l%eap1GZr(Xc0plRmMCZ[Ca5Kl*1q'HV,HkGV,@
i@dr@AIJTV()lpi[1-9cYf0Lj%!+m14HL"flY1h4XF9c)S1XG1Y#j*d3D5P1[%1m
9Kk)2[%!FGcY,T42+ip@BkP@(S[G8BYq%URFmPI%EbLQjpYFpZA*'Iq(bNMbhc0J
M(PrHCPQa&2Li1pZ1Y(#R!'SP5Jf1KV[9iq%"A#C8Ih#Nj(YrCK4FIk#)*i%(pl6
6e9&ZAB+("rN"$qk(P,BM$Jmder)9Pe`#JhYeXXRC0PHbH-"GTK3Hh"'2CTXaHRK
3bZ8`[bdX0Ued1PRH[56`(h+U$CFX(UJ$dU'!"h%UC8hGZ,dBjiYX%mR"LUDTf[J
P8GSHCBB2ARp3pRbrH*3PYF2Gd@XYSiF(B`d2'V)mdC'!-l8,aYijG['S086`m'$
FL,LV`1kifp$Z1"cSrG`%[$hi,$0pTp[A-$XjFFCNZj[NEBjDeDefQNbSRQ8f8Tq
%X*A*UR'3!(H[IB(S64YHCFG5(UJ8[I$"DkHkdc&DqLrNd9#I%[fES8pYEe4-YV6
H`mYfafLBQ4*Y("G!(LhMSU(M!(MA(E-lMf9i,BrQLIQjXB8p8D-SRSiUcp`FREC
MF2dQI'pTUiQEc5aVebj2QRdHZIj$Gj6X32dIH9aTQ$`J06A`0HbZK8YdIG9KmjJ
M+N"1J$c12mMrcZ-mIGiIjM'8b08m9#[Q1hrrCD&HhhYScpSh,k[+A[S%a"0Hr*X
4aqGmhmm3)EaGp,&mq(iCHETkrJfebYmmAV,IdAP!hZVr[`Fc#*h(qI)J$lRGerq
`*Jpe0Y%4N!$(dI@AcEdV(,"X(S0)G$@2#kffbS1+(ITd(QHL2FGafK`Mp*9!E9d
c1,elI2T%(d1-$Dpd-QeCBqA92()I$h*hNEr506b6ac"P$RA8m@*rGUDl-L)J$lj
+LZ3Rl`Vr+1Qi[9ZJkFrpdA&hmSJehl-GGhmHcS#1HrZlGiM-eY$A-,2la(Xi2MV
h[PGpYR1rQ-IPc[eL(TFlpdYj201jjr,)GHjmdVRl[rc&65-!1[HHphLqFqprf'Z
GHbk2bjel6aV2GHkj2"`#RIZaTGIVh[R4FD[cUYdaRZfiqr,JF`4dh1VND0@&YH'
4d23AHDeM8RN-)F19MZPL(TFlR8Yj202Tj2+iJZ3pH6b(j,Nm,S#HbN1IQXdK4#A
(S`Ep[BR%3)@S2%iYL-*LhlGpBHq*2#,e9dM+KH[eFC(FF`"m2d!mGDDA5Vb8amQ
AHd@9adN1YXH2r[C8G&XL-T-ZJ(HphM2%HZN,2IR92(,)HD(1B[9aGVh-I[!9PKI
m"c#QZ*`q[U[prXUKJbp1SE*II!VelCrU6aqG!(R80SXL!Q)8J26PSE#HGr8GRj2
VUD%6i$hdY-m*N!#(RIB0jR&efRHLffT'0d&[M6aHp4MHMeDHa&jfcDE+l4rS4'q
Vh(I$H6IG@,RR63)64I'aT)hr)jAlmNp@ERq!H*,(Le4&rHmaA'FbC@R[[&5[M&J
d%!hNd6Sj8i['pUrR-I`HHXVL"+KA2@9a!Z6"Cq$-pkeheAQSm[$pAheXbpS[Vhr
kkr@C%3#N'@(VQ'XpI'H-RYKmU*fqpDACP2PXM3eqZSGa!Z5aH@pqp4Mb*qp+9qU
Zf&NFr,+p81D,pd)[e%Hm&hUKASFRcKI(cHV6[G"er!#"@p21L3fFiAGe6dbZqD5
RqZGheAR38ef[Mpb+Pqrl4VrYH!eq9cXGYp+1erA2XE6MGEUchThQh[A+VYK`jal
E&E[q18"faAS!j,PGX6kNGJAXLRPNKVU$&)bHk0`G&CfT%`!jh3T)0IaGT*(XrTM
T1&`Zj3aq$S*CM"[S8Xlecl&d+HIU,+Bl%4I",1Cm$,Qi-r5jYblZj0ErI4Y'9Hc
rAqlJh"Yh"+jdAMej20pjp6r)YFiVPiGciMl#eFkV1a'h`*d&NmHap6SM#A9Jhc3
&!h(F!"f"cX-TFIH"%m&+cDq'-m(UX(6bAV#rdZl(8F,h"Sm64!el(#l44$a1(QU
Kai(D9G6MF-5ib11%88GiR!KUXFH*STCiR%,8N4kR#(@8aaQ"1YVM&+11m6JPU+8
HCa4UQFFCM6V1iia"(Hpa5P&[m$KM8FXp6KRUM4jR(1T0(QFLkM52`rEJG)mc#A@
'ajQ-1Y2M6%'GjA'QSXlf1003jhLFkDKc23jXiHGjR*QSP4jR&ZTmMc-EGB((SB0
Hk((QSLlb1203Uca1*HTLMc-IGBR(i9E$8Sqc%(@CaeQ%ZYcM,%CGiA'@S+ld1(5
qUcc1-Y69(QFjkPU2F`[UC)m$Tipe(QFPkKU2X`UefZ1X4Uha1'Y3Dcd1e1$AHac
1!G4jR'V8$4k(6D10(SFjd5D2`kC3[FHT3phXFCMBEr8i'e'hH4bZF$9iR(V8l4j
R-fUMaf(rm9D2`bED$Sr6J0VNFEDK0RZFlDJl23jMZ&dHjeE8&Sqc!h@hafP#hH0
aQP&E2Fj1e,dHCaIU2Sr6JVVIiqa'2H"apU!Hp$LYU)FmcPl8`ajR(qS4Ml-IpDM
(1B$DjR%1SKlc1#bm(2Fic)LR["$('P3FCY*623lhfbGi(0D2ErBih!+Dk((B3+r
`11``62)ilDL2H4aQif12aBPr"F(a*ha+$Pj9G105'9SIF&amVJ,')2iIia2EcXU
"bLR9kiIHF#cmk4GJhB$"ZL1J!Mb1Q*%4GK`aAA+Fr``R5)FE%Tc$!q%-kTlML1Q
3!113!2Uc%!C(c*qP9QLeID"bhh[R$p0U'hP,S09frlH*1V6DR!$-9PaJ(faL!L@
EQ,c"p@ER(*XB9aX-C2&!f+-ij0KKM"ija`jMc-KlGKKMrkdr-%M3RSa3ka#mrX#
`dh,*X38T&I(CLc[[cY2[G+Gappcbl"iDBeG,!6MKGNli&%GRL$ZHIS%HTD@KUH)
SiE[Q9EUD+JJAm1rf10"j2Z0aS1Pmcb!1cp!9"rV0paf,%aV'J9EcLcdID$!rH#a
1hM!10*KIqd)qATfah[bSai&QmZXmMVVekpYh,-l,KR&Z3(h()%ih6dX9TaceJkr
5k94a*U$qcL!1jGk9pmfS(r+mZH,hN4IU0K12Cj%pUD(2b4q(aJ-'UHMKqmmqmjb
eYG[81b8rQPE(mHH1ZjH49mlp`Z`[M4Z9Ibr$2FHfeMR(cYPCcljAc4FGFrH9&"j
NlbZjhHkR&)qFZlH90eVZhTE#!mZqea&hAdRK3HPS16E'#Jr+"[Hf"RK$18mrKAb
1f(YEDPXeHH!)B+L)[V1lc1M)j9)8cBdQ$A*p1qfQF62GRfc,ik9@dMj1&L2e(5b
km6UhM1(mQj1mPEEMlRqRVmXi2-UPISHq!-3m92HMIqI,9lTaI(VVa-EDaUeEjVD
J0Nk1cfdFV9)!6KJ-F-4mh'cik4IieqZ!2rl8Br!HdCh6dh1(r5,EGqlUXBVa[f8
Q6l6FdGj-Nd9SBqN0-"`h6%j0m"6Y`f#"NqNR+qC%-E2-h*Y-EcDpaI5GTZmbIEI
THdard24@drHD[XrdrDBI-2fJkBG-2f,k8G2E6$pQqR(6Ec2pa2!CJfqF&lAE1c*
GZ`aEJ01QhfAkhDDI-IfXkIHBIUrTMF2%3UGZ$f[ATNDU,868p%,6Ld`IBAUak5@
QMc4pP1QM64pMHURTBdfhY6M1p2'Qhf"kZHNhQRk6k40-[pRdLDCAQ$l*p-QQ6c&
pUZR66*pZqJc6CjSqbr6CTXmaIDlTmdb[0(fqk3Y-AfMk)Y1V6&pXqK,6PjUqc26
PTYpLqJV69jUqb[69TUmaIDhTkdbhp9YMHUhTkdf[-hf$k4Y0hf4k[HQEKa#4rch
PY,LLN5dQYA0VF!`kYC)h5UC""3V(j9V4JkD(60IPUR4GVNV2-lemQ&j"Y83H$Gl
+Y@$S'Mk6H9!&jd0BjP1TR`P,Rq#K[*00911'dXF2SdG1k5m,@p"8%5+QD`45ZNB
`T9X%XjRGE[UGjPmic#akqZiNALiA5*4b41RC#Y$!+,G8ejfmkpFh4!F2V[9NB2G
6d@&lPqcSLGbV&d$GF*-T"rF85)A6dafPjjYZr4i`r5@Q@q5kEm6!&%MTTrjV#U3
LR4b*-!95B4r#4dq"p15(&r[E"0YhERaq+T5bakC!m!riU'fTrCjY0AfX[-EULai
Zf5,iSXrB)Ha2@0Im5I2rP0QrE[URcHmc*6X$Ar4)p&fPrPQ,rk60m$p[HAh"r,j
SmEpKqTFXMbrEHhc&iRa9F5NFCIZ92SH!`&(1"*5X8Yr3Ma-kbTN!6&&U(bF',`k
FcMa1$1Gk54Z(er-i-I6&iA8p6JapFEK62XhM`(9KZXFT3ThKFDMHQ4i(lJbc2!l
F'@Cl(,Jcc2%iSe$RHTc4U2-mcKM85Sp6LMVIiia&AH"a`1#&(QFFkL+2!eH)+Sr
$[I[&(JHZ%%XmcSfS5ch16DM,2!lF)jCl(,K(V2!i%e&AHKcQkUXmcL68e4jR-ZS
DMc-&GDh(QBUkcZ0-3khf1004Dc`1biZe(QFQkRU2-`ZecZ2-4YhJF@$EZ0(Mc%A
Gj((QSGClR%V8c4jR2ZS@Mm0Zq&D2Xa#e`H-X3YhQFDT3YhZFaDL0(QF*kUdH"cD
01cc1-Y3QMl-FYGRMh)+kdq0`bQ'AaeQ*fZ*a9U(ZpMLV8IGiR$@SV4jR,HTHM`2
&q(dHTaTe[mH"[I!"M`2hc)-H"rE"Kca1(HTKM`-,f#-HCb2U8Bqc#EA0ip5M([-
iQe'2Hab'KT-p6K0UJFGK,b,XFADL4Mc1,Y5SafP",I3iZe',2-iHe"%HTa@ef12
X45ha12Y34hUFrDLM2-i"e0%Hjb$U')m$@Ga5Mm-4Rc+2!jr6F4kR$A@mai'kp`d
HjcKUZFH"[IQ0(JIqVcGjR(E8r(kFe+@A4"b@$RlCjp@`aBjc'NV&L9'3!h(Bc2N
0cqF8DT`,82!S*am9"`Df8hcqI4IU9)r$[E-*(SGYKTXp$QXB%cd12'NV2-kpU*-
mcRfSFBj%SD-FL93F+#[(14+&MR)N8Pi[3Bec*1U[a`G4(r2hBI-McU8SH*4,dC8
iXBGeCQli1M&H+K#pDF1Ve1XFAQcMMaE&de(PQCZMdhB-6SH&lbeY@EEarN0hP$I
Ir"pjA'QiQ0M'$p3VY00Y`AE8klF(pHT1BK[[%Q!*Iq)i6JY,q*kkph"DAIZqQ2#
&clh&0PikpriMcZ8M2cThpE,G-ClYh2[cF!CdlY[I[8-EQ80I`mcZ%qrKq*J!p,h
UXa1!LhPFRJ"Fc12b"1"5(Xp-!(*j2$d"f"c[LdF)6!"khZ2j#8$r`ekE!16bZ$`
"k%RMZ3P!,Sm,%`#9am8KJ*N!(&Yk[HkG(ahhdXhD2qVmRZfiqr,JF`4dh#eTqk)
,aDkrTq11[0BapE2d[pBaAFcMFUGc+BpR1TeF(PH3!,`RMqH3!$bAa`A38hQSZVr
8Q9GbR'I3hjY)$&5)bZ28`YlMH@aIf(XLMdMp&5DpiATpA&[!$S$["iKA'bVa8Ki
RAqi994iRik,3q5pemHcFimBUZLh4aU8,i&f[p`baA[T#6hieMaabAULc@(fFA5q
c(hb&C9-kJ$(&jI6aAHhh9`iGr-rZY[0,G,HakD-6))rDCP&%3)`#N!#q2"6@mkk
qir0f269d!Vb(R[Bj!I+`dll"2+j1qdjd@meSkN$)ie@2X5*@8*h(ARE0TZSC9ci
@r8jel-VjUBHVYFF2%9,Gm5Pj&2q29mGf2PXpikBb(jh(Le4&rHmaA'FbC@R[[&5
[M&MkTb-QMpE*Q9SdYRmpMq(hd&-@*d#pkLQ,%b!22J0R[QqpUmj$PFIJ&'SiMfe
C@r[`rCqrATmC!F!dKG-IZGE$GmESLFf(fZPEAjT0QFr@f1#RHaJR3"kEpqCAMb&
rmUjdTHk+hFI",pX,CEji,r4#IF4lS4IUe4f`FkClSH[i!3+hTTd6'cM$lqUHQ&c
c58recqqUmk#RZPiI&hRkZ$qfXae!1ek$hp91akfdihApFbcYH*hZV(HRZAGe%@b
,Uefakjm$C&HX"d#HfaAV3fTA`+kBkG`ENRcTf&#dB24%jqkSk%bG!-MT9N#Ui5p
hF-IPGA&Rm(-3c',F3"GhVRq1TBXl9fFahBNi#5lh$(ebZ@ISFfpGh-QYrrXfM+V
BrlrF`ENhlJKFkEakmRLqmqTrN!"VR9FZ$qI%IB5VR9Gh)Qk"1`XQ$deLT1mM#F9
bdc3&!h(F!"f"cX-TFIG"IGcUjV)$YpZjbmkFQfPL!h+EdT!!TlX9Z32*VAAZU(-
MRI[Rh$EREMNhbENhcLealS4c%jY40MZME#'!8GbEjqfT)lL(D)lm5X+Z"%iJm2f
!b`Fm2H$J!Em1B"GH(($HJ-m'A$AJS3(($2KM`!d$hKG`ZS#["9`Xi&N"K`Vi8E#
&"Dm*1%[!4`+Z%I#)J#-%r"rJpJ"["cJjJ(j`DB!R!a`Bi,I!cM+m&1#F!*m%Z#,
!!i'+JVm"h!cJA3#R![J5`)8!RJ0`')#I!1Z2m!TJ)JT@-BRNMMqG2!H619l-c@,
ZBA2RR*[SI&`hTMPQiBqlh03k1m&-D*N6F$2E$I#41iGIihH6$EZePplreJprCQh
Y0Y@3!,[YZbh3NdRL`L[[2r[02l'fpL[#3hIEGi+QKIiYJ3Z[ZIrX-qR4CMmcdJd
A2Q!FK4+im%C`)ELfpZ5M)pe``IAeZH)iElSI2MFp$eGAC'IUa[M''ZQDRldp1LF
h"@J1XGP9Rr[YSJaemc`$Bh02`M)`lQ"H6"A$[0MF&l$-LjqbH*mch6)arRfcri(
TAc2p$dhrJVf2C@Tm(Y-X#"Xm6[)A9%BA69rVlUNApd`p1(A``d&4&'je6(2(I)(
Sj'mAE9MY22T"RHfjSqJHk8l#Ap%j)1@ARJK1j)C25(lT'cKqhHLCL4rhFK+[p'H
@KmS[q&F$[derbpQK4d*q#EmTj"H8RmS[iCGh&dUdNm-r12U6Re,#NMGhMbB([ef
k9'1Zf[JU0k#8PRk44jl#CUlBq#S(8&iAiXh3[5"Ki4%8MQ`1mElk5dVBq"9S(,m
mq2h0%pL%c8RqRk'-#(l[r'X&%MpbA4$bQkD@`9c*mEe"pj&-IY%GZYpNV[AihNC
1)I1EU"Y%h')Ll"m0hZqhlmA'I5DHPeY+j5&HLlBlc,8Ihlh8FGR$`@rHVqTYT'l
HcCXAK$bqp`dFZ1e%(Vbpj2IAIi50Hdri!905CcYd9iSha)mk+`jqcEVCa&dSh[A
Ab#rIkT)E6pb+STlHJl)Qj2FY[4rhSr"ll5#20Zd6Fe-+9H'0riRJ9kqE6GbC)Yj
hqqm8hDEmZ$ePbpDm8q5hGHZ*He5i2i(bUH$hYYk0+P5e6qhrhT!!4i0`NlY9K(d
ebMZ#hmY9`paN)MrUX$,NmDDIaNEpUQr@Xp4#8I$lX2#*QeIUDmUSIH-ArF!G1(!
(5hfIC`Z`kRd@MjbjMD@q'ETPp8LV@`KI[HX!Ypp(+FjXGFY*[1Fh%ccc%qmNH5E
m3Kp5MDTii+lR&rb034drr,L!@q*a-m[JCH4cRm-Q@iSKeEI8fHbIaFEG,XVN&31
me*0Sm)FbS6i&Yb+r*Z#@2$l3alr)ahm''cHrm2[f)0i*hIAL$KMia-d[Jkr4(p%
00'k$%Hr42Vj'Pc8N%YS1kqmHi1@Vp"EF%#-2kN,HEmb(9DL5"hf+i'@MjQ[F'P1
9-[+K!9kZ%5C+jcXA["DmM(khHJ$HKrbS!mP[P(,J6KPqh&S6(2S6i5khbqJ$2MM
!Z9IS[K[hc!LVF0ELjB*E9#['ElVUeH"PG+[`M,YRj2'*34kRe+-*Qk"ep!q#Pj%
2lF1"qfMd$I4*mNkhraifF)Bm&12N'"imMSdlDZTEU9ShH"Qpl1qa5DGBrH8"AMk
Lqh2F@e2I+VfPi1A5*e@lmRl8Ym(,k"AUAEM,TViperIa-RV6eh$J9T[kALCL21)
AZ8d2BHTbaV8$[(bhDS)qK6)(0bX-,kA(irXq[89*C(MTqDhqZRT!`8[2ElcfZ#a
HHRjqiBM8m42[8`+#dr3rdPmfUZkj,8HG+Ib`rG2hG&11QP9Ic6m1m(,H25T8b3-
m%0`kTKULaq%*rRl3ArkZ-&%fCi+U3m'r5DSrQA-%K-(5Akl4fmKQ5q#MJrcZ&ZE
b*ZSlq)8qANBHdPa'*XJ"pDbfVm,'I8$HLIF`H"Rj,H9JZ)clV`3,4ai)m9kT0qB
0eEIhj`Ci1BCH8pma*!9k@DQ2Eah%*[YcjF)H`D&4ZQ%SQd[PRahJh"6G0H3'S[V
fd3GB[+c4@h!A%DLKra#m2+'qKeZ*i!6e+AR-8HmZBjFfm-2fPrR#5QU+H13[G9#
UqhrF@F52RN2HU84[`He&pHhAE%$`XPhp!IFBeAIX(rTi'IQ#X*8HAhd(G*r4i'A
N@HA!Q`0VB+(dPam59[,Qk[YjqJ1,PbG8fm4AUGhab`1mE2PG!D[aqacaUMiIm[L
kHMJNU5NFMH'Pc$k)GqC1H[D`i@AFccI12-ChUH'PjcGHZ'ca-ZiAL,i%"VDeZN[
2cfrmqcq'mpa@Tb"H`ZpYq19&-e0&Pck''3Qh+QN(e(c)cSfmH,iEk*Im0j-hXcZ
[VhhTrD%2eRiHIVq%2X2h5I2chUpFGUQE3hTMlQ05(amHp#Y2UPIN&LHirK8eMFE
[MHS*j#END[9*4``[QD1!Eq6hm##r,fSf)@FKbTR(f2cZ8SmSKa[bQ*IBr*i5hXX
XX&Cc%FR[-qTCCGDi8VfTj2FDj8dZq)%ANYqpLL9VS`(0JL@rlfPQ)6GEp(0*I[p
,EfNfJrd2%VHdecr&'5RjriRk$XL2qSRlqID#pl'jKHFhA[9XFF,cHihkb2FCVRK
qDc@hQ&Uq4p(&`V+A'ql5iaVF,IS"pCIdhHTV9fpUqUULHp4RrjcPmE&qhe08@mA
'fr*%#LmP[beGe4EpNITZ"rmN[bd2D4k!RAN!Y@Mbfh+"hZDYPJHc4T2IPSpT$N4
r66eaRkHp94c"4GqH"iCqhRYADKi@"HIShlaiPHS*6,p9GDPk'(TH)%le%1-I#hj
r*5a4F`rmhN$2)Ae!eB1DIl`YP2dLm2,'@i,IRcf)apY$IVI4)dTr9[@(jDa,m)a
jN!$THkVZ8QqUm&Qr"c9KkU2Ujc@cBhC(2(SQdeG9AD8H8XfTq&j0AbVpfH+hUUI
j,DX$CQqQ2k[kaZHad4Y5Vq#!j&'Yf4jeS9*i-r0%kFm@Rk8jh(Y$[2AU(H@p'eA
Elc2mBpjNm+qU81fq2rJpm8A+VMli[INAF@!H"6ia[c#iZ2L(0"p5IB6'&HB+"KH
VeTj@$b([6FpRq[,&0@%*G8h+a$CpHG9IDVC,VI'ZB)28dcXe$f-q3"ldq9*2he-
GdhHSTbj@ACNqF[(CQZf#-mV[,I4'dNG@II$6H(`Nj2(!Rr6lb+Sec4IT!DNcqNb
TJmFe#bDQ5Z'YB)cdN99I8Jrhd4$[&l%&hPMkqECTjXZ-5,Q-iXf#&`DrYfLQ#Dj
5Ir3h"Tpm(rm$E"m2ITqNrl"jr(GQSZT1VFkMM0Q2cH1lIiS(mb[H#4bA2,kU'L!
ApAfDaX6Q-9E[qUQ3!-G0B)r0ia[#4@E8e#[V)C,(fc8rqdailpp8hbaj2+kj*R0
Jj6+*1VCj2+@DrkcP3Dk5adXdHhM5qK@&(ll6@QcIaM'Dr(j(q2,"9RaN3cT`(PM
P$r1Bi!(e+dpCh6"2E!jqLp@[N!#MqKi@M[j5m(Y!lfIBIJ8Z!)rp'i,I`jSYIL(
ic3+hE(krUMVlSZA"qdTq(p'-L6GAmDDUAL@rdqSMQIXT[pRdHcBr[hT#qPcP0iF
jJFf[AIdZ@+eF5[6HNYphP$2i3fY2Ab(jKG@cUIN5I[2!&C[Ikp9,Ibhi96,hXIR
9U8GP&NejmNk5harr16EU6X@EVcjHm[Z%-2JE`@q"jUD5ha60UjJa!MZUI`S%A!q
[#H2Bd3"hrlcI0d6HV,S%Lm!KqQrM&rk%QZ*[QKrpMrJG[KdEqadUjEh-(Qaqle3
0Im[`Jcj"iVeIFcKba!pm&,r[D*B(QhrmU(2a1kMq4[AAj2F3Fel*,l*CFcAQU-6
Mh5AH%pr%T[TSl8HYb,Z1e1`91hdY18Qme`Z,rc6Npalk02YqIb(-B0j#2(SlLIG
0p5M8#hldKH,h*FfIC#CcZr$-c%($Ap)Xqbr0MaSeI8piAM-eDK-rjKf5aj2URjM
j-!HL,c4pG[L2K8(dJ26CmIfBm'lPV2C"I0(r!`#3"!d+9'Y6D'9XE(-ZZES'NUa
F"TX@JJ#3#!DE')6Z'`#3%!il!*!)rj!%68e3FN0A588"!+r"3mZc(49k!*!&!i4
N!*!'90%!!#ED!*!'6i!'!'[m&Rl@dB9$&T4(GQ6$-llZLa0Z4pL1CYD!FKIKb6c
lEQ94Q8,UX8eE)R$IZ[(8NckHLFq,icpfAP@Eh8j)&U&ab#&I10a`Rq@93XNqU(!
EJEG0Z)X(Ej-GKr[J2ZK&pX$PHVkNm$MF3LA`YE6MF0FQ#pQ3!'ai$#[mbI6L9UG
NBGh#PFF1VZ3J18Jff4&)CR!6H*XX(,r*DNfm'RJ0[+D@,3lXfICXiYGjXE2[[1K
YjQD$['aJjRI+(D9pjiEl1Rk,mFXmXMMTc-Y4MZfpjFbhXdRAMLa#Mm2IA6XIQYG
j$Z$Z2E*)PJ0h$R)#M!9`9RjjT9eql`GC$[BPZqdY%A!rfEiEJ%'!$(MNC6A$d$I
'A'*-iATcLG-bPbcHDFa,rcAfeX*3!9Gl'X1@Zq"%N4G'a@S8(R@EbBD[*q@8phS
K'19qKM(Ac"K6Y2E8Zma`k[`@FfRkreBcG$'R+[@Gb5M+-cEqj+6*UcT(S2*5a`T
R*1bHEhMT"NTRIr4rHH(Z`K9$Gr5#Q-*@&XcTdfFm[RqkS)0TF[E,qHfh'[0$Tr@
*LqfLA2FPA5AY3l#8H9fD8[4AFEDVr#f(TT,EG!+Gmq2Z#m`9PeA#`'Q'jl2-Q1[
0#`SI'6Ujm9mS!pG0KCmVI'RSmfBACEMAQ2pmb&bj#3c9Kk[PN8lN,RPVjfUTIi'
jR"p6@+dXTqT-Z8fJBDPMB+kX,$6UU`GFTq9'0irIpNa@24R,PF1HLV4GY'AXIe`
#BkR)SLCZ'"2FbN8Q#UlT!9e`p3qVE',D21ZiRj6922@535irDldpP+8(KI0PpMY
Jcj@&K`X2AA**(h[!N!"#+)XVTKbZaHMrd$pVc*qSHHf1laEVUmAV!C3RrKp!AP'
1$da8Ul2'A&@X2T3(!2!AF8*MNA&aKMci[m$Zf-QMB-93fZ(1h)k--3,i(2UrUSH
B2cfV'h(LT$rEmaS'(ai"&KjP&0!cHmqC+51CqLfL%*K'i6m8IZ15T6lQTXcMh2r
%rFrFramhfG83F"MrYG`MZ*QMB"r*2BTlY%"-BZ$h2lKKHT25cNqCImZpQr[Ch),
1+GAj18)PZ5ZjS8Aea#E2-GaMZFGaMeFaY@B6Z#IDfN'FrKU6e-33(@QLJ$`$FJZ
)&e#(e-HjraJEf2m*l[r%rBIFIm6p*parb[d!paqN-l@8q3,halRrNIXrFrmAl[r
+r8RZ2q2qFqlra[dTlVmJjKRmIjVl-p`bKd[p+[GIF[p(I*r%r@4XAqAr+Gc6ZD@
r$'-"-U9qJHVf3ZiABD02AXcp%ZilZAqGqkAF[m(pQp`[)!Dera+hc2e5[mlp-Zl
IiRijpbX%bR+rN[Y9h+rQIJda*r2r@ZlAFIm1pqZjhm"p&rFEZGr%rII%QF,rQlR
I`[delRrKrMVh0lLT)c@Njk@1i%4+YCFDTc441iYl"VId@5"Xq*rF[m4p!IIMZ2m
Aph1jIjRlmGbr`Jhk6q-qRIYXlR1)$BkFbhdHprRF-lRT5fSiLhXf0h9LP2Fha!0
cTR+IaJh-IC2l@pcrb[eYlNAF-NN)K#h#ie)9lNZi&h+$FBZj@lJ[*JEBpEIFMGb
AFmrMrKchVGbrbMfIqhRF[mBpKhXZpl1iPa"EF#Y9iel'[Ccl-QkC1+CH`Ef#HbA
hdlN[j2immF!hZ+#`J%#i*4JBJ)'"m2+Gh1r#4PhIcAd2ppZilqB@E%lGcrelh'm
P"Rh`$pc[i2ibphZiIjrl[Gc[ihir0jcb!p`Ij,kIQ26+KlJrc2d4lSpb`flIMUr
dBk"qr!VrdVm"[4ZSAlr$r9hZlh($#cG`Yq),2Yr![C(l1ZlVZCP4EqEH`VfH'1$
i&lMAF0r%I5hh&lP[ilkGHbhhmlR[%(@6qaTZD13fBS2p0h*[jflMKP'Yiel&[C0
l&rF9h&GbrfrL`3qZiVik0i$*14S+ah'$'M"+"bX'[pc-3I$,F"N1I3kRiB!jCZ+
PZ!!AiY!(m#!1rH)i$K`*lX)"DqbXf[)%kX!"TahESiIK3"`i#rM,%@jN1"S(AN2
G1'!MZ%PjU5QiK`d-!bHaJ4(BX3RZ'ck'$3bQRl'"Er3r0V#8AX9'rp'(f-!#1!X
fq"iF"a[p$UCMJpq!kGM!16!0'jJ&"Q+$He%6E'!dIBH0ZS*Af-"q1!HY5Vr"1l"
4Ac!-'rr+Sp2#CTd*TF80i$2BU"qm"K[eJrYJShld!MD`#Kk%$3i'(m)'Ri)2B40
m0V`)'eJ-2m)QI06`(@a`4h!$Qr!#`hf``E[K30LS+e`)f!%[i%6Bk%2k%4XeJKY
K)bkm#aYp5CfaJDY`%'aJ-aL&$AkMFkNbm8`cQ4#EF"$$Fl$"$q!lf1#rF#4Xm$T
i%MBi-a`*'h`"I!!H`6[K9mB'[X#rX0(Em$"Xp"*F$4ZedqP[ZIlT6@a`+,!8'hb
$fQ+$pm(MX-%Ri(2Bi-l`-fc`AZ&TaJDrJUYKJa["fE$"qq&Zf+Ja@)d0VJ+(``E
H8!GXe"LH#1b$eh!5E'!IR!3EZ!!h`8EG`4CXm"cP+"A#IZcBi-Ad+6CQ!A!QE("
bq!)f1"kF#4[c$IJ30ZBB`VH-MEk%Mf&MIJ-[`qDi'r3%,"%1CfaJ26`1'cK,If%
$"m&!E'!6YF)'MS!Kf1K4(IY9UYE#fib0I1"Zf"b(``D2imC'[A9+9UPj"j`1'l-
+Z"dfqKAHL%hQ0)ERBf0q!eI#aMb'Z4)f1,[1d#Seaf$'*+G+h)`C"$Ci#l-)E2!
@kS#0HZY8XNUB#$CL!b1B!@#MCjJ$B)1IF@0M$J1Ra3C["iZ``@2J1pMJCh!(E-c
(C+CME-adQ2PJ!rZCc@#$Ec2VNC-4pk0(X-'Mi)2B`(ZC(aNE1!YZB!0VQ#9KSrr
!3fcN$qI#"YjcBa2qEqC*f+JCpF3'aM"I`XDFLcN60ZC24NSJ0[U-Z4-fjLr-Rq4
NK6(-SE#"-6+2-MDi'6-TE2!IqKdEI!1XaJCf-k[#4LfC@@%$Gq"Cf1KrjPIBk$e
i-6CU#QCL)aCF$"Yc%MJQ0ZBNe"`EZ))[0QCqc&U`-FX$Il!aAi%6B@-Z4SpMSdH
CdFLT&SGR4S-0cXbX"KXmNjN00V!6$-F'Ek%1f1!2c'f`JDG`4QcJ#h-FE24ET"(
`'T`I#9hNJ%JbKcD"Tff1li916$ZE4kIJTk9U+@9b1P8!"dX55KTN-P222C'lMR[
5(bPL1Q8R9Kp"%ZPXe&1@*KRT6[SUjpmjIJF*4pM'HCf4dp1%D"#+bTJbR5&JN!$
lp$2rLG5Q(ELQE%Nk+U6iD*IUl%%[,'AIdRdF4[F'66*V$MV(R*,[a,%EMjc`,-I
2R9APD[(Ja#[&hjLpVANUKQrQZ)lKVUQi543HGk29Z+K'DkLpE,ji3f(dIHmZM#l
Y1caAR$q`BUiYe[3hGmFeVf$J+JapkLHfAh23,"F2Cp1[%"AQ`PiEBCq0X1T'*L2
cQ,V0JiA23r8b$lBkRdR8I-"K2Xac!92$"5KC,QD+F$%a,Z(r%TMc*8bk&M+G@mM
dB5(UN!"&X2&&6'%@`A3ASB+jP%RUTF4VJ[Nd-HPTJMdhiGF-ZfhZ2P96'G,*j()
a0@PKiY,#a+X&jYk#bZKCe10CX0eR`DUA-0&F!KeEJYp5TQG,Q@!XBlUpM!R!-LB
5bjL8,'G+YjaT`h*Bm@ANIaN6ZFZBe+`JVa9-PPDJ$&N*(UqNCLZC4+`NVmZTeq8
`kFYKlCIM[iVTj#UQ@DZBE&l"C2B+TL*AS+5iNZRKP8b$VQ4+Ha8pG"A6akZBU&`
&NlqD1Pc0G1jUHQ!eM(ie8jh9j()0Z9b$XQJ0F,k'UG8DDVN'YF5e6&+[C6*c,C2
GY8a`ej,A@Y3@kkMa1LBUkjJbVJHlec2aAXq%EMd6M[@S9UjM!RSGrAdGFDqR"kj
R-R3p%r$V8@&YB)UrJAj[CDVD5QqfiRF$dk`EU-X06#ifdPFEb@dMbUC0e'm6Nip
0p0*QTPQEQF"YCZUdKHRr&UD*@jK)E)A'EQ@5ZK89`9EU[id*lMEU[3eeb$B`i%B
8"$I5HcFb(Gh1G'-l2E@G#FTfTMaYe+'0#9BEkSiGq1d!$hE55cZC-1jN`V'6AYh
&9(dANp4Gp1XZ&&)hJ88hd5mhd5mh-r@pQ8RQcH$2EUE4ZqQ2hIJpQaM2eS4FDM1
JSd06D6@D!A-lEZEA+h-"e*Vp*qLV1AY(#$U-+"kd)8-d0$"MLH2mbLHJ,Zc8eFC
+kBlDX@8#TQY5BX"["[Y1p@+89E"NSFR'JC'q'G1l#%k$j66rk!&-,ND)*3k9Cd+
VXLSAfXQV3JIQbfC'Eaaqa+k2$lIL0XL2!q)"3&N@a#B9cS-`Q(&49$J#!3!3CF3
41Ld`!Tdc&%6ZU8q1'Q3H8*!!UNHYHKa!FPAJ-2jfRF!Sf8QEk%KA4Z3$VRT!V*-
f-FjedLENC8lDa!M95CZ%))A5*U4(+QdbFL190J8#Hj8f"B)((@J%bPZP63ED9GS
8D(5XdUC!Be+90J@5DMTT%q0DP6BC1C!!5T[5NQHSY#QYdE0+Qp)#'j8fT38Y+Qe
+5aUJdUDd4YmUE8TVR+[5TV5N&bTYNU8*SE5T62fMdUBbqDLdU8a5(C8fP3RA90T
8*YQ&5T[+02C9D91CaZ!UE5U6h%ZP6@@5SkUdU8`51d@m-SfN9GT8VYUTY+PF-L+
90T8,B&ADC13d+QdU9piUE5VAb&fP6HAUEj8f'AQ-5T[+NEFkDC14`DLdU8*e9fP
6K54,+QfU%'5VY+P#Shb90P9)8U(5TJT*"P6D9+(q9QP6K@5i+QfUN!!84k90PF)
GP6C9UUp8fP3TIb9TPH)1+QfU9,d9#5Z9YdUEM1a%jp#95#@GY+P5H+E5TNT*De6
D9#PTPNUEUS3l+QfU8XqSY+P+2LTYUT+F4k909C)ZU,6*5%G8fP3PLB&+QkSN8eC
T8j9`9+909C+fUV3T)ka8D90'Z+$5TScUU0+QM+3&+Qh+U1G8fT544%@P64R9AU9
0'8N-90U8NE4'T8dC5Ea8fQ6JAD90@H'X5TZb`LQ90QA9mbTYbUTR90U893iUEFU
+UDLd+5ZTMNUEXUU05TZb`Pf90Q8Pae"TNj&YU,3T+da5D90@NLf90KQTKNUEUX8
h90T8,Ha@D91eX%qP6GA#"C8f9DYR90T8VASTUkU@P%QP6G@5dkLdU9Te8QP6YD3
S5Y'VK@%UEDU@$&fP6G@5PkLdU9SiUK2E)H*M+QdDSYj5DG-3iE)5q#(#(C8f$9%
IUV4TL2a9fM4%FKk90Jf4A%@P6813!+FlDG-3bD98fM4%Z+,5TU(#-j8f$4A(8'R
681'J5TZ'#MY8fM48[DI5TU'UY8UEKNUqT0+QSHTGP6B0P44IT8e$aCP8fM4-A%f
P6F2%Ie6D0%cBVG+QBHT&P6B08`qSY'QBqNqP6F-NQ9&Tdc$*,&AD0%bm3D90`m9
,9GSdA0LTdUEK`Nk90JdA9UQdDEKk6+90`m9p9GSdA&*UP6B0e`S!P6B0&pp9D91
0q+G+QfU%0bTYUK&28'P6MA"0T8dekN190YA)Ak900H*r+QfU8DiUEDU4A&qP6EA
LYbTYUK8(8fP6VI"-T8fe`LD90Y@UIe6D9#XTNdUEDL@l9@P6VIT'T8dMe$FUE4S
KEUR5TK(L15TY'L&-9fR6#1'15TY'U%p8fM4#(%ZP652%-e6D0%)V"j!!S-NC+8i
1pm3'*b3Q0MJ--RCXi#BpL)fHTdH`892NlGL3!![U@(#NT'Y`"cQM0-YJ*33fq$R
BL!eHLL38'e`,,SB0AS%N$KYe4Fk,$8`"fl(4'q!E0Q+41cC@B,"b!K[pbYa!cQK
a1+5"f1$0m%eXm'4Q'YMJL["IE(!NHK-E@-XF!"ZB#!r#4Tr68pLSR3aCM3hC)AL
)$@k%T%p1REJl+bb`-FX!@l$"jq%Tf1K[iQ-$JkNR0[J'FR0Xi#cV(l$4fr"PE03
#$SZ0f3`bEMReQ[[!3E!aXd!'M3hHcN`$'l`46SH0HS[8hpMJ*dJRXB'jp$8fqKp
1JBfDXL)"'bX-b&h1'-eMC-f"XB%Vi"Xfq#Sm&aXF$&k'$Al#5K4Xi#Bb6@cd,4*
EE16$UK3jBcAl34D*$@j"[f1$Yp&hf-"lX!iE2F3m!4Xm!4NP0M!,(S'0[S+MB5-
I*-KbaJR[U5dfCJr-Il$"ZA@0ccM`dShmaQQeJKV(JCGQ$3!f`@@cNJ5Ei![D0Q1
6HV'LJM1Hq4HV+Sa0jLaQC38fQ4'`IXAB'-AVr'mmIFNk&Q-6($GV@E!*VTNe-GL
NhmaD'6N6m$%VB,#a-NARIa1BICM9)YL%EjY9*0L%%jUe)GL%KjL9)0J%Ema+$fc
86qGr%r%hXdGXV"c4qGp%Z*&C9B&0q,PCEB&01+TC3i&0H*GC-B&0qY+XBm%Qq'M
@Yf#6rM3V9q4-JNqBY5VBK$HEG4hBC"jKeRYJ)cqGrde5rA6q0dPV(AAq0`PFB"d
(Cc*eC#f(XFNXc+cR`#CFh+b``5EFcUbm`FCU'Chr6BEAXCE'f!5hc(SDE+c1d2R
IC$#&96@F+HTeRIp0d5*&RIrj3%kR+Z2!ML8'iqNYrh)Ll21[)%+[[`G!&1X9f2Z
S'F@Pp8XXZU3@MlC,6VAaBq%%AG%JpL1hk4"G9ZB2f(iQ*#[H@LF9,@kYbffP'm-
iS!c+5`hm!2[T"YSZ8McP0cLLJhK)`r3MG6Q$)DP`036'F%EXVmQU)--fQmIVHR)
F!`6E-#K"kkaQ'#``4`UI,[cL*@N@Z[h-#9Rm-mFIXkT9G!A0EV6X&ZHf+&II#B@
,i&$je1cq)me9Vk9ec5YU`&H[T&!m6q1Zj8jc9h"RZ1ZiklR(FirK(XXpMRX#pd6
Z5Gb6ZDG`0rbH0MdRC"YZ+Fd*,EQ0ErD[MZ!Hb6f+Zjjl$2GBlR(Fie-0[GN[LT3
ZpGhF0Gbeh0AF3lL(jP,3c@L,E3i,%i&H$L#RF0GbXb'LJRXFphMZ#G`6Z5Ga6qD
HbThKVZ1Zjal,28B*M1`c`,D9(qKdQQG*B)i"-Jq$!5,Xm#i``%j")U+H!c18Dq'
*qrcA`ZN1c'!%[D"pFTFMXdXBC1Gf$qr6-S,bI6IH-QD'McY4i!A,M88[LFe`+A+
Ga*hdNVE6-F14Hh[ALpa@c6[KQZ&f'#FeEhR+@rB5-ccPaT4LGkhTq2JZ@fhXGj0
AHR(AmFe`qA$&@Dl@NSM%*0hDb&hfL,BE#VA0MC*eXkfqZY!Z"dY2eA5GfGCb1mP
+0BR-YKR2pqHe*$mcXZ`Qc48(RiZF)!afhlM(r1Q4dSS6'(I5DDiZ4f%hD#ei35X
mAJVp-$*AMp4A1c8hbAbDhD!l5I6bIAYZZF8-iiYVmb'RlDD49PI#Bqkm'e0T'p$
dapPQf!Q@IEFFc2-[GCDP*e)(L8"eT-k0BEYMkecZVR9m9EZY'B@q2p&-[$#JiQ[
0pT(TpL)a'eIFjQVUNDNhr8E&m3,c[5104M--MY%@UjHLX0d)h11q&lMa4Th25@X
f-kd(YR0['8A&YB@K'R'DeDFl9[HlBCXffMh5T!+C6ZL[ejaMVYQ@V(FShR@KfAB
im'l[ZZ8T1QP(f1h3Kf''jjT,IAFT-CHZcbdYTGR15V-92mRfV,3r'ThJ@"8!N!$
LYRD58VY&p6F[9eI#**b*A2@3!04iBGYCGUHmZ1-lkR9U-CEBc8kcj,Y1T"kmeSR
8'9+E@MPZG1@N(9F,K0#3!1[S`khGU%RpY%,RTIAJleaKeTB`mCE@Tpc%mDa-%2@
A@llT&QfLjN#YTQSpSqj%[BP+b#eE4Hf%JJYP&kT"Z!LU0K3P+2ZB)+!)4&@(HJf
fKq)5K5f+@&3pU0a3NU,S3#Q+'JJe$N0%e(XSBG`L204+U%"4Hk(S40Q)BJL9#qS
ee!a-d9$ZS6"!"B!U6jI-'[8DbM-8CbMZ'!qM"N90L[)-"35+1*4YU,QBHU*#3dQ
"!Jfe!BTJ9"NS,9"'SDa$2BED$J8)5JX8(p"*&!NSGP(DSI4&YBZLN8%K3fZ8[DK
q85LJ4N*jK%)"C4XU$C34U#QBPk"33,Q&5K%P*LS4&(BSCe(*SS4$'B8b54HY'V8
E5P@8ELJhQ)fMUN$jJ)S1P5+U)a3HN!"69+QS8@'E+!$G)Nr8*QC!,$H+$P5`+#4
4pU#f40'('K-P*BSlKT3S)e%"S3*&4BT5&88VDNS8FbK486mabN$"JMS%K4*U@e6
,+*3CbU%)36A$`"-9*T-"Z#rU'EGdP,Ne8)B#&T8@5KPi'JS99@6h(DR`S-5Jrm6
,1PEqh[MlrmmR0*D@CjZY!Ak"ih3()rUkJmDCbYIH+p!j`T+1l*TXRGL`P&[8rp2
MJGL4$MMj2fTiA-A`NmPU2(48Jp2Pq4$'d(E'$*(VfrJ51jL0,a+brX`HPf6MLcK
#1R)EAq,3A4YI*16i-lRN0lli++E%"j'Jm'U&Kh8c,AESkS&4BBcH8CUEQYj4h$%
e8CrJYk9FUPXYT#rP#)15SGIL@K(bf6$V"DY-flbVjlcaeAGPBTPPGUf,Gq8)$p6
G5,khicIE2q`$H3q,c2!k0Q1'6cpU2`GNfh+3!+%JeNC#NTY+LN1iGV*V+KNl*&0
*#Bf-T'mU+4(#aC3(pP"+*'3L*T4j")Fi6,DKdf6BRfMXF#"453)Gclq0CAXD`'-
MGrI,M9Zp-DX2I$%b-"q#mXE`XREQNDK(JY+hp[llDqLH2FK5NFHk0FfSHZJB&'Y
)9j'8)[G%0k6[6M,GUZpM-Y*,9%lZ[69qJX0ZL4qVXQ)(3rr&1%DM#IRrX5SVGM"
M#E1r3XFFdM6fG@9b!%HcqG4&3qKX9Tik"p$+U+IC#m*"%Qh`fd9!qfbfQqT,S@K
)XqN"9$GV6&eSP0"QIkN,M5cD,#j9a9MlmBP05IIdX[GTpBGClp(Xa!QbY2+e6XM
L$aC5c&R#`DafD*QFklM"e%aY2@LDB6CPc1Pdr&Q[cH)2@A$"ZSajN!$C,@kT'm@
XfXK8r6!TXmC#I&XQ$a"[JCC1Q1MPX4H`XQ'lQh5M`'h9@8JKDaaQMMp9dr*pBlY
CEL(TY6K4l%j%bmF8kd`Y[jJecM)1@Bl4a+D+K@brZ*Ni+Ep4MGcBM9JR)G4j8pK
FE5`&XGRHGYBUBFYEmYaS`@XP+p5P-3b@[19Zj%jfNi4+XCKLYECDV)QR)ZHiXqL
lT6#-@LcHN!$SFpF6VH"SmpQLB4D40&CQ@@'b2M$EbS6F0,mFT'Xa@'eKYhFX@jd
qjJBXdC!!fTTkRDRe'@IY6[pQDA((M0flp6GV0+dT+cCQMH1he'Za2S2qQjGY%T(
fDA+$CDTQZR)qkFSD&&2KE8j5BXm*@Fki9GR-(,q91La00ilSDJeG1N)&@*JaBrG
B@JGXCpfUDX`D[iRe,AC,arb!T5'TBHAAl,"IjH,bM,Qk9TilI)3Ul1c8h6@l2b8
e2&YK2BGNHKRE19,$mmMVjl%UCTR(!T@KM3CE89CVf8KV5`JKbf3%BGJTXjU@BY@
),#cC@NlFYYP'`kr)qSbP)r0EV&@*%%9Acf3@&m1eY)kekJ%TaZ,&Sb5qdfF9$"j
Qk8LUrS6+E)8AVaLFRmTfTLC[-A)LMe)YADG[0rFGh(D40T1SI`AD&JCH`ZD8(DY
ePYSBJrL&YU@hGjh)a55T2B@%Tr[HSUQ[BVSd04QPTl(-193VccMAhqMY'QrG8"T
4!%PE!ZaBi9r-$4[HaY(ND6'dE56+c#ZIY,YUL9ff6H@+,IPZC[P+DX&e91dYQb@
R8,+Id"A+Q66Np"CYY6!!kkpcQQkr3+R+3QNHG*'@0Z@KR!fPN62Kc9UG&Uq*Q$8
XA[28p!b9D9[T&8B3H5eEF9Tpcfd9Xbd-E@PV0SK%Y$BG3C4Vdk9Xp*%`ZG*&ZaZ
QGjTT1mmF'4f*9hb9-M4*+R'PQKHX05a-P+[8*fcjKZZ3!14Z,1SCRUQ[2N&`pPF
G**Q'FVX64JP",c@9kX+QHDlMqf%B81*0(3V380T9fVNc#l5L@(9L&L-Cka,hK+P
1cfb'MM-eHb5M6-@HbdD0QJe@ZHI%EA1N0$HcNC,abf@)1Fl3l5QER6DKY&#U8TZ
PVd-m@Rd'Mr!ci*q$,K-*"("@EE6BTG#-lA#AT"H&RcFlZqRL8Yka#U0U#hf,Z#%
d62mJ!""EJ80VhfhfEN)HT#"aG+"04,%[6F%16fN'JKT)NIb,cRCpL29A&aGXil[
19)-NFfc!j*KiZV*B6jGI$XYXNZfZFHE1XleJ0P"SeM4#()iK`2SqmFPZe4aGDmB
JDPdYiSBCG[6%RP)ee&+N&D$0m5b"X)5FL(0#d3`baAMXkV8(aABdr6ij@qZIY3K
,&'2F6Q&,Xq-,YJ+-'!X0C&ffaa&BXj'+bCUU0VFifIAmPTRaSMJTeYcPYRMpl%a
C-6Y,D,h[Ri%JEELeIUrMT-)@eh1mU1$ZbZQb-I"L,4'R,83e6C&[p&`)%m&e$SQ
YJ31YcaCf8IA%)3GcF46AjT'258M3C)qAkrR%dl#2SNXBDHjq@qkSV(2hCpdLb#4
E`YB%'5Qer&+fJ`Pr-`hC-%&FfrjcTZ[6FVZiXGQ0BEI0RC[BE"dajjXZef&l)h8
d@Mk5YHEDMFSZR[KDD4G2C,893e+V"(U+Zb+XJ`611aKC5qT3',LQe)f6X&fmc9d
rRJj6jM3"fMDBiSi9)0CXU42SfT%`6fS$bD3FXLPZ@fUec64r,BQFf%bjLphPC6F
UCM'"6X11,fE8K8hQ4#`rfFaiE([US!A"j"k`DlNUUr!Ncqh@,+rFCDpJQqfLe%b
p5R@fZ,iTcaIR1[!-@E8(-hpf,c)&GmPM5j+2ZJ'6%&llVd@`a&K6M0T&2FiUcV,
"EbIlkA*Y-500YS&XedIC91,XAYR1+8kd@TkmK(P6,b'PMQ8`Q*SEYYBhf%E$IMp
FY(&XA5P0dFP,G$cf-P!f1)F$cklML9M@r+-&$#Dia`&B`VhmlLA#qV$YiUEY`$l
54PrpQah%SGM9'h(BE*FlYrEMQ0GCrCmi+-b'EX54*`XRGFc&35PDXa%RHTefHac
8TE@$1+K64`cLS'5pi1Rk4!C8UmmBa!("jJlLS*!!EAbk(k-i+&JcJcLS8kX'F9M
!1UmATfXGRlikDriJ$XYVVarNcH,E$B-iE#aT(F4K5FKGJcJX!,QM&bITa`kYUm6
j2ZFJ!(Yrii4l'D0KXRIe*#*52m[aSHpPC1c-k2rR'k"#D8$A"LKI`iiTMZpTFdV
!9T4'9L$),K2CHV%md-D4&Qr0pGQ)XDflb-D"eEjHmj'kYY&S*Bh'f-f04JFmE(A
mKK0&cRUMT@H6l'`QB64c,0fPBYH4Q0dKqPJ3NBBZ4BKX9RQ`MD8fHeE*20)@McA
48c@G0DCY)'IYdGrjHl4EC1BB@cl@*%i`eSJDRDJ6N@eQK"8H#`jefAijICUY&TZ
UE01ifG1V286(+*Y0@T2pNE2%CSke2X*YdE,b*!rNQ5)jhF,D&AP)52Q+pRr)&T%
Ck9k4Xr8hFqaQRP4LA[qK1e4'em0PhNdL)lEeHU2*p@jD@pRXJXHbF)*RTV!eC&e
)dka[X(#&kNK"lGk9fZVN,*ePhP`b*dkhb+ae1MqFCRefQM9r-mGZiH%LXX8Q0E`
NU6B[1$(2-T'DXEK%Ym5d(IGBE,)q[PDe'VV%hK#hlm9ZA9R!IK0H(G,@B4['C6`
44EEIc+2rGVJEffq@*Uf5#LKb@AQYLI6e,(HYb4Y9T"dAc*GZ['A4LHPmD@a4MMk
YqI,G0qUK+U[4emUE@Tl@r(-[hcfQA4'bM@*VK2P#eESeY0Y-DPQT)KVT5jbJKFT
eHE9UYVHklIEkC,Sij5Dl[8EAYE#[KY+QYNNP,3TJfDbbTGZZTbTkfI9b0VYPc(0
C4SmFS3[F$Kb9rUBZTG&@TPf8hmmpfiTS'bTH,$eVj#REAjC)P+X+hF6hj['EqeV
KGXG3*pcZTkQfjfmAA(5PUFkK-MGaRSp'9lSJm9N3SYG22!cXGf@ZP9FjG1*Ed&J
RcSRJ1[&-p0@*CejFhHlBVV4ZpqjXTeL$R5pFAT!![FHhUjP8UTe[N!")Needl+e
C0'![qL(GlR!UG@FXkNim%peiiPN3[qHK)9(#al232!BQRZdBQ2M''&Kde!BSqVP
Djr0[am"1jl"Y%fI&`-6(B'$LN@"JUI)+@BP[!3-6j`3$%mm%!a22'!1,MJQH&,d
lfbR'`(cKmKLialHVQ43$m`d5B@$4XEGQ%3B@rF$!$UG5GmBBQ(JQ'*Ki&M!`$`d
*"NDVQr)3'$Zf)f$X'J0J`8q,Ah"cC8j5EdHr2EjK[mDqLRfaLi'qf#&"[Xjk+dl
&VJAFLhd6f)XG%p5,(@23+rJPq&&`hY0"-H)P&FX$ASGVUAm8lT+ZL0#Zi0G6V!M
V#Qj!AG'RXaYMS)XG%jb,(3X`Pk"!JR+-Jr2`CMcDFFhia)!@1QKT3lZVRmfV(EY
LTl$TM*1LPE%CQ$+@"*q55LQ8'*m#)KQR")U-4i*"aL-'Rp!KDH63+bjcM$1f!(Q
!LAcb49C)XB@-X#4dk-Jp3Sr3$QcNM%Pha%"K2"+%-"i&D,!YPf##Dc,MaAE(r+J
J@926-8f5`ImfC[mGMTG9cMTel+**f&L5CJGKec3l(#A0a+NMc4J0Nbb,h%L6,2T
*MV&24iUQUj,FFS#Q5H8F*"YMl%LMIA9C%HS+rJRU&C`,R9r`ci0!`6Z"ci*cM+5
G[JQ`G3C3M1Yd$CFT&AUKIEP5bEepf9+4hKAFNTBY1-IG@r,G@bVAj3@rJ`eIB&$
GrMePMQP'TqrqaSc)4kFV2+6NepdXT1#G%TH$FcNB,lM%alI6YVQ&-9`XllST
)@`b3!0mV9[!ZB'da3"jXLqi*fKDpBlJY15GYABUJ29(bl@f+214fqiGJe1([PLH
fqb@S@r51BEI,ZDGJ$RL,MKh)@`a4J0kp!AV,(B0[bIP!QdE`@r)&IlXFplC$JX"
&l`5#`m@#456-H5B3Q(-VB&r1Xh2G(Ri*fZAFBTM,Hb@0NhI9MXNlZBk)UTU(XS*
Mf054S`@[R%1#@MQh'+lD[6V+i!!Ujp'"6$RI!L392IH8,3DK[&Gh%d@`NhF#EpS
pL[9-%#EReLY+k9Lc'$RR9L-@e9,ccqM-`*rLl+L3!&ALR-ZUU$mTCK92H3T*aEk
jR!Scr@*+CY46b-8ijC))akR&k!85@dLNi*r,UC2q&Y-VNS*#IKe%0Nb`k&V+-!F
+KG3LRK$QP2-T*C2!3ZFQbb4!aeV,a$hDFCRiP4CH*Y$4QAN5S#2ca$h+22%VC4i
$6'ILXAp(hV&hP(EX9XVD)&*RZXDa)drM&L9Sl+A-#VM8Q@3K4NHqK3K4kJAA8K@
+i09CKQ+3!)ik&%0%K5MkPLU4Jlc1%Z5m1h,2q8C*jja+fAD4-GehhD'U,'jZ,FS
9$d3!aBX4ZULEUd&4eABJIUN'4D*AM&!LHUi%"CA4rZLP!K4BB6&!RK@ka%1p59H
m8USKGbakpR"(PflRq(d`Le)41XPQ-8J[fA3&+BdR$qC4+NNa5[Y8Z84IHmChK`X
D6Cp,[Kd$P'),j!GCaC6c!jNqprCUjiPeai#S90qmHh&)&&I8kh'mX,[3iQGVH&U
12fiA@ZBElchhUabrh1X#l-1Qh-Zb-JpmhiYi$G8Z,Be2MRhi[2IYH'4HSK"X2TJ
pI*[+$drZM3BeAcQ5#r!bJi-[8E![F$2Gb`ZR23&Ji-Pi0R`(B2&!4VRC`Pr1cE[
L+lQVZ$2F@HjUlQ(F`lQRFYG`eh+2j"l&2CUlMVZHH`chH1i*h"1j'lK2iqEKe"c
H*N$p+33mLcFAm*Sh0V@kKkAT1p--cD*6H@m"EbP`,hcMh3+m5B$h"[#@!0i*`"X
!H"JhZr[CbmqZrrh2Q(biMFcM'1L4j"RkhBFDjcTXAdiHK2irFI`JVjZfcm3@j"$
eJcj2DVUHp&hU3*p#Zi1[!krf-(c%l#f@(rd[F4Jp%J)-A0plKd*akE',!djHGbj
1q$32I56Ri2XFp!'FJqppN!!ii2#FFqpNL12`FXqV"R(!rINEl`$ScGYc%5G%UYa
V"ahrF5mDM$Q3!([a)(`TIZNJI!Sq4-j`)Pr"1Il5lKJZmp"CCKq+phqI$bLK+8$
lX`Bep,mpDe!GNQF05R*dRDN,lm,R6IPK,M`!R`I$K`km%TrAfYYFiK*VFPki!@&
cV6ap9IS#YbeX%*QreZ&KE6p@hbedXl$6h68pH0r6GU!P,qGq"IG[Flr5E)0MT&1
+8C'5G5qF`![@UBmLi9Rf`GkpbpUPd0V-E31'#!r+-MbBcE2'j*9-hMCFF(KJKT-
*(QafmYNi3S3(GF`5JVhpTdBXj6d4kjcSc)-YGqp0h`FjfhK"RKP34(J`0X-$Xc9
NDEHMefE1YK)DRaT4F(JJBU6bVq&"q+T,IaSL4(K3FACq`$0Jeb6jDb1%L#r@@ca
S4UI#8YbfiZk4'dGZc9Y$K!J2aX!AKfbrX(9XI+D%IqaF`mdEJ2d!H64ACLF[a'P
r`@rT0&GRp4jd(d!H+dT6q3"eA9+E2jIKm6b@64qTMbbZQ'BF2fi+Ahk$'6lB8c&
RhT2DNYF51f6iQjp-RqBBr03M5X2QXIDjI*1R%AFIQmH6GZB&j('J)$r)im#,RAk
Barj%MZ8KmX(8VK2lXRkpjl'9dlqlEdMfdCp"G,cl[@QJb3L9-rYE-SR[*lQh$He
kEE(`QiqNqR#64jGdrPJpd#QE2!kd4rXVQ2[UZShGkTk!216ad6q[+`*QPmFq*$U
@4lmm92,JSG(lMmQMcDbFafPpAl3"DZGD`'NH(hdJ8aXMHC(dRL2[d$C#l8F1"6&
[k28#j'(H+0arfYpCA6TY56FR)!q1HDchcdm,Yc,Zk0N!lFIr`ELPXPda6M$ZhMb
m!BalmH6"iS8ilFm-,ah2"h2[UHS*jMkBaa(Q2TM(%HCq-)r$c(dJMambpq"c[c+
D!m$FZq[a-(2[,HaajMk3!-F4jYkGaN2-I5#2IZBq50YG(QhZm[0plreJh$a%[(4
1-1kH2$LH!-BYDmM2(L[feiHhRq`h'C2NX4mCMM+Q`6b1-*f$H4aQ1J0j(%AblM`
H3[+"22T"6r)`kqF(%-+m"Vr[4"1*[Jk42,BZ(MfIKca2I$#2E1AVbpmcP8VT`$I
JVqFmL(LbZTp12*L([,L`2`pj'@"Elb%!h4fpcPh+#DMV5Fi3FZPq6RiXM`(Nl1q
cX$pfE,ACJfG)q[LA2S`CRNiIl`lZ+McfeQHQ8*dR0iAkh'XfTSpHJ$`Dr6Jf3)`
!5%mHJ[A80A9q6QkQKPk!HTKTRaFJ$cIYfjI(X@RIKU6YQe1XabD2far'qi@&cf+
[[hfdF1mp(A1LF0plhhMUC1(G,a5Bb-V0QJ$r@`Vh[I2U`VdI)*lQFB1kU,FHKrT
-TbbYR@IlP5Q,!D+q2(JdCNT[kccCpfE+iJAS9c0Pm3,N`E&`P[TfA8dHdKkT2qk
2Cr+Dc2f8)DK8UMN!Mj&J@HB!p8KGP6qKI'LFZr2L@a4FMqdlKX0i!I*BG$4D'Z&
qT+k`8Rq&CR(IkH4#KC2M3Sre4ii,2GD[rS#*Xq&#*r%$"&lPG5iUF!l9e6maZHB
SThUdVLD2rZIF(XTM31+9qP2jEaU[IHFBdr%VDEa1(Xq5aQYECiZG$Y698k!91hN
m)&UaEJ"j5#[@Jp5q!+eBp"+kVL"9q42-h92"6,d!b1PA3+T$Cr"j6[k2QBl(C92
1[Z-KQ-AiJ6EPR$bHT8djafBaABRi#'Ba"f,SaThpalqeF@G!rTrDRPHKrcr#i2`
EH`51-UrZ2"jQAVd&1Fkm"[,`6Za(1-DmZK,a#qaCX(R)UrMl$NR)6P*,#[VLq!%
BJFR$+l(h`6kbD-RFA(h6UA,rr1%ce3SZe4-EaC!!R5R26[1mPE6pVlAriqcrH2X
r3ImmjdMYNqcr42YId8qZiR++[6P-3Q`Q,hPG5jf0RqR(5@q[0reG2*XTA#XY6X-
951TABImVE@"MPhpMPi6UlEmVd%Ml2dVr2"P'r`2lAflpapMrXITR$Aj8N!#blEA
e1((E6a4NU#e%P3fFXBQE4-4[Q2f[XAkZFdc&jGm85[a0CdN"6B%NMLQ!f%If#e$
j23ZZShlBFVBT6$%PPXP9FTVDMePp06LhY4[aMYf'kl6paVb%-@VYb6Di+C!!r$Z
lD@(jGi8aR5Ir$6EZ&0XKpG[0SimqHZC1,rc1hC[fdYhlEU,m'dE'jp5p@F2A"J1
GH+"[@[()[@'N,RIZ$52e1IK[e[$2[A('0rH'N6'jFfmB-@pUmk`erpl6L`*q1(c
Bqp$*R,UYFZ1&IMjlG9[lLkVmp5rd1i9H8,Fj0C1rrS9q4[hU@@[q[FIATfk,ED*
aLhIEpldab@0kG)1Qcq9iiG5-jKbH*ZbeC9!aH)Lk5PS+Dq93jL0)RD36&)+01,`
G,cZ))aYK8brUaC%0YVPcDcp1*EreJcLSj%HGLa2RRH&hc+!q@Al(RXXReBp6cHq
i3Gl$q*ei,Nj&2mj`INF-kP2$EmdJ$J[*D`Ga4[,lp+IV'1(!+(i[(-3CcHp&JcK
er$BqACmS6MfrQ8'F-Ia@$H,)+m058ldiAD4"[-Ea1hm3Ccbre`rbRX$[KN'FLIb
f$Z*-iRI6S$k6qIfYAKcca--34k-i[%IS"B1mTr*leb$1DIcHF3i(`L*)R'Rm[Zp
#2MRJ#PA[qimr0)i2)&&@b33T55lV,DiEb-ThGU,9)5,mpFbY$KQ91lFkC24hh!Z
V3pbU#(rFkK$hd!Trh1S3XeV)XpEmHimI$J85,5)R5&@)[TqcZK%RcYC6Y6`)*dJ
Ih21,NfE405*V2d!pr"B(3E`AKJheYB"c09,'[%4BM$iD*QQD*,K8ba[bHZV5B9'
!RVi0'QPHU%D[H@(kEI51dYc8p)lLMUQ*qJ5r,H95I8I15JGB)2C-(0N[!(VYh93
5EZk3!$J3VVfE5Z)iE!cCZ`QN["m(!0flb5+Z$jXf"MG25"`fE3aZRT!!1'c3k0P
m%X9KJmDdFh(#$4$La3D0RSdQ84`fD!aZq"![0QM-'F4KJmETJrU`3@2[*T!!Z#r
BS,&h%dJFK`dDHcGha((BS,&hFdFFC`UrHcGha('BF6hq`XB,LF-'MEfE0Z*m6ZG
hF00'Q+"hGB1'eb%15cF)Nm0J1aBpii%A[qeMaZc0HpRkjhXj)qf'XaJACMc`iTq
qrr6T4cqHkiB,Nqem+XD&@3pmhiX@6TrqT1BDrVD6KN3@F'(G!bpqqbZ01AarVKX
ZV!)8Q$2%Z(!&I'((kG0[eUC)Ip[CbR!K0c#fZ2$,c*efRMlpTAbh$HYhkLQlAEM
`)ZPG[(FRI+l"HH1h2IeXEHrTDCbT!(j[VRRYMZr@9r0FRfXJLr)VR*'`qrp@69c
%Q91YcJ)UYac4bmj2([)*MFX,GaHZ',VME)3J&b$,j1cCBH)$1Tk)(5E5b0Rd95S
0FrmAid*m-c,!HE2lMc4A[9Be#SmZe+SPFhQQkAd%-8bRq"hDa9mc013YmrhX+'B
rbNaNTHE+Kh)3DK2dHG)`#cp$QH[TCYrTIb"-lB@T)GaXkL%#f`S3RU"#KaXK@N,
SL%J&V1"j&826[2A*%h*('dMm"4Ah)'!jG8rrlbH)r1cK4$QYMmIY00I+deH9Jm5
0!MFT6UpeI*CVRKM$,h5cX02G06hahmYfdZD&fc-T4dZeG%l+-5&MTiqGDlMRG$T
q2N!HcCACb3YaC2&d3lQYcH48YLY'Fh9f*LFJMa@PUAb!ZLkTcCr,m(JHbkD2e%F
@9d`cMKmhK5qr`3`Il,(Gc(Y5fec(pm-`+"j`rFiCeq#aRaa0rercL0+`HDap,Yr
QK@*T9fRRcMrX$TI(NhEQ"H4aS#!rb#-Xqbrbf*r)X6b%LU9fRGLApHXpMkfFrYe
p3l+2rJb6NYh[0I2Z#I0R'$TNpVF88h`rbEeYD0GVLiAII#5G2jXmqYH*$05$)Bc
*id"lN!"(La-h(IrC`YSmeX4j!AQXhDVX3&dCUlNmpL(4X6ckU6EY1R"-(QeQj6a
15aRQa'f6!V9c,H'dl&SI6,MrV#c0AH4$a&M`G8Dd,QafRkm&KGdH4epR(iIcD&[
a&br%DCQq8&A*BdFh*b!2cR5Dj*'kYR!VFqm9BBl2r@$Z8YQZ'#HBHfmHhJ$Q[RM
bi-@9aFh9KB[em(a-!(UUHQ)#-*M(N3R!B"j(*J!(mcJm!4M)Bf!#`0%*32#jAaR
0!CJ!G0IMi3P!Ef'26`!'mMJb!HK1ik%*`%!Hr4-!b@0`#'!R!1ZARqpll`IM2Qr
mR)$k"12ZbB2M#@$F+laJceKaEIcQFi`lqdh'*(RX4iDMM'N`Mb0-jf!HKjR13"j
(NE`lMiH3!(`JMhl3NcbNl`mbmqQqYi9@d85LVd-NMkf,4mrRXAMak-8mXT@Rj4a
k-T9+kF!hi+rR2)KiM9NR(XaMdh0F8I,Bj-4aXF568Z3K)BALKKfpcPh+#DMV5Fi
3FZQ65cjcR,`I1I[l,1b2(9YYpZ!CFY!jjTc(Q1(Tp2(Zi+l#BfppCJV9HA*6U-q
pCQ2kk!A)Sp'2B`2%#)$dj#&B6ee6jqIYCQVS"DL(QICj!I*`dljpH4bEpQe)fVi
jaCCrmVMpBEaI@2JXp[VE4`[hhY-aVbrFGrreTdi@h[e#JBNX!Dm*m,qPF0r2IU*
`l`H)ThRFS#lUVFHK2Y-T5f[RfAjPa'+!U#q29H9UdBbFf-VM8$h-P-8,d+pQbZ)
&b)0Mi5celEUD2+3p8RrF(mm-JqGNT%'P8Xd"f"3PiRMEmI[SlBMm#H9$ipbG&jF
%Z4lEG`b(m3,NXHKSY$6#r8KGBDAq#ZhM[Y2*K3SRai8HkimF&hUXArd"QM2$K8l
L"`LmbZYF91!FUUYrBR,088leD&e0(R#UNrdaZ'I2rk(1pJ"T[2DGBdc(Vk6a1RN
m5aU[ECdYGMT39aq"@PbdBLH2"d3VeJdJ$fR&HT!!fKHJ&BXI0&ik9IN6c0e6`8b
p!-MT9d#U3fGJiBl2Dq21[Z-KQ-AiJ6EZR$bHTBdlafBaABPi#6Ehl$qkZ@Irm@p
Yh"Q3!2qRYZG9k2q2-$MraKk"SmbV1iq(Q9G[3BicVi%m["2l%BiaVkj%r!*l&Q`
HklIkM#6NMD'@&26&m3-`!T1(9f,[JipMSbHL+Ur14Xmc-iAfNR3,T$QC!fr5EdR
Krl8[TVEJCqjkKrip622&[RjPd13DYU0IApRV9erA4XqH[LpYp1c%DArp4NqI`J6
!$k6flTm!&(FA26)"m%YYp$cCpkHd$"XpllhZ8l$9ARDljm6X0T`qHJ(bL$CkpZ4
4fPcB2K8c8d-[3$h-Y-m,N!"(Z0'c,ipMdckcaDlTlYj'6a'*VF3Z'ch69ldUYGI
m`Za$3m9((X2%4Xm(m2rBd+l,r+'V6U8E(R0El(VVFDM2SSfH2AQ80RUfja&Yp(b
d(QE+iJAS9c0Pm3,N`G(YFir@eH4K0hSqQXFTSXe'6pj,QdjI"&Z"6UmX(qlPeB$
"pcRS0JdHc0l,YX#C)k0lfdicP`dF("l)ElQiJPH1(`4k,,,Ciq"eIDhrXP8fpfe
bRGJY6RBp[lF,aDG##$a`R0#F0#01`3,cH9r1k"fPZDRT(F8G8a2e#AjEbUAkMTb
9$[$!3%$qb"[PHEKlj9$@&`+4q3B*JSdiFU@Z'-4KG$pf)dkPAN-IR[*q((3VM8r
R%p9R*,rcHR'khKN[F8Ea1hm3TilI+mr9*bb#a+RRpkT"R$(mVYk)8r9%R&[lF@6
*A1SeJcMMq-d-qQ)m[e@$1"2i[Ai3Cb+r'`Ca*[(E1SJcQGr(RiX6pmm8IZmDj$1
9hcYkFI+i8SK('MSFhRrme(&mdqqclq[AdQY1S[HDKRQFkMZmcljr!Y$l%Z9rR`$
iTPjcmQMIRp)b[1E%dr8qqrJe*qR,RhM0bHH'GRhdM8qpjZ5$,rrpejbFNZQmccl
$eXqdhZ53!2SZ0[@1cel[FEdEZ*'AcrCb$dldHJr2h1YHj,Iml1YHI'im!6`3[PL
A,rID'm'$q[5e0eD`Y,6EdHaKpJ(ADEP4R+F'$0&VEqcVIr*i)11Yl8lNZ6PUL"$
K38@'"qZ6+$cZ4UYaXCBi3FZ*@JJN3)AGHbZef@*TVr'#2$0dL2MLf,2cJl@Xk9Z
6j+q0%#)m''2aS$Q-h"N@0VB9GirF1(*VhKSL4(J`,KrQC8#HQ11,3`&c)Rj3dhq
0B(NZrQX%blic6AL0S(Q#B-1%R`1`qX[IFIaaVa'XJ"PkBHE-@6TKc8MB2Em,TIp
Fa,&,#B164l62jH3KRp#i[("hiBUK1mj'#()"XX`Rp1qHFRihG3G)JX+P2(42IJG
6CE'3!*kZTr(pX#"lEI+3!%$Vd(EK(Ai5"mGIZ4!Rc0,VrCilcdUFMTFS$U6Na6Q
V'h(LE+e0mb!F'H*EN[e)2jXkqKf+LC!!c8pcH0jSrc3URMECQcGRV(`S"k%f3Am
ZjCGlbUa26V4qURf"!rE&iUpL63RRe9B6mTTd2Ar+r#fV$ReGqYlcP(Q(4BhA@rm
h@2[llImEVGqET1L9mfEchHRr@fcmYeT&e$YXARGE[hIDq2ICrhIC20jYkh'2MA1
[M4Y+AX2M2l!G%+4bUQ`2aA(M$&KNrSZ6rRe&f8p2Zr$mH+hcPI46D0Mp-qc'Yb!
2pkQG6YCck(MPPLYkEdkGj@Yq,*EYEcQqAMER*jc(F6bpE-cp'f)@K4#MM`C2r4G
E+`rcjG`4Y4Re(&a!+(&`(&aS+(%3DVhX1fU%KBD1cch)Pc`%aqFlX[+rR9-NK''
r*qli`PFfH!2U'YAAamHJ[3ALGep&QrhN95G'4*Kb4Nji13"[!2HGR&APD[(Ja#X
RG0IdhrQib$RQ&'X[QbrH8"KphlX,Sd[l$Xm9j`qXQ'Z,0Ih0hA(0+dcKd!H0HHN
RYPpcd#`A$mpYYQ9VdRBk&5G1H*j6q9SRM-e`[HNh*TC`D'bhc("eFUlM"P-cYI@
JDBCVEU+hc$GjE5mKKGU4qQTMbPhb!VI8MH)`-YZUITL8Qf'!Em[N!H)Y+!G,B4U
p22D#-6-FZ8Nh#Ya@IEhMmVLdQH02eE4mhpMZ8@UaX9&eSYLGL*D2+GDCirc0'Yp
MKJ2hq+blP*5$PVY'R*6IU2)FjIA4-CHkC2b`ZGTB#Q+c[HfX9F+@Yq5jdB,A5PD
S5f-B,(R,hFLGl#B*P4UV+MBk`6%RRSUFimkLljE#-'V&CK[4jkiR2(-j%r[1-EH
D81('bUa([f`afmU%h$5r(*LVb8!HibQ*lA+MT,ikIF`0NV5fTPjRhX6I@E[6[eN
hmMGMpflpc4T0DcSVVDRi,I9DVVPDr6H[PN4HX%cl0,R"-P8cA6QIG(Qp)4@@pc`
fKYddbaQh+TZCilG5KkA0+26p45HDD#CH'&3MRYC-"Fj,Xjk4eJ(E@EHU'V2'Ec,
$8elFmChek5#*eXf`mQYfNZE+r[+-ZET@RMYmK#VXl06GYB3(2Dm,Mj[KfFTq0b(
6bhMHFfTiRRHScR-5YqkeA62FD#bl551KYeYE3SKV8i4CcHpU@NT3*Y-PLB@*fcE
ED2J9@CpYSTARYjEG685CQdC1E9YF$0I51YDU"k3Bm[jQ5AbRRjKYmPJ3Z5i2N[E
%6Hk%1PFIQMXd8CNHQ6ibr3Fac22Pc)C4qG(rMUF2qH(3a%Hac0BRJ'qqNq1I3Hq
dqDld0AElHkDj8Xd"H+-Gi'0Q8[ZHI$FLHe6-BqFDEQC4IS!m'ZIZA,d34ej&6f(
hafMdikdAd4r0Bp(4D'Q%qj'k-P"ZALK0j32daj,DFkr"2jU(H6AqY9Z2kNp01Vi
IKN(aJ1Xr-a-fH@a)f[qrqHN2NmF0chAMSAieHI4Mja,ha-@D-1Ap"Ak!`+ZmcXc
cHA$NBIilm`(kIRXFIIZ&rbi2c[5Qlja(f80e0ARdD`i1j@%IB0hh`X8*q40-TlN
b1hNKMM`CZU(FeTZb+@ehj9YQ,b,-JhPi!aM+iXQ$ra-j@aBZeX06`A6kX913!+T
a9fRRcMqXUX[M56[c![)i8*!!(q4a326c`c`'N!$mF"lVeh)!9%L@Q6l@Vb%clDq
'j0(La%h(IlD`0Sme@e1*(q5aGUZb!hAPr9JZMhe)p)-mYQfadi'kKRPi!CLlbD2
0AAiH2r`6M,YYa9qm%+GPHZBLVfT,ZMN"HA#Qdb52e,9&f'#BHl-ES6NURDVm#HE
ZU@#QAJ$Np#XJeD&MND'P@XS[QHP)DEXVIhbQdjZ(hf6UI(3@dp-G*fBaJhNFQF8
-jR&N&R-`Mm1cQ)%mr!ZcQ1jk2$b,k5hXm9R-3"j(CM(GD6`dLaR-iqJXTLX4(m%
XjN!-UF+FZ2eFM*@PZBYmL"MKe++l4l`I-jdH)$SadqP$I&r!6-F2Z,%PpB,jZER
kTP2Pr[R$+ES3S(c"Lm@lXM2Pf@PYGY(r1[YIErr(f2rapRqDrCpSrbIBrr*qFK@
A-ecC(#BKYV6eVl,rQAkFY2BJ2,@qbRcUfXL*2(B`T-b9#L6eUl$rP6D`XFZrXFX
MGNb"j0m9CUcp(kGr&VrV[bQXr*IVAjiPC3SUrbDHL)VVqJ8TfejECb('jLF+-Y3
@`PA3G8bep4YQrfYX38`"*%(65I*[#LAqY6EZ+2Xrf[k2l"HJmRX@A%IpX19X8lJ
Z-VR+rfRpQ09AXd0LDcGUZR(a1ZE0'iZPN!$Y'eSS+8L$$@S+*2q6lImNqqm+BcT
2rPfmUEC$k[XEID52KRrNi6m#Se-I$,@%,2-lHkbi0RlcdmbppTX-6K,CMc"('Ga
J(NFBh'!H4aMF`6`1-lL"2)ibVqim(QCH[38jcV`'mMM#[,V6H)Kj$HCaP(Pe*C*
MAS-i*!"lB#*Mmc"+KCj$%U*3X+5J,iiR3$p&(TZm,CB56E6k%%hbf,Tip(`HXX2
cB"jq3$fArR[km#0Y,[Y1U'9ViZ!HJ'%j5hX!eVRIeUq&HAJ%pJPi*r6lAJ$G2FG
6STFrf&fR(![EQcdTlm[c5'kTPS4-ChJNYP4,!Ga@kTpYUIl+*ST8hI2AcQ6Zdm&
MRpea,`P0QaGZ[b#3!24-k#0C#Z(2d8HZMH048rMb'hJ)ilU0!*N$Ep*[Tcibq+p
I6'h"cpce$[elQ254IIh+J0SeE%Hr[V,AVriNAB*23%q`i6a1UjkJZqmMR0l4c!(
J9[iYAB)bppje9H2chlC9H4BQ!(kJE9Ap%`#cLG-I-!(`rfbVkTm!5"k$3i"`bp6
*[[H!E*RUhYEkd*DT[Uf[RJ$'2E#5)*YAXC(!1l&*`&qLh2G++1kcP@IfAGQ6U94
+"li"IchR3F4Vc$VaB"kERZ1+NJIEBN9VYVR$Fk!,a3dlfKq`Uq)NC`LjG$mR2jE
(!(,fpeRB(cXZVV8H2%-ZV!8IRNiIllhZ8l$9ARDljm6X0T`qHJ(b-0ZmlEVKRMc
FPZ"pmhBc0I3#e-0-ql`!HEKThlimMNhlc"EZTVZc2'j2A`D92S+pr[E4SDYHPGT
VIQ(fSD(L)ipK'S[e!I`r0V6V-RrSUP1M'hQB,Gbpp6M8CcTPDHdmfkq-@(UR)cB
2Xi@EpG!Rqpj-@E`!r@UQ,&k!2$Lk2I[4ZTSmT$hf6D%1jA&+f2)LJ90"K*F*RS,
6[!cZc[IV96HEiq4*&$pp2lZ&m@ZIR&9MVj!!hjDcIX%B2dr!Vr@XhrSe(Y1NqCA
pHXq[KMbb0VrBEmk2B0ImBVqUPbRjE4&B9leiT4,@[&IaFeVQGm84E2U)VH#er)a
1rE+IP&42AJePr&l-cdZcH%rq#@cbeL91@[NYbZ*pj[2Bj!e0R(,P-62cqrBZE*8
fhVhm$-[ml[NK&FMkCG56CfEjRD'4GmEk[A)M[qUjpf$,CRi6r`ijUYrTrd!eeMk
MPPUrqdjM'f,crM!ril0i9hi)fp$-lq-raU1LILIcQr%lUSh'q``eVmVbq%iC"hU
(ZT+Vj[F[,e&$@VqbIpIVXa9rcm)km6kKf0E[mVq%EB6YbbH6AfAQYiCH6re*'qr
6r&bBjIGje@p8jPG"2*G(kcp@$DcI12SMq%cQpm`hie"Ri`'EYNl9YbQrHZXhHk0
1fCr6MZ3aYXqqS'D`IRF,Zf4(0ZGmqM,ihLb2*6q[K+eI`q2m[#hcHrjI9'pTIXm
6a0SmA[r,f#CNIS[!Pr4`j[H42kX'9Y5@[UV-r+VImYXi6-Vm2V2$Q$drRXAlX$"
cFZChYR+pTCh%UP(dFUTG[d8Hpl@6G')GqFeqZj,FR2KkAeIN9r%apDM%!hGM[`J
[EhXTYLR@lbmfm$,lVe4V9I09#YZdcjkU2H2%P(21HJm[Ee5rNKI`pEBHRJhr$@c
6E(lIk1(PlrqLL)6k`3NYAPDhlm$f5cE[##qIqMHa2Flk4ALjl6jXdNHFTqrTiH9
GQLXp`FDMll9qBrm6YLGD2hLGiZAb"l'GNG'!BHKH(&ifrM!HbM4R[Ri$,kYI,1`
"VmMMQlhmkM9PHSUY+cE&S5q+0dbhZ!JZ+mlG)AbL[q6-Jpmi[$chAkMfeQrX2p[
!bqVbMf-lbq)C[%Vcf#(XabjR#EfVH*Ppacm4S'JmZ)l@k8CaM(1X(kp#FhK!EFl
0r"D)ReLmV*j4E'@+Pp%6$Lp[%rDFRrQGqfXp[(bDHQQQV4piCI'bZUkHRjAjVEK
p!bqVIq`9!M,VpeaiMm2,iFVTJU`[AhJRTIccV+kr*a`P*RK$rc9B[-`p9#kBI)"
H%a`eH*Rc5cdSrV("iQAN0eDii[!bmNY6$pI($ra,!Bhb%RLJmX[P@QGaSI@Edq0
2hrlVf1#!P"I1URJjii[Bk#P5J$FUEYh`0d4dPHH"[iUAIk"DUF*Nl$rUiHAMhSC
0ja0Pm!1(PihL[US!+4H[d2aZ%XqBRrQY!Bm8,l-I%Zr45@Zjm&KaSNNB)AcIe(A
j"PjQhkqkfPG+"0H#T`i[le*ZF%NjP`[2&#r(#[XAf6bSTIE(jcq(6A9QQ9IhF+K
HHqY9i60"[D8ipi5rMDdjme[eKKjHAR`2$Xqdr1Q[HRLj@ENYYRN)IVXmc[clf(6
XXTSqG2ab#$9,rANElmZp2KJR6V2%eJqqSA8Dr4CX5beH2Y$$bbh+@9pEGb9pSRL
CrGAAi8!I!@[`%XA,i+F%V0C[Q[T(qHApiTSV-VmEiEJ1,cIIK30c!$R[B%lMm2)
UB4+F49,q3rV*iH9I[9-0ShApdcjHkZb$H0HrLMaHE2%bjjID+hbka1*Pj$GK%bm
M[d#m5rYMTc$kLXa[S[T0qH@lKA2`A2*J"U"p0N2F8ZV!@DKjK1,PD'UF%Mj!@q#
Q$VIJk+YYI["jLjI9qc5(d(8&%clF`mXcK3fk8##Y'D[&bqc2hip0CfrRhY[$bdR
L#MVEZaeFG(Mjam*)IB["qHTEVGqYiJBUCjbU2"3[2b[1CQHa`8(`V2EZ,0iYRmC
$&DYY`M2&bjGUpU5cdY2kFijCF+D8RD00d,a+qfbLX&pRIY1%'BTc9iKhkPk9(Aq
eKjFAI")(RGqGUrQ4cQ1qV9jA6FDd,r6b@#SZSR1pjp',$LrAIK!(F)&ihql9D6S
cTj5GBCqQ2P(qG,q`P4S#QerE`-[X`qTKR62H5lmkIRQQF%*e*$XeNe1mV0-X6&F
)RII2HrabVIT!P4kr5qmk[(c*Ch(BPIAI"FbE&#qc(eB2hC6"`9$i[-2,Eh`&$fC
+e*9jJF0,R3Pb2X3X+MJcMiRmaURA"4F0ANCq8c8RFhLCm`[Dp0R`plD6j5IRRHq
"qkCIhZl%a)[mJKH!9HQ6eGNi-9Fm)-l2()BqJ!IVR$A1ib2L4C,I0[940!IkJ2M
UakaIa(H[%QkqcIT&Z$j0'2PNkaI9GB+`fIE6b)mURXU$cY0X`2EPb*m9KM,EN91
KZ9KjkMHU)%aRMLTRePm4"PXrJlY`-IU'HD6Qpa,03X"fm*lqe2cq5$@$@j%I[0(
Q0r+ikXUi(`V$[0,Q0h,j)@bh@R`#TfaqSfj5$m%6bIZc[Ibq)'i!VT)IH@Vp6Y-
m8R#EFi9Q-eUrLH+,YpQq!9md[`G8dpXYlX)REAkMlY(F"F`N2c"9krGh`Til-Vr
EQ(qir*CTYN+r8$rUqqTfr08jhh,0EpjVrD,q[N3ikq*&rIddFHjV,-lTM*[)&@r
Ymm+FAr"'c6iG6Z6m8YrrD"rR)Vm,a%'IBA%amTXPRQejdU@r*SbKMb6[Lrl(aPb
KDCGiJ2!AmRl14cE`ZqQ$(m@$[T!!5Sk'%bKq0iep#BpIcr*l(ca5H9A6`m*+Z$2
e!+FXAlRd+jSc-G1JI[!-beHDrZi[BB-MJ'I8aI+KTKm84K"(c[ZC4bZ[DMUNq3H
c#$RcK4H@9c9G*[j"$FQEr$@2*Xdbl,Y#JJEiT,bUk3ja"@DHFXl@h%6Vr3PaCM!
(IX`XbZ*(dffD&6+,N!#qZBFjUI,8TU1D-F&$D6PQJ4CAQMiNr*1q0VJ#Cl+iFZN
A0*H#emZj8RKTqA66Jq*fc*VNR#-FX(bkk3h#ER!Hr+!2YCqq3ZqQ0013!(1kp!2
D6irAE25eQGm(rq-'rf[kJBpMHeh@"h2JrmVrQLD%PIS@N[XdClImVqRKIiU0@C!
!R)[9RpS(MhXAYMGNHDa$!k(mVfQrCQ&[Y(e$2RB1dI3*p6'i*1ITQS2EqM8G&"k
6Lq4aM@EBGJl40+VC!I0!q"pc1Zfc-F+kYfCq9`Yh(Ej'1$G1q&%,2i0[42aTZ@D
h,Pl1,qh#h892Bh&AY5@FAH,6c$A"hFM[I-fM(8q0r-i92h"i(2RCShJFq5h6,0c
LFGd4p6"F4[VJkf"-jEl-EiGQQQr2r,j$24@2khj%'J!d,&+r,i26ipqAqShqEkS
*XhU*Gbdk$FAM1NFpq8k,Pq#6lEqkpkZAhQAVbZc"iNIG1c9A3hY#(dYqLU0e(p@
mQCQHT2DVRpV!ilU1Y!ISFH6FVlTB2+jcKA0`$HS0Mp%mVTB02LXT2!pm96bZHjY
Q+$*2jX`@RpCkIdSi"cqPIRqjJ80e[k8CfhXc[ip4Qr*bj[Gac9MIPrP9DKjNmEM
Z"Xh&hjrPIC[UDr'iVLTXT4r"1HCB&SrVlT)1!ji)EU'VXAKFYbJZbR`B2XSl2E@
ICUJfD$6S*rLapP-JMS*@52+qAAK[mEMZTc@M!CI`S`mX(YH0r"XmU)1i2&rj@6b
ZHi[Q*Fb3!((reeiI[&#B$GF32%M$&4524rphB4(p$Km&HkSY,NBiG,9`fH&LcLr
pC[K9L)ZUVF,[9H*G$KGcIUQkCX`1&b-r-mChZ"Mj*EJBqHf5EX(LBR#AY%EJMq4
p'IfJZ"MXdC`$6LTq9i)0LSY"U0NVR%9ikXA-)"8AJjXdXd1R)r(@`Pm9&i2ADMi
(*j+c4[01fmI"EH)kc%$!)A+bI4am6(`&cJK[imIL@A"5mG$D5(lVd'8T,JBh5!I
'h!`H$rqdZ*K1Z3hB4EfCDfXH&f[q`AaEmVJ"AU+i'1`8TP)Vm1RV'lJBZ1)aJX1
'rk'RXRJ3I&SD(QDHNX+Gk"B8&i-(0CXcEaL5PX[0Ki*E0!Z'JdZm&iL[@e`-lP"
IJYAd!Ac)iQ,`frmH'pSC1G18KmA&`"2Q`TIPh0kET`DIeq`6h42eCKk[rI4qB4J
c++Rh*[@caF9J@RaAG(2iE@CHSlJBI&MD'1C&iVG&20ELBT!!3ZKrYr9MpUapm'P
a#6"CiQe&Ak'i'(br-"f-TAl`lAU,La%1I95FrM-@&b2mZj&q6@p,mdMG+jj0[S)
hYG5PE#ccZdmc"HBc8SpKQP0D2%Zp@M9$hbGq8jM(Z$aq6Ah$l%*FEQG@j2*iMfC
5[$0*iNd9PQJH@k9jS!I&lca`aqAa@68#-aCaZBYqGRRFUAMJXm5EU6lA20iNENB
rLYm9B)R,ik[#V#pQHEb%QE(,ibE&BjiJmHD)afXHIkCH3I-PmCB`Gh"j$*FQaXj
)dfq(2lNmCQRQcXaFmTLV1E,Qd5)0)A-!LIFIQ'1k2&V9Jmb[a1Aem#UAa`Z%CID
GY'QhhfF9kJ2QkZ,hA,LAbf1ajYr-BF6PVI5Fbk0"@Lbd6Z3"$pFmAUIj&YS(S!Q
q-lV0pT5%`+4IThRCKpV1NaYZdQpLEK9NZSHb0bVf2f@1(a#AACEj[85F")i-R@4
1qCZChjh#'rTGmLKRrKKXcrbHVYjJRLpqGm2hA(ila#@S&I@MefeqkFqUYq!,i[F
#e9McZd9D#,4#i[G1kU[jT8q,hc#E&Em[SB0bq6e(Xi&[CAi[dLa6khHljMTJZ2L
p6$a6meXJ65Qc,2(l1qDJVRlc0GH"`iVIha2EjGHSfR`hmc0M"mh[I[%mqJ8rkQV
c5hp+qD&R%EprN!"13[-,Q-dj@I*DCVFZ[eh`$hhaDp!5pQKqVf!f(f3cfr3Tm5A
0ld[-2i*XCTYq269`rI&9CP&"0MY+[j2jZ-Z[R2PkB'G3p`Yh0,rCc'+#M&-(5q+
(fKq6dpQ-cH-$F"fAhjr!ii0-Vjcq*I@0c5rpAqMM)0-VThp8@+,pr8fdI%'Q9dk
r4cLVq@e8rDaH1Ih,c1PFITp#maPNHZAdMm*[daRrbei*T`QXA[Nqm6$,Nc*r!Fi
8@,hb4k8h8Vrh`UX#UeIqU,4Vk[GpD9qXAMPi'IPSITPAdeZ"e5Z2&CI9H,m"C`f
XA[PM`RlVPcd!*``b[A*`VH*U[(pN*K4NHZ9JA2a*mrYRH%#3!1Q9Jlh#FBhhD[!
eb26+`9lKNI-6V953!1Q9Jap8(kVI"MK-N!$TPB0Ad5FZ[lI$YB*-Vaa-D$kKmEl
&l#6)p-V"K'E5kVF'c8b3!1Q9J`PTFE5ZSkKTN!$TPG0eCJ!Z[lq&P`HCAMQBe(a
FmlJ*,K*NHZ9J8Ma9rEk(TM$)p-6"T'Cik[IA`JbV*dir!*peqAf2RJNb2A(kC$q
2lk+4#c)pFITN,irXPA$A)0-6Tdq+3kZHE#Lce5$6%kG2LXpEITrj#HB@3DBR6Tm
8Vp-m+U90Y(VLp%Ra%c[Ic4`@APSpFIS$dKICq@lQF@)EA4Yq-Zpaq(3KXlmJda1
R6dQrSI@l9reYpF6T8jVlUpr,Q6d%QCiiI8UF@q[(cTdJda1Rrl)iNpE[ZI4-N!$
TLG1Ra'-dMdmb)`Jb2A(k(fS1CHZAIBNd59C2R(j3[%6VpeSiAT!!kSRr(`#3!aJ
F!!!"!*!$9hS!!&Ck!!!#HQpX1`d*#@Cc,R"KFNP%)$dJ+Q4TFMX0#3P1B@eP3fp
`%M3Z-#"6C@aQ,89iG(*KBh4[FR)#!*!$39"36$q3"!!!39"36$q3"#!!rj!%!*!
5V2Ep&3#3"PRd#3N0#3NUGQpX)$dJCR-ZGP*PCNjeE6X0#3NUC'Pb)$dJCR-ZF'&
b583l$3N*6Q&YC80[F(NSCR-ZEQ&YC5aZB@eP+6X0#3N0#3NUGf&c4QpXC'9b3@a
TBA-J25"TFdC[E'4PFMX0#3N0#3PbCA4eFQiJFQ9cG@ad1`d*I3d*$3NUG`!!!SK
"4%05!`!$+!eG#q'@`$CY$mNlVhhP@pr8UY9@@qQeqQ59A*IS&5UY@KfIC'[9b9N
L1%$*L*aNZNNRV6M!GmlA#r`$YJQbidVkSf9Q5X31HhLX@9Q%+la1-l)V&YTbfT2
cF+)hk@)j'9-fQ8lL4QLa[HJBES2G[9PVC$GXp4)p3Nl$!MZG6Z8$B&mlN!!1jLS
ia2IA)MN&Lqd-1T12JV2m5$eDcXEMr9!p6%l!`qeB1SiA`RCr31qAEAL(lD5YI#I
FEE0T$Ym&mref[8dfie-fM@Cb0*ca"IU-c-$TrS3q+92a(TY,mlJHRV8He$d+VMC
iZCiMkh'(jr4"fB,hf8EDa2G#ArpA(jFqq,4eT@lm+1aYqe"[rKhfmefd@Jl#)Ak
VPXTir0iQdJ6q((kf865DIi)aAUNrb#4FBqfT(Im)RI`Vr9Ski%KIVDZN-kkeX65
1ed%A@dV,q$Yiarr@[q3pI0rrdelb(2j[(p#lr!pmkVAkTAb#hpJ5QXAI3MrlQ$l
M"ZMT+r8,kBMRf3[d#Pm%VrV&HU'mM)2m4Ve&"Z-0pK&pb0I$#,p+VjCKH+e0SD&
m(GaN!fNiA`2pr@BYN`(iQPqLPmVVH,Qp5@ra&A#q[8M2mlR`NPqJPmNE8IVd*rh
"Mm(EIU8q*,rJVrk`2L+r)4U6-%!8@H3DeYBQ9*C')qXiPmXP8r6f--@@XC494DP
M,dYl1NjRdUPd9AT"fQVb6GQ@ZNC[,P`FYf95CS@YE9'2PG8N3%!6`V0,*U'm,U'
i-+%T8"3S#,5&mX*`U!k(qY"@%QKY6Zkd0LAVNTD)1NNfM!-T53UC3$lmXN#fiP*
S5`8bJHD+$`8X(lEdE%)fN!#*%q*m3Ne5"J#3!bp"4%05!`!!9Je,!jhS"PrE"E9
`#`$!,IqU&`!!d&Z,@RJ"SHEr!eL&(XF[PfEk(!#3"LHr384$8J-!2r)293ef4J%
3-H2RBhqEFikab$+@e4UMAi`9SqlR0i4,$B`jKmkaHS`4NpKF'Vi3XK&`XJ-*cm[
e%T-5-B3JcH'PA*)Qa[D&b3NF5lNdemIMd9a+1G6(0C4,+BHQK'1)Y8!Ti!"ahrI
llqrljQB1[Hflprhm"aZNTbK"%#4"%Mb4!A`#Q[HMPZJe$V'B6iBr'1Yb(r0'lR+
63eqBK'k*JTVe`GLNZkY$V&"$8-"+B,,MA9!T8)4+K1*F9Gp@SHGGER'D90K*j)V
m4%l1aiIPRJT'qXZfLRX1S0!J&4Cdr$P@`T!!9JX&)MSSQ*ZU5FPbfmUAe(j0UZU
JMXGVIl"lVkK0&2"ilSEK%KSff'Yr%'6H))528Q+P-HTJD&J,dd*I1dqZ+AUr9q0
rcq8$iYLYZR9VZlMrXX[pTmpVH(+'5mR8V90,hFXHVX'53*ITXRk'5eFkYlq[Lj[
8,)&K64G2[YrYrKphmI'qINjhApDdhAf2[H6LrTGfFp0,h6cCmHIk!m&Cd,!kVH[
Zq,3AeiV@jNiH9cYbEq(RYG%T$5Cllk`1*0mjKDP$QqCIYQeDG,PAQ$lCcq0pS8d
0TffE[McYFLpp!)2U91+a4&&MVcVe*J4k['"@3M,NBJ0*0Y@UU3jeDR#5@fYc3mI
&'K+qFhd'1ahQ5&fpaaFUEjc+X)mD9S2Gk,BG@kC1M8rb1*C%hIQLD0L#$KcXSZq
-(PH'UYJqfcjElImGT3YeUTYal509jUJ)JG,@d62eaNYM%beZA$*Y4()bSN+i$cC
1@@MliV3)`Y8AShV$II54MY3@DmCKX1a-C''DNKqc)$YS`GfIBX&!d),(rZd#XBa
3dAXq##'2-S5%-P(l0Eh51V&'V2(@`P4BbNZpA`Q$2-CMhJB8,0cLr8SLGY6pD'P
+h)hS)#aUM*&HRV3hia9eMNAE)FcXX(ZqX3Y'`KJGdQ#5a#cabN5'-J@Q8RX5Vb+
R1`bN0YdP)jIMkBDl-#bA0YaeENY[(NaLHUd%j)(DVl(Y4p@*b#3AqHYf+b@AL@+
"D-dlJPN3bH3bFCm%S'c)%f8hrH6c[$3l)0i"a82H$S0+6BIl*K+R1MiCB-+f#`F
lLaJDE[,KqjCeFhI`m8I$B@E1LDC,BA+2EAYppjjM5dHce)kK8VG"L4RdXIUImdC
piNh1Gklk@GY([a(hIM4G,'2-$iq1Xd4#bPM5C#jTXVb"$2YB#M"#@X2UfXm0Uh'
8Md"BR5PFZ3V3V$3eDZ%8+R5@D6LDYEJc(!ea[lECENf(Y+V3bE8DIL&$-AB"FE4
Ufjlb)cN'pYUU3C-F(JmfV%+9LAD#l$9,J@@$5a[TkYHU'lUebEBpfXSZYpC%#ae
EFa3dCM$N5j2G1iV*dU@$IN*jRrj#KRfTm-NVh6CYTI$4QCFL3J5*F"035NEUaZT
mHQUDlF8p,M5K*Iq["3M"3(`C$'R4T)mpFShhZ+Bb&#k1%2Vc!i%VCI'eZ&)lABQ
RNi-`r)SH"U*'q13'"L,lH+fPDXTq6'R66VhaZ"LB4J+56E3cX"f'aF,Kj"K9(!C
%m,Kc+"(5aKU`SFl-$3@L5)GBIL6hBb@bS9IiF*KbP-!@YMp#fq6F&pL3!$4$0!3
9BYaUq")K"JS[V&Fl(0r,85D29k%4Bb-'bL))L1$efJ4ANAb"l1Y,Ac[1KhjBJ%`
8%JLm9Z"ilY9#hJG#``bEM+#@+h!LJkVhM523LpMl$[i!i%ViY8i`X41AAmlD
!l,Ibq,-mY)@4h8*JpURI)D+8Q#*"qMi5)Kkd&5b3!!$NLP!B#NUb%4R4-SKJaUV
G)dmK2&0%T-AE$P1iK)DIHEj`IG@`iLLY'ZkV'[Bjr+RKm`%5kae&9F-"%Q11C09
`J%38QqP!TT5f8Yk260!A&Y6jCN1H,"[QLrRiZAB3`)Z2Y1d9pb1`GF0KK0*h%Tq
&MN51XSEENiP5#+4$d6$hLf886X'R"m+BY$$8+lk$j#HE,GND@')j#Q(YKRaJ-Lb
Ha$3ar(MBNNb`qKfUN!$4,#h8#A)H%"N,GBYpV(X,%3,TpD2qG#4GLU30fFbmK03
9#emp((,,K`cIU[e+DL#bdT&a*-SMGGECIH0M+lLPpLYIpi@-5pabdf"2k``Mh4h
HT`mHPfZZ8CK[$69q0$LBj@eQD-!Y+L'")pTiBP3IqAID0+HRFl2D2pbrqimmVN2
i`VhmrMYc(e#-lCY9el#,KYI5m*rZrhV'!cM-Shrp$855T86DeG2['RcPCY3l2R4
FMGX4990l3K2bAN0BhJ2@-PbB(lc*rA+&-MU8*r,qS`2*K,8K6kj`0Mq,F,1mjq!
CET,h+mBHX!q!AHe2K18b*+2q5l0p)'2[T)N)c-'`[&qDb%-IkE#mYqUiR%#!CK9
$$I2P!hBeNXIeXPaBVqE*Kd"3GLql2l[aj,"qH,km&e2*q$Nkm,RU3ZG40KNAYkA
3[DGhCCjFFiR,bc(&SG3808pU,YCHTU5CL1BqKC!!V*3mb9F)fG#3!*,4h'-`8X-
m#$AEXTF5++H#6B9K'jXATm$P)!A!kLc[VH8)fK,DaTap%4F#6pYm4QHB,GD*#(a
C'YMbeZdZ9pCbPRJ9BBXRFG$[18`K[6c[S%Xql3E`e1"E!%*c5pYHZ3B)G!+&4eK
bRbGrBSFJU63EYS!e&eQhb2Z$c(($I2N%,5I'h)qKaTl3M4Zf!1RXKY9%%X3QD[q
U'5I8UreU-+[f0&1U*LBk`*c,!VqFRm6(2rL1Sd%TTS$Zd0RE('aSjTq1qMkdha3
q)M8,2mblS&ST-16dZ-q3!-S$C&k%j-kU,Z*q+"NDZ!9%Shl1R6$ea[ac)+l(-04
iI8MIAmEMM[LF%QAHGVUf1VDLkc3T6a31pK8jr3$emQ#bpM3&k&X2"#N((ZPBBm+
am[Ji5lcPE9*bI*UCpKHa60b!9l-i$d0a%8FURUBXb``*%21JG(LP4A'JHbYESS,
Y)K+B6TE!K2%CT`5'*5[C6Vp$9-E!,*!!Rmp)USaN2$&IE!JLf4`Uq1Hfh@I&NT!
!66`UaU!Zcd3'hNNCrI`cpMbJ5`Qfd)p#*8+Zhr0k$2FK8ijdpk4eYNZhRk!13LI
D42&33VICk29JZKX!EC40hXNZeAd3cCUB3*H4N!#%G48M3FXAX`hhXFA&K*J1NrF
T-Le$BHH@EUE+[dDJ2&Iic(RkK-2&"-4L*"88i"4E8L!*UQJ)Im*`-ZEeX192%AR
m!aA&Z3PG9Y,V58d1X,)KA0e`N!##ej`6rR'!m2Nr%C!!Q8'!c'9N-*6F'J"#!0"
jrSP#!4!#X'VBG[ljY+l`8Kk*,$%kl)3Z[L2&!(*SqL$1j*G@d&85ZUHr*A9L%T-
r0Dh`-CA""*q@*Tq93Bb(K!pTm`[6@4#!mbf*YSSM2$H8qlcE9MhQcI2+j!`JLZT
ilVCDDffLYJAUjAra6Z5Zb9eMX$14"Y12e#9EAm`6Ie(H5#MK2+qU'+iBUFYb))0
'JBJ@mAG1&Ljh@&l8Plp,"qM-Zh91B[0YPfh@5&hVmS4Z+pqJ,pq&Rc*5KmVh'Qc
P1cF8m%Mj[T'k)cjNpi+!%VA"TSdGVS!+TKiZSf%i`aLlp4[dfU6"TSd`TLaX9NJ
l"[@0J(3-kLDEDhq(E%2E85J0q@Yr"lHG@p*RY2Ch2rKEGaD@H8ckNK+lkCSP3"K
S[!ZUAmaKl0*VMBE&j6@q,+H9U@N*eJaEJ6aDHq60'Qia'4dQZ%[!NB1h#qSDRq5
FNJM$&P,U+A&)kf"CJ()DG5+aN93km3D5I,K5'-,LeiE3iFSZK''faU"ZfJjAN!$
#HEK-Uq+kN4I4a'Nh`fK`"1VQ)9)keqAkp!-C6PkU9@h(['rDY&&qRBTY&9Z@%0J
iPPD(Kd"R5UCT%&1[+r6TTfM41b0eB@aYV*@@4'jbbjB@CbZ81#GqET,kklE*%)5
H#Pqc)"Q&3INDCm2j@f-BVSq3!**I1C(a[!&A#@NVS53re,J-fHbh$RpZ'-fa(mj
&YNeZ(2-F*)A92[e%KY1+S4&TU)+'l2j[BM%PrfHRHY4"RFP#)M@aN!!B26a2)!i
c'aaVAKirdEB!L`VMMR%BPHHmU!FiH650YK*0`F+*M#"#R!MYhR0B&K3IG5SRR)$
"36"d*29L$m*("`i@m'eNPX'2NFJJ#pS1b)6fY@@qd!(C'DG$2e`*Y5h2E6Ym"$p
l"d1Ed)#Vmc$e3P`(bIa`"*Ydj$#j2Ve2`b0e,e3$FHB`N3&,JY%cBM0dDa0SEM2
Y(LE%B4Yr[91B"X)B*1$EI%e)'qk%Z*!!cp[pj*b$RfP`j[+PLp53!$c3Z&LHDRc
X,"P-&h2IY")-+KLm-,F%@k,+&QFc0Y9!@pdm"Z(R-`KM5GRRV"YNDPjc()2cIF9
)G%m[[(KVVHSrq3F%VBT!c*!!jX*4*R05aaS30[eBr1Zq!+#@YhbpcVISZZR3i51
$SF0`qQUpaJ5eZ&0Yf[(,Qi5XX8050lH-dB%*3T3MQD-3X,%j!PTD6#al!m@E(dp
$kAMD%9kmmAVYm%MGjZRT%)T2S@XkK@&`**`hqT!!BD!L,2(efT1'N!"C9Sc#aK$
UULm6`'Cj)J1,#SCa8,0`8,0+3QhL*p*KHCU#DL`M%*8cdU(Kq#0P69PH[#aGBl4
Taj',l*)aSGXHP4"RQm24L(!2E4"V2S+@a,D4NJRNq`6AV"`J-A88eqc%j`,+NKY
ZmZ[D+-Zi12bZ6RE9#%1DZb0eHb-A-L#J")QdT8b3!)*MJl(9'-f#!5BDDBGi9qK
FimXkY3e$IQGl*-Qcl+-`b55j4@)iir6ifVRP9!c$IQjadR!@#US[C+k4*S3*Gir
Z3JBPfiFVAp5EDb3cbjpMb`J!AllTcURKK)kIr,jVf)h#KkYG2epLMj'*1M'HhTT
lFK!'[C&Ae8[8i((,X&Y*PUlE$)p)I-EfkFrU$3-I,4&VYUf!%6$I02q9!P'''a8
CH,ED$6kBjI*8$)VFa+C+[%+1TIMB2(aQ#"mQEP*D$Fq`*5B`aqa4$2XaR%5K&%D
6ClJrdXG0PR4H20CR5IISeqPj&L2@(1hMrXh$pZ3k)KU0j!q+TMYAKFqYX6l6'0a
%rpXf(IFhU2Ip"`caEDqdmEL[cr6l8rA@2XY'h'&("-B`Cab!ceeh%dIhp#[jTKK
[pZ@ADQhGQ,SCbh8'qdGBVRlkCRjmJ0FlSMQ+FqM0Qh`ppq4N160IZ-RIiSNA#[T
l9Rf(YcSXk%kqFT0l@#MNLVTUq2L&6c8VbLk1[%YEV6*R`p@Z0$PjmGc&hhIpl-p
f##XmmX&LF[BFcPC'B@*INp#9I65-iAQRl8RIDEY9dHkZjZU['Q(m*lB5!i,T2$E
bT(SF'D34l$h+hYY2R$Z2pNQa2IIm644ZRIq[jfqMN!$Y1(F*%8AqLG2aUSV#Hrp
d5k9#aDQVYe#`C$lhFZ%T&!`f'c&BETelcND&l%+8U-#P2b$1)m2BBSFrmJar&5l
!eXJc52'L6Rq2ANR'qL)r[e##M+#J%BF6)SVhSJ&J@iB2(cE4EdREqk40@kpqHK6
Qq@0E%Ym+Zb2kmAUl*k)IV,I(m1U$q9%rhJI(@JJRQ$EZ!$Si5JPY3BS,'jhAQY$
483kaSrbAdY8ZSE&BN!$Y6')*9j)d!(G%,Xm@N!#"HiEGeRSlPfI0idlYlrp$MD*
c(N2QC*Dr+,S9S5#'(TiQk"%Pp)K0mLb`Aa43dHDKUd9q&X'-pJKHT6Er@Ed!S+`
%!qE0!'"pPZL#E(ZFR"DjajZKMS0Yl8m1!5(,4BB[N80aV0kYMrh3Ka#-[4Q[T0h
r)jd5bp8T%H(cE4d#4,Si`"N(@UM(bIePT"(+b@bJ,4!'MU&`,H*a3TLT$0De62h
d"DM@h-SB2,NIJk&jj%QJD`D"%d2SbHR2q9Ja[Ida%XI!N!!43mDJSD3M+dG4r)k
XYj8QM(%`aTX-46!8S5&+5LL8""&a,a$idj&'(-Bi%#0TZZ0-jMiB"K-jHBG6c"1
e$q%Jr-2C5)ULi3mPCp42QEV`&!PXYER)&K($kqUiI4KZk41*HJ3dShE222e9"'A
2YYQ6XIThPbRD@+a(RaY1C4XF3dXk#`*'6(cm`3a5aafF(%T&)icZ)!J"E"pcai5
!JG#Q-Bc`15d@M[HZZlGrkYj21dK*&&Y#*"BqIT!!h%AfK8K`U3NQ+6FF2-kYdZ)
i,6iE@&bFcX*#MrJ1&PV&KBc8DDL6ZFm5Z3pBi$+(N5Z@b,h$!)`#`2F!@$d!Hd3
L(L2LRdldMr5iJSJE'I%B)ai4L-2Se*6S@`*4U)"[Uhm4rN(F%d5mHD6a!EUdDp@
)ke2KfK,jI5#hR`(Dj#$0Mc1L-3#kL`k8$P)kd!U*q*)JiU"pAhF9m3Tb!U`2Xm"
%(!E'CKK9V*&mY(e[fGC6&[[!"G'eJMN#C`U1`$8V%'kYD2M3ER``Bj!!'32(rGj
-(,d4#R!M%fah"ES%9hHj4$2ZM'!i6*meXcAM8%DLF2lpAe"-2RN`Jm,,B$e#!3a
F#3c1+icpL"6@1##%Vq5Mk&+%"63&Q-X`P2PJKKV*IC!!`Y5$I0aIZr6JF3+LpKm
di`i6(")11$h5)R*Q$l0*j[@0+l(!--$Uk30B6T2'rqEIiK$*a9hFb&`@C`E3mD5
`lIeRADXkqRXl(ZcRc26ITp0&CUK*pc)+EPB26lT*bCiirm6,T,c@jSE(4cZZF,9
hD#,ISK6kr2CSc1SZUG!VrPLQZq6fMZAFjlp[DEII9`U9iJhGU!Uaic,hr%PJ8F+
48VjMqf`c!Qa4akE'8KU!#jkVm%jA4hAIUPf@0K4d8N'rDKH23B6FA0e0SP5T@1h
#X%rU(T%+24,EdpAh%YYQXAS!`aHNEN8Uh*,BQUY[%YXkXIS-K[1NlR05iAE9P&H
N+3X`A#*eAj3+fBcPKX4bKjQ3!!46I4D-Uq6X(D'QZHGe*0H[`c8P1Ubh`R'iTjH
k-"KVk#fFJBBq'K5DX@fm)i5,2Xi1""dSLfKL&)4c@TR5$2@Cha$8Ck8H(6ZF&$D
,4L'HmL)+C8%FAbk3!)9"')cHmfkEHCEhqi-K"*KU'QhQ1DL3!2([QT!!HGTl0[0
-Q"S`XII'bZ1&RI4KhZqpmGlaS1(NfG$'1mTHG*A4)",%c)N-eRd4dm$"`0+$`IF
"PSiG368&EZdX,,lSKa"`baC"(+Y1HVr0`T3jq'MfITXa*4Q6-4@kU`*f1J1fK3%
lQi$efF`,,NdNE1CjkDJJeQaUSB,h)J[X8!J6#[ZQDQ%3M!ZU'(r8K0(%''F*J`!
j5C0$hHE#j,l&jS@A#VTXjXr+Pq#e[,`&al3%al3dXKLK$ilZ4+)Aa2-Y@'+ZJk$
e&K2G$1eF'P`S$%,F3D'G+jQd3')''l'N1K1KmZQ0,KK,CT2V!$R-$%!-i-Z`F3`
FYXNI`i5b"$r60pM-PH8YH1d6&RLr$f)V@9%V)!XFB+,[i[*dU4iFPM#-J'!8B&8
&NTJ3F%rYLUlMjT9!iKlcChKY05r&5c%[he"J-CQAi#0NRSlATqB@[!kDCk1$Qa[
aS6I2BKdcm4Sacf%Gde5EHDA$e(Kb8SmU%mQ6KGbd3@rHY`e#b#G6'pV-PHXKV*q
!Fm!*[IZcab#bEc#86mIJI!`Z1Y('"T0*!cHLBdNMA4D(-JYAfp"@hX*3CCL%9lS
Xd'-[fdLH#Zi[kZmk[['kSJDa('R+8VZ1@)4$03#C$6JFr#``,$EAi@IKB+KmTrF
ZA[Zmek93@GfcfHciMF)K8NCp&qc8UG*Q"Sk@$B,-8FTZ*1VjEX,d3SBaJd0X3!I
l@11MBT`BZQjZQ@BqLXdl5UidC2+aNp(A'-C3PdeH!mDN3qc5QiqU@5b$%3"9)Z6
Z26,[@U@P"-S#Fj!!Jma"")Kf,'!8XJb3!2M0b%V"C%,aDl`p*'Y)$"IR#p-QXT4
YXC!!E$R9#R[k#hEV'@-22a8$faS`cAjFVm`#5d`5Rddp[G5PV"43P!4B8XKM+#J
UVU,kZ0d+NfH8M)mNA*Ue*'!+,!5#TEk[`1)E"A)S'VL6*)1F"BDMA8LmM+JLdm@
MTK*b'MJA4K@"1$2H,)(+EkA&F$T)fT1MCpA0cT8NX0B,MMK(X-@[SVV4B[1"@c(
$PN(G`dp5%ehl6ljaHi`k(AQ0(q*!$k3b2#h#&6A%[&%NCL$CFKcB'"eB3Tp'H05
VB(QF1Z(kQcq3!*&+T0M&k@Ke2JVkdZCZJb(KV33j#dL*6RNLC@kT#Zir0P,hLb@
#'B'bU86Z#`UBDU63038M4qSb$dN(cN)IQmS'N!$8bYM8AjHa6E1Q$%6Nj'Cf`K%
B*SEU62`XkqU!J3T"jbkA&0#1%M+)(3`CQLi-`c4e&-'Mj##U9XAIlbUBH1lFbpT
B9m(C99-[!+&5**lf`6a&+LVNa5@5dG+NhIa[TSV692+qY5%Y3`QCM-!cJ-`AC!G
H8r,,K[ZX)IQQqq&"UZ`3NQe5)5d9#U8#(l5N`$*G`%%8b46+mYKK0T9(jCHCd55
HMP!B2rRfK3`%m#@6#T,5D3dfqCCGC8bCP-`eGDfBH`A(H5q%QETU+kieJ#XGNXa
0ZlCr0F%dZr8Y-JA*5ETF)"X+f3mCcbTP['jfFBYdFB9GI%"q@B-3,#lf60A96dQ
&X&3i)a8XJDYEVV+V@h$eHREe6[PP!(mKq2T&hZeFhrRMVrq2"50e"`ESqTZ-$)A
V8p2piM*Gd$c+6'@FcaA3EHlFY6am3f#*hMEC4&Rf`B4NCXDbE5M+pRCI[hf5NMK
CBeF"TNDEL@`dbjjTXXR)*dREchCU@pNV8dN+JaYXXNpE$fB$N!$0*VZ!DMDj3pZ
(ei4@&d!lGJ!qZ`B%jpJlD@,Rd-&H9$a`L5Z3!#@A8GD)1-1,QF*GKir6T23UcDP
,l4`M3!&Ja"H5Kmi`0ibF0UM)1kZ#Cc)#'%QqcKlG!)'P[&,aSiQ9UMUKfLJFJ#J
lAV0%M(cmHArp#Mk1UAE5a*[h`RaqYHTcCb6-Aa4h`R#HK*%F49DpBHHc+hLB2p5
$)UYJJL3&5fE!H%SKYRm8Q(CVq81X1#-R(1NYII359B*XTi&hU5S$69(P0T)m+TN
LLp1N@1h%e%jbM)U9"&G''DG+8P@*#F5k1`++Qii3X1A[iHG)#%FZRX4V3M`KE1a
"E)Yi'UpZm6)kA1*#I$M&HAMG%KF)#$'MaF0pT6$`4pQ@Ze+"RfIeBSD[e*k*,$A
U61,9D@m'N9%iT!0aaIN+l%'%,Nir`-PJ'q3RJ9@k6X!J2m+bARFJ85&6-TR0"HH
IkQ,"S'`DaA5G6*NV)P**,MM`G+(LLEEEKbXc&'8C`a(28C!![$RKlUNeK%4C%j)
6!%XMAKF-b6"l0rkiKK8%Vf[(K1Bed,"@FmQXR3Y#Dm6VdZ'J'BCTSZl`0&m[`MG
*N!"r3ED`KK@Zc+aT9Fr!V)E'P9Z-Ch[*R#f!,rZ%E'Ga"kj8&'i2DDIS'!$%5@5
122'%9VF"6[[D-Ea1DqYpZ!`l[L5hq6N'5Zd4X#e#TN)e(+d4aj!!!5-K(AZ8&!R
+J1KDL!b+!`SFMJmCb(iV(4+e51C@)S#5$E'pq$qh`(Lp6E@*fZ'1Ac8#AHXF-I8
[C0"0r)9P[V#i!Q)SXYe$e`L-(Lb#`!4R#E'i!Fi[YU8#bDM@X&Jiq)%-6&9Y2h1
`@mM#B+J@-Qi8'8IT1G[l"J0j2BjJ,'#d,iFkFQaIi0KURP56e*5&5`+$"aB!'#&
Tih*l`*3Z(L89SLTFKj!!rNMGEeXCqMAESq4N!Q-!N!#6'`1L-b82T+kXfX1[D(5
P&FS`8b4A8p)bFpUS2[bjphci"VNBe[iHVJ4rk1QGbUKbR-hbM[XqG-i1FXim4!j
h-&D`jN-cbDmMUCP,J8%eG1c,,[fa,r#cBS0VBlE"YV(9B+[13AMT#RiiQU92m&1
r,93q`p3QlV$(B*@YpVIaTa(DhSr%HQpR5(DJX$,b'1Ih(,"&*h988%b644#b%)J
`$9%MPSDM3cTdV!&0biV,&`9QA09ULij+#dDaB#15#-XK)1)C12,4JJ8BZ((j$b0
ef[Gm&fR"T3XqJ*9A,@4*l5'@'G`d&3`FIQQ+4YmIk(![*F"mK6'MiG8ZBFbY0!f
B5bAb2b*@BG0%M3!b(M`JJ()'U0'C$P(6&ld#P"bMa,"*XeD-lELG#Q&Y`+'@6f[
U&&M+N5!jmU"-ij!!5L$!iE+bSc#TdV%aBr!p"m*F-%""@#FNI)D3!*!!`UaG[@L
F*V3a)I1(3pVkpUa[Jaa3VkUDb%MGS4VIh6a2a#Eq4BXUQF,"P-qGbX#8cD4S(eZ
1*2p(!aQNV2*PUDB('rp&`q*M+qK!ML%l(2X5K5r)dBdKCS5TPa'JbaFpLipp3DD
#*Nk!9JJMc3edY6J9IimL8"L[PmK&VaiZJK&$)@q('f!c2I!!aPbiG2d)!E4$)qP
f2J5`%J!,e@J$eIMT%(`hH5a25d8i6L1EP"X$MZ'X1E3bBf'0Va#-eCTf(U1TK!R
B3a5'ALT!PFIfPmK&X"j6PJ,jjNVC$NhB6+m'JDj$+eQM999*(NhmZrBi6H[)K0Q
B9IA)UA)RK),9M'D"a*ZNi0DD#Vf5+mU2Cf11Q2q'N9`Qm(#+U,fH("VbALdXC#l
M!%p`!Y'-"paNQ4P(B"m$1f-Lp`Xb"cUP+iPID[K!4V"V,6[)Ndj@'4rQ2&6AYdX
0T84f2KalY2LTGZLS3L@+#r&6aT`pY%$U2Qm'R#X+K!'U6)R"Y@a`EQ3qZHk)RcP
R4HBcYjrPcL9`%S[BGBap,eLrbeMEK3'*K)L1Jkb$'JE4cKjdB$J*e`B%mC4QbIb
UI3'''1iA(LKL6LP*-mQapKS(L14+[JX09KdjTD"!iA*8PC3A#HiNFJkj'T+6#KQ
('"SEd8b1#N2brPEZ5d*iLDT2GqC[pAGbfJ$(q6b92@!%)L146ff#dj9b0m(V93H
jGHbUFP1D+lJTJ8f93,UA0X&T*9FdfTD8#a$E+-lI)9FJ**FRYZF)P2XpCXUYV*V
DbBjZET8l8UAJlS1Z$Z(LjJSfR8CJT-Xc"c'%2B8Q)ZAN3iCHi@M-#pQ5L("JCLp
p-Q!kI3M6U%9rrjU"Q"6FMD4&MdMX9k4Tc`QA0Cq"1r*H[T1-j),+KkdjcCbLb1d
d&jmj+,b04VZBJM#5bpME-%-f$`29d%5r(j3C,""diN+f)3%SjCC$5q%)%h"`6X+
9*UNNHhU9f3kH3RBj6Y8%8K9BV[%#"!-E[N59!)m(U2$G+Bl(b'c4)eMEaF5+"VJ
*aYf&R+SA85BSK#YK(1EkFb'B!m56"kI%f`#p!+!VP'8eh0F,pj*mjK*hc@j-%Gd
#P8JLHJ&NTZ(RF5cH&f,"9V'#NDX"Q4B+Za)CjhUi24Q4m*PSHKcNa%MGrQV01*%
%193PqLiH&B1Z8c`&B20%"UYFX5cBC6TeeG'j6Ij2T*bI(Ib$B68D5!CbRhU$5c3
1#Hke58T5S$cI8ES&&q[+5(JF@F#&4jc!rD1GAh(0Z+X@`GPd5)-(!b(d3%DDHXC
#4N0$iiPK[B09*B!$6&E!T4Q9LeB,bG+reP&9'VD%h%&"YLTj!V,#d48JT+8+%#P
c#!1cMpc#UGS$0ZbGbHm-pEDZFaFVpCP'pf1AAElq[$@qIQHF(SM5J!T!YbB(EUb
mFA@ISQCD"3CE+aLXL8k"i5bV81(6jb@rHIdEdjqBmEpERSqf'bFr'5T@[0qBl[3
2I+kXD9mhLJ%eI[,c5McdiCX2Ih+p%Sr(Z"4,aeQ&NM1pCFcKXcQG"8G3UR3`%)j
2C+KC*crrCXP9,Mi*Nr[1l@f5DTcmeHLbUYHrMjB%ZkLc3"QZH9CrMUYr9rm1eED
D1JIa8"USTXKi*+K&ld"BPTUr,%VXpe8efd#5!fZE0Y"!0F'8X%qA9H&b*Up%Tk1
#hK9ZkZ9Cb9i%q1VmKN&GM#DB599P0#[BC+K8,ZBCE#)-%'+Pcm@8HTI$q[IPUrC
8McEHQ05RMB-k5jZ`$,,GPpa2!e$1ClT[kXRYE!J0F33G89,CL'$85JB6C3V#le"
JF9(e-"EYrU1HZ4[JKFqF-"are##Q1CS9`F5,PK0!+F*&Aj!!mB$(Je'1`NQdJ#V
3d@1J4[%"'h)Lq+J1ajSHPAZC056Zq9G[#Di-`Dab!YH2f(LpZ-ZfC'e)h'rUhb(
5SaD!U*m2k9'P&3J9kHH42'XI6&KLC9NZ,IX+bj3"'MJAfFH'r$BS*l[@@SH,h(p
rp)&CLm@GSfd+9C,KiU0``NIP064YU"UhPUY&lQ@2CMF5Ljj)l#XK!QF*N!#cD#"
EqYC&ZP&*IP40pK5$V3+9P#p'LXQTdKBRT5jjU!#*1&d@VJFZ5F"q#e@HDl"3FdZ
6m--GMGqVAd12XPJ4I"KDrdpr'%6-fEU'MQ4hUFLZ'UqkDKcAl`5,hLQ!G"8Lj,3
eZR[%j6Ca2f2H8F@m3pb9h-hEQQj,qCArlfeC,%ll2pZBSH#0k@3EdpPdBiEHZ$%
pE'1X9cJUHPpeL)hG'Rl&mQYEddXGH[ZR[j6kcierDraEBP+qYJa(GTe0Z*F"r#(
BH[S6r5Zb#jX[Za,pNmbGpR5fNX4(mR4fBRFR'lUFAAIaNVqZ1!mZGcdA"84*S3`
#I5H$8FEr'D&-j#)E-ZAcXlZGda9ZMT-B+eEJZRiU)(5bHfkfF5kkUa9HXiXYaH0
'@JmJ8AT5-+#6F8)ZJ#'MJ+Ti2TSpU9FmSafrh52Z0*c#Bk@3!2#Z@5'+2Ed60b+
p@AjECFT%,S4qb5M%+NP(K!GKE0T&$IF9RXrrqKXNY1l(Lp@1GhrMLERr-25Grp4
5YpYZA&XDk4G&TarCHK39riX+,!r0pr9IbKc%PJd@d@1jq(#i4'T-6T!!m0,62I$
j&dL%RjJAl&,[i%0JDYXM[f-e96aLDZ-l'K1Sl54pr&(r8h`Df'I*6rSd'B5L'P3
PD3GVfLCaFCMD+C!!'XQE,,$m1Jm9(6b*IKar0L8hNrUqqGck`ejZQZ'+p-Hi$@B
TAUIcQe`la%kr)l*cFIkKDHbK'[GRVcS@03P&5UE)5'L2NC'3!,DQabBAV,qV1$9
@j@UdL(0l@0JX**8lm4J)[r#jkNM8lh1KHBGV8N*DePHLi8Tl%hC6&EYTHqa9&Fl
I&aJTqkMk"#k#icm5A08BeH1BQMCTNr04k3i2q![12,mmXrh-mr$LUS`63mCTSBa
#iCNG)NX+jSlUqpEGjKkUFSbZr5`,r48,Y[PKTKL2Y2'LUj`Ih9eY@6qVEGB[Bhc
NAASi!"EI'0AhZ$aiq!L[$!bG&BCQ"BDJTT(`[Na+-*T6$`Ukri%I&JX2,T!!')Z
E*KPBG#-rD`Nbpe3h!ieeh8GGEb!59''rLTJbNMp)Lj2GU-k$jE[BmKrmY-YMJ8q
(TG([+5&&UUHhV[FUPlqi*Mekl2lXPqj'6@ci#*RdK8a8FbqUZKi3(JJJ9mYcj!S
a)ZV&!U'kZm)HrJ9df#0r5HV"B&B-!9Chb5"2'`A9a4aMQE!A52kp*fDP+UUc#Ue
p`YDMFTD4X[Ir"+*6j3NMFdNBq(`PCGVpDDVX)SQh'kFMm5N4!a@PNGdV6d""M(E
Ca)VUH9fpe3Z4)+R9+cIB0QCA,c)XVRk[E8re*e@#2i,H9&eJD3-"jB0KLma"e6N
J8bH%*f(`bKB%#QE3mGIqpklMH!53!%hFLqU0H+9MhSp'A[91M,`+!!!#3J#3!`S
!N!0b!*!%3RJ+5Th16VS!0%kk!#4#CdKj!!$rrdK[!!4)9dKi!!%L1[r@6V83!#"
Y!'a1N!#Tp#)krmTR"%ke%!"1G9Q2,caD49*23QHTS#4A@Bm[2%4"9%&#CkQJ)&F
J8#*i#3JN8Q!1-YKQ#M)DB!*#'9(*rrblb@EZUD1TSeQ2,ca%8N9-3QHTS#"AS#8
J81*!*!eJ"M)BeE83!&()rrLTSdje)&mb'$3BX&KAbIrk5N*RrNl`)2`JAc)B0"L
`Q&I*rrT+3QIq6[!JqL"I-KJd',"#EJU3!%&Y"Y"!3I!!!M!3Crj1m!!!)#m!"#p
"!!3L,`!),em!"%MR2!!N!#B"5%,%`bJ!+J&)4FM&e%4)3T!$`-(3JNcI!$`L(dj
e)#m!"#p"!!3L,`!),em!"%MR-3"1ZJ#F60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!
%51Fa!%kk!(`J!8cI!)`L(dje)#m!"#p"!!3L,`!),em!"%MR-3"1ZJ!X60m!M#)
I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!!`J!8cI!)`L(dje5S"U(%U"DJa%J%5
"6VS!)%5"6R9%J%kk!"C%J%5"6R9+J@S+4)&1ZJ!'4)"1G5im!!$rrl+!B`BL!(!
!6R@`Kf)-J-&)3$)!3N")3%jeXSGL'Li!3N")3)$"5%")4ci!5%H1`6!(5%Fb"dj
e*!!Q!H+)iSQbKf,iJ-(!Kc)$`X!Z!dK(cX")4p+(C3L5JQ)%4)&1G90!B141G3#
3!e`!N!1!!!!-@!#3!f!!N!-J!!!r2!!$UI""4%05!`!!@!e6!jcU"VH,K@qjj4E
ZDJZS"5c!V4Dfm#r`,AG4Dr9H!!%HrMrbNdYj*SXBa!4+*6*aL!ZS!fehk,-3!3#
3!`TB`!!-!*!$$!#3"A`!!3#3"@N!B`"p!*m%!Np,!*!(23"J!21)A&4SCA*P)'P
c)'j[G#"PEQpeCfJJFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9P)&9Z8h4eCQCTEQF
Z)#""EL"KC'4TG'P[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3Z!*!$8J!"!*!&E3"
Q!)%!SJ3#6dX!N!8%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'PcDb"bC@aKG'9N)'9
bFQpb)#KH-#NJD'&c)'pMBh9bFQ9N,J#3!d`!!J#3"6%!C`"&!+d%"&&eDA3!N!8
+!&!!(!%3L"T9EP0dG@CQD@jR)(GKFb"cG@0MCA0cCR9X)3#3"3J!$J!S!#kJ!J!
"!*!$IJ!"!*!&8`"c!'F!V`3#6dX!N!8%!%N!43%ZL&e"EL"TG'9Y)(GKFb"MEfe
`FQ9cFf9N)(GTG'JJB5"YCA4SEf3JG'KKG#"dD'Pc)(CPFR0TEfiJEfBJG'KP)(0
PE'BYCAKdFQ&MG'pb)'4[CA-JEQpd)'KKEQ4XC5i!N!4D!!%!N!9G!(!!F3#X"!*
25`#3"dS!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfjXH5"LC5"`CA*
QEh*YC@3JEfiJ5%C6)(C[E(9YCA-Z!*!$EJ!"!*!&D!"k!(`!YJ3#6dX!N!G)!&i
"*BK18fpYC5"TG'9YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9j)'&bC5"ZEh3
JFh9`F'pbG'9N)'*j)(4SDA-JFf9XCLePH(4bB@0dEh)Z!*!$@J!"!*!&A3"`!(%
!V!3#6dX!N!G+!&8"%iJk9'KP)'CTE'8JdPi`db"YBANJBQ8JC'&YB@GPC#iJ)&"
XC@&cC5"eFf8JDA3JGfPdD#"MBA9dD@pZ,J#3!bJ!!3#3"F`!MJ$J!0)%#%0[ER4
TER9P!*!&"!!%!--"BX!#!qJ!N!--!#J!+!#f!4`%!999!*!$$!!J!!J!SJ%F!)*
993#3!``!BJ#5!2!"Q!#&998!N!--!#J!+!"e!6`!Ke99!*!$$!"'!+B!ZJ(@!)C
993#3!``!)!!)!+)"(!#!998!N!--!#J!+!#Z!8i!Y999!*!$$`!#"#"[CL!()'P
dC@ec,J#3!c%%!)!!N!-$0#i`*M3Z-#`J!+NJ-6Nj-#dj0L`J3@aKC'4TEL"6HA0
dC@ec,#"*EQ-Z!*!$'J3!J!#3!`-d,M!28h4eCQC*G#"648%J0#i`!*!$$!Y9EP0
dG@CQ)'&c1J#3!`J()'C[E'4PFJ!!"$0"4%05!`!'G`e9$8-L%K(QAQi3C#dC4'V
b4#3,%&QVTLBRYcf,M1"fjmK*Yc06mTPrGlr[fiSm'pr-Yl9!NYA1l-RN5GLq1j-
4NZ9@j)QXb1mIN6q6RmQmfGCf%8N@%l)h,FNL+%$L"rp1@BD49%3iU!XlH1)RGL%
XdS$Y8-@K&RB5AKr2MQN-Tdqr@5Tb%b2*lEeNEa2deYr0KTa,b#P((lQrdKDbpHC
eqFBN#8XTDGMHT"F9Nj*A@5m3r1$*iF)A(Ra+`bCSd@*%bYh0[UE$mLb8Z8NZL1F
Kb4cpaH#,'S2Z2"A0G593mh5B(ilNbH!U(HDq*03V2L&LN!#Glm-GLj)350pE&Jf
fVadV0j9c-)PcYTmmT-U'cCf2[lLr"Zb,Dr,j*UQJ&eL!@HMeXIT'U5KXK+Zi)G(
%4'NH4P'P*SBS*l2%Ke)*Td69NE&*%bSLi2'$"P$iBJ#e%QfCd)!P0"&UFSY0QF0
BUD3IT`bXGDL,fZ$B!U8fSh08@--BYZrp*)$#,J2%1@+BZ'k&r-qa*h(XSZeGPi*
0bi'TkX2@JbVR0)ahG0E&J(3EJ`[@YV@,-D*-cb(Q-Y`6mPcZfjMcBMp"cGLljK3
Rb&aVTMai@-PP[RfUT+62k1U0klXYd-Kcq8@f`RZ!4-@X%K,E)89)*H!)2HGQk+!
L4L(61rDKE[-93T%lT4&h#Yj6*Gq@)$NpfZfT-bIQ[*a$ZHi9U@$-fpTGbR)EqIH
h6JN-ELhIr*F2iT-R9S%)rHb*!9X*2'JQcVG5aT+bk)"66"T!8Hh@RKiMNZDb1RC
PrpLBBZE'f'*+5Z1k(+rRjMiNk%bc`$2Y2dPbk)d[lP"05[[rh(fm5+9i5KpCGN!
BDPI(P8iGH))aB&$'@AMak[HhZkICP"IAk`20U"30ED$cl3ANPB5bhE"dKJq'UT!
!'MJ$K%Ef[#TaY#Qi5[JiZdp@*Ek(V6S2"5LGMGP9XcSTH`kX!)Q$@e`Lj!Hc!Ye
F"G@qBdCpV(kpX(EYJl32qi0AAhd*'kUV,i&`%M,25lL3!)9HJTA-Hq-JNiRVb1C
`%N0V@&,9LJXedG30VZTedYBKmQ8[pD@$C2LX$T!!US[$LD0[BBPS9ake"Bi4i"N
pQ[B5,S$!l!aZkDY"[CV-MSM(ZdcHrYqi$lHRmXQ0Uj1Q&hdZmV+6dc$Q@CReZ"0
&fVV&S"Ua`C3d8JpM+h9[1peJ#QP[H2ESABrbfDQ9EXl,)rR"Y(aV,(DK,&e(qXH
CLJYTG`ceq9R+jqIUrhj)D3VcIeGqcX4Q-IlfpqABR&9R,NpTEKEkTP6FE&CkmZ#
#0U6Epj,8cI&CH25LN[RmcjI[Q)F-e2@eAFBV*qph(["`34I,9E@$fDIYZ+ZVJh8
&%Tl"cXY,fjl%2ZKNB,XDjI@RH3*a"UE`8,`*ALRF`jGi-!Gh[Rked&R$@pIN$J!
!!5p"4%05!`!"EJe9#k-5d"m#lil$A3H$Uk"L%CKd5J@GC9U"QHr-Kk)e$hr4hab
B4fN9chaJrKEcB9B9-a36aI`eUdQqUDLB988&4IGk*8mab3!6X@8PbS$BRQd%"YB
`CdTM&pK`d8NR-Sj3)#4%SNJDpR)03Pf+FUmjed@&X98p25ThYfX2h("A&L#*VHJ
jfF@Bid1,9[aK(e3C**q%(K5Nj-LQq[LjlfBAjYr+h(!i-+p*N["VGI0fm24@NQd
q8Kkr2jH`q`qN2l+CAZb!$9KHF`cEPf(j4I243B(`!QX@j0+Br1e$Rm!Z-kFhGIP
Nk[G$S4Er#MRr,H2QMUShcq1Y`!IebYeRA'N(m[)Q9Y93qI931Ni+ZeF6`)C6LKQ
!kL'-cd$3lkJ")!54&6U'B33!!!NA384$8J-!$S81A3ZNNL#q-YqGrrM1AZDFhjr
%,&R1hMR%'D0a,&$5mVjcCSV2Qi#FE%69UXh+QJK%Tqap9)1qrhIQ-5G-b-X-*)A
5X#D8T%,36UTBhkGklp1@PC!!-M6%eP(9D+-$#8,+eQi,LrIGR4eRKDh9H`hZEM8
L!M0%)ap$49B1U82iEhi0rih5Xe'Haf#NDX-A)q0h$C!!ZHZS"mPpL-B5hh5*Emm
5hh6*'5b5&CMk&N9rBRqB45U"Rp,lNF+p3'4A!0qN%#Di1FMC'%M5$"!,#2F*fI8
`Ae2DGdDRlbQe-0((fNEZRIeZe`ejQZmZp+EElRPLpr`#V1'P3RLXrCX9-a1Dl"i
+D4e9RCfK5P-S0Zl+0D1dF%Xl3l8Q+VYhaE4r9IfY,9Bpr&aX4U$djpQM@LaJBi*
D#*CbKV3bAhD%9$%6ijY4m,c`49YTED"lJcblUk!YijHp8r$-YrP(AF*,TC!!M#*
bUa&9CC*Hpd%pYr#9FSb8h8KfSZdbEm*jj"$ZVG6FIB,!690eI@2A`DYB9VT40QV
EeYMGJH3h'"MNb`Gr-KZr[[alRh#lr[[ae*8A$iTI+P,8qi&Lf5AQKM@Er%K+1fX
EGrcGPFdPTqrDIqa'-6Ga2Arh"4lk50pfCCZYlU`+`I5AfACEIc65&kEA+AhlVLV
Y`("ZrS#TrGHTr0NS+2lJX)0XeEGq1qUkAYeBKldehB*I[Eq8JNKZ!U(HeMJ1`0M
3allN@&5)2FUBre)42De"FKZie5X59"0kaDKXXN99,PQTU#BjlK8+PD&Al!qC*#F
YjC9URe+9b&rmbYCdc91HhG`Th4l42'AklRZE6GCdK6[Q6Y,-e6GI'NLfq9KpA'M
V+aIrZ%QCkp(,q"88&YC,pUJJ6qrEF4kqf5EUUT,[6E(C*Q#cbBUR`XCe@If)64D
25XP#8f6S&@dd+IYJ8Z$dYZfSN@iTJ$3TcS0'$eEcT46("F'jUd%H$%VV)feH*6f
B!U2J))dUSDLh[9kY&PDZH5fG80Iprecl650UfqMr"K2KaMkUQ4$hSQK5RIQJr,+
V1N3hY'HP4Um@qMI(Kp8c0U8II1Cm9G8(c9G[#)(KLbDZAHQE@+fU[EpChbL%Y)(
%F+SPZ1F6lC6DYD(UU[$`,6P`*!Z#r42b[2m@b)@3!0b2,A`Bc#61F0c&6r"+pjb
%eb(FTi5!+&L2J2%-Qd&ER!iN!T1mHC8NB3cl-CV%CK5XQr%F16Piq*!!'Je-SRN
915*0*NEZjA+MJ`q4ji8!j19-f3XZF8,P9UmpFH@cXD`d'C6PP%LG6Y5$CL1AFiP
dJ1-QN95CXp++RmNbRcZrm`bkT'DF5q&J"qaC,&,J+V1b(-eT$MI4!kI1mFIh$Mb
4+rUjT5Rm[(9fElKbH%41$@qip,(U5LM,Y5VaPC%N(M3NE95d"(mJP0##d)N6chS
3(B(@(,5iVGX,&HqApA`9AVNNHUfDR%$9!kF5K&hH$A,1+2E%JG0l@J`#jjN+M4j
80ZGY'0IX*2lKY5pIqdjkhA`K[+j`F2GmU6$bd,aL+0!mmN"3"+m-G)4BC`-F6l4
"#lLpcIj(JZ+i1#`dRi06LBDdAC&&pDBS00q1#41GbN5MHiM%hF(FJ$Kr4LZ`C`V
2ZqEh&hb(6CTLPH"UYbTQG,0ZYlFL*JjX4`4E%SKK3[*E,2&M5+Xp"%YB+Xhj)E%
92B%p"*FU#B4Emq&EK+b4hd0i*BX)rp)+(d-'NN--+4h2[+,fq[ZQ9ariBVRr!$)
EKEcRH+CA(HbE[D(VmZr2cHPj1d0UM[Id'RhcTcCeVIb#32S(N!$Q5AA2FE@hVh[
0aET#9eK)d`"2@MG1'q'D1`khTZIm1JX,cdeRlP@R`p-Adi9ecrC"rP@N,5R)hr6
iip2K%jXZrLkG$Yq-TCTAKHLlS(M@45cYU)0Y+M@@MZ%%,f%683,G1D4[e0B5USr
Y9QXN(Dap-qa06eJI$Y2B2K*pada3PALrK$l`'Bm&Ci[,ra1q&H*EVH%hkSE))QZ
'F#BTMZ9M@6M*d&bekY!BPL`!l"JL0PCX(DNIZ@UAqf`r2PaidK)ZpUqU["dC`dp
M,56rRM@Nr8%q1b5llD,@8'pPLrhrV&5H`'mYM4Q!f-c@Ca`9mTm$PM(l5ll3P09
IA&Ca9[)L9%"mE,P#,JBX4+f-!B,lr8P%@130AdLVN!$2"R*Zp91Y3E1b&@bYJ*6
'q+d+NTrcY4k[(,Pk,(G*2C3ZD*D")pI684*"E)TP)!1Q#TGpU0i)VU6RZK@lKJ&
hilXmcd#bjLLr86NHPD#f%baX9$mYYemE@kC2ea%NqF66lR5D8Z8Hif`!62UPcl3
iii1,8D3%l&VL1L'X'&0"J&qB$-kpE+@d"cNc"fajFNCJUH4PP3K%YqdJhHqp-'R
MiPBDr0AL@h-9GrAfZcX!jVA"f1l4FUE$p2Q&`rpB[0$k@Tqal65ah@(ejGel!Ir
f59IZ8fXp!hJScPZFa3l4T(9d9-V1el0bD&ZRJ,ZYXZq-$,Mi`IKmKIAV%AaR840
08l@e9ajee[Yb-4GV`+[Bh)r*2MIJG@,rH+l#1QkXh6QTE8+c3m%ced`Qf9P[F`"
1"G`1Z-9+Sf,@p8#&e88R!`,Z&2#SDFq$cRUa2D3[hZdFZR5G'q`&I(&Qr)KeT[b
,&T!!(TS(Bc1lCF"$fF2eLCUf8kaaM4,`DC!!R#lqM4"pE!YkN!$FAT2Tq9S+08i
(#Ac8BIUAPfUQckFbf$),bH9GMYiq[K6'!+L3!)GV-&f$&'!9peRk,dGKHq"RjJc
Q9p9H0K-H2RC!"CK+%4@H*YfRpPR+$Xj+ZF9clF@2CZ*XV81"QC8I'B[,#SP2hiU
S8-&0,R[1FDcEHTilqC6mmjqkq258Bp62PjBqC6&Pb`eC5he%K3UZrY9Z-AGXrUM
-CE0bIZh$M&VVU1hNQ6[&cDB2UTUHYMq49#%X2Y-%H%$(+k+j#-jN,DEqBNMkm&4
5KB!r13'ih9k1CV-29Ma5b8a&m-dQNEkHc6@U8(L9qSNZpAaKT51eH2,lHpfIpkI
6fR5B,fd3V8BLEdpF1G5S3[LaN4%d9J*EB4EJ1K2+e9iG$ZRG"D'&dTLZ[SRh1eN
RPMaAi0IN83#3!aJ!0!!!!4`"D!!"!3!"!*!&!qJ!N!18!*!$#!!J)!%!!J#3"4a
KGA0d!*!$!8C548B!N!@!5801)`#3"B!!N!-(39"36!#3"3%!!!%!N!-#J!!!"%!
!!!NJ!!!6N!!!!#I)!!"""!!!J3)!!3!"!!)(`)!%$q"!#"KJ)"!Er"!N'T3)6"V
d**mb"$*-0HMj*$8S-K!hq#3)-1!)""rJ%!)!`#!"!r"!!)!!J!"!J3!!)))!!"2
N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!!!"!*!$!i!!!!I!!!!2i!!!(r!!!$ri!!"
rr!!!rri!!Irr!!2rri!(rrr!$rrri"rrrr!rrrriIrrrr2q3!rjrrj!$2rrrrKr
rrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!
"`!#3!i!!N!3J(kNJ-6Nj-#dj0L""E'&NC'PZ)&0jFh4PEA-X)%PZBbi!!"9)!*!
$!AB!6R&+JfBD3Hd!)$#m!!JaI$mm!!)aI!!"!!3aI+R`!!B[!bmm!!!8TN(krp$
3r!#L,`K#Tf%!!LEHr!!3Ca*+JfF%F!&1G8kY!#*K!!2@UI41F8U$CJ+Tp(!!6R9
JFN&-384%3de3!!-!N$43FN&Y51GJm(3bRm)[5!!J)%mL9$&T!"3!'#&!!#3aI!!
"!#c5N5&"!#kJ!Yr#60m2"Nje5MJ+AQF-)#S!#'F-)%!J%'F',cVrK%je51FI"N(
krjj`$#)U!!6#Z!-DBD4Q!!%55(VrMNkk"1"B6l"kreTQ!!$XS4SZ#!JU!!B!"'F
')(J#TU!E,#S!"#SU!!JB+J!%Pp59e#!kreDK(QB!!-`X5#!krdSL"X+i!aTB3@%
!re)J1[p#`,J$'N(krciJJ%U&CJ5K)Q!%)%@J*fB!!*JU5#mkr`)[1[lk,cVqmLm
kr`)[1[lk5(Vr%Lm3)$Vr!&'!3IVqpL#!)!j3J%(krZJJJ%Kk!(TK!!SNh[`!)%T
!C`+Trb"1S"mJ4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%fJD3)!!"q!!5"0S'V9e0I
83IVqQ%U3!'F)F!'KQ(!$SCJJ659)!!K`!%cIB2K1G8cIB2KJ!2lJ)%kJ(pA8ep3
J4k!E-$J#)$(!#Q#4b'$J6PB!!%MR!$JSEJ!-4rVq@NAkrPSJ&,#5E33J%LL!5S"
[%L"6)Qi!#+)Z)"64Nj'5F!"J"$!mrpP-ha`!6Pj1G8j@rpC)ja-B,#i!%%RkrI*
#"k%D,8MrjNSZ!!YR"L"i!UDJ'bmm!!#Jr%kk!TiY32rU@%pR!!&q,blrkNkk!IK
+!&K2C`C`!@!!!A*)E[ri5'lrp%KZrqj1ZJ15)#lrp+%H,8Mrm%r[!!aR!!&))#l
rq+%H,8Mrr'F!!6S[,[ri,`K1ZJ2Q5Ui!&&"2CJ!!P&Q2,ca$6d4&F!!r!+JI*Pm
J#fGq)"0b'0#",`"1ZJ,F$%!!!eK2CQSJ$A)Sd)%Y32rD)"0d'0##,8$rhLm!6VS
#m%M!,8$riL",S#NJ,[rH8)!T3!!S@Bm[#dkk%0!J(h)JN!#"+8!!,#mZrr`[,[r
d,blrm#m',bi!$%KZrq)[,[rD5(VqV%kk#&B[#kQM6qm!*#PZrqS!$#PZrr!!%#P
Zrr3!&#PZrr`!'#mm!!#KQ%kk!BJY32r@,c`!!+LI6VS"HL)ZrpD`J9E$4!0)JdM
$+8-!(#P'!#!TEJ!-!#4)H[b3!$mmS2`[2!!!S2a1ZJ%N@)mI!%kk%&J[2!!!SCK
1ZJ%k5S"2l`!-C`41ZK"@-$J"@Z"!$%!!"QB)3IS!'L()!caq!5"ZrqDJ'a!(61i
Bb2r#6Pj1G8j@!!")j`%B3JF[2!!!S2a1ZJ$b+%!J$&K2CdJ[$%kk!&"+!&K2Cc`
Q6#mV!!`r2+$m,c`!!+$m6VS!SPL2(`"1ZJr@)'X!%+!I)'X!'+!I-$J"@Z"!$%!
!"QB'F!!K`!-mIJ%3"dcZ')$rp%jH6R919J!!51F3##KZ!!Kf!!bX38a"4!!#CK3
-V%4$69!!"QB+F!1`E!!+CJ*f!4!$61i3#2ri6Pj1G8j@!!"CMcmmU'j`!4m!6VS
26&Q22cbUER!"(`"1ZJmq)"q`RfB'-$`#!'!%-$`%!%jH6R919J!!,`-`2!J!`'i
!#R)!-J"+J9,$4!0R"(!"B!*`!#BZrra1ANje6PB!!%MR(`!q,J!+5-F["dkkrmB
D!(!!%!8-3!!"@%pQ%!*("rp1Z[pmX%GZ"(!!B#TCMcmmU*p`!4m!6VS1`LJI@Bm
r"am&6VS1YL`IZ)CA`d3$C`4`!'!#)!C-lJ$irqa1ANje6PB!!%MR%3Jq,J!1)'i
!##K3GJ"`!$!8$)!!!%&%CLj`!$!X!!)-J!!!3e*Q)!a(rrpR'#!X!!4#3%K!i%J
L2!#3!rr#J%M([S&Q!RB"%!0-lK#)rr41ANje6PB!!($r,`")EJ!)6VVrQ%S!8%p
R'L"Z!!JJ+!!%3N")31"))M`!N!2r`S!`!@!#F2p1ANje6PB!!($r,`")EJ!)6VV
rBNS!8%pR%#"Z!!JJ2!$rN!2!U!!%B!*`rdjH6R919J!!51F!'#CZ!"!SEJ!-)'i
!#$#m!`&`!#L!"T3!!!%N"T3!!!*)"T3!N!-J"T3!N!1!"T3!N!1!"T3!!!53!!D
8!!!"*!D8!!!%N!!'P!#3!h`'P!!!J!!QJ!D6!*!$*!D6!*!$)!D6!*!$5!D6!*!
$2R!!61iB!2ri6Pj1G8j@rr4)ja-B*Qi!##e,rr3'VJ#3!b6rp#KZrr3'VJ#3!b$
rp#eZrr6rq!DZ!*!$52rd,@lrp2rm"Ui!N!-qrr3J,[rdN!#Z!!L`VJ!-B`C`C@!
!!,"#4d*'B%C`!$!($%!!"&A$4!0R"(!!B!a`!$!(@B"b"%kk$5*b!$)(&i!B!(!
!-!FJE[rid)!aKJJ!F!!`"a!c#!"b!H'Th%%`"e*(F!!`"`a!!#4PX%*(I!&J4R!
!-!F-3!!"9F0%!fF%F!"J$(!!-!G6J()#6VS-c()!-JFCJ"J!F!!`"b"Zrrc3J$'
'#!"`!$!(%$3)!()"iDRF36!(8NG`!$!($%!!(f@`F!"-lKM)rq"1ANje6PErr%M
R$aJQEJ!-+'i!&%*'B!j`!$!'d)"#G!J!-!C54R!!-!Cb!$)Z!",5JE+!EZ*#4RJ
#B!!!QN*&3NG`!$!')'i!#1@!,A!)!2rmB'a`!F#ZrrcH3(!!-!9b!$)'G!!8-aJ
!8d*)`V5!EbK`!$!(d)"b!$)d#!"+J@B-F!!`"p#!1B3)!&4%F!!`"p#!2M3)!'!
BF!!`"R)!-Li!%Y+"dS"`!$!(d)!jJ3J!-!9545!ZrrcLL#e!rra`!$!&FJ!b"R3
!&$-B!,4!BS)`"P*'['i!%Q8!rf*-lKM`rq41ANje6PB!!%MR$aJq,J!1*Qi!%#K
Z!!Ji,J!@1JIQ6A!!-!Gm"ma!IJ"`!$!&%$3)!1`SFJ!5!(!"`!&b!")!hS%J"p#
!FJ!b-`J!,J&54R!!-!Cb#,+!CJC#4M!&8N9`!$!%d)#`Kf,!F!!`"0#!)JH5J"!
"61iBm2rS6Pj1G8j@!!")j`m)1#i!%MiZ!!iSEJ!)2!IQ6R!!-!Gk"mT!F!!`"Ri
!(M3)!(!!-!9b!$)%dS$QL@FU8i&R&P1"CL*`!$!'9)"b!")d#!")38*"MS&`!$!
'8S"b!")d#!$KLBk"F!!`"H#[F##3!!4brq#T`SF`!8cZ%2$rl%jH6R919[rU51F
2'#CZ!!JSEJ!3"Ui!!!%N!"3'VJ!!!NJ!&#eZ!"6rp!DZ!*!$)!!8,@i!&2ri"Ui
!N!1!!"3YEJ!8rr`3%qB)FJ!5!(!(`!&b!")!8N%p3IrU%"2L#()!%J"`!m!"FJ!
5!$J"9%4`!HQS28$rmR!!%"0b3-)!F!!3!6e!rr"`!HQS8i!p32rZF!!3%h)"`J"
R#R!!-#lrlP1!B!*`rce!rqak#%TZrr"R9LmZ!"3[,[rdF!!`,[rb,`!J#e+!,`"
1Z[miFJ!b!1H"fN%[,J!8,blrq(!!-#lrmLm!,blrp%kk#(`[,[rmF!!`,[rb,`!
[,[rd,blrq%kkr5*2l`!`3NGJ!!$f5Qlrm'FbF!!`,[rb,`![,[rmF!!`"5m!,`Y
1Z[hHI!!F!(!!-!BJE[rdFJ!5-!J!fN&2l`!3B"T`!$!%,`"`!$!&,`![#dkkrLi
m!0T%6qm!$,aZrqaQ%$!(8NGb!$)!3M3B!'!!!)kmE[rZCR4+E[r`Cc*`!$!Zrr)
[!#mZrra`!$!&,`![#dkkrA"m!"`!F!!`"L"Zrr4b!")`#!$D38r[!""J'R!!-!3
[!(!!-!8[!#m,6VVp`$`!fN42l`!-9NCJ&(!!-!G6J()!-JFCY!J!'!!`"e*(-!C
64NT!CZ4J%K!'d#lrkc)(8NGd!$3"'B!S!,jZ!!jP!2m'F!!`"9k!jSK-lKM`rp*
1ANje6PErKNMR$aJYEJ!Nrq3'VJ#3!b3!*#eZ!#6rp!DZ!*!$)!!N,@i!*2rS"Ui
!N!0)!#3YEJ!NrrJQEJ!Fe[`"*0Em!NM@r!!Je[`!J0Em!)!Y5rrBe[`%N!!Y5rr
Fe[`"*#e,rq$@r!53!#e,rr$@r!"m,8[rb0Im!!#!!#!,N!#Z!"b`VJ!JB`C`C@!
!"9*k!%*()#lrb0#m!!#!!#e!rm`SE[r),A`!!)!!rra)E[rm,blrb#"Z!!K1N!"
+V[rm8%pQ"R"RB!!&'#!-8S#`V[r-Bf3Y62qk,@lrc2qq)!a5J*!!V[qq,8$rYL!
ZrlU3!+lrb#e!rl)J,[qqN!#ZrlSY32qZC``J6#*ZrmJJ,[qZSLiSE[qZfHlrb%K
Zrl)[,[r))'i!#%k3!#!Zrl+`V[qf8%pN"R"RB!!%UKeFrmG`!"!ZrmG)`0#!8d!
p32rXF!!`,[rXd)!p32rZ)'i!%#!3d+i!$#e!rp3[,J!F,blrh%Ki!53[$%kkr(4
b!$)!5S(C`5mZ!"`[,[rB5(J"*#mZrpa1ZJ@m,blri%Ki!53[,[rF,blrf%kkqQB
[,J!F,blrh(!!-#lrl#m!,`a1Z[`ZFJ!b!%U"fF%[,J!F,blrf(!!-#lrl#m!,bl
rh%kk"A)[,[r`F!!`,[rX,`![,[rF,blrf%kkqKKk!%*(,@i!$2r36qm!B'!!!l"
#4Q!!!*K`!$!(5S"QG#!-8S#`V[r-Bf3Y62qQ,@lrc2qU)!a5J*!!V[qU,8$rSL!
ZrkD3!+lrb#e!rjiJ,[qUN!#ZrkBY32qDC``J6#*ZrmJJ,[qDSLiSE[qDfHlrb%K
Zrji[,[r))'i!#%k3!#!Zrjk`V[qL8%pN"R"RB!!$ARS!'Kaq#(!"`)AF3(!!-!B
JE[rJd)!m-!J!iSd`"e0(F!!`"Ja!!NKP!2pJ"%B#5(!!-!B-3!%!C"!J,[r38Ul
rd#"!%)CJ!!,U"%B"!(!!-!BJE[rSd)!i-!J!F!!`"L"Zrq4b!")`#!!p3Ir#F!!
`,[r#5S"M!!#LB(JJ$&+!X+lrc'0N,8crTLeZrmcrUL!-8S#3!+lrULe!rk)J,[q
QN!#ZrmJY32qH)#lrUT!!V[qQ,8$rQQF-)%`LE[r))#lrQU)Z+'lrQYRZrmK)E[q
H,blrb#"Z!!K1N!!J,[qHX+lrSP"2C!C`Cf!!!R4`!"!FlkL+J&"(F!!`"`a!!"K
M!2pqF##3!#lr`h,ri+R#KGK"F!!`,[r#i+fHE[r#3NCJ!!#BF!!`"dU!CR3J$&+
!X+lrc'0N,8crNLeZrmcrPL!-8S#3!+lrPLe!riiJ,[q5N!#ZrmJY32q+)#lrPT!
!V[q5,8$rKQF-)%`LE[r))#lrKU)Z+'lrKYRZrmK)E[q+,blrb#"Z!!K1N!!J,[q
+X+lrMP"2C!C`Cf!!!FKk!"SFIJK`!F#&h%"`!$!')'lrm0#!2$!)!1+0-!G64la
ZrqjP!2pNR'lrlR!!-!BJE[rid)!pF!J!rm4`!$!')'lrp()!%M!)!$e"rm*`!$!
Zrm*+J'-!!+4JH#!-8S#`V[r-Bf3Y62qQ,@lrc2qU)!a5J*!!V[qU,8$rSL!ZrkD
3!+lrb#e!rjiJ,[qUN!#ZrkBY32qDC``J6#*ZrmJJ,[qDSLiSE[qDfHlrb%KZrji
[,[r))'i!#%k3!#!Zrjk`V[qL8%pN"R"RB!!!rR!!%"c[U)U!8%G`!$!($%!!''-
!rhj`)*!!,[r$F[rJUF+&dflra(!!-#lr`Z#YRQlr`R!!-#lra%U!*Qlrd*I!Yqi
!$'8f)'lrd&+Zrp!3Qb"Zrp"5V[r3%*XJ,[r38Ulrd#"!%*YJ#L"Zrp"5V[r3%*X
`"&0%5N"QlQ"@9N3J,J!Bd+i!&()!-Llra#3Zrp#8VJ!-NS)Q3*I"B!iJE[r38Ul
rd"#E-!464%T%C``J,J!Bd+i!&,#,BZ)QEJ!-B!SJE[r38Ulrd"#E-!464%T!CZi
J,[r3X+lre'8!r%JJ,[r3X+lre'F%F'GJ%#!Zrp#3!+i!$#"Z!"!JJ(!!61iBm2p
Z6Pj1G8j@!!")j`mB*Qi!&$JZ!!SSEJ!3B!!"-$`%2Li!$P*'['i!$Q35F!!`"R)
!-J330!J!X$3B!'AQ8dHi4f35F!!`"h)!-J330!J!X$3B!',S[NCM5(!!-!Ck!"S
d#!"`!$!(FJ!b"KQd#!!B!(!!-!FCK3J!F!!`"Y#!1M-)!(!!-!I3J()!-JE5J6H
c#!!B!(!!-!I3J$H&#!"JJVK(CJC54'!!!+*`!$!%HJ!D0!J!F!!`"h)!-J3CY!J
!'!"`!$!('B8)!(!!-!63J$Sc#!"`!$!(d)"b!$)%dS%hX`J!'!"`!$!(d)!hK3J
!F!!`"h)!-J53!)&b!$)Z!!jd!$3(8S+5JV+!Bai[#bm-F!!`"bm!F!!`"#m!6VV
qjMJ(8N42l`!3B#![#bm-F!!`,J!1,`"`!$!(8S![!%kkrX3p4`!16qm!%(!!-#i
!$R)!-J53!)&b!E+!E3$q`%cZ'2$rk%jH6R919[rm51F2'#KZ!"3'VJ!!!53!&#C
Z!"4#4Q!JF!!`"L"Z!!Kb!$)''E!)!"J!F!!`"Y#!0iB)!$!'8NDmEJ!1CGS[#bm
-F!!`,J!1,`"`!#m!6VVq5%*'6qm!%'!%-!C54VaZ!!jN$R!!-!Cb!")d#!"+J@I
SF!!Y32rmB(C`!$!'5S"M*(!!-!Cb!")d#!"`!$!'8i"d!"3d#!#53NM")#lrr11
S,8$rr(!!-!Ci!"Jd#!!U,[rmIJ"J$L!(iiKb!F+&JS!Z!H+0-!464%T!CZT`!$!
'd)"b!$)c#!!JEJ!3jB%KKaJ!-!C54L!Zrra5V[rm['i!$Q@%61iBm2rN6Pj1G5*
I)&qJ*5k!DJ*#Pdl4)Pm5(c!I5J&R"+G'B!+M4Lk)6Y%LAa)I-"mJAdS"C`5Q4f!
#SNG1d5*IF!'KQ%l4)Lm!"#![!!K"qJ!+-R`!!Nl`N[jJ"Na"#!&1G8kk!#3J!8j
e)Lm!"#![!!K"qJ!+-R`!!Nl`N[jJ#%a"#!($3%je5S"V&%U"D`C1ZJ"'6R9%J8k
k!$j%J8je4)"+J@X+6VS!-%5!4)&1G85"6VS!*%5!6R8L,`!%)#m!#%(k!!SbI!!
#6[#5rQ!)6%%!!F0!6R8r!8K"5N&Q(#)!3N&)3@F+JYG)38K!-!&)3)$I-J"#3%K
!6R9)36k#,`-d!#B"FJ%K!CJa)3$!#FJ"J&Y*"C4,83Y'!X)0Pp*!!Jp*"#-%
!!'6Z*Kmd(dje!!!"!*!$9hS!!&Ck!!!#HJ%#pV`i-!#3!a`#DJ!44%&833#3!j*
D49*2!*!$RN4548`!N!1U3dp%43!$!,C659T&!*!$jN4*9%`!"`$b38a59!!'!9*
69&)M!!!"TRCPFR-!!3'b8e45)!!"!FT3Ff9d!!!"iP"*3e3!!3(Z4%a24`!!!JC
'C@&d!!!#%N*14%`!!!)H4P*&4J!!!LT*3diM!!!#0Q&eFh3!!!*#!!$rrbJ!N!R
rr`J!!S`!N!ErrbJ!!Vm!N!8#rrmi!!,$!3,fR!!"rrmF!#U'!3,fJ!!!rrmS!#c
-!3,ec!!$rrm!!%%Z!3,ed2q3"!!!,5`!N!3%!Irr)!!Y1J#3"BArrb3!,ES"![C
d!)Irr`!!,K!!N!@'rrmN!#jJ!3,f6!#!rrm!!#lL!*!&YIrr)!![3!#3"B,rr`!
!,l)!N!3$k2rr)!!`%!#3"!3"rrmJ!$!m!*!&J[rr)!!`6!#3"BArrb3!-&`"![C
F!)Irrb!!-'`!N!@'rrmN!$"m!3,f@!#!rrmJ!$#-!*!&JIrr)!!`R!#3"B$rr`!
!-+`!N!8"rrmJ!$#r!*!&![rr)!!`p!#3"!)!N!-J!$%5!*!%!J%!"b!!-5)!N!@
!rrm!!$%Z!*!&Irrr!!!eC3#3"!2Srrm!!$DB!*!%!qMrrb!!2l-!N!Errb!!2mm
!N!@!rrm!!$rE!*!&J2rr!!!rq`#3"B$rrb!!3!B!N!Err`!!33S!N!3'F(*[EA"
d#-3JFh9QCQPiae8:
\ No newline at end of file +(This file must be converted with BinHex 4.0) +:#d&bBfKTGQ8ZFf9K!%&38%aKGA0d)!#3!j4j!!"Cp%[#8dP8)3!$!!#8HA*-BA8 +#G`#3!aChG`!0#94VAde%48BZZ8pD"c0i4!FliN)!N!J(1q4%%'!!N"30'`#3"2q +3"%e08(*$9dP&!3#[m-k-XQqlHJ#3"QGr!*!'$*8!!%QD!*!'j0-1!&eeIK1,FUm +c*q,Cl62DCG(0*S6(SS6G9P[lcNXja42kR5AKj'KiDRMQb@kGl0@M66DjVH4j*VP +00Z'566Kj&YRNpT00EVrN0YR2##IELqb6h$j'0Z%AfH6fN@dHi@56r@5625#rh`J +RNdhfK'bfl5L`!&pHPhA&cXj"@S4GIT'YK"mCF2*E`Md!XS(a`(J0+,2,D#S9Cib +&'01@-@EYCkclXib9r*TLeQUk4Vr#`UNHZp2+C'+TM'&Q8R[XU*Z09D6B9)d0$(L +(!`-D$%H,a5rXXFFBZfF!(i9SE2V85#TT490MU%VB-MC0qkjq12YI-%)bKE(T(AZ +l)[80M6@(BQR9#ZeHYje0TY&FYld1[L*LZjR8IMZcec'DVAf@dEkdc9LZV6cfZ,C +bpmCYV8EEPMlfAU-GIjZUUpBclGj[-VENKl1VQPQ[XDf9i,b(r%E'p,q!T2`m@ZX +Z@hhRUJqZ@Ek"rkpG[S(THDk#pKT4&Kqj&IT"GM4dJXj##ii5&#CCA0[3%h06QHa +aBbVTCJpjZV`+k`@CPK1eiNBiP8M(iVCrXibM`Tb-*AXG2dlFEc3FF$1@(aEZGpa +8`YKU(pbIb[6iFAA4U1diKQQjIAl3T[jB['F)`9hVYP)@HZc0GM)I8apc,-Ha%pf +jl##`*CEF@`JC5Qli!q%9+dlP9S5G6'fi-8)Jr%bEiC-*3FcTK##`N!!3K*J0MB2 +R3q`c`h91JZL4Y12CS$Eld+QFG9LCAYXefQhAc5HYN@ia)PBkcD-mG[+SPTMM)fe +U-eV6EL`41a5!LPM4eRBMBK1d3JlUlHlqhPilB`MF2Y`1Xh$6JA9h%C@M0S&,*F( +dA2!USm9+p[CEK1pNjPCcGKP%,cYMiI*Xj*T6h&aVe293DD0EU#JKNB491D05EL0 +I4GiJ[i6m8[,Pj+H4Rdjq"[P5mQANCj+I4Ek#r&6b#b@'HG!Dj"H4RdmH)Q3"H4, +aA+[-*Rm6q8Vb0j1I3hiZH4+5l"EbYj*IV'M)2Q8))TQa"lL8$[j)ARXL+RZ#Re, +58YcamaNmb1p+M0LT1dUiB[IJSH("49TH[hN#$Sc5"mAG'&Dr"6#4'l!jHmZdE@C +666TMliiG1*p*6GCAYMQ6kNmEUkMHNLC!4%f8FA93%ipeXeTj68h'b84C5kcED%U +N8aRAJ&k+Q*fjide@2*j+*BdYGMc0)Tf'%&[mSNj5"ea9iT48$L0jP%I#j8LJlBC +8jD#D,#LL35@8ejK$DLDR08pUc!"r6P-@Y'4"3dVYk-ZM[0l++cSeTARD!YV3dbE +3HY"p-1K$hUXLHapjk$hB@[,3Ml!`HHK,@*[%!ZXL$ad+3d-BHK4fL$ad+HbMj+& +2BCmN$hd+q`aj6pPmP6cd+ZaTQ4rB$mK$Nm*q4KlD&2BlmY#SX,q5KeC&UT&ID&D +F)4kk&@I3VG#[1,Z$IU#&FABhr8"Eif`,r8!Ai`bY2'KMR0dR1B+chI3$rAc&FMS +DZ3$2N!"cF!Pj48k3!![N!,a!IT&lj!'m43l!4r!(I!8I`6e`$[`#hj!!'h$RV1l +dq*ql!hGkr&m9m,mTi,m9m"p5dq2rNB$rA`Mirkf!rcm+q2rlJ2mRI2jVi)(N[hD +lchpY[FprED[2I`fe4[*I3ciNrl92"2crG-$rV`AmIbEJ2qU)armrq[cAN9r*Iad +aN[pkMFpr(69#mPrI46qb(k*$qD%rJl0(k!Gp'TapQAl3Vm(CXr5$[Jh1INSrD"@ +VMUb-5TrSaj43JCZ+RNLY!SPdUJZ$'"SJSaN0('UebVH#i08$qJf48P$,k3-qN!" +9@e[V4Z2VDPBUf`U$9`qSIc#&GmBZ6T%S6kbFk62b3b0['DjpqqV6KPcSD0ULPEP +01k+9kap4(V$!DjRQ5iAkalUk(0I++"jQa2N8,Y2D@PXlmQ'EflDChPQT0e*&rFA +'TTB'ZP'6rhTff[Zd8BXK1j!!pbTdMMdN"qMP!*XIcP[,iKlHe26[mAVjJrG`[16 +Pp"[1d,bQjV4'!jDmJ"@''6SDGR63G&M!K()a3GVDrcBTlb'V-md@RXZ5qTE01k* +lBcdB[1TX0m1jXr%#LYLC00E(lhLRd[)+ShBS-plSK(V'5&bAHK1,a9V#0(Va!"k +cpMZ1+a"bS`'j201C+@Ie&6##EdjeZ,@qSGUSVUrVU+0IXbRF8DeDS3#A9[Q*i"* +q0Z@*e02l"JBHa%#5'Xi`d$C,MYa95!di@il8h56(mLVPk0h0XTV-NH0hFqAj,I+ +q@qA)h6`j9RHEl%A0Prm,j(d,jIqLl0LI'&5RB`*bFL"EZ@S6[3B9LLRKTL'jkDa +mYK#$`80("CX[fQl['JDQkp*T["1J!-!4LE4X+Yi6['9#Q6ec4m4XQC3!Ph"dKZ[ +9!(PYDfmE4[J'$Yl)lqjM8FICa8,22m`U&hmpHd(PXbrL0rqDLeF-RM3rarmc$r% +Cp[a!`,"P(i)ja`i2aiS9UJ!Fja2b1SlcVq,p"mFiN!#V11`$#S"RqML1[RIjLPi +9ac'4$Ir0Rj(%#Kcd6)mL!%Gd2,2&['*H`--a9SQZiTMSQH%9T%YmG9MI@*d@$mN +aAULpd+%k[52F1UPMF%If6DEKh2DNS[dhDK$dKaTJZ!miR,jiGr'Hi+@TF`A%FIX +9!6KJ0855Gr++-6+TZ%IDVqS2a8fC2A2(0F8pJN-CS,KE0cA,eeT'V2!-fQP6I#M +hFeQpTY`RF9a@lT-i,L[h#cKH8qj&(1S&j6kFMlH8qdKLhe$Z44bAPIX`M$H9Ha' +(3N#jfleXY%i$#(qCpl4bra5[dmS2aAf1q0F8pfL&93BSlXjBFXeU!drDRP(Fdrk +VQ!M(H'@iSTJQF9a@1KG`[+CdLMLZ92*K('p@mL+1LD*(1)Mh&j6jM3U6aB%R98F +Yk'b--Se`T,VhM1&SlGicLD-mFRDF3eTC*",'LhB+!,Y81HR&E6$k!SliHFe*11, +dSZ[C4eHcPD((aQZ0+S#mAUm-@8dqSHf[iLK@i!QHCIRKUJ!HfCl1aHeSMCR&ZjJ +2r$0*URG%*EpU1C@Fl@)U!A#%iil$U-43!6Q(Jc3$mXV'qZfmqkJ%b!I['LS"F(K +G`c%F9lZ'I@iLcPi`"Bl1irVpY3rV4qLmXZ+Bh[3EJaejiFGdIN5rlqjMG#@pT9R +eCcSrV&X[cG#E5rJb#Kc((V"S*"mAH5Dl0E(d+&r4V4RTXJJF@21!B3q'klcRh4S +P!&pjYdB*J!-QbKNeErkA9ik$k$(@cEU)ipj8dKkA$&SNBLS!CXhaHZ2Nr2S#pGX +%aCMp@`X0QH*fJL+G(TpD+1C986#*FGh85C-B`@BLCbiT98mSGd@&-P8#9%ke3U@ +kD-9R+"3J24f&bcX8BkBJk-@S9pqKZ0U,130%5I#HaEM*pbc'6EheRJ8C(MI%rKr +i,k2R,kPBl2c($FiSbN`*mh5Z)XC8F99!M@0cj5B!`C*EmLhIV2%0Y03caNQLPG$ +lalPYZmkDYh85fHJ5Ad2lIbNMmUbDX4$e&dYB`R%,2Fd+fPJTK,M#p%FThDFK,PR +!J3f5PP&FE$#ZR("iq%)[qA%c+8il,2$PiLU`i4,L#&mZ$ZXcXT9Bjia9a"leQDc +YS*pQ%GIp5cU6"8Rl2(QAamekmAY)N!$-"rUTkm4pDl(TNPa2)r3K*%AFpb[XP#L +hH`TKUkNjiMlp56U6Qck9!FGmFGp6f&K*E[e85ANY-m9pUel'45*Z2LdkU*@+Z-k +95)6%mA(kQ5ILlX3c`h)cU""QbkB*I-Fr4QGb5kJb@Kq5c4,hp@#L4Qi-YH!9`MG +9a08H4#lPI9qKRr8L,[3FlTCaImMLQ28+*Y2P9P',)!&q,ZlV`QCEXYDArFhRJ3A +1b'fMbT%ANDH+[Rq"!#,1f%Frc`Km,cp%Ch),U5@8BdhQqm2)Rpa)DLQfjATFa'h +(XK9b1kPbr2-ehPK&'eE'N!#E5LfP$DRd'3,IYl'"P0aDU[Sl4&%Cpm5I`#d4phl +DN!$VMND"BbFkjR+EU5Um#@-NA!Ge,P!(9G[TadbiI2STL+[q"LHr'dH0b0hh4A# +&lN2p#q*ZThUK,dbi[B8kYi2iSpqC5$YdAbjZm5rSCk2C3PX,9Mb#'L3hVDTkbUq +[ZIZU82-S(fR-%J5ibp((PMcilGp4)14pf!LX@r#J!kZIb#8lGQkJI*6a1(B81CB +,EpcI3(KALlM[SbE*6Dl+X85+U(qX"c&bUbX$ZU!X3C0+JcUJ'YYK2CL`KUE*ZQJ +P6Nh8pG"cQ-L5%r+l[N3r(5,Za%p31'3F1Z@2mVL5cFqM%)JiLeEjd'E,1!`3m+f +arJm!N!30#P4V8fKPE'ac,VPD"c0i4!FliN)!N!J(1q4%+'N!N"%@!!"Dj!#3"2q +3"%e08(*$9dP&!3#[`82,XQqlDJ#3"30Q9!#3"NeC!!$G,`#3"TC9"J"Vh1e4RZX +LB3GPj*BMQfbbAIG,Z0h#DQ9qPbGh@c,2[PYC9+B,pGLQlGjE0jjk!1Z&Cq,cB[L +[[,U5hBk64FNQ1lE`K5rQfB4X&`QrcS8r@BlRiNAiC@5ILbjf(PPiEprab'*fh-A +Vl(`A(qk-E,+2l+4!KeIUGCYGRC+&eX+9RdG@XXNQ#q&NGf5iQ2(&`fqb@[CHGCl +FmcZ[kbNI02%kYPNfmVDAjjPeG[3fFl0"AJ1MR(*2lXR25AVeEV*lIS[R,A`!jF[ +aS&l2Qm#G!l[iGCCQSlciFQ5A,pc3GYIZ[1akfjG`AeF,fG"1"m@,,-"B!'HVJr, ++3Al[YpR@h!0@(VJ3H**Eq,X!-!M3kH9lRC8pce&+RD&8iJ*eaXMEe4RE2kR8dfG +KEdjd*H"U6j0Ad41@lpZHRmVlhPjG$PZqRT56DGG#N!$%[e'TThj"UDH*2A@$iLf +PhU*@4IIl9I["[9'943pP[[[HhT0'(9I&"'5EA-Lrh%TlcC1&IS&*REhSI@ALkX6 +CACF[451Kb0mNZ#+KjZFA(2pK2X'$k6KcjIcbDj9khM`rF8NIUcjVeb1`a@-TpG) +ST1MQNbQqI*DTR"pAAk$12M2RZ9EC1jQ`V,T!26RahUk$VAYI4J1e2r'(LArTqUc +DJ$5mAkR2le*2@8aikXQlmpPd`pG9'q4M9eP`#j!!4ENC6$&TFrr8@3YJBqa(LH2 +Nh%5T1,e$@aAYEqkrl1()"[cN&f*2*JTB5mEH(DcPii"*fHc%m"FFaDh`C9HBkD- +2l!B(MGqpE#1YaIp8+B5'4h$4RAmU[5MT)A`+UK3,bDBS5E2I!AZZ60bEZ1Z--aD +aCcrJDrf(81SeS3Q9%@Jj21h(cVCmjV[BZ3XPr3le[qri*QTE%qF0U1fbVL@k&'B +V3-hX1R-L4R,#ra#&9#RapiR2R9&Ga0`#BM4%1E$R,'C*E8XA8LTR2IlPBU1b+m6 +fCL+@fMi@SB!p[ipr6QarcS5TlArM2dR#Vm2&pQT5LBfi(#ff9P`df`(MRL)fiUi +@feY`18CX(m*PUYMq!bl6a2EIFDQ4%L0(8$0X-h%KGQaRi$*GE-Y`Q5'fkh#T&pY +25BeJqb9FH"rE"h#KlB6Y-lJF+lDr**CU`9-raiX0(qP@'GYmA%i3fh*F6K6EpEL +F*,EAiR+bf0k'br2%pNPFRLqf2m6P"@,l#e`84mUqLFZ,"&$*h5PL1aZA8mAf5Pa +H,$ELISRBL(Zff(i&&m%0Bk1qjiMY2q*bQYLqMXYFBbYRE92,f-JlpBAY(&c1&0Z +PJM2B0Z0#6V#p"KIH`IBQA1D*MIUQAV"p&THALHf[F6RAf#U)1qH*METkZGM`2ep +X+aC`@QcNHi(BL(ZKf0k+Ll+VLMYa@53fm+aCE2m&Pm9LqcBZ&aTE*A(R)V&4-d[ +%KXr&BZ[!46XIPA1iY)MY$EL!HpMHLiYLG1Al")HaJD0YBRX-&qSAb!8V`5jXi!* +iJSdmNR0XPq1b8Qc8($@)lACF9SQ0h+m@fdG`Z8aXRm1&pl&*TcAe5mCQi2e+XB' +cDm3'6PdP0QUqA@c8c09L)`CU!GY@A+i4fkYa@5XfFV01E1"ZTpJHa19DXIfQF"0 +XB0)'XAd&PbkaI4-Am"`D!YqJpV'"hI6FXB&pQm3',P!Mf+JCTEe9c"Hj`VB0Pa[ +%GJFZf,'4Tfka[4-AjBa9a,$YB[YGA'i8faGaZ8PXi+M5Z8RNBq!$0QVV9@)$Pj9 +46L,Z8#rBU-1I%"[q2bQfeq-#Im(f2Pb8P8qk'jGEaIBPA(jDE1!+H#MR+1)CA!! +E(1-fXB'$e#BfX10Ra%EY83[Bb2@GB[YAZ0`P0QVhEV(p(LliBS-crDba(8fZGSr +Bi$mr*cD`qqI&4LhH+cCUi(9LSrlqYGJqM-X[L1f2FD%@X-%E`&XjNmP,Ie&XB#I +[B`-l6H01E'$9I@+MaYiS0VJ[2!AE*h$"MZe2F)'IBS2[JUYbTT!!IriEXB%hF$T +Xm!4i&MC`lHeLS`lI)6Em`40Xm,phLBeBlaIE0h"jYl&9Npqq4fa`X&m9'hMfJ0M +!*ZS4'r8$lm$f%#jJ"EBr`!8l0ZT'qJHFBeJh[bBfZ#9F'"Xmjf'aJHNI&"ZimiM +BU"2`%"XFLcV&"Xq!Gf$l&LiI0EDTj14`6fa`3Yl%"SIjGE'"Qp3J0QUH'X&'6Rp +$E*r'j9'aI3dAZ)1FDHaPr*EBi1GJ)cCikDI%"YH#Lf'$9raEXC(Aha%EQ!+fBk- +f`$GX[%AXf'5Q*r9RBU0Hk4[)U5'(qrGLJcI$0l("NqPTB)-V`Rqa`C'S6@aJ,Ad +!E'!L2!JEG8j0B50hIb5f2m8&2-3'0rUmXG@5Zhp"E23b`"CXm(Pi#MEUQrHaJF( +N%aYmicq*$Ccpcf+MYZ(,f-J&("BE[CRrDQael2[!3E$4XrLbf1$Yp$5``4[KG0M +)phm6'rcNUf)$FkPVE03rR!)E1IdVXIdp,X3ZCcVl-IqIf-!9m!dEI"@HL`d1"Lr +$"Mrj(f)$0rp'E06Yra3EmI`[Bj["hXrILJeZ3EeMJlG4GpM!Hl!1'c9%2`%E21( +[a!CQ`51`89G`0'c%maeMUbIHNeYXp"lSrf#$FfZ[Yajik9TqpH#aVJGC$l`-T2p +A$e`1T2pA$h`*T2pAMh`&d[pV32mVN!$qA`2k,)(draV3)`LNrpF!A!bNrpH!ZJb +NrpF!(!qNrpF!A$-6@ck@)j8dhP%q(fG"2Jr-Tqr*Rpl9DZ%[AS-6-(+e&@B4E)G +6qY'QAA`5,p+f02I`r'L'CR3qCQ+84C!!U3lr@IMAiRrX%k-5d630k*Ff8&G'q+Z +,qYiqJ*N%$mLTE)mlrG0T,`@K&9ffa69-VEU4'%@IRH-BHbDfk-5G3S#3!2r*VFN +D6LrJ(EmbdV%,fa+iYI0XC6qBqpL9kX*lMCcNQ,,6QV%bMK8%1NJIX+A('Cl,XrR +8cS(RXbm+eqXirSC[jVL+i6mPTd2Ifkrpk5$&3QXX2(-mG@'LjpBE%ch9EE[(8Z- +lTY4jU3*[#pHGHkP+l%,Rki4l9Tql8p95Zdhh2eqf#p(9DF,%5K1kLNhSU#a#9h% +4ZT!!Lp$K@36@hiaTJfD!3c-kEiXa0E%BACm,d8@k%'pFK2Y&k"aHK%l(%R3GPk$ +lZJ4GNS[4hESBAHL,dHQl'*fN5p$Y[36[YB$qY+"chS,ZB3[m@M&KdGSmRP-C8T! +!bBfPb%NETNhDd%&T3qHb$Gf59b)IVd4AiCAS)#a$Pf8C`(8Cr*DM5l%FhDS9Q1j +CJFQ"&HLHV8!RCb8kP#[4E9f*cY'PL2p56#4FLNle+X5e#The9HJJV3B1VdE19U- +6ZaTaABCmABC1d'AS@Pi'rm[4pEJFhIc,`CD[`'6+&HK+Ai%1d*@BRVJ5hI!VdE& +EJaTD!hDp"KhP0HM@AB8mA)8Zde@SJACdSGV4e@j(,&FMPU[4bHX!R(HJDpq"A(D +Jdh)0f2Jek%aIJfl9@R3+eb+ZYHJdVN11ek'M[!jGZ%jJGbFkLTfB81K%"lF6RCY +V-Eeb,HVl@Vbl(M@`(ThapHLdV%IAD!1QQ$DJhV[34HP#EAE"lcT-)9f([&b(MZ$ +eU+[V%G[ek#"Z42ifS[1l%E@d#Aap%bB30U%cYaPGqmhS['j'4hB,Q1X@6**X36G +X#r+r&ChlVFMh9R4+Y`)$EX!%e3fS[4[3jGb'$Xdfe03fG*!!Yk(ce)dmG+1$hid +1A!rmHS!(fe&,fp(Phii1lhE8kShSr0k)VY+0U0FEd@@l#9Kd%qVP*Y6,cCK8Z"P +GbTZ"2c[3*GU"qYJ"[eIKM9HaS`L61$!5Z1Yi)1KNL8kC3fpX%KYRTLeaL&mGDTp +i!&SHb8&P!SCVHRid$XeJNj[kBiTT#9iSIj)m6#[BM#Qj&qK2QaNQECJ`lf"LJF+ +d`D&Li@Qkk@CLb6h0b*)C9A)1c1ZB'5AMm#0fIDL%iM*`iqcUj2jbl(Le"T@I3mC +JfN94iRJ)!!$HD)CUYm!-+*l#4q62J"S$%%*2UN"E6!m8qjYPP2)Y%UJG($N%)'% +M+aR#Taq3!%qMk@,6[DCV6EHD(J06PNaA-P9*4ZM+Nc5QJ%!&ZVCdrJQ,2L$*TIY +2KjcT*,Up6"iaM81H+3)3J-id%jC-F6"4b65LQ`CPNY))GfJ4-8&!X8KKd8QQJdc +Rf(5-QD*JdS)*#bBVQ0KJUS(*#LBUQ+4JSS-Z2P-EG2$Tc$0*`33&Na0-6$!T`B3 +%d`K-4$!*`33%8`*-2$$T`!5)G2dY&0MZZ1Q+-jA%0"*65%aD-0A%9!$6-d`G-AR +#e"-6#8`f-Bh!0!56)8`C-9e%FiPT)UD)Q"jL'SE*"BUGVMp638cl-#A&*"!63%` +b-2h$e!m6"A6qQ5"JFS!*6UD*Q!bMmmmd$K1H6'SbSFPN*P-96!i`QFId*0-)6'8 +`cF68!G0G6)R4C@EkP+NV1"U63dc`-BA#0!c6Q3![Na0-6$#9bE3+8c0-GJ"X6,, +5R'+5J3N'*KHB@)!Z-2RS@),K%dSK$%&3`X&8#!b'k81Q,jN-B9+0#68QcjL+BZS +$X'0Udh%*4b'BF))j3'#BrQ4#MDP'TN1C#Q@kK2kfm(IDZd`e--eJTKLBkQ"LL1N +RTTkBTQ++KUNR*RUBFQ,DLQN5*UUB*'(DL5NRTTX!F5CHQ'*LHSQT*DD9Q&*L1SQ +T&+D4k1)cRF@d#"-F6'i`X8'EN5Nk*SaJ3%`U-L(#K#16LN`S-TR)*#56-8cJ-$h +)T"A6-8cS-CR(G""6H8cM-Fh#p!a6M"!(TKDC9Q4+%GE-K#A6R8c9-*A)Y"[6K%c +B-0'TNjbHJ32ZZ(Tbp82YJkmkp@L`!QbJ&Q*F""2*)EN%Lm&Iq!Hj*(rN(b`'mmJ +V'!KZJGG`%h!(E!#$`#*`#G`$Am!9X!Xm!PI!&2!%r+$fU#Y`$qb'am#6U$2`%K` +'Xad(!02"ER!E[J!h!Y2!+(!FlJ-2!2IK!03Rf!*A!RI!FE!E$JD(JN2!(m!LZ!5 +F#%i&6`22`(c`MIS&Pm%qkKLFC()5r!2li3TJ1pJ"C`$Mi@9`!r!EIJ*h!1r"@h! +#6JK@Jp&J,GJ(,XCi#8m!-q%'%'-i"A`%R)-,J5r`4[J$Q!1'`DRJ31!Ar"'H#3q +%6m!M`"l`'ii#"`$li5RJ(*`,RJ!(!b2"3A!0h!3[`9%`'E`%rq#Fm&(i$CJ)YX% +Ii"M`96J42"Jq#Ql#KH%%m',i"(`A6JX1Jm[`1VJa*"%1T"2Yhcf5k5N&Zpj`G+S +iRES!8MJkUIrpXbSEl$$63FHNmV%!-d(4c)mJANQh!VM4b8b1*f!B*P4cm3Y%jAd +jISGQD,k-R3D)IqCiBqE)T!4b1HhAG'TX49*Rp15()qR1CBC'YqmT6pX9bL'Z+U$ +p26,$94L+1ML!))aY3J(SLC6*,1IUEfXMrCpimXB"aQCQ4[d#4r!VjUdbD&$LV5% +[K6kAXImT@I!$-04a8)RUSAmUBkr'%Tf)p)Tr"LrXpLr(#b2qAJ6)fcRI&`ke&JA +bNZ%)2mJJ6Q&3@90pD("#1drb+!qE#Y(C#Aq!qTRJjp4&r1bHHRDM86i+SCi)r1c +Yc%K$l-N4&!m#fY(p$4DdYrUc'5*IDNrL`iN2!"kTDkYqPNBIdrTkB0KicEV-f0$ +`ZY5kSB(L!+jYf8a4j-4m+3Gi@@8(8cr%UMaQ$f,9MmE4T(0a)[l9q+Ia,mFrLhm +YrRAi0q!r(ImCq0IM2a2r@IJILrpaq"q2Iq1hCp0$pMHjVD(``ePbqlkC)$X'rkR +i6m1r$[rTq-r![alr"R)Fq62H,S3Xp92i6m'r'[mUr#G&HTE#JV+XZ-EqY)M*M95 +8hi%&@IhBK#*)kSl([aTr&#,+mDr([`(rQIM2`[pBr)r$r`5Q@Ikeq0IK2`2rkDe +jc@-@jc@E4R)2LH(ZR0Id)l60qN32Z)%UBZTiV)Gb$AMLE[qeD$AXlF&)R(3Mj*r +"(%QK5p%V4@*m5)V25B`JXfh6PMk9h'rjVZh@5T0f'+KNaYG@U!IYX'ie90,AqjU +fVbX&qi"@bESAK!@l0Q6Al&!PKh5!91`SP#d([LZQ5pYeq(`lD&U15QChjkaD[K$ +k#%c#VICecFCV1i"9@l8IcURZi[4%2HY@MqGdRHUZk%BiP3ppe6eL1mii4I+ckCS +1be-@I-khA-rYhE4425fGQE*FT3HYmR60pjTZCF*f+plqM1Gi[PUE,Nih#MSd2Uh +DE3lLpFbfM9ZfU#4mF@hGCG9ep&*lcT[4icT!TZf$TMj19dR,V6NkkilM,RQ@&TR +N39iJ1j,R*UrHN!!mCr4X`f'fZmZqjcJ$jG$fA'4mV9UG(Uj2iXfQ+9fHMMbbaE* +6bPQfUhifA5U92AF'CG&HpEekbGAl(G[935[2Cd3j1bI+"lBcYr4!S'mcZ!I[Y,* +1HkDhDkq1-YU4,L-$fBERc"@X'Dfk`lN'NRHYTlThZrDqTXi1SC*k['B$GCL2m%b +ebY(98+fD'kY@SfMR4G'+Rd4l@P3I6CBlN`F!5(+l'Q'QAN(f0pAb8elSMILD053 +jAP+hDRV)$KU1a9SR&c2`GUY9cMMDmPQ$eeJq+d0b8dh(kc@GY1+U!5%8j$V8iCD +QAdEq0%0R4IRJGLBaDl-AfY@j)4eDGU3!kA%I4R)keY%a9@%l0A)AkQ(l00eTdCE +YIbij46*aU([ZNCNemQ6-5VMcIcZVFCp@$8jbdBm`48'2QIRb8F@Af-%S[XL6G3X +k,SRLLcJb$adU[X42$bUqb*-0#l%8&&rm)'*c6dmJa5PRVYpe3+P4TmV2r,TM'-c +ZZi*LpYqa'@V5UI+lfA@1Ql2RS'IJG&M3A&"96U1"i&3jd@039AkMBq#dk0#a8&9 +qSl'LU[a'[d99qBd1LkVb'`d3TmT26P@9hf`!S+Vm!HIp9C8rS%D"U[)(e&Y39Ik +!%+@Ur!'e)9592q!X[kVb"qcRk'433*DLU[`"G4T8P6qJ2S5UmJI8@P"9rS#D(DV ++(e!V4PAj!fU5U#Tr`,bU+Rp!M409j6FE"UJUIjVje6'D01rDp8j6Nd&*6*VBUDV +mDHC29IR6c*qUmKZ@TDVmD@S5U#TrQYS$UXUITKk'$P+NU4qKU[aTDT'S+RqDZMQ +UbTqQhSfUmUHTKD+Ur'RU!DQ'3CTj99Aq-Z+&U[+AX3j9PEq-19*9rM+qUkVmCDa +,9H8[Sqk#U[+A8BG"9IR,U1@J$+U-HKQUbPp',3P&`M,b1&AP,k0HMkTDP9'h4PA +jbkMaSkVmCG4489Aq$2&19INca"G9jFq`YP@92m0D8PAq$(1R)aLC"BdDE1KqU#U +rfC!!3&Aj-`XD)GM3'e&9rJ`e+9592d20%PAPce!R3eAj-p448&Aq$(@+9*AIE&5 +JU[`CDVQS+Rq'H+1Ur"RQ@&AjcDB&UXTI6Za69IjbiS+UmTFclkV+Adl0#p9b+5I +fUbTr1I8d9*@rR$SPUXTI6Sd59H8[TdD,U[+A8iG*9IR,UEQNU[cPV%Y9j5qRVT5 +UmTF[D0T!6m!59H@[)0DV+Rm&F9C9q5Z)JkV+Ad&X8PAq#Z+)U[*AX%Ce(,1#Z9C +@9F&i9*@rBN(R"KXD*UV+Am&m+aqXS(D-U[+Ec3p8PEq#pDUUr"A8P&)DAd'Y+G@ +RUD"qP+Vb9e#M5$XL&G4R8PAq5R)c9H@[*'p49Ij+mKC9jDpN[V9l8NP-9&Aq5Q+ +%U[*AXQC8PEq5r%a9qFh@#+V+AdN0&PAPVb5289Aq5[)c9H@[T(kAU[*A8U0+9IN +VLIfUbPp*(5*9jFq5qkNUIjBm5PAjXm4l9HA2%QG9P6p,V&&9rLcV6eAjXiaI9IQ +ca(Y9jFp5'dC9qE2-QDVbCiNaUXUIT6DAU[*RfH049IiXkda9qE28Q9*9rK`a4PA +jFm3B9HA2NCZT+Rq1r%G9qA2N'kV+Rb0fUbTrMVP89IiFF8G9qA1XIeAPcl(f9*8 +rajbU+Rq1EkNUIijD1DV+Rk21NDVbQmd99*8r4idb9HA28Ap-9IPce*G59AkcaB+ +UmZGBSkV+Ad81VkVm9H6-UXTI4CkTU[a9a%j9jDmLEe&9rLVb"eAPVb+HULUrYq( +ic)B`mU@mGfaE$Ub(B@dk$@&A8KcbXT1$AFRB)HP+bY-`Vp'ZT,b3!"HQh+Y$+5r +"JXa64ST0()k6Tp1)F#c3f'&[S")%&2'(EGRK![$-MEYllkDKr"Pl+HbDfKSTiAr +dI'U9KF(TqAiPJ85KT0qYk3HkrlkBqE&GKiiQdbe1TTRUKK3a[8&(RHN91SKde95 +*f*!!JeJKQ8N@0pRL*cKS5rai+LYf-24IM02CQT!!qiqRXQ)(djB`qKADjT!!SX& +Jr)%BdcjhVp%r0hecj`"DQBBjZL!F1ZDQpYd,Y-T0Le`eSbP)-qS%)TKHZ(ZDCVK +TJVZRkB+ElVGaH*bqq34fZFVq"c2`VCaR*QIhe(#LEHCpN[i`mKkY9K"#"#)cfr! +Jr)%JaB)U()bd3p[J@%1l3b1&1EHXNP$+@0"S1+0f(F)I)R#"A-BLN!$Cc6V6p!0 +)E@6cMKGQ)@-K[Qf$1r$HBST1Q0FcJHe#XQ'E$TZqUbY&#&+)M--jrFGcQYR@e`Y +a#`Q[cI)$2H$AC[M@()TIc1Z(')H)Bl4!U@)*e#pZaMXTTj6hGD"pb%Q)9X"'Vca +GUVU"@PfhCR0HaDlDfTq`+q%8mY,NZ9@le[6eB$--N5Q%+GUTDY%4$2R@IQ[5d4R +2mbX3hT!!eaI1KC6Jk(DJSQ'%5*TbSj!!-1Pd9AF@6fiFVlQ4,!E5&PDpBmAdm)a +f)D)KZ6AjQN2jM00kSpXm#RI-lHhPE9j2P&-N0ZEe`fqjAB&m"[@hb#L*52QdD,H +'V*QUE%Di)S0L-Vc9#M2315(+ZCF`QR2k,d%HPNH+)bUYSD)MC!$"M,QpI9%HX*e +f#E-aVrpLb,GBPBjQ&k)KU56MDl@JVh*KGN5Y,@6(GZp"&VBhLRT@p&05bG%Fj$N +NdNZKcT&+MS-E,)*8c!SE!LT(P8T34@QRf%KAK3JKBM+#-'M+Y+1NN!!D%F'5,GP +3ee8h#Rk9U60%4jSVN!"9L4"&T@HbNj2HE*6(DYD!*'2Tj&i%[Yf"&!`H4R3N9Gc +F2hf$'64I-DfS5j@#mdXaFpjL6rU@Eb09bqG3YjX@(Cbk5,F+@Em#E8YF1i4b5Xp +d%D)faL"qHG[bI8h,ec"*D#p"`,-GHe)9Tf'k*$,*@dX,N@A"VN*fa,TJNlfK[h* +K*Xd(*'ajS'F+Gc%hYVb0SiR6BQKhfMIQeFIX,PYLPaRk-0N5lbD)Vk3QY-9XEej ++1BN5I8qA+'I5*fGA8&C,A'$pY9CC,bBSPC[)M!0GT+40HNKRBbDpm,b4e@Qcbp2 +DEb@[G@Ki"*RTRQSR4K"j,94aZKaE9e*#)8eT0T*%G*8Y3T3Vdq93p*&R`Y4&dPU +c'q@SR%9TE(B`j6#9HC1%%QHUG8+XqF4%X8TqmLAIH(i+&Gc)06a6$iTichr33B* +Tc0BERKrLd8Y8,MqaC&jS1BlRZ8MaaJB5d*MCN!"C[pimY#U9Y`)))aRV-Re!jBG +(PTk1)c8kV&'NBJqM8D0'JeAq#i+kfT-C'fQ&C2c##$((%6VeKINYhEE@`LMU1Sp +(l3YiK*m"ra#kc%XJJ,0USF8Za@,XKEXN[1Mj4D1M5biZj*jT-+TZca(%c82$l$X +!!,%91,6f(@VV%Z4"#K*("pUm+2EP%GMK+FA!S`C5*2k5Xe9hXrlUiKklrSD&E"" +Nb!C-M)QR5i[eG2'&@'D$l(@0)hHH[3Qc$qA0'NBHKf-)X,i[1PDY'U-Vc4K%VDY +&h(b%I6@a-e@0K3KT"@K$RL83PT!!%h&1+*T"TKL2AEjfSPK2f9NNCfZGSaCKL@+ +-bbPIdQKm`9D!%@1KJ+c,YX!(ePb2M)P-9EG1$6CYTk*'E$m)8`9GUj2AccGparN +QS%l(@B!J,ELe6V[L*--@ed0H9(4hkA64'(LaPSM6&Pme49%Sp2!*mi+V(!,V!!I +U0)*GC$ea#'%ZIX@9HH4M!K)dfHRPDMla01bMj**rDH&f5AH8eSAE6E8)-SP+@)G +V5+RPPk)1*[c0&'6M!0kejEpJZ$K-Y`Y,5p@BVlD&B`0,T52Q3Y'&&EEVTEj#+la +NV@'jNGQP!`qPGZQ!bDdBNP`Pd'-k#$"$3q5PA@)Gj1'#Ja'85HhbA+dbc5$dkUR +,p0cqU*QbS!bJl3C6l*N#a"U91S'ZRK$pT'iJQD4$P1+f4PCE6-fcS@m&DNK20QX +elDI-Qd#RBFFASY@&6IT%L*pX3RYX@q5J#F(N&YLeA"8T2)PcQjKPbeed"EZPLP) +Ma6bbXeNl+MZH'QZ!CiM8(Xcm9HfA5EJ,(PX5I&30Q)6`fVXQ`4*M$6%U&r8i,68 ++"ErYd+F,bf*Z&'`MSZhd69ILp(EDcNJ09#Sf[B4jNbmKTBjPd*KDk&AQ$0[`2"f +rh(LXcdb")+F55hTbq5E($dkS0cIP'r%!mkllTL,YY,E")&9)mJC8JmHK$YeiUpY +%@"IElYh6@"a8k8HhrXeehQ%)X+Ve$XTfiEPem4fcRG9hhf(#l+M@1l+bF*,(m"d +Q4DHdhSQfdqjpKqR5kXil6+FHdhQ(5GDARFK2C'"UpB,11dbf,Zbm`i4XdiPkM0j +KJMAEHBITe-V11fLU,@Ur-cKmU9YR0AIH34YSI5GZ0(8fG0j"XD5Vm`iL)AGhhN% +!j)lf1dNpp[&8HHFIF2B"X2Ih(@'&T9klGr8N%l0qPL0XA)92I@r(1lG(M2G!VIh +*Y4D(2Ae2bLN"9&'D))%J@LDLHV(5TH*)QcfV(5KLE'e13R'JhH%f(kRc5U9+@#V +eE5k9'TLHkE+FNZAlePbT`V9*YTG$caqCLE48V"b*d3l4C8&N0(3j"T'0P!GU,09 +QVC*&#&Xm1[cM1ChA4c@3!0-fmREf4QU,R0-(PBq1d(,l5RkTi6Gm4*Y03m*MmDi +Qe#pR$d29BQ-HDKShfpcD3qBB4GQN+pcZ@e8SFkae-,JYXkbXj-&iTSbFESEXLL` +5NTQLrSHSL-b0G%91jqfF[XeBUF4Xrk%D+M9&ViDp5D6&eXNG6GEV+,HLl),(#Qm +!DkDJ'V,13p&dPL#i3RBNS9ChT6Sr1)V+-MZA,!JL&CQe9Z-&8G5R4e&c1kG[#aB +A%4@E9,,+8@df1$&VQ8M1%#j4PCMZr6D%66U$mjLVSkV3$A&k,eCeC6(d6GJkT,X +"0Ba,X5++U0mX3[hek*EkcI+`NQ%#C9a@YM@4ZTkRCm[B88A+FI&iCY1@55Y!j8Y +Kbq6SZH@,HMGa8C9fc0I+6LhRPRrqSYiqDN@)'X8@(qDA-pGGRULC9%054@DN,l, +F#UCF9qEcDR@P@Dr2$8E#+6H*HSh+YD"A3fT6hCb5PJPJ89ECh+`ASbPkdASj(GS +bCPf@Q[3H9)(6`0(4hp3U&0VUU)S+ID$j-N6EQ,-$6Xp(RU,qXSa$Z6UKQrMHh,p +jF9Diec%r*pcVTk(faQm&,JE$91ImC'lLh)`CADQ#a'HaKhRpa-2!rQ$NQRNGKdj +mLc2@LA-bF*ei*[29L@GKZ,VAXAI5ZYHl[jcL'Ha#iJS$f6Yp"iY*4l8,"4,0C*F +F4h)@6@ZAr"MGlR-DU-jiU$[a61E'%mrLm(X"'T**q&K3Ti#"L@F["LDq-3D@(,8 +!5RiZeiAiHc'`hcPIYSQcBQ$LBc!`m8J`F#$c#PQ*Ea%$%qF%!a22"!-6caJ$5ii +*RT5mqmXTaX"#iJSBZ00hX*J8!`X&%Q&JbA%NCa%'P[c!`$kRJHU--6$a6$!`m5a +LB!%D%Jb-T*X+%"JlpL*Jl"S$B0&2NepdFfP13Zp&[jfqqAU0I4AlBKF$IE&$JRc +pq9DFLPf,Z"Il*V!A1bDS&c['S&Id5r#Mk,bcJQ,%5c*@!,`qei(k8EK,UL*#Zk, +IF,)LV#Zk!A8PRrjUM)%ZGNa`,RBX`Pb#!JR+)6"8J$IMdBYVaLF'Y,b$TMC[GrQ +cFI9L9qb8,cVMT'KPE!DQM#A"Tb46#LA'TiK)aLQ")Z14B*!!mBM"*qq3!"4bhLY +1Fi`c0J%&J)Pm#NP@5,'*M,!Nlp!AHi3HH6Z`%4U6kSL"`RJN#'%mLY"J5bl""&G +NaJYead+V)*'TkHXQbD$!9X`+p$PHQM[Ue+G&Nl#a*-`q`UjKpMP+Q)P6AjJa'LC +4PVL4"PRbNaKMRli3698PXB@!TN'&$K+0-ID&d5YG9S+kSRq#HNARBZ8Ar3XJ824 +1i,2S(#0T[fm#E2d2+-EeZqE&P)Ued#ZZ01$H+lC8SRG&Yk4NLmjap3lilNU9Ur+ +Lhlk#,c+S)IrK0-FdSpph6f&'j+2I&4ibi$G8"3Nl+6SR4+ASh-Y'Lqia-Hhh(FT +K6&H,'RFPT#dp80!9+hSAXEEd3!&X5qi*fTDmBlJGF%l+HZ!&VBN"hj'L+%$ZN!" +r(Sckr*eiBUpIJVSPlaKf"jf(%qD!Yq6BKlbP*iV3ZqZ"NA6(i$[J[,G-)rJGm!9 +r"aehP81#`#A["),c`S)P*!`p%`J-hBVB&hVfbqhKPk"Gk"E$A-%V+Cb#UeC-`FP +94*69!T39(I0&(6PDm!SG%Y3+h@+ik[AU5i-$U0#M$jP#hb)NP6ahTLd'SB,A8"& +&X&0`!Qpk28Vj6"!QG"XC5ZQ6@BbF3fR%dV48mm+F'IK6kKd9SdUF`kK+mbHPU1) +Z6c'Sf$H-UGM6,i9N@Mh&@)a6'%5qR9Tk[8KLLi%8rF1BqZP[+E`5+5M'edGNm`' +@A!FL$%'K'&V%%r)aK6i$`55`d+pNQ6c3*fZCZ%FDPiRIJ1"P!KhpN5F2p%@HZ%H +4*hi$NFF!dapil0mAGq`GK4fl$84Y%+NrA12B&kGaL`)dpS()LVM8(f6aMEjiLbp +%S4GG"l*3!Urq0*3HkFY$kBNS%5AIJ8b%N!$ARi,3Zbrfd$F+1R3DL0C,Fr*D5"% +6pUkHC+%'2m[aafNKH@'jB,c#L+IPH1LiS0df`Xr+"Fdk+RkAiihMJLc)+(p8q$2 +iPq0IJAmPrPRmFrKAiAmdrT2a2`(r+IKAicm9rfRieq"ILhmGrY2aEm"r*[kcm'r +%rd6mG6GEXjX!H`bJYFKH"ZaF`$C[k1@laG*dcc5MJmQ#$HaE`#i&EX-hpKCJ*`( +f$@#A!2B%B!F!GQa&ZapGIV6qpk`aqG3aHc%%V*&NcE'KirEYeE51aZ5I!!4[c++ +&hS*bpa!F!8i`X,1pKd*Tp36h$MKjlI)lqHhqG%R1LIdFG!(1LAdIj"e`H-(bRJc +a1fcZZDEc$VMIh0S$B#4Zcm8lHZ*Y"ahrF4X0aKc)E6`)AiSh(B42`BH)@IGhpLD +FJCdCapq8G2,'2ki2+%p6),eV$HV62eaV8"f5Y3BP1+V1j)9eHXdD[5i@pZ8eHr) +k"aEP03[bZPL+$QkcDkrED5eNKpG%'lKYKS*)mf`$LlApZ-Zq4*YRCqYCfH(CahD +J*5cDc),0,0Cm(cCl&N+GL39S*U6"GpaqkFmGFT(&*4hae(,NE(SmA(mC@0"G6F# +VB1[@'L8HZXUaEF!3i8'C`B2jf,C-eX[cYZ'#``26-dh`B*-9cmB4)MbS45mKf,U +i!F9bV$Qac[)ApXMFX69D@h,qS1h'Q3&&K!Hjlq'"Z@fTecehDcjDeU-akjDG*PE +bm),"4)3(9BrMJBbkHmR!S)!(N``H'&'$jFd'Pf5G,i[*qY3D#3i2C"@rc%0iN!" +I4Y@IKJJ4(T3Il5qb[A"(',r@BSciBThJ35['kp$blNleTMHP0mDY)8+%"pAJLj0 +@Ra,)Dc$EC6jhVXDIeDAp!('djNB(6lh6ZhMd`'R0Mh+0I4p!(+Xb3r%!H9e@'&q +1m&!F+iEh&0168kSF"&p5LDpGUC)lflYrC@q+E-Q5e`iCr[ae2G(pcIFa$"[(f"U +ib8EA3mI'FHVkZ)!ipLENqh(XA66X"h(X#H4J($,eR0T`B*ZTeiH16-erG9XAl6@ +IJ&E#MPZLKik$pN"fHi8QmIdXrPZl0Pb45Ma`Ab4VBH)BdhFDc`Ib#LD1[HA4Zlc +hD&khBL8%6d!FXM2j2qF9h38AafiN1KM(f&5la-&qj(Z1LD0E6Ch%D9f,h!#eFbh +L0$Z6lih8[T%X8Vlcb2VX4PrLQ80#c1V2AS!ic'V9BkGh2I5"dadfB`,Li*JGirr +jY1'[M(YN98[r"q1@c!kqm56M(SR$'m#iP`lZ6*ekThFlqS(Mq@$Z`ePpNVP2a(' +!Z8r%FB#jli[MFHBq(XF2Q([`kBrha!!`pk&m2-hF4a*lL,Q2ah'!Z3q&m44c(ip +MM,P2d(BA4lHZrEMZ[4q-QrhT"mk6M(Xi$SiRJ((,"N+Rpk8@P`RU2ER[-bD*B`m +b2-'B*Z)i`(6faI%idaQ2i`NN(iVM+53IMf--p#31XhR51%,-GV#9rqL*1K+M&5* +aE*RFHc)1fDTq)SjFlV%p"E+jA'E(ir!hI,k(H,*l$T@i,`jC&(-X$PPSXVZp4-j +34Dr6eCL!["lQ$(NZI9JY1H6NBmJj9QIjqZL*!pMiC&+dXp!SaNb1ZSm2Z)F64el +lF"HUri4GU#qpZ09pp!,%dH3%J3,%#)!-ab&B6ej6*r[NTQ[S"FL(kICj!H*`hEl +GF4cXpQd)kiikK-e[LH2fHq&p6q*qf1[fp55Z[DDK$L4Z[Z@U3`F60jj$-"'Pi#N +Zr'p*h(cpfX5elm"l'XGeV++4I1b[-qfbG$8HU9Hk,!D)4Z0Jep889i)pA2HQbq) +&U&I6CI%#a-'aF*Ck)UmQ$LQ2e)rUia9BJR82C3KbZA`-`+i%V)Sr6Me5Dq)R*Kq +DaPjjHQd+9f1lMq%`AS!i,YlV9p2i2j0A@+QrBQCapqRR3X86FU(RkL2N3Xr9Ucq +Jifbid'(m!)%[YaZR*h$fjp8rdERQ++Gk0UmQMV%YP2I(-E'0qmciYaQ[hHFJdr% +VcAJG2TkP'DqYM49f1TjA6m'Xf1(M!CN9'`+3!+GQaBD4fKF`+aE[L$0`+Z-RQ,Z +RJTPk!C!!dkq!92[2a#CCrSqHMXG&+@Ihm4$dB[a!5MQ(MfG*+HGJ,fB`%"p",fE +['kUiXqIiYa4haXIr8k[M+ZEr$c!iriD1`"2-DbL1TjRA5%)1-Dra1,`6qJJ(QGG +J)(i"R38E4qG+R4'%D**D8M$kMKq!%CJi["+k$lfET-b)UGXFa0F'!reiS*[&H13 +f5DQ0RGXNT5i'Ic1))qq&6A0mFjZNf%hhr(+ET)6cDa9YI2$BckreEUENVpq%m!K +kBAl02cH[P)fGQfI-aGj[3XKQqHa"cfEJh,1hHAID%(6q[3IIp-)Y1@rA8dp1S%k +['1("1HfP),4@G"mp##G3Cf&I,k%&ck`CEr,SGdJQ[5r2cj(b!3!UZJ`-##)8m#" +`@qr!"(+GGmTaV@fr!mA-ReXAhkR!YDlc$M4df[)l`H)l@9bR,qFRISHjl4R,mF4 +jK"rAGq)q'YGCbqq8,lic'GGM1[Q"RdrT[)-dF(ARRDQiRRFLMa%16-2ejCehDR! +p[r01,Dj0*r!LHUF1efcRRHQi9REHNAfI8N2YG`B*JRM9ipVFHDF"er@GZ'ILZU( +ccLaFZcV[()[VaNjqMX2e$Heh%X*qkq)ld2Bl6q"&p-i*Z0lGHHG%A1pBaS&m%Z5 +GNh$pd+PmKm#9Rj[fTEk$PNJ3FG+bGUpq2#VIfBQd)f5bbc1R(6%YGNilSZBR(Jc +Y#,GVKdp11b+0PB+B'qIc[TbDGCQaSH&eUA9$!m8"A0ZbQH+kZ"9Jm-"JJ#IQ1"5 +`DK,*K+r9Q2$4e%Z3!%LXS[E#f$JdKcPr2D0L&kJZH'%U63CTbkfderbK(-Rj1(D +jaH$J(Zi&G[J36pki-R&eiZbZbirKJ4FJbN*!AJmX%"d"B'j#N86H!I-Q&%RN(C4 +"*K3ra!ZNR9#XN!"h805B8*L3!(G3e*K3Q*!!Ge$+'&BiLGj"+H1NjAIb5JrLK9, +'X(**p!j+'40+(Z+&8XD#cMXSCCcFb3p+'41+(r)15KN6LKrb$NSC%`SGmJj+'4- ++(I,1mEK1+(6)1bKU[1#88SDmJe,',N@01*k6FGfPU&%k(PDP$*r$1bK3m8`SVF0 +1DLReFlGjlmc0clrPEDGLp*UGUD*N&Z2#A1"#crcmpA1aEVK`R25RBPbB"eai!q" +L@D`E,U4")SZiX!kim)K5,cUp[l$Al&`18!J&PbdZA!&Fq1Emr$ZrVF(V96YEd&` +)'mB@&hi5LYfL`[RUjmDkiF*G)![pZ2!m6",-LA&$"5DGd!b8(S1SrhMQ0T%52-$ +SN9-2P+Y9Lr1a3F!!(JJr#)j[qq!$1Kk*E4m1el-ABYX(AmhabfRbp*p*q,20"1L +!#)(E!!Dfab`5mi[-RS#[+0%IK6pE6CL0*H3I+C!!H!Z1(i5Gf%4k8-$%Jh0D#pR +K09Nhe,kV`p6`E-1"H0kfriaKL6E2cYDc1VB-*XC1@TfcfZKiYq8c8'2G22dG$*P +TC)UH1eIM[k$4F1)"iQM0MCkHB49KfFCXRFVNC(E`MGEmk%K-3"bV-N2a!(PG9KK +IM["3(#Z'pa66Ne1U(!4I8SQ[ADQ51pYF0AY6C&YS1BlRZDNGfQNXZ!C(AKI0G!9 +[[)pKf$M@2KT[kd3UXb'cI[fr9iH,ip6eF3&al%h)pq2)TreIiYJ6b-%iK)UP0Kc +BCZVeS506merGeN9lc5I3+GPaLaVA"p66dEr)EUr`6I(p,2jEZcCFN8SmF&r886G +aE2LrHU8*Bq,B@al%d@B&CFYj*,%fMSiJ,L#1Y5ZC(FmVfQFZMYe)G$#1-DT0ZBi +I%dHhQMU*dj+'"8&G48$YA!G`@UDY*J)H1kXcBkIj%'mXIS`4VI2+c4rRJX4Z#rc +(f-IMFA421C1RhQNE2T99LD1R'4-3"fFfLZ5C[,EKVmcpV2l,PTPl3q`(FjI-$Vl +a*(-ILF-E`0bA$Zim[DjBDhlLG$im(af!iD`qf3'BL10!"f!LMJ-GJ(ea20i"')p +M[!2!d3j!m1Q2pm3!G!#'m[&d"f!NXBFk!10a(1J!$)Aa9!GJ2)ka$S$%-G%%X"f +!cYU2kpll`EM2kTrqYcHHC0c$FA!m!BalPHeZl%[0pQpHCYbjlc-QL@-2-Mc"Q#E +L1-"dpXAa10-CMq-**"q+ibNN(ipM$23N$URlIFamYQ1[S&A8N4LY%)PMbq6HNh% +XRGal1SjFlX3iKjjX,TICm6Mm$Cr[)9k6UF4pF@amP#Y+("ZY)1#@)&Za+%3aZIQ ++AUHV-3&j2F`CmPakM*-IM'-F1FIU,&mI25YPpVdcDDFeBjh%Q-P4pr%"ph$Lb'X +IlN,eRl!,pD8AYlU2AS!iQT`J8)!B!C!!i6J%kmPVkQ5rhA30[3$j-0dq,d!FVYZ +h1ik$hEi0BGe4Kc$T64bhh`[[Ha,h`ekhVbGal680pE,%c@qli0$"a)hR%%a%fhZ ++#rpE%MHrpCl%YHr!HaV(GDbLNAcXVc2YXR3e(UPA@L`'L%EMZ$bE6kRdJC8ipZI +$G&Qm!29UZLaHJ$Ji&Xj56q69a#(PNIT4IEc#FamG)`ebZIarMDMf(45'aUP(DNh +ma14$dpJV(qP0fH0UE2Fa(-B,%-I&HreU'[pRmJSVp9I-2Ziqr9bSH%)Zp&apK&c +SZAVe"mbF'5jd'$p!i-[YaZN*R2ejp8pdVMR+UCl0UiN$6R@i2XC([$`JdpNHS"Q +[hHFJdr%VcAJG2TkP'DqYM49f1TjA(m'dZ-b+(6iHN!"CX5%!H@T@E"LTI3'cBTD +jYfUrYY`8VBbIB1kH#QEU"8"1[`*5l6rMJMXq,m@GhFG$d)[a!bRZ($kH*F@GJlf +B`8#m"-SpHiiUpq`jrLh&RI(arp6UZ)Vjr`--cVqK)r!%maU+ifRQ0C+3!%2-Dc` +1li3q`N(Q04L)Ad"R`FE4Z9*R"#%l4&T5-2U1(i!4Q$Lm%VS22Jj&6iDU[$U+RR2 +-K2Db5!A5R1b19r%k-1(rYeq1E-'E$er(ZiHT[cKDVc5DA-(feHYplAVeG5Pk$YI +pJ+*R2dllka8pI3SG!$r3Y2GB"k#NAI4-"m![THKjZ1k2D"N82GprrSI!9NIBlFi +6XpYmpp%,%%HNk$NFai"bB@pAc(30[3$j-0dq,d!FH8A2d6J1G[Z-LPh,e@e&6aN +5@`fl+(UQel``XNpjrqKGADRlMX#%SZGRi2pSeiBcRDieKb+&ae$&EL3IqqXX8[3 +FMQ0!dE-hMNM4mpPmQ#k,&k"H6CI&#a!(4pARRXfVLF-UHMiEaa'LMD+R,2YUjR" +hciaj6mq+D5J[EG4@S&1$6GYTcl,l8iiAEX0kFm,0qc0ahC[hqa6`3+jP-A5EpjI +$kS(ChYfXRejZTEhQ$eFi2ar($R8'"rH`(hli%%rHZ$*aGH,XVXZ2&E)A)-S5-[K +QMU`TcqEb&9fQ0)40&fSNF&[[b#peGZFG1MBc@Zp8F#(kJAFBA@Nk%8q8RkQi,QU +r3lS'hTQ'Dh2RR9TFVec16ci*mNiGVQXkldc(YEhe6Z@hhVPem4h4Q8ZpZ2012Dl +C6Pddi&VCH@FQVZXllmc#G82RR@0alHUmFabZ,eKq*kkIih'pZa22#EMHdAkRJ#[ +&3aMD%r"Y[q1EhXpqY&i(YMQ*pMA0ah'Nll#Ir9J(B'36jIqr!q#EfZENfESrSQA +BjX66YCpp[-e*qUa[EA2bTDi0GepeI*Z6MehdR@e1MXKdpV223[)c63(be*0@F6l +EE'b`AV[DYq2CYMAJ*"XEH18fZT!!DqES4KFq0ji!(JKIV)fAfr"$m+!Zf[$$$L` +YEcEBHjLr3eX9l3GaDX!3EIL4H3J2T,fecI*Y(D1'#"%HP"Xmk!apElrfTi08)E6 +FLZ9A-#!"+ZcBQLZ-TM*E"fdhcJ`G)VjBp6dmi#BXBRkq1HRBj96@,6[05R`BJiM +`)2Xi(SLQibE2M5@$K!J2FNIlLfXKipN4aUqe'#-mQ#jid1VjHJ5#VYfTh[5Qp-D +i085)m'"+21`fJQB&`FB"*`C!ZXAIFIaaf`J+)5`F(me'B8qIpP)3@LYcm4k%%d4 +ELrPT$SZIM5d1&bm'Crm)mUkq+`kKDU-9iY)32a#@CMl[bkPCPaNE'PkA@MFd8"c +!Y5fE+Dk,9bN!,``'H'-1Zmqp%4S6R$F*ahXc1lTbhK*Y[TG5EiSffdZTk`3ehUE +1M1kr)[Dhbh[[L$4-8ZS'PBcZlj*Z`2ebIlHmpakjrkV%p`'a2bch$mVp%ENr)2P +j81c[PAMI*rPk52,cISRRek*hj"mN%U[J)YH*1N"B5-rJARbHJ#0e3bUk6bhK*qr +Jq&1RhR((ilh-RArPRE4kdNp#,5YRQ0(MIbN3rm$ac`cmqb2'`rea8Jcq1%%1(mk +T&ElQUf$C4rB*E-ird)ml`NpJBqjZL&RdK"Kp0(MUTqK&aZI(mbXLX%Jq*`3)j4d +F*`30j4dd)&rr%c@#S+(MFei$1GM[4Zr$2@(,kNL+SGPrC,%JfH!0b'Z8Adr1Z*a +rTKkm"-2[hSSb'mR+@,lBqU6MP&bq$qD`[-(&!mmIi(r+iKjrCKf+jFmF6efBk,R +eaN42GG[ZXG6iMLPeAUV!fm*ejekU%V[Z81SCpk`qGkHUTAD2,C9P9eLh'MNV#+& +&QjPYH)&+&XY1DD!+KkCk45AcJf-0l3k0&1EFXNS@G%KKf4DlESF)S6TGR#i0kDV +YkNc6$caIGHFG,mb@24HqEB-lm0lLV&[eSYFcJHhfUD5[`kE[kNTaVU(9UQhprFG +cQYR@epZ$A&aIbPYqS!ImfJcIQY12flcqM5VTk[fMZKTQhBUHa6XTTj6(1XUGrSa +'AV+19jiZ9Ge!VDjEXcQ[BPGYl8rBPA!+H@Rbh+TGDrTkX"Q'b03-CV(*FQHXB-L +hpPZ6MXjiRPm*9$GHAcJABXhPE1"B-cSI)X00Z9%EpE*CG@Iaj-EaQU[@)J+4pTA +!EY4q@*`HRY&Z'1A@j'[1aELGeK[GjQh#E@j[,frcHU+FcSYb+Rl,lBT@DePrL`U +KElXeP%q,GQ[)QUR+CS6,GRCN@2EeDr+D8C4c,f%djr4IJM`X,rZHidaDrN!jY$d +hld2jN!!-R"9&26I+!lE6,Q%fj[9IV**$GY"`V,PK0r6R9*,aY9TKH@TlGN5Y,@6 +(GZp"&VBhLRSfa%,2klcp+MQDfkj$4(STeRY1*FHaKqSL+p4&Zkj9XP5UkE!8SVD +l+N5)Db+%DFHe(58P+*0Y)SJPSDkVEK6m+P0R'e(+c4A)C8H)XM"k1G8p1HR04RQ +XCJe)-Q6rCJPmZa1UERSXpM9NYPH3!%P-V-cJ26e0)cQ!hcX,GVhKk1,TV90m*-F +IYl'FIkBAH369XU+219iraCE8NmI(aST,6KAEahG(k-)$Q3Nl)1r+M@4(Kl'JEPV +ZeA+[PhZ$h'Ib,RSZ*iRp@,R2NR[jBR$PCk'jXXN,2GK-A,)JEkfmReem*ddGK*F +@Tp'IZXDhI"XD$#Re&$iNq5ZAHi8mE1ab0hB*U%lZ,N&6j6k0Gi6Ip4l)252qdq8 +qJhG4IDpG6%MCkX)F"$%fI5XK4dNL+ZAKV!4Z!K'rSq8q43*b&@%b,RH6+2%hP58 +*0!Q5pdd#a$je-3%92cfK,GE$jU0&BC)TEjPB*DB6&YqX@JX0L5e0[kb$e2RS0eq +IbRK3h`K,qcKjh#4)lXjZ5PMZ,M'QmZ6H+1mH,`QYHd$GHHHG#rr+Dcjikj*pi*q +F)aq-D3N4mcZp,cAE[rN%Fkrq2S1632BJc"--EL+1!`aZ)Si$$'jI()mcZ2%iRQ" +H3h%mcEa'%R+)HBh(FB"j$BAa&21DL1-*jM8B5-Lm*R")!(C[4mE'B5B9KJp"b)5 +#*3@MlhJ#jUH)Bk1p`P+LMYBSSNNF@bEhRSa$0$chaH%(R1I5ZkF22l`90HV(@N- +eUP9IcU*PIT40#Icp1(N%qk,Hl('EQ[k"5MAiS(HR*QfdPH9ZY*MPEX5JR8Ueh)d +@XpbGHRAQT%Ueq"Z0Ciq"5VAi1G&R)krY-9#TPJ"Ga96pVdUeh'[q@k9DlLI')+K +8brf%YNTeG#U[qI@&b(dkH1bc1fk6d,3kCr@T`362a&`#`jMqR,Q%Y8(3Sa*IZa+ +,-+jV2C!!hI%UA[[R%S+[I$Qb"@mqI"h[(UDjK0&kT8(Y#VD[AZpVekXrD5l"*c" +2X1%N6ZXm`9$G4cMG8ii"i&EqVEN%CHiM-K%0m@mU%Ck&$S!I5#9LV!0J&,$m!4d +!rip+a&J(31+BD!,Ne4d1eld(40eK5#AY+A@(8E8e6`$M(Pp0)"GAXCQ!Gf+M!2q +%mViA3$(I))aA3U%qPhYBCm+HE#kAfI%ir!fIlb&HNkR%IA&XI*3V5KbSY-QXfDB +'eS%Z*MGIdH[d%aU(qA`FjJaj,Mh'b3r'-BkFBh@@ViqHdh+5%fI5+6R1b9(hmIh +RI`KXGB6GlM`aZmeh(ld!F4J965[c0ab(8qIEh@mhA8-[3$j-Ymm,%)IVpZf1if# +hckKIYPaYiVMpA[UPpm"HYkqRDmd,)rZ8pirHeC@kl`K--f$p$2`IlGT`TY1ejP" +2+`kMIMQ5MreeTPf@VXBMp8U,CD3lBZ-`kTI)-KkZHp0Pm3,8UqQbH!(Li+KUjE0 +j0A&)HHcZ3Zf2idLS43RiL"KK-m(8+fk$'(#U(S6(f%N91S&((i4IEdI`C-5FSGr +QShj"(bi[K&rA8Er1@BJ6DhaPrpMfZjJLaIK*I,(I#cm(1hi5AqaAq8`QCDX2TBD +UbDF`B1ZAr6XQaITGX3Ff&3@[f0Tk,rG"ML#+#M-Reih,kmal,rj0f%3lf2MGak6 +Bpclr@GK%NjL6Z3+AFicIBaXBQ29,hiV,dFE[SHFa3CS2DR+1LHm8Y[+*PfXBApA +B63cBqXek#f*8[j2IcTaTrC(,'K2I4qCKQb4aI`+A"[2HPHq#l5MMppY2K`EbSmC +[lMmc0pD[(R%(CjNi[T1&!l9$ASPeK[(laP0KQb,a-FZYGEEUpf"6[IA-2AcEqPh +f+l!GBra14Ed'CaUr$Y4kk[r*Her%j9`6hjHC[fR'VrbLGKaGh"5ka[Lpq%Z)ii[ +'la@[KN1Y[!GXfMUSZScaeBPI90mIiXcjG12Am$ZiI-Vi28$X%Xd"JjDI4R`fheA +Mlf&K@,rTe)eqYr(lQ9pQ!"VIDrLSMH0Y(i9YT[%l'r@G6KUr6ckA"@cpIJ*eA'( +mUPlc46JFDrcqp'q8f[J+mpiRL*P5Tjc6'HXYp6"JML)PkKZrJ$Jq8JqM6RcN0rm +0T!DE3SGkjC&IqIYBSr)HZ"[l4AKjfc0J1ej`mGXY[-cp"A1Y8iTPIpYqlkA8EH" +0B)ek9EbmJI9+A2KpXSeRNi%"U@G*h0pUiq8(2m"Be3q1D['bURijE-q6I%4iqG, +IKZhjiKIKjGDEBAZ"m6Y[BaX[lfDrl)Ab(Ma!F@,'2m$f)SRlMpTiZI*ff%iaG'8 ++mZ(`XZN&"$,lhNXreF,,UTmKpT!!Iq*MJN$aSilmpL85(cE&SDq3!$I-&V`(paA +RlL!q`4hNR)BkGRKjjXHBHhd2A,0i@C9p"4p5[fAY1(U)rI!X13YHdX,,h(9r4%" +4(K29`3hN''G)rSMIi3'Fi8cMe`MF9EbX'L&28UEB00('bpZ)2@FE[lP[EZ2PZDb +PFicIM$pYi@99N68rcrKGLYT5[+akqD8%-Z[h,["1KjH68A1TjjLk[1H9518IQVa +qJ$M+Qq39h'S8[!`A2`J'[`)X%K`eH"RkT@kr$jF0JTH4h`cQcq&Pj*F'IVXkrXb +I%fM8lr0YIVQ5lB'ALppMlIFHq`hBi)$J+,a4mA,ZPf'MT[$la6DHAIGE,'$PHH# +[iZ9[-PFk162MR@fmI2lV@C!!'SI`!iHA6Em)QdkfC-JV0,kEb$1DM9m(m%Ma-[F +ZmKlY)'H)aiS6,F5)#bAZEl6`-RFEmfT9Ri,cJE-1,qpQE("*`THF1EbF3Hbr@(J +RI&,jjCFr$C[1ce@3!2FS$Y94"d3RPfB3)aARANJ1efVm&J0((9jHH!dFAL(a86q ++PjXBfe,M0j1F@q1BmrZ`DGYP1@VGmFY*`-l8,mKlp)Dd$ZT[K!fm"AGT6'ZHDPL +lbihI'A0Y[0c-Q(9lKG@)@r%bpjF[KF0+ihFQX8ha-RJM!G(kRFJqJ[,,Mj0V#Yj +bEJ$(GALjk6!$Xhi2JQmj[&a$M)'c5-LrpD)fA[lCpI!!%mMV[e[%5qepm0lkAd- +F2bpi'IUPYM)I&`PH4RicPr!bmJ[)Zl3qYK1MVa!riPGqq6lL(2@1(cd$I@mZZH8 +DmEZMMCFei!3Tj02J+pc8i4BFTGhic5+IYhKCYBdaU3c$62*4aFXjRb6`D4adDbe +HjYlc0YLdphEQY@fm2*CF3AYlY`-A(9lq$M&5Y@h1CYdU6Ya+EU"MQM0IhXE,,j! +!XeQ0P'!RZ%,0VHDp@ci-$jh%[Bbm6I(bGH`pDHpfjZIEr(,H2YLdMeC2hUYe-i[ +BVcfr@Da&aENVb$Y9,qC+i,A$bjGp%!lD[cZ4'+rpQ-GBkcTV-S[iU(%X*aI4[Pl +hP@fmA(X((-!&hU-qY3jQ-rID$DmRTLSIqMLaP4a#%qJhD6rQXkaKl61fShrQq18 +FiS6fD1HcjkGi@FYHQ,CN6b,I8(kjPR@J2HEA!$-FAYjl2aaZ0(iI3,p(m6,hlU[ +KF*1"Jk2!jaeHIZXEm+#R4(cd#aaHDNq3!22Vk%8&#rfBb+qHY5kiD2!bmM[KrBY +i'IS&,[Mpj&[UBHeS[c1i&,Ed4I9'J2FL[r6(Q0GEmU0"U-lq!h*qH!GjqQYFY-m +D[CGk0hQ4a,H9G46eJ6j+[[USq%9mG`eamphL&q(k5F6)&iYIP0HCa'CE6e2[jRX +kpR3@H`1f,UHqP4K+EdG11IYLQFK[@S+B34m9+!DVVM&q"RI"$HU'IU6'Gbpl#@! +lH%0pDRbrcCc"VBJ2hQMMQlUIH@9X3-lTa(iEhp6DAE$G+[J(6YRiTPh-AX*25pa +ID-Ih&q3'F$(L)dl0hiRX4`SHQR`,VVMmc5*I[%hU"Rc4q$l$R!V2-M`$2QRMQhB +0qbjJ*['"UCUrVa&li%&bjK'r0,i9l+hF+INM[fqU"`rfq9Dbcr5)q%AeI4&aeVd +AeIHjj0aA#mjTMjZAbe((H9iBqJ9AXIITF#,d5chVVaGa,[*l'6RS"B+,NGpTj1L +@*ehb+@)-25k*qra[Y[S+,4[)!qifIJqMAK@r@qki'al5&b+60H!%LYmYIHa9r+b +*lf1IDI'UPRZ*PA"RmN3p@jjab6I)aHPT3&(TGeLqd[+l(i%0MS!Ih-AbSCER%#1 +B%B"Z#)BTVfVCaIi([3Mb6Er0mUU@-mNrb#(j$[X3,D2XC9LGYZ"jk(FVVfUjR&b +"RLHi4Gp%mrflj-aJ$[b*AT6&MjE,f#ZN&b(em4$kT-T6@rDba`5ITH6S"9TFDAN +AmHqATHlKGKCA,[NRpUASVm)AkHpE2Yeb1hYDp*VNR%%FX(bkj8TL0cL2(hc#mVp +,(N$YTYM6`!qFdhTk!AZMEc(j[S"FcI+rPQIr#@a[0Ai,`#H8rl8-%#Y9@qj#mNA +,reVZr@2Bk!@"Lb&1Yjar!fcd*55%G[3DPIqeE'F[l1e5Ir!'fiGSZBGe$#lK%[C +e@RB5MiQ&&)%[YJr4dX2H!Ie!H#TmAZYX1V(ZIZ0h&A(Ai@Z%FrA%Y@V`-rK'a*p +@XRIVhJ[pdKTmU&`*lZTX#HG'pKhSDi+lNGrCl%FlRKVjR8Pqi2!imV0(m6Mb1jF +eBI'iGJpV'#iMpI6Upq+C#iaI$hZDlc&qh`6f+"lA[S3c!-b`52kZ3rlU2K2jeAb +G1D&A,qqY`fb+iR'YaCTmd-6G6(jMkllf0YE5H`8r`VjJlIAXUc&l3PlTY9JFVEf +Er@CkHK*D*cL"iR&YJl-(c1-3(lK[mEK@%qIJ'[!fkP,MZ)UF"MiV)EbQh4HXI6e +l+!qEpqD66fZq2dHFJjm5(h-Y&SGU[m!Hfb2'le(N*T-eITpLMr9$aUq#q'(aZ2C +#pX8r,2`-h,9iA*XRYM+E!2l4al*iA(ZBFaM`4$RRFDl'iR(Y*,NSr@(i"lc&iR& +Y(h2$M!Bi!6r@HJV)JCJ9NP5rP[cBiR(YQpLM!CI%lcEJVq*aEIU[i%%Hj&c1@#d +Helk'r4*kb(+Z)2r41VL(Xc&`$3RKGZ44mEMQAiP&m"(b$IC8#5j'1(39FGRKBZL +AIMALbq1LcPEKpdE'lA!ap%X9f@0fZ"MjQ6Dq`mA),m(&b1m+jY(LBR#B-aQ#Kq6 +e1qKa+Li''pRRJ*0+2LjYpf8$Mle21)[iI3am3R%aZ*Jp1qCda#m0,U@i'&c"rKb +FL,M"G9Yr`@@XDASJi"!af6S1hNHq!QFNVmcc@$`,$[)pCQdN[M,8ZZ*LF#(R`1K +Ab,QDleTF6%IF"Z`#cr$A1#jNri-j,iRM5[JT,JEVLIAN#RckCJXA!ddHmr[#UjL +RXRJ3I*Jc223m*B5l-,HJZ"MF6Z`hQV"5FQ&r+0M#AM!FA-jYa"f,Lm(PV%Z`QMU +!$ePF$,l)@59QCq5Fa$JX,JBf-4Hq6$f"K4BAJmpbGSij)2cJSeT2(rikE25J*%p +hXTpPF6%B*YpPlN2U!(a5A!cHcGNBH+MiY402,5i'%B6qLBR[G[*XVB-r*TFJ$r, +HeFLIiQ,`,')k'%[qi0YeJSX4$[d'1IhR"4FMr,X'lk5lScK5ej*RJqFXK54j+HX +cIKpK6i(q$2Q'%eXm5lf)h&[QdBMM0H$k,SlAXQlSABM,lHJ9Z6JHCNm+h9lLS)H +RF@cKc!-e+1rG#GaaFAb"K8#249cZ4Mfl11lLHq!cFF$,0BjhN!#Ed6q4phi1m`m +ZMUm6NljLr1j&cpM&F42INck2iHA8KmEa"l3amb@PfJ'HkZ+Bc*NBfb00[`(mbF8 +aMcehqT!!FMU)B4T('fF)Q@@6ppk+ZR&aG,%'kFq,bp[!Ue`FGa,,G1qNfmNA0Bj +beJ&p@RR[RH#a,SkPl(q$2q*b2fV1aG()@5aQRD"Tc,9S('pPIi[C"k$*c+PXJLT +-3Q$5&GE6Rp@YBmSpk9HKEa@BZBHbUrMfhaM(Mj,,VM"qpj+6`*'KNr4[IX(ih8@ +mJ6Y)("Rd(i29aZmmeSE-@q(h!(L5Lkq(A)*FL9mRDph'PlkI2AVi!MK"MM@q@cJ +,`Db3!2Jpb,P2'epkR[b'hUciI49c8#kq9a06rdj`JPkQjZpfpM$!F2&l2AQQaVH +B-kAdXX6[DqL$Z[`eXkm$Ka@r[m6E,ViQjZE[MCpT1fKm(bI2Sel`)kmf[[5('"m +cVH,h9qaMDA`"HR2DQJh+k0fkq'i%rp!0LS)+X8IMqbAddJ,6XddI)Pr5q,k+rNG +JHVETPb%(VMkq$Q`)61mSI6hkibkq$(Z6fS2k1(&(ijZ2ANaJ1(93*6r8qMJ1[$B +`R#*p"rQSa[GTm2M!c#ZR2m+kXI'PrcrU1$$cbZPI*CCSIAmEXhb"Q9G1hd5FeIL +ZCrlX[(,kSqM6ZIJqKjR2)*TArRm!$3e8DdaTBR*KFQPPFbkjH%3(1q*#!*!)"c[ +N4&Cp!*!3$4X!N!MrN!4069"b3eG*43%!Vm&$Y,*[ZfS!N!8#41m!N!Bj*3!!F)m +!N!BhP`EiMZhc,3NRh%f@Xb1,,ZHkkj4GR3[P$L+Fm-b&E1QQ@8GEU-`Mc'YK4hk +4m!92$FrTiCQqEAc5SY`ZX["E[*i[,eN)AhK(EY'ZJ8IiBYUj(1&(q(*kK#mH@FJ +Qbi$Xb2()E4H6m)8XI#%,i5k%4rC&&PjNmI)LQfbbm)8`V2#kfV&Lbj&EMPh,UGX +R`'3K#rQ&E,+3!1-,'5aNX*!!aA@h$[1BH3eXN!"jD5L`J8fLMIcXlHADq4N#l0+ +YR6fY3AlR0FZ,jr*mmA*JXmj*6Z+AAAU,%bqcmc*lXhFKbjXCZF91XJH4K5c(&l+ +mC!Z!"4"`UpH%H6E+1YVP`Yr&C#eq6jBMLr%,J"2mk55pdPD@YD-SfK4&Y@e4IFI +C8AhR*9(ddSm5mrPD[BETI*ACFR)`c[-dba[cHABiD499V#AP#`el`IFRR0q+STH +G%dAI'Ia(mLZflEaiail,,VViXNX[hVAcGDqMSCkX+PJQ#[eE[NHr!(dF(a0`fpb +&1X2a4,Eq6+-[$eIR'')he'kVEDlIq05p1"9K4fV4mH1$`%H1er6K1LHBI'qi)iT +HIebr#[&(QmpUCYfiP6ecAhR4YZMFfZr8EklXeJ[e4lI@ckppCG0N"-*&lSfL*rC +&jirZfhIZJIQCL9kHA*GZr'YAB2R,Qdam#Mbj-PrdSqA&HPD%5q9HjC,0+6(iSJ1 +hMJb9LD3Mh#5kX8bT1Lae+fiLb`IQ'+6`[YfFHqaHRcIS#jX$JTa"#j2,3)!dk0C +kTrkU6AH13+J(2j`,GGYIAAd5L4+HD&QM`4Ml"`MB"SL(qpNcJ-1P'H'R@YhLmU9 +SN@p6r35RNTCa%KMdF`MRTYV0p4BJjb*YXVpmdFY(#,&3KBP[i`"De(F"*eh)pc* +KL2KqPe0c0rAG8D+!mhfG-fDq[e'c5mR8dmpmBc$bcEF-SlrjYQ))8[MA-3V0paX +B!mch3Bb"j[XFaL$cr3A'B22p'+2)!*!!1ajL[PNB3mfh"Q1BqCSap"a$q9k-FCE +jASma`Rbh@,rJqb,'522p0FDSi!ZU0miaheL-dHCEJP&X2ZkBqmF([T-(hkXaaTR +[h4MMcIGaM!RQqa,'420p(f15S30p0GPma%maAbA'922Y`CKQ[QX`TT[[G4Jcc(F +c4SRj[SbKF%2lk'0k"bJ!)fDEMcZGBclZZ04mi-GFmc&FQfHqAmHBEllI`eKJ[YX +0Ir!pL('ZqAk)84Cm%H')QLPT(hHpf(`V-+JGh`k-THD$@S!Yq(i63r-PjD1hbXh +h+B`+mrd*"[f#lamaU!Z)SqiUmp(r+mh(rDibhhU-eHB$,k[0pe)-F!EIQc(@QZm +M'1[-p`"'MIRS-m(S2'%dGH%$DfV04mpX-"qed@[ipQ,8QHpDM(Vcr3j'JrPq(f1 +6qHl%D$3IGlrCI(q2X5AiBX*Fm!SI1,,0I26HG[04!hf(la+-RHCl"FBZmp&c6$, +`86GBK1p2-EJhI(q(X5riiX,d*[1"@I[04hmH-"peRfmqZ-*"mld'!cc(TcL2QTS +i2V#6hX6h23a`#8S#ElR3I1$[4HDM9U'prA5r&jX2A1'HmG&EPjV[9S`@mpf,)Gb +phfF`Z"rejDZR,cFIR1%+mi%P3SAceD[20ameA'@qhmB3CTm[$J5'ilXIi`AQJiZ +md(c`I("!IIh&BB59paIq[XKmB!Gm"arhqa,cJG0J&ljhBX$lm$%8IlRj(X+Jar( +"4AiYq!V%&9pT2[$b9HD$2e!A2V$eH[24@h!II0c"$HDMIRJI[TX``("mm,$I-Kq +mmdEc`6[T%AcIa3!(m0%(V`fq3[&*HKBI(!RZJ`mq!0I$"rET@C6bJ3Y[0"rhcMh +J)rj0jRX["YL1la-BEc%IZ2j@mhd(ifhQJjZq2IJ'#1IHB6ii(T`D(r`(IS322+! +(mB&0lc)II3@ZiL2AHmc((A!Rq,k'!HEM!erI&h`$aFrIEckik!I-"kk$,IM!e`q +C$``&5r'"%I"%I23$rBJ2r2Z`q6k2J4mIq!II8GmJc4SqDMjimKqD$dckQ2RJ-,H +CMlVKK[M!Y6mb(cd-,mE((A(Rq+MlNqDME[JG2RS1l&,IB0dhZ)%2IJJI`FGpImC +mB1jGjU2@cjU2RVREI-`!Q$rJJlG41cl`jTlJ+a)rKJ[JJfGq`Aa`R[[-"kC6#ck +`!cc(ahh"@I#TTaBqmA&mri6aPH!E)Pi)cZ#MGlpU2MJE2"SIA!8F`!G@JT2ik0Y +[Q)rD`(0mB"A21q`&(le"6p!,p!$c(R!CVXPFKlN3mb#`NAN1FacQ'r3imbCi%jb +02SH2`N2"-hJ%h"2q`4b'Q3qc(QBmc(DBkF#$c*3@EN,rQ'NC@-&XJcN9r8+Id"r +d"GJ+TS+PB#Ki#rD#"f!RQ!PfJ`hJ-lJ!,S'CB#@p"MD#L@!K'!MfJAPJ(4J(YS& +TB$eB!Mq&Ii$jm&$i,I`9MN42`c[K[f!N["1Z#-q%Am)ViC2`5,!-M)%[`K2"8AJ +KI"#H$"H%!i,VF#k`#!`#Hm!&jN6-KjJ,-3pL$J!RKmma"f,q!jF#Vq$2c'LBAB' +am(pi2h-U1$qi"mpK4X@X#0l,E!MmCkl"$)MC$Y`!$X6XKaND1!T1Jph-bm!rF!q +m!qHBJc"EBDE#,)9C$$-BCLR-8*LG-+X"hq(eF$`i+"M2c)&C!c-HjJc-&q#$i$9 +c&MJbR)4j#Pb-q3Nc)2!@cX$FK2N6FbGi!Tb#@4-B$%H$mm*eiEK`5,Ja("GZ#kH +&@m1GiE6J-a`@lJTRKA[!8H'QF%ki+*`,lJRRK#r!`H'Cm%YiTI$*cLm@E6ThFHh +l,l[m"bIDUBeHR[k@f@F2)!5T@PTI-0J*[RalL9,32(MYiYSe5EbFj,4%@kE@Y`H +lkk),kLf1pX*BCSJfU"18dSJ(RG!j(25q6T4#R5mF[@2T,Xr'mqfkYPr%qCL(ajM +1FcJ0$%rN5crF1"U[q'[Kh[K)20@1qrfN2h%dYHQMqffGQ@rXRI`K-C@Z0e'D,Zr +jTq5fQFqd%QGK-bRbl2SNAqXhe)(&#pql[h&4EIZpGp@fAhI9JER'rQY@SrrI@*! +!9E(e&9G'YAd3q$%I[q!9Hk19aS%`X*Fq[2Ei1)JrGkIr8B0[,-3pfQVqX@mVU8H +6"PaqKP'4#fX2AA0rlEf[$Bq(EP+F(KB%a6,qTdUI4TV*FBXC+c0fN!"aX4jc-D* +Ka-*BK9%)B`c'CBc1')8a%Q0FaLL+841M%8BDM#`BKc(LBh6&5)`4&5-P4QU-daL +0-"CM0-#BM2%5)c('GSa-'#Y#VaPr-9jNe-9SKE%+Sc5SQ4Qc-4TM[-,)K(%BiaM +','C-`pL&d3`M-M2fCdc'U)9a'L0'aQ@-GaJ0-JCNE-3iMT&QGS6'H)H4&5-EZ!( +M0XDIM0mBd6(+C*6$H)ma$f-m4Mk-%KNc-[jM,-JBND%#(3hITFXC1c+10'-e4Qf +-d"M*Q9&GGS5A(0eeMH(-q)ea(U-ZaPZ-Z4M"Q4'A'C-a8Q1FaJL0d4LM0XC[M1% +Bc6(UBVM#@"C1bJL@%5jM@lJTieh'[Sa$'IdQ4m+-14P[-QKKK*SF#bG([!aDc*L +A%5#MAXDNM(NC#c)+C!`)3qXDkjPa(Z0"4QQ-m-b)fBbAc8M6M$-C4c,f0'0%4SL +-GaRc-ZjPK-YmL,%IifE'ei`hc9McL5pD2C!!rpp2MdRX$V-5md$82[-T0Y(hf*X +4DIRm2$MQKj0`JVqEl8Q,eH$cMiDc!I"6[q@h`8`YLlC1cHfHhYVBZRYbF4+cGQC +UdGlLfP-qp36G2$PZri*NN!!RdZeIL!bpqF0Nk)R2$I"VjqhjEZTVaDScSpUqQck +fZX*GFC*C6T&B2H&Nm,8iQcMhFalJ2*rc)'Fcjr-if8*%2[+'14RiUTVd'q%BCjb +c(bI[5rYc&R!@FJlN(-3jQ,1)F`MR8-jKR+-iLcR(F)lP(-FjRR-#jd615Cb61DG +`6Z@FaMQGF`CR#HG-cPQFXcRRF*CbcZ1FclQ!Fb(RZCaPR)Xi&h-Zi9c+ZBac1@F +jC`9R*HF+cLV1PCbV1&Gc9R1Zi9c,ZBkcK[-mc[@FYC`E1$GbeR(@FcC`EZ*Xj0c +-ZB9c+qFfcZfF1cKhFZlLh-fjTm+4NepV$V163A#JBbH$3-$*#Qd#+cqX-5Xce($ +T4%-ppL9TpqCrh'Vbhr8NR1d[R65eY`YmM0ZHA)M6p9NJ"NIKm'C0mE[Z0f[fJ6G +TTlrdJ13-X@aqPN*,58G,PU#I2K+DIrRDqaEACY1P2-j[L1EcT*9eHQNl6CBEJ6f +h4-fie9KFL`ieTV*1*qY'9bIG*%r,')pPPr4DUe'a4V++Y1M%[BQ@H5mVLU`lm&C +Ql5b[R*IPrC(h80TEbZ*mH4#`)ShEf8VP[65qIZ"EQA@,J@rel254T&[d"rlUEPV +&VNeZH+ULQU5lIX+hpkQl)5*4KYVNja@r-9P*KiRU@RPlUEUhZU4E&9Lh[R4pfPh +1VUrUD#cG05Y9ZXE1`,0jS9KI8U)V@qS+l@N+YhcP5NY@FbGH5H5iV%MECGV%c6G +ddieGS@jFGDfiV8a(eLbS2&mj%Ka(XP"a"6FKMN4rHXeC'AH261BUfr(Y#9H)Uf+ +3!!jRG5Gd"EjeD6F8ME-fDpm`G,VCkj10F'8i'`BALC2HF*bTeUrX,&[f"&K8CYh +V8U[lF,HIf9el!&,9,I*3IP@H$f)!"QQEIGED+p0f`RN%`0,Z5q01U'A99$$hCae +H46QPV%T#qP9j['51jR"(eGDCH-k[qN2j9XhX'EKUjjZ9kf"@C!0RSJI@TIeL+GX +`2'LZm%AeKBY85BH,J4R`fYr[$qjMIDmB3&9Yh&S,MN0a+d6ACQPhF2FEf95jrNJ +FlX)&%)9ZKp[YT6JNU8[DT0'Z4#2MU&M-Nj!!$qq+Y"mk!+IE'pTldA)5VKK[6Cb +(+m&C(iH@aTI!J[VF'Mh4*T[5rVVGNS1QbR9aVc@L,BkhEK@rEhUMPq9&3lhP+b1 ++@bcS,(j9)drkfAVH5[S4a+@qe@l!'FQZ3P[@HdVU#r8dNk)aLGHSi5)CHrX'lP4 +6NQcdSU,9aLr9TpP-bd4Zk*laQfcLVYNp[3HI4er9P5bFf$l4Afd[460UdJ-d,6G +D[QpKTM%eS6biDq+L['Kp(4[AZd8+JZR!4[2Le0KCQlE@NPcZXY(EERULZP0fL3V +a0HF2RR"Aa1efPR9KIiGkP&3mGFR8Dei6%M8fjZ-q1+'p'j1MdIcdRK1T+G,FTPH +N#R%,%DF8JPHGjIe1G'KUENp9MBjcLm1YLNZd4mh#E-2ZQRTAc-k@)DdGSB,FaM& +iSIUlj-'bMhA5kVN$KkSFkZSZ"+Tp8hZDh'J#9&DQHEpS,#3V(4L&liS`2T*'G&) +9ElXd[IEbjBZUZT1AiD4)K#BEe3Q9jTFmqSj94++CR,Y24UX@FX'UIJeUhT3-fAZ +#['ZFFa0aT3Tl#&,hS%Y,Aq,+q-3eQYYhbZFbR*[*ANBk2!f1qJT5fIHe4ffSSG[ +!H0Q*1fF`N3T8!6T3JrfqpZ"UdYATTXd%*kp+3VaNFXH*T1kJ!(6H&A#k*@p9cYX +'([V#LpH*UcT,LAK-HDqAa(RF$3LZ!YF[##)eT9"Yk35S@c-"PHYpH(Sa!iXVXRb +j(dff)#SY`1549ITl6lk5#(k1&'PhT3mD(8SDcEMA+ld9kfPlZ6'p8H4a2pUG,+f +[V#4j)q6NLM8fU*Q0pLQLaP$S`U8f4AXAJXXX,hD!@Jel3"*e0GUY0KaI9*BVJ,9 +bFClEZ5KT4c2l'q+F&kC(5DCBJCZCqcA&idX9ledq,SAfMLfAi,!#+A&fBcEZVUa +$+pdQQ&1@9P`1SrD)m[Tf$5pTEQ0bH6P9P#)C$L1@&9a@QSq&0QU482`*flhS,!* +km-,hR2AC9pr-Qdce,N@pXXbY)cJcDMamq1!#41kR1DdfM`2pc,i69#Eh`E5kJqd +'RcIl"XjeeaF-ec[rG-qVmX5D#9bQH1krAf`NAQY3I'Mhl0@(@Q[TFR8chJTL08" +RL"lJ9-pfI#rL$(0'1+1FHCc0R$(11'FrcRc1rT`&R)@F!cPCCcDBXiKc#1G3cQ' +FScQ,1FG`MZ8FacQHF`,R4-j*R*-jTh"1jCc'1Cec"QF*jdc1@Cbc1HG`cZ@FacQ +IF`(R3Xjc1FXi&h%ZjPc#ZC4c'HGbcR,1#Xj+cK@F9C`V19GaVZDXjPc$ZCCc(@F +0jhQFkcPV16G`EZ5XikcRE1$Fa0R)ZCPc#qG@cQfFfcPhF1lNh-A*rTZpR2XiQcM +hFalJ2*rcS"l-(AdUjeLT6H#RhcZV(2&pFrXQQp-6diGX8@IfHq,KP0eX1ip&lZQ +bSKm"cL"RL*0eaP(1SCc$1IYaaMJ(F"Cb&R#1i"a9l[Gb(RM#&p[(**P20PEc(AX +8eP0(XNDEdbSRc@MKThS9MLc4F4LVYb,(Lm[qfGKXlUjFfITbGpTe"mQcVllFhIA +HEHrpjAUJp`kkiVYbG0hI8leikSjkqU'eSYjqXJYJ`+RlIU*h-kb$96Z'R,$'aLJ +!B(@3!*Q(X#,)+!"J$C!!83$!5KfM!)!91@D'biSLS`#!G8jQibVVQ%3"J&ka*!S +!p2SL83#Jed3CV3LXH4)&!(UYNZ&6E'39"3!qEE`@"3!qE5ih#J#i)e%!i&H-+!$ +3bJ0%!B"IUj!!4!'!AkZ04!'!AkZ,4!'!AqYr4!'!AfZN4!'!AfZQC,f&AkZX4!' +!AkZN4!'!AhFX#J$m@YNNkhlm@Z8N#J$m@SFP#J$m@KXN#J$m@QmP#J$m@L-P#J$ +m'YU,!J$rBaK#hIhU!hP,l2m#KLJ!m$pT[8bEdkZL!##JRK!&!!(GPbJ!##KH&!! +%Y!T+&!!%Y0j*&!!%Y$j*&!!%e2HL!%#V+"!&!!(eKbJ!#'K9PLJ!#'JGPbJ!#'M +ePbJ!#!J$4!&!3'[#4!&!31Zk4!&!3+[!4!&!3'Ze4!&!i&%-83!3q,4K&,iIB-K +m1[$h'+)!)+Jq%!8!3@'0+!!)UVGPK8K3I5J+!),U%aNX"R@2SJ!JU0T%!8"3kke +%!8"3Uk4%!8"3Dk*%!8"3+kTNafK3Dm4%!8"3+mC%!8"3Ul*%!8"3+m&%!B"@K#! ++!)*D+b8+!)*DYbB+!,3k"&%!%&42L!+!i1-BSJ"!UdB3"3""EC)@"3!KiD8S!!J +*Cd8"3%MB)!S!3X)883!38Xq,!S#3!2T+&!#%G)qL!##NA+)!)#4X%!8!)@'$+!! +)D4@D[&`)kHj&!8")kmp%!8")UlK%!8"SX'S0(b[M4!&!51[Q4!&!5+[@4!&!k-q +-Mq#$(iJ#J*!!&"k)!S#`Z)FS!!J29SRK!fG&!8"BI5qcPl#`3"3!K09MSJ!JV2Z +5jdIK`8CQI+bb%`8!BDf-%`8!BI%$83!3eKShH534eTSh83#JP6')!S#`9XE*[$S +X$L3+!-,Df#d+!-*Ia"!&!$aR-!S!)Z*,XPXLSTi@"3!4iEdS!)J)Fd8"3%4i+JS +!)X)T83!3%8D)!S#)HNm8!%4dek)!)+*k4!&!4,BS!)J)ld8"3%3V!88"3%5VdN3 +"3%3VrN3"3%5p+`S!)MaD-JS!)X*b83!3&6m8"3"4pDiS!)LUGd8"J&EU)!S!SZ) +2SJ!J+N`8"3"4pEBS!)MU6N8"3(5`G4NI[%d8!%5&2D)!)+TeKk)!)#UH+JS!SZ* +RSJ!J+Y`9"3#D*SX#!+hX36Bfj`h@qH'$4iN#J$ca%&%!N!!RV"F&!&VaJbJ!b"- +HL3+!22@j+!$)8iq*!S!mhD8S!-K62D)!)%pi)`S!mV4189BkjSP2L!+!2#Pe%!8 +!H9*P)3S!mX3[43&!6"FV#J"L`KY4!"!60aB&!&T&K#J!L+N[43'!9K3K#J"LiNZ +L!%#VLa!&!$&a!&%!%"1'LJ)!V64#&!$%e-qL!##QrK%&!$(GKDa,d`SN4!&!6(F +X#J"LkPG4!"!6hSJ#J*MZ@"3!a-8G43&!A"aD&!$%aH&&!8"Fh&J8!-6&D88"3(b +N!#!ZALF+!1,L8D)!)#i1)`S!iZ)!SJ!J,L`@"3"apE3S!)J,Xd3"3&`p,3S!iZS +I83!39mfL!##ZqB%S!,!fI+U$MVk6YDjqk@8m9TC2[F15SClYlE2-VDUcQ6fr08X +)eDB#fGbQ9VkT25*U+jHcDHI84DTl0"2eAhbkG+IqqL6[T0fiq%EjDQTVRNCjAlM +3DJDl#lki!Ym5qfdGh%iVeNTm[,hPEC8'Hb1T*I'kM1QdRNUE!-E50j0bq)ZY%+1 +U4@G3JEaPd*&D6SX+'&9QXN)TRqKiSQJUlhP5DA+i6aelFTKi0iIVkhNZQk`[H42 +T4jEk1hS(b@V6PCpkJTQlTkjllFPKCrK9DlrY,4qT[IG'2I*aGbEVTjFa2AcE$2E +UKi12m0N3EL0RTar'RRTHfrFm@5QIX-eY[@F'`(0Ql,clXJrcY,$"RKblRb'[PVI +2E*BI10UG,$[e-PmVVqM61+Q0!#-8AUIqqb3P'D!R+5Tj5!-6C62HG5FT+Z!U"GS +4&R2C%#TXAGCLSa!EbKY5raR*$'qLiYjpi@pj9P,$@mp)DV!N02Vaqqrk8R)CP"N +a9DkZq!*6KVcF9P'mIBj@H6`CVjNmQXJpRJH8MANHd$AZHAK[hmrc--M-pcbm[Hh +[HGM,8H"j`,9#cm-qM`'HKedI!cf29RlfH"lf0Jcf2,`2,r)m[&FHkRNBH!hc2!` +&KRXHGT5FjARBAc,#ml$Ej'c2`e[jNCk(YpYMUcb1AY*F(RDE6+Mb*+ALT[1`pf5 +Ljq%pp562`jk1bCk(Yr962!pl9UCk([B,62-mc-HQHajif3c2``k1%Xr$1rZCRNF +VHAXm$cY3CRXHpXM-m6b-LNXp$rYRjRSH(Z(-mcbmcCr[HGK[XX$cX+GKSHGKIdL +Cjf%hcL,2`pkFaCk(r30,2!ql2jCk(TlY,[-ml0PBlRRBqe$ZHGK(8Z&jf2e6kAP +ih,M#ml$ETXVcX%pSTHGK"m3Ucm-HSY@HKpdJeCk(R69V2!qlMGCk([BHVI-m2!f +Tm6aDVGrMHGJ0XYlc-'@Yp6cXYYRJHGKVY0(cX,ZTc[2`A+VHml$cUF(cX!pUNqG +KIdbMjf'2e'E2`rkM,Ck(A6YE23qlUECj([E#E2Fml#[DiARBGlA6ml!,DjIRBII +9EXr$lTFpRSIp@RXp$lZhpRNHpR)eH4jfGZhh21cc1Z"jf1melZRjE5+IXrYV[1G +K*p!Scm21X(-m$cZY4RXHp[38HalfN!#0m6cX+,YYI%!HLiDNV-5ekRQp8Gr*60Q +Sq'6qED5L-C-fkN#6%Y(X$&rfcVVZbdKEbpiCmqDXP,@Fh$6QZ8D5@PE*U&%`QT@ +8CP4b-KYPlQNrN!!'Cp4[RT)&Cj4jCK9l*T9kpXTc-r,EXMe)rp'([qT"qLcEKr5 +&N3DA8j4U&qK$HSpHT!rr8jkGrD!(`D5Ghe58C#p!C!["EZicLSi+rM0IlbhC&T3 +2*(DbH@SpV+YI@QQ3!*APXmIYC)0ja[I2cGRfD1H,AEhrJ+fIpY@qlCrPJkR!P61 +cdh$-jP'b`&NQ+db06L5mcZakXa[0EM"lNpQEcGjLpM9QEc9lQpREcGjKpNkcGjQ +pfqbpCZmcZmRXr@BI-2YmX`q1VM&i6L@,6-f@*-(&CPpLpU9QYjKpa1c,c,lFl0T +4BD&c4c,,e0K'8X60lQGf[YRpc5i`Zp$X!@B20(Z3!0Q$c5ibHiMCTKH(Q6hFl,2 +-(Q(ff@D20(Z8fHHB2GVXBV2(Q$h@l(&QMcGlJYN6cCjNpQ5cTjJpeHaTCNmhHiE +C*@E20(Z@fE20RQ0fUGPccCjRpRbc&jLpd1acc5icHj(CLmeHB[C5XjHC[GaXdlm +9CPHD[F,X+V0AQVh+l09Q9jZpCJ34NCHGeVHPjMD5,Qafa'`6GjAC9jYYN!$VLP& +jdAU*2"Um%F2KKHCpqbRpA!S2TC!!N!$CKbhlm&(ff1DK)LQhp%1@5513!,)eJLR +E)*LTl!+c,l,iIU2+iZHIe1fPH)DN-F$)$[6PClrMX*6HUdh,pae(TH-MCprq8%r +fmG-1)V98Z*FkYDT`1"Np!IQ#H%'f)&U3!#q)&L3,BJ@TJP""TL"5N!!S#"6N#H) +%DB)`3CBJ5T!!*2J-K!@b!P'"T%"3)#F3%dJ*K!3b!K'"K%"!)"m3$dJ(K!1b!G' +!C%!`)"F3#dJ&K!)b!C'!4%!J)!m3"dJ$K!'b!&'!*%!3)!F3!dJ"K!!b!"'!"%! +!!(q!(p!(m!&lJ"k3!!IJ!AH!(9!(d!&cJ"`3"m!"Ei!Ed!D`3@%3'23&D5'XF%6 +i)G`3AJJRK!r#"3&2%"Sd"[D!21!4b%[Y"bicU96&cE6IqZVUi$*dXQf8pLS4BT8 +1[[,bbdDDX,+4#8&Bf8!T0a-T3Xik5jASK#kVG(39%Ud1rd0+&1jP3[6@ZFlbT3G +%rPBk1#ZU+afGNYL9$Ne*kNU(TJ9eC5-cmVUbiHfpPC6HPEQrY"#[A("RCmP#S8b +[H(+m@L12ACdhr'm04,KA@e4(YbC&ID9$8m,"dU&Cq@-C[%L*)8Y0Dp-)Q3l0)'3 +k1)Q3!+f4dJUYJHE5dj'#FZNJMA+CbmSJDAYdSYr6d5Q%l1J"3E0dF"BKdp%TK%b +(TK!b(CT%b0E)&-bdKVIh9K)K-rHA4XKFF'I(#%*QHX9$b0E)BeIR)@4V)!MC&YA +4V8Q%6)HQ%$)GQNA)$0Dd)D5H(1A`d3PX4dFRY"8EhEK8#lKKkDZ@dY[4,K@Ek9` +R0S@Q6SL(T8j!'aUQlcZ&@djS"a)kX@dik!5fSD!6f)U"EP`EM,M"E4h8LRjbBcR +X5iDfpdm+pk3VMU+H'pGp@8F4c`ecmFk,bA9M+pBjJ@e)j`4fi*bJ3!VP6+IV++d +&-XdD8k,efUB0DYACaEb5ES[Fe$`Cj6b3!(-fT19`1e9U'ff68YXL9DRTU+j5R3j +S+p6$`e5CAPbL5#HQYF5d&-DM3*N*6f&P*MEE[TR`G!GRJP03QiP0SQeED!V$fZ) +&aYSL$@TP@b!MN!!`&jh45jM&hda8UR8cXFRZcB9fAT*TlNcBLIl1%V11m+lV6A+ +*YY$H9NbUB@b0K&6N`MSZ2d8Y-V%TGT'*cI$H6(55qVD&GPaHNJ"hB@JlH(DKCJG +FYZ0N$L#lNE%0%R0Bf!Q#RHLAJEef[-X"A6[#CD'Y"p1k`+`,aA,`eBeEEB#94DS +F4,9M8cXSGD*4$SEDm#F(2,d%VTZpp9+h(Yl@6GUk'0YaZYE*eEU)fM'@GSbLYI' +cER,@aFbkD9Q1Nce+b(VC@#m9kq*KadPB*`2,dDmZlY90[,TC9hU!dUTC0"RY#Je +YIC*5YG&+JVM2pXP,YV"dY&YBkb5rXc$R+M[+%Lc-&19#mG'5NYh4fJ)H[(S0N!# +QP@dP*6XNTjSdRD&93fNkhP08QJjXeeHDEU0FpHN-VG@RilhUdi((URHDSkGf*lk +VFLIkD0e1@([9bCEXk$Fh2YGYER5Uep``bik593[+Kl$lF,R$L(H%3m[G$'8ViD' +iY@e*!qq4N9DKc1"iZ&dG(KkJC8$aJlfPh[1@FA$m3'N'"JmZ3bqmcBdPH(J3#AK +`*BXm,(&i%!ei8)D#Fk9HbGSf9c*i`&k@0"jF')pRQc&kH&$%jL#r29LU#bZIbQc +,Qdd0'!`HU!@bSB!(VT5UZL,Z,XIjXTC[13r@kfBE8eHm)Hf1-m-(Mar%rKd2Y+@ +A*TE0VbqefA&Bh@feejH6m@!d`X1$k(rJJ@+99M)`510"hPIR5Db+h91-AaXTHAJ +`a2#J*XX6,4&SDHbBZ(4LelJe42$`S(#FV0i!rIMIeY)!9MQp!4B#h4jm4TQqeHf +V@CLChM,6,C+mbe+VUSeHQ`R8dj1'kL5N,8Nf6)1mIHd,4#qji,PTeBJJTHLC$ed +ljEfHbG*rTSkDjUcNhacr%*93hG(c2Qkf)dI0r+aNipJ!kQLFNJ`G#m#pEPcBIlV +#-hA86apDR&KDM9VprZHMfPIH'TfhGbM9)1q$TDmLEVHcV)[#M819MPcrXAH9HRr +p[rL)bR$U3068XDrQB#0XSZ[Z$P2(0%N"XJ,8mHL&r&XGMmVRr8NGa`XjABHLBVj +,MPi9q[9$aeD2IrQUZ[a&Mb)miIQr&V&mc[Fp$"(bVTCm,"qaAqDmZ(l*6BhDjai +TeHrS1K"[pArh`3a#er&SHe#(l1lVZ9LR$V8fd4*3alic0pYhVfM!-RAd)Y(T1Kk +MfUS11[EiTqYSL9DI`@PR'D'["'S6QXATc90ccr-BFUamPXNdCDhejqVSqlL3!%[ +lqE1XiBNk@PEEcmq2e9,(%rbXT9JI%e!(A`P0mXYl4HD(-'j[&fMQXhm`lMBKX-l +h012ZUF-D`,MA[f'[a'`GrfVQ$cjr(jB2jYjpUdmcpa0e2-RF6p6a*(-r@FF6c,f +[MMlQcLI-hIri(fmI!m$F1qrMjmbpjf,2-2Hq1TjNlTePr)bjpp9K%@$ZqeHqfII +@$mDY&ZTfj(LDFAIA`@F*B0aU$ARTcXCS`hMQLhf$-DNkML2$8icT4"e2-Tf6G6c +"G2VUH!V*1q[i'C,heI%Bk+Nkp2Vj2S3SBAPFEl`hN6M@)DU1`dZ5X0MpV9mkr(` +GXHDcMiEcQXdTLGbc!(crLRKU!cZGH,+13erRLUU13baXGpHRGhCd8b)aNcD!Hhf +@-b5ip'1Fr(3GIFMj@*mPqZ2)1)$&fIh+$Il(-+DJR$kqVrZcY@0hr-X8+[Hj8kK +[rdJeIE3#e&(Cl[FM)%B"5(FG#ZZj9pmcFh)p0E3#h)HHpPN"kM$6[Yik6Nrl$KD +GGR3,HZkTiq82%he$l6(m3pqd[IE1fh[4GpAZ[QRE,6IAlRU*`%4*I#cX%RpGlHl +m0f[[r"$jT)lRUBYklZ08RmQ8TERhYAjPa++"k&JG@fIQ'p(%d60eR,S22@@a![5 +VRV*B!HVJFq$-pcrhUZY3lH(lhrii,qYqrIQR[pQF(`1`a!+eMRh8`lGPr-6,KmU +jYheY0Z9mTXGk2meKV!"eV$QFAcI"qFYlKCAD+piXpRij,T6pA#ld6(qiA1LCIMd +eF6iaEPDIjN,2iJF)[$AY2Im#jp5pfLFQehc#UIlrAR8GF+TRqk2[LCI[jH2IhRM +eIUHCMPhTMGHcRfATMGI&[62XY1pHRhSVGSUj*pk+2IYC30k+G3,)cpk+G51e,H# +YQ#GQU#0*G2`%FlG8-&-V!(,D&C!!kY4hBUfMr@1QBh(CP02l@3KQ-ADJ66R2ITD +P66QRCc%GKGJ)CM'2jT!!M6[(2r[@aTfqjrqq#mC9[2prNX(C0rB)2-@m1Z[i1I2 +UZC!!-mbVV`lVa(k%dmbVSa#l`*i&T`kYPVRlS`Le30mK"FIbf!%BJDl$+V(hJ4A +"bSc8`jTJY8!k[5rB,h(H6Kje+'(6*r-SaG#qFc`2QfKLRLH-fFrc4$$MRSFPa[Q +H"kPSr6e2$,2!mm3a#ce22m`"RLFIFk$RkBmjb2-8B!lf2)@B4CjR)1C3cc-)FjM +R'B`jh2-8BClPHBCJM[!m3c(2pMc$-%GkRY'B%c`2V`FRHTiaQ*-mceM-bCjR(1B +8cc-HFkVRQB!jcI0-a*cZH5CKc[!mNc&,2-m8c*QHCbVQ,-m$JjlYHDCMc[%m-c" +,28m*jPc2-a0cRZGK9m0mcc-EFi(RQB1jd22-a5cc22-`&hNHQ1pLcl-!FiRR@BL +jc21FLcR@mk$BB,RR@B5je2-XaLch2%X`+cc28Xa+cl--FiARB4e!PHFTaecTHAK +TY-Vc-#GDlAPi+96YHDS`ehJH*[EV2-mUc2-m$eZiDMa20HCkcl-'XpEcm2jaJqI +K*GT'ce1$@HGjcX1XpccV-4Xm$f1i6CjR!fDMjpQ)ZGRce'&Zm6ceQ&Xp6`2Q0Xq +c#A1ljfR%h1&j0Q2Zp$aE-(GjRUfBZch20X`pRQFljPl2X`0cRqICLGRNHACKl[F +m2(Jji(QB%Bpl1Srj9"jQdZ-p$r[E4hNHRKqIihRB"66Dmr!#[GMcm)CKM1GTaVc +0mc!E(r*F(MeG2LQ4`i,bf3S8JrKIcbHqKYTYYFhe'dI4D+cme4IJZ3'$G8Y!"hJ +D8@0Ml$5LfZ3d2cUD3#eZ5(!8$d3cV(e1)kT&6N2ZFrm(MDMrVJR8MUB40@rXR%E +8f"KmMDM2T9CNppe5ZrXYKdl)lKY`Dj!!hAIPYiJkX[ZddTa!U63R20c8DTe6QQ0 +VJi%F(SLb')ZFFT!!3@2RP)--(RZ[(#6fJR)3baNHf1H8JiLbQ06m`%'#j[&KhIj +[H+$Q"ikb1CZFNK585Ce8$Q,afSGJi9)1FUaIH4K['VDeAlmpfL$l6,rDJj5$r'5 +2J39!1BLZ3h(k%`8rpMdR9&!JmYJ%S'IAqLmQ!(BT"5,2p[ec$`J&)ZYZ'bS3#Ca +G2i4I+4!*E(RM`p&ppBNh(TVpD,hab$&5+J8LK4mRrY2eLIe2eVIF8YEch%j(J8K +3qN0m8DqZ0CmXqe65GC1I[e[P8BI[6DIcq%Gjd,KlUHF*BlCiRLMQCF-mA%0lRKM +Q&DIc*1qa(qEc[Ci#c'Y1j`Q2mK4L[[VTHV`qJclFi(Q'BYlSHG4EHYq4dhPH0-T +c&ZClKRPSphBF')&jkp2pk18CKIQ4B4lD[EhZFc!rkRAc5ZlfdrHB+XjTd)3DMZ1 +IP6m2A)-d,ZG!EiX[H[0pfB2SZKjjjA-e@Xfqmf'[@9ai'EM`%#1#IaRVKJX(Q9C +%6Z,#pH$#Mk)S'`2`8XcUpGd#@FMbKC[ZbhlVP9&dc6hMfd""!3,$cGGAXml!UGQ +ZB-FEUMbK8l0GPB3CH[IXhXX$4r&QpkR`C0h-fVhCIAFH&)YjXr[Z2((-#Ck(QIa +%cj121FRcp-HFl(QBm8ra2-ciThSHC[c62-p!c1QHCa$Q$-mc',2%ma4Kc[3m3c" +RH4lH+Xcf2--`jhJHhM58HKlH0-ce2,aTQ1GjcXDFlhP'BLl`2,b4@1KjH#04jRP +'Bblb2,bP@1aj&!rerB$R'BZje21-`ecQHFCM,[Fm%c$,2Fp%c!V2-`Qcd[0-aPc +KHDCJ9RQHUCJV23q[lPCjRZQBUch2$-aUce1#ZFEcc-4FkhRBllM1mmc'V2%mFc$ +2mcbPQ1Xpcec-@Xmc$h1$jq&9h8E2X`#cc[-Xa+ch21GL0RJHa0TXmMb,-"Xp$fm +J0RZH*CKE2-p5c+fHCaRQ0Xr$UX(YRUFFFiIRBB[*6Xr$V(HAjf%,b@l28i@jar1 +`$@#[jeQ&ZFrcX1'lbI08Bqlh2'X`$hJHRXD1p6aeQ&(28iqCjhND-'1HCa0Qh2- +dB[Ec2*Xamch2&XcqRQFVCS(RfBCCk(QfB`l`2$X`"hUHRCL$2-mZc-'HKk844Ck +(GpC$23r[ZSGjRLE-iCk(&9jRH4lfkBl`2'aa1p[cX!GJT1GTaSa8H6*2TEdml#" +qRFqVf4VP[VhZbF1VkEGlRX1BlT[Pi+Qh`bS2QaM'qIcl%XcaRSF0(D-m$rX%c[% +mV"-BlARBPe$XH5l((10jVX"dhh+(6VhP9RPBAH1qj3kGHXZYSUl'G0pbpr6M0CL +hqIfm%00pmadmpHElU6b*Ll9I[M&'l@Zih&14ak$+QUrfpE*ZZM(1$48m2)J%2,L +5l9'@1$`3GBCldk)6pmDU#AcY`S2SH$Peb'UqD*P6Kkc`)+F1fHkQlV4Jl*aDk2" +i1EA3#JmL,kL&YT%*42E`303Kfq,83LXmb"X[T`jCi8'4i8&0PLGl%0[AdYJaFHR +%VR&VL1$K39cE"%rSdE+HIJVjhVQiYV$+L-6@dJ"@Z$IYqJY%CheVD+2h8'fI$ef +`Z-E#PXSp6@EF*ImeY+a[Y@I("m`kqCEa*C`0YGYUQq[5Qh$dke#6m&pIk+6Q#99 +EFI6L3ReK%bM5[['T[PDMjqTZ@U4a1cfDl-RMP8l5I3BLdpqZIK'I3G46pGFRH5I +YaX8,jHXf4TQ8RHB,3%G3"**9"@*PqBUf6XhYRYlDf,TlFR%5XhCQDP%#N5`URa8 +'!b`aRbd1"H`iha#6-[2Ffi-jf5P!mdZPbPTIp,#p9Ia+UH,@&hfb9',[D#T%Kb- +D'p(2b"iUY[h8F*l(ZCk6Tm8E1$GbSSN4[BYS@85R)KS8dCH)GN4d)D,j%$f(D"G +Ne43lAGN5aKYbG%(bMTGhcQM%j@Di&65USGd@AECSVN92,9TTd8(,XhMdbk*0&Yf +aD)T&,baDB0(jLSCAp,QL[49GV@KQ43mV@PI4XFU@425RSLd9hDKS3NA[+9T1HBD +("P2dPD+GP0ITD"j&cbKD4G%KbJYGp)1L$46GRfMk4+mR,jl4fBQ'6[4aXRBDACY +SeN52*PScH@I-HP,dAl+aL,INE!T#Eb@E0ZK!AJDM,BqZ4)mLfK8&6I6b#KCbSTq +3!,IBl1aPJa*l2%34[JAJSfmqBHq62fNBm5R$M%mE4YaKQ('R!GaR6)AdAHErV1@ +lZqaNAr5aXSYpd4qBDVjlc,lAmRh"l2ZX[UqDrd'c[fEfemhqSYh2rHCr&0--#$Y +iR&)&U*`f'PjVlqNAqd`r@(A``d,4&(Ce6,2)I$HmAH2$#r[&bFeTHAr&12)kiM, +E5JFcG`XU,M0lmfXf1*NijR6H9r)CM61GqS*r-BaErGI$qT*aSjP0Q[U5FH%l-H+ +p2,NZ1[H((aafF[L2--D(Z%fDN!#*80E`PkYmXBmpJ8qf$d@8pmD3!'q5jT5LD69 +#(rMfKR`2[%-&1(&4c@mAKVKrH&5**0qIBI32FHrp5b@51'UG&HUES,QYE-H*DLl +Ve"II@fSJGZ*'8&2)iNCVpXN-Q,4rM&%8k[[`"r%a&qBDQCq1#2ND090fTSbqAqA +q4K`,F60q5AFMGEqC9SQ'1Klq%J(-P+Q$QII`%2I$hmI(R*NipST*Rfh82*Xl*1j +DjAELkM8VCKkY[U(JK2mXkdYQbmbSe6IXLaL,3hhIe2daYkD19`rVD0*FR&Nf9k( +QZ[j(3ebeCXA-YmRh`DS2iRY8(c0[iZiFp[I0QM%c"eIIf&r"Z#[%[@X`'eII1'E +[rR$ImDEQb-c,J3j@SEdRa,eB2F`X'*2jG%QSide[aNIrUQm#Xr,!H5(ZBm)RCZh +UUd-rEb6%a@pr&`(-hp9h(l2hdTqfI06-6&jpNc4$[kj6p)@[(LZji'jDFA+R+,F +%Hh'6dARV*pmKkNc'KGkY(PAj`&d[,UJqN!!q[[B4!D[%h9rKCH`6Rm!R#JU#Ic2 +-0rA(mI&HJ,JI$I&5EmRP$B(kT[l%%-pL[k`'NrZiTF+rf$h5NXYE!q+q2Fah81m +*H(m!c2,@`-(Aq+[epS)h#H5lSF,Aq*VH!-LkS"A['q,Pbh8A[&fJ$[T#F',`,q! +$SiKlb4![Dr9QJ$F1UP-'2$$%bkA#40R+0rAK#LrM,a8(i(kSi`-9AXDhU!EH4a$ +('`r"S@m*GhNc34bB+MMh%VdVi4d&CAjML*HcEP@[#"lF@Z&PI,I`M2F@m!$k@1S +i,)i'ce,IF[L$i'AXhG)Sc,X-mY&rdJFAr$BqF)DiZdGiF!FqhQp`[I!B"brM9rd +Y2YPLY`J--(KjRGkpm-k$Dhrl%#rR2kEHPI[lf`S[ir[%AAJ2SVlbabZmM0rb"3* +%QXb,i'-',f-rVi+G[Tb'cq$P"h6hF$6D(0`X0Vcda"!r!VFSM!`[[EJPm!rr6BD +AAYa`[HdaH1R&qB8MKLqq5J9)(1pjK&r@UZpjdd)Ff#Ej(KCAN!"pHRleY1$PM,[ +8U%jF3,a#F'Zrm!#13pb2Krcbim*%fHSG9"m+rSe4rmN1aS!`@2MP8R%cfESGH-q +`[NZ&ZGb*qRCpUX,,f!2LGV,G0L$1DRJ92YiPd@IFVi1AX9pA$Eb,8YHk#cj3G'r +)pl+r)i)l90m@pJBD["`XM!6$+3'-%Aljc6[`b@lrbASR*6Jd8'qRC+[kC,f*%T` +ETrG8[,e5hpBI'q*PKHk#peM!1la%m2+JH!p[Y-"[m%MUQ#EZ,LXKYp'AKPp'K*A +d&2RS"qQ$)VdliRdAFI5ph&1KlS)hAqVESAX5['`@2q!GQ2Tf`PX%,f1I%VE#mEN +LaEm&,f02UJEZ(+LNIi4IIP4BbCfVV`QF-hKj8,e0[kM[$[CV'VaXr,!DcqR,PMm +%,am)GAa$GmC*DHL40RMTEPld[jmj5[3F`dXhcMI&2-ChTH'P&cGFZ'c`dU[MJr$ +8[191XA*bIR-!M!aFh1RebCH-H`AcKA!d2pX[i$(-5(JM"ae3mb%c0dVQZ`Dqj(m +VGDYl6r,D&ra'i-%kcX2[Ul@rmPD,mqj[K2c50lYealc,Scmq0Z3VpiJV-Jq"*kP +qmVdSa0dN6L"[dCD)%qme['51`Ub'qTL,5(hhDcBKNP9'D*iNp9dLMLLL8X,#!kR +[AZ'pl24X&Vq4qZl@E%hfS#i50jAkVPIGe%)FH#(eADjF)QNKS$H'8Yr$QPQ)RTa +Qc6QN[Rr@A6UU*I`2d*G&!rlNkVX1I"mB'9!FrH2'q3lr*)DC@hKa`pA2"LHmZ1[ +KIrjl$9HmZ'@D@cLm+[qe`M+&mjS(`(%Gh-erTIJPr*hlJjXk[#Vr,[(XPeSGRkT +i6hjM!aphba@pYUT[ED'C%ra)I4H)[cVeVAe!m`$mc!2S4DHqY6Yd0qq`1TJe1[@ +YrB$Q3-`KDArH)6ChqLGadEIkS9'FGpmPQQ2&`6RiQjG[QIV#i9ZP9iV$`(R9IAb +"[Kcjq4$hA@'*QRX3paedT`S2+,eImiphKEJI-"mmqpB3peIh%r(Z%&F!2aCq9[T +l2b-Z)[F(ch2i5ZQGQMfmeh$Z1e9rP2k8CRBU[lkR9eDmU[4DF5D&rq"%M,X4IME +h1m6[hfpp!-paq&RTPck*$fj)hF4*(H@I`dGIU$VLF%6KCh-[e"cZ3b(I#R&(ZHp +DpIBI'2iaEh,`Vl5[hVdja(f1q8TS*X5ppHF)B"l#961rF("al[r6I%Ma#)d(e1V +JBZPac6$S"IS!cZI`mVN0B3Pp6FRNGRKjk@FefkAAZ1mE+ajCqJ(0`p4m5FI4Rp* +2$kZ2i4hJ)[0@KdI1r@l0GX%CU*r#@q'4T@rr#"'hKhaADFlYm-M5ijS[`J("*c" +HqZ!1cB,*UHVS6km,MbcpFh'i6i5i3ZBVJA2+10mHh3%c)K8bN!!l#qi-F@r66"0 +FK3I$0aammYhcZrJq(I)9`C0-(GmA&iI[Uj!!SFaq6"hIqe-LQ025ar!NUH-"p3# +eU(`MZ(Y6aa$GkedKEL6BBqTi5,M)2)eqGHGj[[GVeX*F5q8EcDc#e('(jTUI#h& +Mk'06alhUqFpE(H#ce((e3rMZXEj8q1%lVi-b#"HMU@15CJB2)[Xh%cFCr2#(H8c +`0['9HqfqQ5I@KlLjiL[8U,jV9FGV3Ya9ZVrl3KfcQFrk,`KaefUfq-830`AF-[@ +p8Ah'r*BkZ&qTlhE0Q,KcP@qmqNcUZeJm8XdcLCX+hc2eqF8*iENUEKTc!P0IXrJ +Z@+e##S@R8YpIUQE`"fS2Vj!!q[,%fG4mLEJCB)bTllALdPm,F5A-I8ap9H+Sc+* +T6qj*k[[c6q1Mle5qQH,a8YqG`Z#(3Y`XX-V80dlc+QD-[[m$!*!$@`d!!!%!N!0 +AHJ!!9RS!!!*kEf`l$3N*CR-ZF'&b583J25!UC'Pb1`d*#8jKE@9$Eh!50#i`)&0 +PE'BY4AKdFQ&MG'pbFJ)!N!0"8&"-2j!%!!""8&"-2j!%)!$rN!3!N"+Xp[d9!*! +'@I3*#3d*#5TfEf`J25"QFbjf8Q9Q6R9Y1`d*#5TNDA)J25"QFbj`BA**4$X0#3P +1B@eP3fp`H5KQFbjZB@eP,'jKE@8T1`d*#3d*#5ThBA0'EfaNCA*"E'PKFb!p)'P +c4QpXC'9b1`d*#3d*#A*PG(9bEL"bCA0eE(3l$3Pp$3N0#5Th!!!#L%&%3e)$!!- +S$9d,iCE!0Qd2b6Z[IH9Ehp5Ue9CEkEAkC*9FPqJ9+UeD(CpNDpA*@5)i3-Q)R'5 +k55HY1-"hcYF,r!1f#E,M5[UMC@C+a!jlH+aC@B3V[%icXLX@fR,DNr0`SMITBMN +C8cDC6Z*'D,'pk"KZJpfp@@YN0fce%Me#6X-#1je1j30JAcZ3!!lQ+MM%ppFL13@ +,l3`kNiq#Xra)29V1aZ2p8$e-6X$$l9JkMKI#GRp!ljGYH)IYT+em*paYXfN1h`A +crADp66EM8cD0CR)dR2%&qSc-`1RqK$iT8r%HQd[cZ"kHY4l823UZ0RLjRL2VFBI +Rp%(CJ[IC4YV%pd*IreFIPcliY(@PE[`Sl'hl8'rq(IEcAE4D$X)KIUZ@bRMmhLE +5"2iFIVC40*TrJM&HU6r)*&aMlDNGr`LGr#[p@MVJ5&qYUk3cVV@a0)lA34GE5X[ +i1hM(rpDrj$emhrr6A[)FrQmId,[m$hcUYIUPI),If"+DaGp#2rZB2Z-'k1NVp3[ +TL1IC#r3+A`5[qX9kSEb-Jra'[88'i`hf%Ah)em-)[dU[PQ&iV8fKSA`Gh'3$D6K +I!rhpCLf6!ILDAk+AbZYiZEe*Er%9F,kp5-rcZI#5Ak#Ab4Y4q[3RrF'2`GYqT6i +N[q#[rV!q)VmK'T-`3"4Cj"V@eLC8PNBMkcLAbb96p2B`aCDaP&9&U@-[5hXk6QI +5UA49HN(DD[*0fCDk4QmZA"bhC9*QKDeY8Bq9e54!3"2#XdXQSE`ZSEJ`S5P3&#J +)Y)Ab`R#S$SIkd&B5D'e1lV3f*HZ5PSJk56D-!bP*#TP!2[bb3,EL8QK,"6+"jSS +2"5`IY[4X3MD3!)N6iRa#69)'!*!$,d&%3e)$!!"@$8X$RHJ'ApX&YA!,!-!YrkS +A!!$3@iYDH!'Kj[m$@)8HabqAC[SF!*!'*lp"4%05!`!rmJp9$AC'!4!aiqGMIjY +cMV()-TE9'U0IM"@MlZFhK%X0M$Q(cV&kM"'6f&`D[K#b%A#b!`R2br85Na)aK#$ +0iD9FNLE'pSA*#4a,Z66Aaq24A%Sje-FeP%XTKkD%BiLe3#RJ!((Ipr[[lr[QCJk +plE[hrI`('k5R+%%3*%%52*%"I!+Dpk1@k$81XCK2KMmBkh)ImdEZFT0$AjL%ESQ +#Q[A"f+5lUd1X8%03`%TJXZ0G8#P3K%U%iPa9heDKjeeZFCT8f%RNL[a%6Xl(Kq@ +H#NEkblD+H`kJd#!9&R6m19E#N!"@#`8L1LLBQkT*bA,EbTI8INfUkU#1afYrX(Z +[U%d8m(MZKZ%5'MEBDhm3C0iJK)p5BU8akQ"S@![63Pml6kiTHVpAihr2j32Lf+f +kG@ZlZ2qbbrfRcfYiFSC,bG5Y8d[GbakZ`C*!PqQbISC,9cUh[kq,Qp3XJ@&0&dq +qhqhq(hIamEjq6RGIeV6GIBqpj1,qPhCcdd[G20RajrS$`9R3X$UYkqliY"IALYE +Q6KjA1h*[iHHed5N0*R[[V!iNhcQ&U81EjPqfE9TdZ9HB2YR2ihfK63fRECZq21e +b,hd!JqT8iV&%8@1[1[8Q"(UmB&C#-Z4L!dNfeDUT$R9UF**EDh0$am8D%VjcI3B +l(HC)AEh(&bT[R-U`MaT@JphSYKeETNk06r)iPN6GqD*Sf))1(1bLli`H9iDUf$l +E2P[YrafP#h@UQh(Y)eAQU!L"dYE4-rA'5f-6,@jF-Qe%FM+L3VJ20NjCD2[LY!M +#e4HMHX0pp*'1e"CVaQ'`l%aNBCU5(l-J1fM"hCpL`8$3JXIql3+aM&$4Hci))Bm +bK)3b8IXe[G)kX8DXmGE#9&M+5leI#B-maQ2H"K3Xh1,p5L*fe2eSD8VFMHJJ,'U +-N9kHY$IM&A@14GXKc1b`Hlka#dE#'"h5B*,%,2(+4)Bb"DC5Ha+[)UFl$+3fh58 +MPq2TKVX`,*Ffh(9Z5fmH6'*kV36NJGU[XHe(eBR)*"IjkhBV*CH*BS&Sc6Z#@4$ +*j$*aR`5JE-J6C6Ipj21m0$XJhJ(&3pi1JdT0KrXQ%UFk2KPJ`VB,"cZ,'"TZmZ( +lPR9cGr$a4m0KCXk*TNYKFSpYHhhhRQ0,4l28MU&5Yd'*'I5aqTrc4RhL6FjhV[T +CfdHr%IGq0&dXBm`2Mikc4%,+@0*N,QQb[)%-qeJ+-%*D`qVDc`fVFC523&LG+9b +j#Y#X0$9Ui43UG*CT1*UeZ$-F$A'rYYPZ6BHdUY$*Y4Tq)8-aGJ&aY'VER[)M13E +ffUT"Na`H$cDX3T@*GS,X08Z"CB0,'qRUekSEZVA*YMhDbLkheN3,(9Yc&$4Q-14 +,NpdlLXR5TB0q3RQIrN+'IDR`b5[G0QfPm0'CPb*#")P`%e"+4ZV'kRakDTVYa6d +Z0+%Prkm&#-&!I"N-DG'NMcebMIHiTM)8,Si3q[-$J5YPmE@i8MYGLDH6Jc$mLKi +'SNEij!B')[YiVD9UbRj-DG01[I'i'*K'!T*0Y$1`(BE&`Z(N'&8F"N6`Z(-S%G, +''V#KcX`0"D*)KeKq*2GM*E+K9rK`Q(+8`"Df2d,Ej0`Af*!!0%-d""9Lh'Vi%L% +'#LqX9cXFhmY4*SpAS4&M)`E+)JL)i2AD"&H4I)(XkdYI1mk(IPL!6"35#,a@i(M +Ze8,H"d,$!8*94Z-S*BVF#+$U[H0)p#,f2X1rJ$J5[Le6M#a%jGIcYS$XYr,iXcb +dKC(G3Q$fUGmKST5B)N(k2K)L(V39,*!!!15+8"J+5V)4'G%bL'$'UYdM6b%m8d5 +NaGX18lL%KTpj[R"peE$L++dDlUXDpMRmUH(c!4,V(899``%5BijNeA#!4"5Ek8# +QP,C5hSp-d"F@e2PQ3jiX'qD,qILjGK$!Liqdl4Ah)l"e`f'%dRF5Ri@14)kbKYZ +6L9))T%24-2H,C441`DF(`TLd-03V[S2N*jXYf4TBBMN+BHf'I'!b,*l%0$(mH0L +56,$k(DU3!0%X,G3*FKi3'3YeLhfXH`X4!ZReSrjd*&f+T!hCc,b%e"8,AcdFFXZ +($0qUr8TU),,5NA%NbL0eeYPpif-VZ+Af+erhKBa,h(,6B%rV$#2G(GkR$akADkj +4Q'm00Aid1*MPE@CS`#dU)B%MfRKL9"rjGpSdTkGcXpSrh,rlMcbZ3rM#[Icq1h- +I8)cYQeAAX)Z'ep,`RqlrHXB$1-bMIrd04*+P40V9dqmDI19Qe$XqG&b0fa&98hY +#%r*H3eMH!pBbA*JI[-RpFS8b1T3Rm[kM!mQ%Y5&2VR!f2iY`XlcRi"PZN[FVaKk +`$i"Gl8q%j6)NSrj,XhdJBqqNL3M-`E#mAjV)3arTX,bhkVLF3)"Q&8-0mq8$GM@ +5ar@bA&L[jXQ(3&"f,lXrZr(NX(ji[V`A8mRi16V`ZHT#je%f'4HhTG#pThGPRPa +cLF[,-F@Ke"3e6fSZePkQT*Q)jMk&N!#XP$c*9`MCd*!!NY(FBc"5`c`)0GZbPa) +STi*0K@%EQaHR`18J"F$U,1qYj3MD%YV'R(d4&`*2fha'CjJYeSN)I&NDf2,@l5j +AeR+@H"9KLbGad1mj6#'p21qJ5clY"[$8i&X!3R0,fekj"JKd!S9(@(+I*hpLKb# +T0"ZfJ$8A@EI)qi2-FF0mq33Y*mEFMk('RY#0'lB!kHb'e835a#CUrkSC*p5Vr@S +`UrBd8kSQ*MV!R-X#[jbIa-Frq)kM35QQJ1l3fGXFE'MQRilk2V6I&$iL03Xrc,Z +J@LN`j25icj!!bJ0NAS6NcUSZiRiS'4Ui"85MIXkG-2A'r(-JVXF`e(Kp50pIaZ1 +1q*`5CGjfZVBkYU,V0#P2&!lf&6Rp!2AbB,,f0!AS@`m%+3FHk9KM`V(bq$K,[19 +Y8R*mQTRf&l&-h)"AXcJ23h%44bUHTLc,$!N3mk"dH+9&FD"l+eZLJZdL%TK1PX# +%m4QR")BP+pP1[d08aX!XN!#IcdLUM'3m-9pX##,C(#VijlEGCm@5N!"02#V'S#l +24!EH54Rpr$2f2+",#EE3Md)P3UlImhS-pb&6MR6hT(@f5lHIS!j#*pT%m9"#YpR +Sp@#k'`"YP%hHb5l9I4$0QTK!Pj'3!)4e&50"baHc$IHaaF@%Q!k6pbNb,80KjjC +ZTXUr4U!m9rM-HIU%`m8%a')N&46J&&Y5)!QUD!Kr`R!bj[@`j8m4HI`$&F@j#9e +@dZY*63k`XL&FhA#3!),AR"2qFB$`q6m4N!#C3B$-C@3`P0`D!%)!d(RqL8)"%!+ +`DYKfr[QdV["5(SNX-6VXK#kq)m8!FQMk)-lNPeE394+kTlmPG@)5NcmeVI!aPF% +%RjBQRj9"M)H%$fRc#p0C%)$c,BQfLL-m0j6l[0Y@2HE0mmVN$##+kRMZYPTVED+ +f"HVPIr&1j+l*A@1`-j%'dir8*9YIc"0r8Gj)+1%mVkSBVKLTbh)JJdD"L"EaGdi +@,RGBAY5A[dX(k-blG8jLmffAEGC)AH[bK'iVhk![hi@I-P+(b[FDE18l0a6`52Q +qNESM2Q6hJS!5YF'QM4fZJ!UQ(LkMB6M$',[e'r6DT-'QM6#Q,'a@5$X'pBf!G!c +U*TYVIiGX3pY4+!hjDhm(YjeEdQHdpRFrq&Yh&TCj62U5%V[TQL9!''Lm#kTIc'( +XdQZ0KXAP0EiXTj@TD3R@$&Z"2&Tlj-dDEM%C(5Di5m#4JlF,kKUIj*b5#--@8ZS +TF8MVB&Q!FKTe)V'49$Va"T*mZ&)B`Z,AKY$KbLk%BEE'S'lD$PH3!-*jZ%bViVU +4&p(%D6I$D(!%kZBK8MVAjIVd!aP1AUT9EFHmEpUd8AkGLQd9@jB3f$L@9SH(3'G ++TQN38kmVp1QRD0%l)h9KE'fXPCC%ER,,PKCR+j3i*hjZN[VVYXN3K*i+Al-J'B9 +"q4TR`rPEBaLZMj!!NPmjNI'm!9F*D5ZK*$r8Z!cCl,F1IfiBcE%IcN@f6@iFma` +NKG8qr85'diUK%@QSJSEXrQpL-5ArCkGke%'Gb8)L0E'3!"Jp2%mJ$M-E('YH(Mr +4YJ#,#Z11F4L9jlbS"cKj0)ff%Nh"`SQ-)%+F#1hHFeJ@&"pe+LHFJ-&"-(3Np@) +2`NF($KE`E@5@`Bq4b#!,fJl)K2DeCEl3!GNCTd-rA!Qe,FpY1h`%2hX(3j[3J+[ +c-29#A!I*r(!%Qh6N-,Nq[8r$)h8[9!0ajM#4!8Z#d60L-h4V%fKZ-qdH*X4K'hq +p8jJ'`KJNi0Ym68JElS5iN!$2frhNR)1IDA$QmU@,e*!!20#i@*jUI1`X'8`AFpq +d%J`U',``Y`4ESXS@Cc-fe8"Eh6`'iHFc#'0*fHHX'f4UAR-FJr0pa8Kd6bqmH'Z +YkMrj"`5YLN$-N!$Q`P%QFe,('K!fr9Mmkli!S*DhI,h1YqLkkG$K)i1K`h$kDVh +'",@i8fhDmFZEK+ba3e)hYic4J3P#P#1CSa#`X6N#@PT-,(X$aCXI6d2TH0S4AVc +aHZh`50hQkHN3LNqKDcU&BA!NR$IkN!"KS#)XmIADNiD3!&P@M-,'%1UU,a2!CRN +L!iX+KR&3Xh"3XdT#EH)RdQ&jQS*U,#-3P625SH(i)f90@9km,&eMY'R(NB[XNM' +Kfak9%'HE`p')F!pY%'XqJTE%YT'5#H6l"0HX(#!aG46Al-6R!XU5'flbkpSSblJ +ir+j1GY8)3jUl)h9l)aFb)+!%LE5P6*!!JQ1$XG8BcB)"*KTTKhKAk&cMbcUe$80 +qChXNbE2XSc$**,P&BMMMp2MDZH98$-0qER(5F"B+ULpNVT%QK!PhMqj#"LAEKbY +Ie*YV*$2,Rf2,#!"I[ZR1UH'%MTrm[Q[BMF+(UedrAf+2NBNk-ClHQRYb%!DpN9I +95p6JFFZ`@dQ@VYX-MdKma[ETcqS0!amY%@ZfVB!4-0mdrj8#8BBE&4PiYYS02TM +PmP3-LYc%TNUm3SkPq0JmI'B)(bCZ8PS0cl!P*M$(l&%-qc'F4+%84T0RZ$r5adf +@G&imeQG*pqMAkAN@)pBFlH2qcF2fj$SL'ShN$iUQ1eH&ckfa2Y-Bh%6rfcBGpcH +Sprd($2&YVl6aZ+r2p2Y6pGBqbdEFB8F%aM"R()$2AAF64rId+rQQ''rfjCGUEGf +BZKR,G3El4eLZI[TQIRb!ecZL1BTck-fEI$hhj'3j-eqibGrLL4F+qRY@IBHh1Lc +S6VjbNhYB+15+ZQViq)9205[+,Skm5eZY-QI$eDid1ARah-AIGrhXchB)+ccb`@* +bpKc19NCKBPq6d*9p0)cKHDIY5GpTZeA4lUlQkUmDBI`RYK)$JZNm0[+NHK`CT"( +X2FVHfdqF1irf5E%ppra0&'kGrkrREk13!1diG`N44Ik*dr'ULX*lrh4,T8,&UDZ +h8,"N2[Gbi5N8$$BE-9KZRA[14SAX3T5S`+8r)-iM`pKLKcrb$(m9,X$@b$0)mD* +1IipH5FEk)Mqr8)+-S+!4Ka-LL[HL!@"EKJmI0Y&[5G[lT%eEVhjk&1EjBeX5h`U +l)rVaHVXRSKqXYmI`kS2j86rH"mGD##HB0Zi!1MK+#@e"LJXERGHDd0&4$V'Mr*I +5e5kKX9L3!1e-BJPANM3!Gd3ZcaD3!)&lKYh@HMZACmhM6Zh[rd10SR-H3qCNPVm +SZK@K))BHRLES%5AdL%hb,,"I&&$4jU'V4Ai@`Bcf#&kP0[pC[3#JV!3$jXd!B(f +@k)*XHjbF&VR(Qk'1JfhY6`i")FY&KLq43h'XhUf2rG#(%)bp'DqNhImMR4,,e5N +4iI0Y(3*%ZMM!'3GDU-I*r@@N%FV*E+!Y%!D1SA!YiR&#Q+N-eV9-rI3&U0EFbKJ +mZ4q$SARN5D"V"S%63qM*kFrj@$'pr6%5am#3!"&$aU#KT#-V4e(mMUbhP5D-F6$ +'Q`a&-"5K)8T++*3%%A%[%2M6N8BFaMJ3)fQkidcQ2KJ'%cPjKe2-%l82i5$m`pP +)LU,K$b9Re%qCZ[!8#@beZFJ@%F2VkVKp''lT%iPk"$5MGXmmr98%CFqffC1aqRH +A+GTBV%HI'djP'aa$5cS,!NC-I2c"$&,((C`F5N8MM1iJ#!&X(h2(K)#"d+BaM2! +j,4D1pkklYhrUhNml5%N8@d)N&MjqN!$F4ID&5(#T#5BT0a`mcUh5iMJY2KYBA*c +1`N+2q!i@@X@&M04TU*1jca+j$eMJ-SH4+jE)[F-!M!,!p`"B23"l4#)H)q+I6[5 +2p,L#L"XCm4JM(K')`qM8P1KE!P'SJ'qVIa(q3G`64,ajT2%"ZV4VeBMV8q(D%[P +p),HI!GVN)-f2-k)a!,U,$T318MV3#SRiNL$LS(eIGaAa#R)#V!qc`%3F"XCQ'&@ +XNAbdI@rCeP-@qm!&dE@#13*R#Sl!05X3EUeSq0"ZI$"MN!!C!mIphN`F[4%+F#- +6E(F&ZJ4AGlP%-qk-B$K-Rc@c0H034U*`r[eI8%`qH6#$`XYJ28)"$&`*$-iVM2f +)&0Bi))5[j+2S8S3&0!@Bbc#8q@#''XPpN!$#e)0mh&qlp1"a!U,f(c6M$K-F%Ji +i2G)LFQB2XdRQpBdVXF!``1VT!eK1NmErjYrL%-R&AGc)A"CR"Y$aT,$Yr@GGUcV +kHcXHl1I-p0qRdd9QU%Rh-JTZ9Jp2ZNR*RMMra-ZN[0EQKXG(1kj`YAGS)YqL&2V +mpQM-kLkTd#[q@+Dlj2D1jGcR[fpTYppA#TAL$GfS#V(M-[Im5@"4`T&5[Q2lE$- +#E&((TXC5'S!,RU[`6PG(GGqUACBf&(453EpU&ip"K0aFh8fL9+PBlF+`6qSHN3S +p%Y[6eIF5ffDaHJ$$&k4Z45VFNYLDUfm5fcUaqJb'mk6ZFe,KGY@89k3T#c"F)R9 +IP!VCM1@'a(+(QC!!"&0p&SbVj1`GSDDjjh8Nekr$058kV,I#FELRPlS`''[S,Cb +"KMiD&*UaEE`MK)XqcJi%(5L,D')8K(0DQG)-pCRI%04RT4iG1j`80SY')Clb)JT +P34aI,T!!K8%BM0lcETYjP[IlJb%%Q'SDEHBjU*!!mHqDN!"jfRXfmdbB'M#apmE ++ii@Gp'(Hllhah['JiH6Cd-BlbPjdPG%J%X6-L3c@I4(6`-(!dS2"p`'@MKe"039 +Zl5`X[ZL(%($,&N%FUdjk[mh#P$RiD2CqQc%P'C-a&EUV!RBk!lD&!6ZEJ2ACc!X +Z654XjRRTU#$@E'UKJ[FL#qa3#"-+qkCUB4#-#kSBIp5%dF3BC`Q$!$P*Nd2GjX, +N[XAQKCF+ZQcQcmUAi,@m[!A(Y!6(Y$5b'+%2MZj%SKI%mbeBBUk$S28@%pd-l9` +DA#J-3Ya"SCdVQE4!BJBEXD3k%k(bkBdZ'%YQNqX!1F`-3!cJbl"a$"bfb4r$K,) +%2p-hf-b9j5eil4-@H,m2BLYC85XJ#aaJSZrLmR5T(Kb@-)b!B"4J93@5Q""`6qf ++VZ2QP8$L([0RH'de,m9,-5rI8'!aQCIJ)f5HMYHRjKDm$TTRSi1E'r'K0mpL(62 +a'M(2B4h69*YjTF28H(*5MbS6bC1&h,4"Epkh$8,)*e-EfXb9kb'XRi"c`!Qpql2 +(),*[-*42aq"m$#ikdFB'NdN$0k*M550G&SFb#eIEd&EH`P"PQ)4AZLc3BbrE5*i ++lLrUlcUqmEUL"V%FDFT5ZijBK%-e!*N01"cm,$!X0YIKCq&JU(bRpbjHqlcAT9" +ChE2Cl2L0`L&54RdAl05TdQB'MTB0JXa4bQiNk[PZ`[4#KM'$3fa!"rYBik0LR"L +kEQkCCMk+c6Y+VM4NmV'6dGFBaP#A69i$aU4$l0+EMkTC,)-4!&8Lj1ip-ZpDTD8 +%bJ*cN!#$c%%%L(BXB"5b$*!!q-h)5X&N3[&V[$dNDdJ-&qF,dbDbP'faN!"X1G8 ++HrS,GZXCB`mr&32E'M$0IPb[c!*,6"+I66fpe+@X&"&K5b'-S+#UZS[Uih3U +6Cj5-Mb4FQV8NB!SX")+P[Ur!iKX&FLJDZ*-NJj`&KU0G5,b-U#,6aD1Q%R)D1"G +'&B%i-piXJFT[TF9`1NMDNk0ReFh1P55`eJZ11%H`aDqLZY&Lmi&E-F1@3Gh$6e) +6AIY2[R&lM$SGHBdIiN!2T$)m,F)90F5m854Q)0Pb(0JB(9K#RdCie+YJHC`kiIU +E2j!!N8UNf-ATD(8q#[V5jQk$)H'Y"$N,5)P1H5*PEUN+lMmf8[H,*B)CJE+T41i +,#TKUT0!e"50(kM)253I13KqEbJD3!06+f04IPl&0XkB-416NCRE#%4JQKZT-r#c +VkS#"#N(R,TF8d)i5-SJG$"QD,Jc$0(88`D2N)+T@aGr[+TKilYc,fPKA`GP98bm +!S9)NR[E"2%8U+Z6&*C,4dU6Gr'qQLY08mVke)5e$#CQ-`$1!c"GN"ej6mXZ'qk` +KqDEli8'Ul"#5E9)K,48+T3)IY+6!-Ph!346*&-Vbf'%fP8IPPjR4**k18"JrqID +&$!6`*C-+NY*T$6EjPPeP6*Q8c$9eVCKl"FGj,i5CZQSVVM@!+af5c%flYRme`65 +lp5db"FP*ZP`J'`VC$aR2+Q@mERCaLh4aK9em3(jCJa!X,[C-eG925B@`9$JM&5b +"UeZZXUYEF29kG[91q@8!Ib(iqNAHl9cIqH1[rim&)h8("ZMkQi`-KHY6drhL-Ph +32-T-CCc2&G"YlYbe2(a$B)RH0YP%@IE"K'4QaV*Y+-VfGPqrIC+51&PM9`'Q4TZ +*E$6,RQQbbFJR5G[2GQTEf5Y653U$'fbb6eX2CJ13!-dQZi"U0VP$fiIAK&BA3$Y +f!$kl"J6Rf$YTBZI3`9j82(#*+j!!*CG4eSJi`iZC`Pf(Mp1Np#V0U8[Y(#0!!@$ +%&j+(cM!hM*`fU-JlUi*R-J)B5El1(Yd!JD@m8['MLC@U1U(D+"b!+$YHXd5-I2a +jIrd+2SkTGY,%QrI#I(kekR0R*-aI&(I#F*k%N4a&9VeKjl-VH*Jre)-LUf##*!9 +,CX"i5L'fIa5BGQ[j3k`i)bFFk5epp"*9JQbRJAHT+J008H8fNM`UQ5+,dk4BlF6 +86R+-LT8%9dBCTdT59BN*a,Sl!SUEMK#`jHrKjdJ)4bkHa'Y#2#&Xl%&XLhJDVfl +a-MTFiN*m1-9jH0d5&`J)-D2&`hfP-2"(fCDl8S'ICr9LKUr8RSNX0HT-iY9TE`D +486LN!h(&q3VX3B3Z6Mr!b@!Ej#H"9ET1`#!r`V*HGb"4)9-bQFd&jjrUBX'JE"V +&G*e-Q5XL8NNZ12"dSH+*YYZ(+c-8C4R$%Fp4N!#m1H(ZU6@%4&N6NK-!5b0H&`c +*-(XhrVL'&35[DmH%jMA3X&CcbDbG#d*Va1[5iD!CKQQLl[!dAbr#0dQ3!(p"YV# +'&Dl-V'P9cm#XKXD9@iaRHmQF,B![qi4XCh%(VP38EJpTTqJB!-4*C)immB4@Y`& +1qpSa[%jVkhfi$$Zq*,Ij13C+l4'`,8+Q3M8FV4((N!!")b%GHj38#FU!k&U)$)S +$#Kb1$aR)ILXG%V9)jPBLJ*)0XEhi2lI!H,e0YBRDiBjI03*Gka`ap5pNd%hmK@@ +qX,J#BLLbh82A#)`H,),!"'F*XEJ"cLqfT3,*U0D`@$MiJ3a-9@drFl"Eb-*JU"B +bEK3C4qNjfrX'!hNpMQ!XB,3[KcTbE&rJf'UH9*28P)9,!S-(&J!B)@RMFR[!P#i +H*4@L+Pb(N!$q50e[@aRk0GZMj'3#B`#3!*-E!k)c*3qNVUcD`kpSG+89bM"6*&G +6dM*cfUJqr,RhI2J'Z4M@rKkZ"(rSkCh+U(+FcI+1qcjdcJjbcMa%$RF`9V$Q3c2 +*Vb1TQ8Z"369dl-XZrE%[m,0LJfYMYX'fXG9JUmj"H1N+IMLDT8r`8lmY9$l$e#E +ZX-GJPDhfYr'R%GVHMm4kEfG)GU#`-[)BjrFFX%8RG9436*0&%,)3L$!0851@KU0 +$1R5X!8h,LXXA"@CFe@U,MNS,4V&J)j))bb%JiKNimY'#"4LiFIN2)hADph`ADF' +P#ck!P9FYC%RY)CBCh$39$"aqDBT'harSF#mP`(b&-D2Ke5jKc+dd$CK,*I)r)PC +Kdd50!$)H2##!FJDSdCN18G-A[3+8(+2%X%Qc9ScYZ*d+B@h!SCC2DqS8@-U4)$R +bS%cMN!"+)-$KXV+M-+R5X6&Mm$d(`P``3%&B*b4mKT!!N!$#V&fpD*`QY$%KmiG +$f[VfV'q$(&#[UTV)50fK'YrG2%r%*[j&LbUC`X'8cjh+`*60T'JI@iiNrdF$'D5 +XmQ@TTJFErdA$iQ-Vk%#1)6XFqa+&,mM4M5&QK+QA%D$,&cf,Mhe"TS)Q6S"@##2 +0$A5e1"9rMb*3'+qAb%@[(Lk#%8-KEiFEB$-pm!$'A,Kdr3J"Y%-MkABq",!5!![ +9D!29q1N3I$Gj,%p,46K1)jZ8'`11iD`jY$*MBBf[%)c9QRBHSkQ%#GK$&)CH+N# +9arDAb%@`(P1@![RQ5YN16GK-V`D"VN-V@D0998NH6IblpMK0kmL%fCK9pFLTFLH +%JY@-CS(%Qk6JeTS+[C)VbSpRBikBriD4A#E`F)US[CiF'[*H,5aN,Z-!6h!#dB` +(h'5C'8GJ(`-lBb,h#c)(1U8VL9pUq%"'X'XY1mL66PBC(qBm90Hh5`fP4(Bq((Z +dq+Pfk+K#*BS,m92'R$fd31SqE`DF+`U%!DT-LF'eE("ZC$kjlSLI1@G&jM1hRqA +1*A!5LpKeM(d[@,r,@0Z&!BQ%L)k$V)-D"Y(1(R4J1!RA"J6aP'E*r+Tp!BBBlKF +H+'*1+8NcbE(f'JH)j%Uq#`e@(6QPS%$KFP59P"F*lL4b$VNDNT-+'BFB'K[46)i ++3r,q9Zj,3RL*UNphjQreGh,D!-Ij2*8pB!3L)j&2EB,6PA)h`HY9"lPel+Tb8jS +VZ#Q"6C9!ZTFf`@NP9c6DPT3,%0XScYmK9b!NPbHfj`L8qceQbUfXQYV*MQjZP6Y +5TH$ZJki1iH,Q#MDG4Q#Nbc-(-B3pK5BLjH4$KPlKD-`,fC+)F'"Q,hdbB$Tp#01 +S4ArrQS'B&0b0T%@251aAT'R2#CFeRi%lmPkqNicNJXU(V6R0R+,)l63ARcNS[)e +'ZjL#-*,,f0X`3cB2!pA34,mIP"NX%(6L3VBK!5MPPN0,i3J6F("1`T8QU54lHTA +C$Tj#GMP1e345&9LZm3)%!aZq4*8!M`HSm0dTMXI)E0%M@0[&a)S'Z!R'hB@FUKG +4*LL%+f%Fj[Tc)CJ$a*-(Tm6E!,d!S#Z8C6AFe`[hNRcQ%RI0EN`4h3+95#*k!@5 +QiHGa,0iABX&@XB+4U`'C&JUl%KRRHVJp'C(`Q@Kk(16%50hqDXdiN33j9#Ak,Ki +9Jkj62!9Jmd3'Ueba,0KP1RA9dEP0rNqNR*mGr)0K04T)"R+IHS0,0!i*lV9*5P+ +J20p4ZJ8AkmT)H"aC`)9(R-$pSjeIFFfiUaE"fA4)J`F$)I4!4TTkaN*'3d2ML@' +pJe8PJ!0-9X#P'C@,9J[*dVr@898DYS6F38'f+RN#XX,4&5#NT3S3+A-)!l12h-+ +TfJ-fl*h*l`ceYUjc&b[eQ8EhBjGG[[km0EjqCj`HL0+!#N#h*JGZV,aaGCqLCPS +&"PXV'+b*6S(K,+Y3iG2R*Epjr4[6RjMa[eZHMlBE*cmC+PDmhjMZp!pmVUaTAcH ++!69qm[0+226KQ`prFVd5MmHi&%[(@B@5-lePc1'c1Cd&4e#UG$!3MNpNU&NR2rp +Qb98Z2JQ6qmlYEC*UR2c9k,+Uelq2PJ5lU,0!'Djj9Rq1UhpAr`l9YTSk"r&3'UL +Qb(JNU%A[3&L@QVmX5Zch96AE3*)$DjXfd%!e`C5`6jG9iA)QVd5RSi,H&@lUj9R +*AJ6ik[b'39f-*TK*9@8d+pKNU&3ZjKPX)J`3BUA2aC4kPm2kpq@VpP520YkBe+H +0JcT,Ql!-XYfAh%m$8-jRZQrUbHeX#!ea""e48YQ)B04+"K0P#X,[8'"a8I8`&Zh +qSjkj'q#&cj``((r8)+BjQKA"a)Z@%d!T`N9IN!$aJ-H$8Bl#5E5!+Y$4Bk"'m3% +EFL,iU!l(QKk9HjNe*1lj9fm*VJc"V()#eirBH,fiblCNE8MFEqVI)G+M&S#SR`r +T8D89#"ATjj%mDap-@'*P@5iYq`V,P!%D1"ICaiEm0LJRZpCDKi[FIhrdJ9Q,aCf +ME3T9NZ(LSh$#4q8e0'fS'VH@UdAZCBpQ0a+,RNMX+b%#C`Q3!,0S)&[keN@k88P +q9%hf&)1Y!T@8,dD+bDR5&LHP,RQS!)NiA4DZ"bj*`(i,9CjVX&"c5j2``af0hkY +I3iqb@"&m'&Vr6hmB4-cCZSD1C(HTb+iDVlTU(0I[")[H+B"d&5,NY$@kHm6P0R% +rBpj4aEa$h*AFcGZDEN[jPIr[E9NX6[XrfjLKi)hTC"[6fA4MKYki-6eXBkaA1#T +kAh@)MGdDIXAbDe[65aekqkHrP2V2MApVr&YL8Vkf$%GfR8fiP`(m)GKkqK2p+l) +,Qbql%[f6c*hfG,D5a%IbG(CLGbFEZTaGGr'5[kii$bjh24F&4%QK$!*p*i04a[m +CS8cN)KXbjI1cZjh6&@k1NaJV9Z#kILSJG,*lEVCa,VUV&9kcLbh&idCD$b"4HP) +`S*0a3Lk!)D1!URJqQMfT9cbM(ErG)qidR-*MTC!!m+jC)BSp[4-h)VeCIPYPbN3 +ZK(l*+-3U58H%"f&XfN80pa@Hcrrk'b5dlXH,eBjhIq1*ZIm`p*hre&+hffjF@aV +T&d@R(pPk&"ArL`SX$mhhp9r+(-5@$4E4BlRiF,K%DNa1N!$`dY-pm2NA5)5IQ"I +X8ZrJ3f"Ufb1rBc992'*UicXD%kMY*(hm8Ip6I"VBCmP2qM3CK+)D9#9T"f[D*R& +aQ0STN!!DbCXXX2`k$a8G2)Pq((mf*6H6qVljh2V$AQkDiBVdalJ0CLPHTr1EA$[ +%6VmMXR0arU&Tl+%DpfH[1KBe#89+TXK)D)q4NC!!YUE(*KHX[kXi09EPDV5)FhY +Bf#`NP6[a'!Lrm,RU506[Fk&jKfY53PV@9k,K5RX6GP-9ZfPll&89cYmA'#RlU2S +%,S,M2a*Fe4M9ijLD0QQ6me(T$Jri#mim[cbcrFccm1+UM"0$aQQKM%,KQ4dL5`V +QMZVleYhQ(UTbM+lp,![p&3Zfq@'Q')qdmD+VR"rGA@eC2kYYeLpMI14GHMJ!&Ym +BeIHi2(Mi#+m-$*d9KQB&KU#QNI#q6%S`QP-2#VVrJ4m@#`mZN!!BLjXQ'9Kd)cp +V#6,h9$F$MAAG4ee[)"*8BEq+Q$+52dL,NpfScS2PZpMb(rbdbf1"6iHPdHmT)8@ +UTlHZpbUA[lJQ2AVXrZbAlNC0E2J)QI5&6&4c,kUk(K!H##"Abh2N#M%LkX8#SEU +l`Klq"A6B)hp*kX&J9J`"9RI*)%mE"GA&('1CX"G)rVdRCU8UUV-+VAh#eU0bPT' +bprm%SP2P#50c54MiI#9Pf[eTUZ`LLEFETb2a+4%$&D@4h5Y23%'-GYR%LZTjAEh +9#j%JUG8V0pJfCPF[-LbZIUpY6r8R9B)rJYj8A@"T!`(PJf',c%(915"6*i3RBI$ ++&J3+CY$aerlhVZ0i"*!!6Gb,kSeiT@2HMdCHp8k-[!S!!!*#!*!$#J#3!h)!N!4 +#H!T+RFj1ZJ!d6VS!*%*R5(N!!2rr5'm!"%KA5(J!!5)krpC1Y4!!)'d!E%k3!+R +d)MVrbQF%6V83!%je@Bm[2&T&8Np#CkQJ*&GCMbmm4%&838*RUD!J9b"3)RJ*##4 +5B!ibf'B+-KTJ!N)C8FRrr,[*CZkTSkQM@Bm[2%4548a#CkQJ)&HJ*5"3iN!N$@! +'-KM9Y4!!8FMrq+QM6R8JAc)B0"L`@&I*rrT+3QIq6[!Jr#"I-KJd',#B9mRrqNT +#Crj1m#$k)&mb'$3BX%*Z#T!!3@d'd%""m!!#-""RrNl`!!!J,`!%,d%!"#)[!!J +[A`!%51Fm!#3!*J&)3X6$+!!U!8K&b-A84%K#N!2!`G##60m!2#)I6R8J,`!%,d% +!"#)[!!J[A`!%51Fa!%kk!*a-h`#-)Kp1G5![!!3[33!%)Lm!##pI!!4)jc%!6VS +!I#!"60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!#a-h`#-)Kp1G5![!!3 +[33!%)Lm!##pI!!4)jc%!6VS!$#!"60m!M#)I6R9+J'SF5S&U$%5!4)&1ZJ!J4)& +1G85!6VS!&N5!4)&1G8U"DJT%J8kk!!C%J%je,M`!!2rrXS"M"L)!F!"1GE#(BJb +!`8K!-J"#3%K!6R@bKf)D,J"#3%K!J-&)3%K(2J")4il"-!G)4c)(6R8N!#B"iSM +LLE+(B[L!`F#(-J2#`#i$5%I1`%K(dSGP#*+#BJ4%J8je8d"Jj%je!*!$A!#3!i! +!!!aB!*!$B!#3!b!!!$mm!!1Tm%&%3e)$!!"B$9-$R1S'YiZ&ElRP&ZjU#kJ&,-# +Y&VE`,r!YGe&Vp9i!!4lq2r+65hNQLaM%"%SP-R')#kJ$EAISXa!"!*!$#PM!!!` +!N!--!*!&I!!"!*!&D3"M!(d!R`3#6dX!N!Fp!'!!miKF9'KPFQ8JDA-JEQpd)'9 +ZEh9RD#"bEfpY)'pZ)0*H-0-JG'mJBfpZG'PZG@8J9@j6G(9QCQPZCbiJ)%&Z)'& +NC'PdD@pZB@`JAM%JBRPdCA-JBA*P)'jPC@4PC#i!N!05!!%!N!9Y!'B!J3#L"!* +25`#3"33!5!"R!31)-P0[FR*j,#"LGA3JB5"NDA0V)(*PE'&dC@3JCA*bEh)J+&i +`+5"SBA-JEf0MGA*bC@3Z!*!$6!!#!*!&-3"R!%8!V33%8A9TG!#3"3S!8!!F!4# +)'P9Z8h4eCQCTEQFJGf&c)(0eBf0PFh0QG@`K!*!&#!!1!#J!,U!#!!%!N!0q!!% +!N!96!(-!C`#["!*25`#3"33!53"&!5k)A8&Z)'PdC@dJGf&c)'0[EA"bCA0cC@3 +JGfPdD#"K)'ePG'K[C#"dD'&d)(4SDA-JGQ9bFfP[EL"[CL"dD'8JFf9XCLePH(4 +bB@0dEh)JC'pPFb"ZEh3JD'&ZC'aP,J#3"&S!!3#3"9d!F!"a!+`%!Np,!*!(5J" +9!41)1P0[FR*j,L!J5@jcG'&XE'&dD@pZ)'0KEL"[EQaj)'*P)("PFQC[FQePC#" +[EL")4P-JGQpXG@ePFbi!N!0Z!!%!N!9S!(S!I!#f"!*25`#3"dJ!AJ%PL%j6Efe +P)'PdC@ec)(GPFQ8JFfYTF("PC#"LC@0KGA0P)(4SCANJBA*P)'j[G#"cGA"`Eh* +dC@3JBRNJG'KTFb"cC@aQ,@9iG(*KBh4[FLi!N!0D!!%!N!9G!(!!F3#X"!*25`# +3"dS!93%6L$T8D'8JCQPXC5$5AM$6)'eKH5"LC5"NB@eKCf9N,L!J8'aPBA0P)(9 +cC5"TG#"hDA4S)'0KGA4TEfiZ!*!$+!!"!*!&c!#1!1!!dJ3)3fpZG'PZG@8!N!8 +%!!3!``&L`!)$k!#3!``!+!!S!,B"(!3"998!N!--!#!!#!#L!4`!JP99!*!$$!" +L!*)!m!'B!)9993#3!``!+!!S!(8"2!#(998!N!--!%B!TJ#k!GB!KP99!*!$$!! +J!!J!SJ%F!)"993#3!``!+!!S!+i"6J#e998!N!-2!!)%)'pQ)!FJDA4PEA-Z!*! +$-33!J!#3!`-d,M!Q0#i`,#!!U5!a16N`,6Nf,#""E'&NC'PZ)&0jFh4PEA-X)%P +ZBbi!N!-D"!#!!*!$!c3Z-!p6G(9QCNPd)&0&35!d,M!!N!--#e9Z8h4eCQBJBA- +k!*!$#!FJCQpXC'9b!!!%-d&%3e)$!!Ch$9803b)5%HCHEK"N,4P%D[*%*!X3@DZ +Q*LHh2BZ-i(ERb%Qh-e2bQAph[qrELM`EhmbhY8#5eFlXbH4*f,ilNa'5j9ENLDc +)laq42j1IbEcCeRB454B6XMFYb5)S31)(rdjCKT&84$LS#cYiiLGf)5c5J1e3aD% +@GK*H(mq1D3bR6lpC+R)6)mRY[@4[%r6@hmf'R%[)+8FIZEr5&V,ejRAjaL3*5bP +Tf0kN&a@6NPGC,a$mi-RK`KFHI%V$*QM4BN6+hFfqTX2b,*5j55k)jb(*(2h&i)X +DJqim&Fee*9$cG*JIMZ6*i#SGjViNe#Xq)@+3!*h[`af,NK")heX@$ED[(5XhPA- +`LA1fRcbNbSE0RBqrZ,m'l)YVm[NQUD!A@)"Ck2@aqNDT+'b%UlJKdF4%D4j'8D8 +QKLJRXm5(8JQR40@4X8N6+L,JmB-'82KL!,85ECR3J#8d%@TbLdfC`eLTT"qR$+a +eU)[Di0J#T6DMFe4B`aLflrdNJ-)Z!m3jBTLiESAmcl%RFHbLl9fAJNh,JDRU`pD +$+ZFdM(GdeX@!G"Z$#pDfYBXaSNc2)HBbh"2bA1lEQ20L2d(0f,[Q&#I)A'ZQ2(K +Bb@@qIDUNT-rSkShVZbh3b(2j4EE#Hi"%aD`5%YXK48JPi!JpjfESS#*')G-lpU& +Zma9#N6ZP%AF+hP-PhjBJ16hDlDNc*qDmR%1jlK@TB-cEfPh+FK[jplG1#3aZ,Gr +mP`rLNbG@J3Mpl)N"@`NmD#E1Ye,'NV,SJ&0-'N"4lGDH(L15jV)kGQArf*KLjXE +BBNT+ilSFVqIQ2L6S6,2!-qdr5A,SM5rZ8%e+qrrFIEa)TAK+(ePf3"KU9mH96Ke +iJM&J8-CCH2(UplHlTpQ8&pIV!mfS&!eYS22Y"H59K,,GX(5'$iDUN!!D1!1%4[D +m+R'd+EK+q$Ll6eBP[SHY1Jm&+*f0f9@c1LPl$U`!LB0EA#,N"l-#h9`&eEjM4Rf +XIVf`GZf$Y!rlJeGII3NEUUX[JA!5-Xp,Z*!!K9k#PFalib#6LH[)jR!53fYB8Y@ ++#cA4e!fZkRA5eL(bC5reTB0Nq+`1N!#ULm1*SfpKL@KA(V8&MK(J'6fDpK)ZJ-$ +X$'lTUd'pQXb1L-Hl60lqhlJ2YkIbbBfVNkBAI5lbXT26-1CCQI@i%dADZX@J'V( +"P$45$f-VG@mlh@!+D@pipZKGMr,CUC9ZcXXMqF'dI'XXGU%XA8IkajQ+#fPh$2A +j@FVRjqVrINKT#[0r9hl1a'Bar[EhjGLF9@FZ6fPZ&[UQ90aX9RVbi))fT0[hNY6 +0m9Pip++5qIc2PqqBK`c8pE9GaLXRlhFHm(""&mY9YB2CTqfiUkZ$G385RX(1bd[ +ERX3qk'4JZaVPpDGj!R%'T["3[!PH+Gc$PhJ`"hHqIVA3@F0Eeq31!!!",d&%3e) +$!!&Z$98,Sa,3(`,[MX0G"i1VS')4Q(4+"CeP@S'Clmb(SM82Ip(I(*K(D4A2I'$ +q&[0K9K8c&"2&r$@V5EkTU*K9439&phSP6c(*!"1aC5A+J0LHE33'eM"R5Q-Af($ +455FbMP!J*%5L5"VfFJe#ABTbVcRA4B@a96dp+RHhD`rFF&F@))QYk$RCaCMM3iY +@r'%I9"NNRi3H&+6Nb+Ekq,R[CKIQhmVFF$J`VdQ5m'YemhE`p&D5E6j5(VmrPl$ +l$k3rXTPHl)!0@&jc$0ZABIP&mp&"JI!#DaENdTMml81I`#icTcGeq@6Upd1K&[m ++1ImYiqD1UMI2ikh!"rA+h@GFD3IbmLC@e9$jp9!k6JUl9a2!KP1+'B$U)Bc230$ +[U!%J"*%91SCK"!!!#4G"4%05!`!1K3jG#k55),ibhjhrq-jHjTcIRm3X@FlH1F3 +CSh%X80,b[R0QLXqEJ*aX40@UcFUD#%5Rl(e8JllrGqBa*dc)b``NKG+`*T5N3Y" +1UPMIThV[djD9N!!b0-6@8G9SS`-*3XV@EJZ,ppfG(@H&VG9l$HjZ05)#-d3M(d0 +&9JkT3rK[IJhrMG+c8Cl(B+4U`aFMihF0N!#jkkJ(bAf)aK,IG)P[ca,IG-NC,*) +9Q2S@4ApLIjK&+S'Id[Z4`Ve!C&F!hk33*VJjb0NB50)-%!X)p`RCp6"I8pTh4UI +[+E8`dFID4ZkGr@lA$AQDlbldTY[ZH@,hr!+XiD9#H+cpQa8c%jVX(JTT(9@GRD& ++8bJflXSeSl4`5cY$Y5BUZhI&Y(p9rDdY9MhmA'a'S26RfD0D,'"MJPS)PR+'Y$* +IGS48-42MQe(`[2"&@fPYS(Z$2,ZVS#hMPle6m-bhq8GG`NZPN!#-)R+V%99PNPl +h36fhm*9bM*6G5(DLl6*[`RRN%1kYe0apJX"08h9pBpI"UeK@ZP%fDY[@f0f"j$F +B'16,"hmb'lqqr(ZIF,[qqr(8P4F2LPmU8Y6lJ@,C*HD'0C[m5%SlDaYhr0f9c5@ +RlpTrl%Ba0h%pIrF&([T)hhCPQkhZV!V"p*ICGPYr00)ATYFTIIZZ+Zh!F'lqJ+R +pekRmf5JSrZ#`Jfc9YhilkVTHh9L([6AGJPqp[j5#5'i#SGl@1!l!f0$([Z4B9)J +pbTMr8K%pV8&b'lM9+a*8%hV&U'bb498Z@DQS*MRZ&3U9S9IX$jNN*bhPP@UI8TA +)Arc+eR608jlGh#RG(Y%mCIVZHjY0eR5&1qC1dXc90emD5,Ej@(eFD1XV&rqi5CR +VdF[i&43@eN[fU#"2lpYa(VlC*ZUUNZp0XGNQB,2*LUI#aR9CrBK0&Sp+b8*6C1J +9E63Tqf"5i25flDL4ELQ!0#R1JdB29[1P&-F&`EQV34i-5ZXME9iP2CJ#Sq!JM5U +KU,HpAUd@9Ujj,Ce3erhrA2Y0)fVEk2m'%q('2UUC%2HLD&+GqD$mXUXk4$HdCk9 +'VaEk0mH(e6-fT4pmjRa9e3I09fm)JH',*UjGkCYBVDUp[eRI+)5dJF4`UL@ija2 +YP0UeSHUUm2!Y1A!N#i,p%r+mraE)KC!!h)mYI"M-*-j`h-92m%VhR)6A)GbRK)! +S@)q!m3bE39ZF$L3#NlajP54K$2XaQX4Q&+bEm4`j1AMiN!!D$8bLH48j)NdQ4Zl +PFU1$$j(RK3$Nj8cC#bja3Z9@VceajE1aV$3CP1@85*e1e)0Q)jGcLA5!ibD49*Q +cdSUIb6+I1lrc$,UNCTa,i@!(l&NX8Z!UXl)Fc@N10p%$TmlaarF12*%VqVQP+Ib +mGAC[Z(*i4%i0ElMdXHT++-Ze+['9N53H0#4Y9,3%Ib#8d),3L422HK!GJGBFY,L +Yf`X9ljIeI"9HZ54kVCUF308$Ta+%AGi0FXiSpX5"dhYD$!,RQ3U0(P3fjfdBeq` +NrZ'e,erl6RVGI#'mVR"`phbT-2,3[')Sd$cb3&!%V`adK&KR!aa2Y%%,Z,h0rNH +#iVJi,$5IJe1*KV4GN8AeTLJdhii*%jh+4+0lL-6G`Gb!1(p'+l"R#Xqlj[FAI)G +0QQ+9i'Uh+QCdXfkhYb)Q$Qa("&X5L'&#mPXXm@0)Ucd%5eJUcINKX48pJ6d%PbS +*K&[ci9Z%V*(I3hJPL`MrdJSI3`D53``T(FqmS[EkqkCA(rKLZIm!-KZ&[1GiTPF +Gl*ZpSH[blmr0kANl3fU1pr3DII1R0R@Yr)*!qJH3!1C*GFpaYEH[Hmh&ZN*A@%M +6!%pD0diEiCSl$VHQjr`k#`[26@IZ9DI$daI6KAA2pN(q9D3Y+FMIp2MMdq%6Qbl +q,Td1hibPQPH&k,ZJH0C&,1fSJfdU0CD1i33[B404!YdjT'r8eK+UMqe@Db3GV(d +cl%e2@"m1dpJq%Rh(6	H,q%2[!CM`9RLm[r%li9iPZYi6IUKXJLDiC`*LQ1j@0 +C1-R3A,AUd"L@,!$X'#)f9Q`GU4qjDTIlE$mqA(M5%LlfVkUm(4R$6f-Y*2qH0D6 +p36il*,[YSYC3Ef@,rIqX9*l!Ebf0'B$Bc0CR("AbR`1@-IY,[Y#8e9pF9R&@mL* +83(aXZ8)Z"La%VB`"J[[p584Bj!eI5+Z3!-m'FQle8ke"Xl)9E+f!P-EiV3U5Rr1 +e(UmFZASXGdNpP#jSPS%Mep04%N&XLQ8J!kB+PhfShJLZT1Hk&EZ'!AIMZcc23,, +Q+,p414k9S,B6,'a82bfhAaYETNrA%56ja02ZG*T5j4lME!"-qUA2Y$MMJiY4T!6 +X@Z)k)D`B8d'!AjJ-cVeXTE3(16-(E(Pb4Q#Tj'@9#%5hl5$Glld`DH2L9KVmeH* +EFa9hpIDl1`$QYF(BlY&bTX2dqBA$reLmd2TDRl(Y0,(GBIAPhAX"rrC*9qj6Dcd +$H#M1@jc&$Y'NGA48bXlAXh*S@kH!Zkfbli`-Z2M"q(b&pHX4I'G4%de6YE9A(RA +@qh)a&f[!UpMFMmNq0q"eB[piVX)kEUcG1DPY3V0$`62A6#EC@@pc!%i&h!kia8U +MBYEe3)A945F$!Zi8m+KTci21HV%pT#rHl4bkG*dEl!9mF@EmL(@Qr)X@N!!HQJG +M-lYP`%2C`r@*QVC6V('0%["TN!#F,[k0%(eX#hU3!0aHNqRj@JSe6JF*I04KqTH +ADUE2Tc,B-J[*j9f1hMkq&-B!U*!!KfX`AB-8B"Ah@IS[4f&li'IQ$1CAe9if%ai +qGN!&Q%S4&CiQhDIf@FS1cNUjaA2YaBpQiQbY3i'CP4mCLmX+L8rILUK3`8dZHmj +aV0YkRM[jP2ccRlVip*4Me-qAPMjP-@A,$9P,I85&#Ulqe@iaGfcqU-aPXh*qlF1 +-@ZZSlH5C1mA0TJqUQTkf2j&8)5`qd`4i3-FVSVN)cQ3YT[jL52V`9&+&J$mj!EM +GASjQX`p@2&,*6%A`c5D4[Tl00DT3H*AkL5leI''P)l9im[YlhCrhTp2DG*J[E4# +Y4L*[6e`je+K#q,'4%64@!PYK&Z!k%mV9AKd1kGd&SBA5Q+kqLIFl@5H@2&IJeq4 +4!*!$'!!d!!!"(!&S!!%"!!%!N!8$k!#3!j3!N!-)!#!J!3!#!*!&('&eFh3!N!- +"4P*&4J#3"B"*3diM!*!&J!#3!`G"8&"-!*!&!3!!!3#3!`+!!!!%3!!!#5!!!"1 +3!!!!*mJ!!%%%!!#"!J!"!!%!!JI!J!32i%!)''!J%"[m%#3DP!K-'[3NRc)%-N` +ek2NN05Jb%$Ii*!J`i!J%(q!3!J$!)!%$m%!!J!#!!%#"!!!JJJ!!%q3!!!R)!!! +%N!!!!!)J!!!"3!#3!i!!!!%!N!-$J!!!"m!!!!rJ!!!Im!!!2rJ!!(rm!!$rrJ! +"rrm!!rrrJ!Irrm!2rrrJ(rrrm$rrrrKrrrrmrj!$rRrrN!-rrrrq(rrrr!rrrrJ +(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!# +3"#!IU5!a16N`,6Nf)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J!!&8J!N!-"GJ"1F8U +$CKT"l3!J-,`!#$&m2c`!!M&m!!%!"$&mUI!!"Lm$,c`!!"5Q3IVrd0$m!+)[#%+ +RB3!#*Ylm!""R%NU$C`4`!8je6Ud!)Q%!!pDTp%ja5S0Q!URdF!"1G@"b38a"4%4 +$69!!!`#30&"b3@e)jf$`G$+I`Lp)!#!J6b*8-@N!&!!B)8!!*$&m!!%!,0+4)8% +!,U!#hm*-h`m'6R9+1!THC``J+J!)C``J3#!3C`B[1[q%6R9)jam'3IVrRR!-)LS +!"-+i!aTKT'B!!4*)H[q16VS%i&K2X(Vr@QB!!1bK'Li)##S!"J!%C`BJH!+QS"X +X+J!%+LS!#"JU!!5Ae*A8)$Vr9U%HCJ!!c#a))$Vr5L)'`VJ$'PK"B3$r8L!krd, +!Z!-D3IVr2L#!5S9Q"+%LB!3J4D!RCJ!!Q#T),cVr!Lmkr[S[1[lb,cVr!Lmkr[T +)H[m5,a!J1[m!8B""q[lf))!J$P#!3IVqk##!5(S!HQ%!#L6Hr!!J5N"R!URr)%k +J(b"(S"Yb!")%j`RM'H34!!%!)!)"!1!J6D"T!J!!(i!")%fJDYA8ep4"q[kB5T! +!C`K`!D'BF!1KQ#"0*8J!#(!!60pJq%je60pJq'!!rZ!J6U!IeG6Ae#"(S"X`1!) +J-F!+B*()B1"19J!!51F!1#KZ!!a(q[jD4IVq@L!8X**Y"#!5+)"+J'm5)&-LEJ! +)SLiJ&0'6NC*`!'!%-$crf8cI(!"1ANje6PEreNMR%aJX,J!35IVpmN)(S4SY52r +Q5Li!#fF')(J#TU!E,c`!!+$m6VS#RLe!rqTB6fF!!Ai[,[rU6VS"q%S!@%pR"R! +"B!!"FNKZrrK)E[rd5'lrlNkk!j)J,[rdS4iY52r`6qm!$'F!!8JJ,[riS4iY52r +mC`!"1LmZrrJ[#%kk!qC+VJ!88%pQ!!#8@Bm[2%024%9`!$m!U"mQAb!,ChiJ%h) +Bd)%[!%kk!Y`-3!!$@%pQDL!0FLM3J5e!rpSJ%h3Bd))Y32rH,`"1ZJ,`5-!Y32r +L)%ZJ+5!Zrpj3J#P!!#KCMbm,6VS3d#!IFL#3!)%T3!!X,blrr#mZrr3[,[r`,`B +[,J!-5'lriLmZrpT)H[kX6VS)9Lm,UD02l`!N+@lrkJ!-+@lrm!!3+@lrp!!8+@l +rr!!B,c`!!+'B6VS"L#e!rpB[2!!!U*p1ZJ&k)LlreV#"9X0%!dL$5--T3`!F+8B +!)#PZ!!`!*%Kkr*!!2cbJr#mm!!#Jr%kk!54BMam!6VS3@#mm!!#KQ%kk!6T+J%r +[!!aR"%kk%&B`1!&Di%!-3!!'CJK"qJ!D)FJ$2(i")'lrjU!E%!G-lKM)rm*1ANj +e6PB!!%MR!4K#"bmm!!#Jr%kk!2)S3#!-@%pR5#m-6VS!8%S!@%pR2#C-,bX!$$m +mS2`[2!!!S2a1ZJ#L@)mI!%kk$pBJD`!3S"mJD`!BS"m`1!&Di%!-3!!'CJC`!#( +!!caq!4!(61iBJ2rd6Pj1G8j@!!")ja!)+'i!#(B!$+a"6%&%!!*Q&!bX4%008!! +'CJT`!l"X!!TQ!RB"%!0-lK!)rrK1ANje6PB!!&Q22cbSER!"(`"1ZJp-@Bmr2+T +ZF!%I!%kk$ciJ(l#ICJB`2!)!B!3`2!3!6Pj1G8j@!!![!c!m#!$!EJ!+FJ!b!%U +"8X0%!fF%F!&J!R!!*Llrr%jH6R919J!!51FI!$iZ!!T)abm(6VVraKS!F!!3"3a +!!!&B6fB3!NF(rdkkrhb`4fi%F!"J+PQ22cbSRh!"(`"1ZJl#+"pCMcm((`91ZJk +f,"qiKPI$4!0R"(!!B!)J"NcZ!2Mrl%jH6R919J!!51F4#$iZ!!iJEJ!)+&"f!(! +!-"3-J!!!384Q,R!!-#`!!Jb!!!"$8QBJ$%IrrfFB)#`!"%*!5%$J5#)m!*!$rm+ +!5-HqJ@B#GJ%3!dcZ%)Mrp%jH6R919J!!F2m[!%KZ!!K1Z[qB5J"36fFD)'i!##! +S!!4#3%K!i%JL2!#3!rr#J$!"B!*`rdjH6R919J!!F2m[!%KZ!!K1Z[pL5J"36fF +3)'i!##!m!2q3!m#S!!4J!R$r6Pj1G8j@!!")j`!B*Qi!%#KZ!!`JEJ!)-,`$!A! +!+)!'P!!!!53'P!!!!NJ'P!#3!b!'P!#3!i!'P!#3!i!'P!!!"*!!"T3!!!%N"T3 +!!!53!!D8!*!$I!D8!!#!!#D!"T-!N!-N"T-!N!-J"T-!N!0)"T-!N!-qF!"-lKJ +!rrK1ANje6PErp%MR%aJQEJ!),8[rp!DZ!*!$*2rd+'lrp!DZ!*!$)2rd,@lrp2r +i"Ui!N!0)rr3YE[rdrr`'VJ#3!clrp#!Zrr53!+i!#,#Z!!aM"R"PB!!!X%*(3NC +J4R!!-!F-3!!%9F0%!fF%F!"J$(!!-!GCJ()%6VS0)R)!-JFAJ"J!F!!`"b"ZrrM +3J$''#!"`!$!(%$-)!()"iDRF36!(8NG`!$!($%!!*'@`3NGm!@"'F!!`"`a!!!& +9`d3$C`4`!'!-F!!`"e1!FJ*1ZJc-FJ!b"aQ!'!"`!$!()'lrr0#!-BB)!(!!-!F +30!J!FJ(KUGa"-!G54h!!-!F-3!!ICE"`!%cZ'-Mri%jH6R919[rm51F2'#CZ!!` +SEJ!83NCJ$R!!-!E3J%*d#!!`"P*'F!!`"R)!-Li!%Y+"XS"ZiN*'H!*J!!#D3N9 +#4h!!-!BJEJ!)jB!YF!J!rraJE(!"`+lrr0j!F!!`"A)!-JCd!"3c'!"63NM#Y)" +[+(!!-!I3J()!-M3)!%U"CJa`!$!(d)!jK!J!9%4`!$!(d)!q0!J!B"K`!$!'FJ! +b,J!5dS(5J(!!-!I3J$Q"#!!`"9*&)#lrr1+),8$rr(!!-!9b!$)'G!!8-aJ!Y%" +LJM!'8NDmEJ!5C3$rBNcZ'2$rj%jH6R919J!!51F2'$iZ!!iQEJ!3+'i!#$JZ!"B +k"qC0F!!`"h`(c%"q!(!!-!830!J!l#Kb!")!F!(!!A)!%J$HJ5!(d)"b!$)c#!! +Z!9*'F!!`"R))XS"Q"N*'-!954A!!-!63J,#(BX"`!$!%d)!L"j+!%!&-lKM`rqK +1ANje6PB!!%MR$`Ji,J!52Li!$LKZ!!Jm"qC1F!!`"hS(bN"`!$!'IJ!H0!J!F!! +`"A)!-J65J1D*CbT6J@F@8i&Q)R!!-!C8J()!%M3)!%K"3N'1JA!!-!C5J()!%M3 +)!1'*MS&`!$!&i+p`)*!!"(,ri+R#Kc!"61i3m2rX6Pj1G8j@rqT)j`mB*Qi!##K +Z!"!'VJ!!!53!&!DZ!!!#5!!8,@i!&2rd"Ui!N!-J!"3YEJ!8rrJ'VJ#3!i!!&#e +Z!"6rr"!6jJKb!")!F!I!!A)!%J"536e"rqS3%q))FJ!5!(!$`!&b!")!1!&84(! +"kDJp32rbF!!3%h*!`J"`!"!"28$rm(!"kDK6J$e!rqj`!"!6FJ(#!'F+F!!`,[r +Z8i"J!R$r28$rl(S)5Qlrm'G@,bi!&#mZrr4`!$!Zrr)[!#!,8S![!%kkrcKb!$) +!ji(D35mZ!"3[,[riF!!`,[rb,`![,[rd6VS)I#mZrra`!$!Zrr)[!#mZrr3[,[r +i6VVp)Nr[!$"#4f!!!2C+E[r`Cc*`!$!Zrr)[!#mZrra`!$!&,`![#dkkrGjm!"` +!F!!`"L"Zrr4b!")`#!$D38r[!""J'R!!-!3[!(!!-!8[!#m,6VVq,M`!fN42l`! +-['lrl'B3-!G54h)!-J"#0"J!B!!!MVaZrqjQG%TZrr"R-R!!-#lrmLm!,blrr(! +!-!8[!#m,6VVpF(`!(!"`!$!')'lrp()!%M!)!0T"6qm!%'!DF!!`"#m!F!!`"5m +!,`Y1Z[h!2!$D4%r[!!a@4Q!8F!!`"e1!FJ!b"aQd#!!B!$!(8NF`"P0'5N"Qj'! +5%!E3,[rV-JG54h3!0!%CJ#J![Qi!$Q8!r`C`!$!&AS$QL%cZ'2$rdNjH6R919[q +'51F2'#eZ!#6rj!DZ!*!$*!!N,@i!*2rd"Ui!N!-J!#3YEJ!NrqJ'VJ#3!dJ!*#e +Z!#6rq#CZ!"c@r!%Ne[`#50Em!#$@r!#!e[`!J#e,rpM@r!53!#e,rpc@r!%N,8[ +ri0Em"*!!,8[rm0Em!(`Y5rr)er`!!)!!)!Z3!+i!(,#Z!#"M"R"PB!!&8RS!3NF +J,[r)d,`!!)!!,8$rc#KZrmJYI!!!J!$rr%KZrr`[,[r))'i!#%k3!%UZrra36fB +'F'GJ!!8B)!a5J,#ZrmaMC#e-rlSYE[r-rliJ$&+!N!#ZrliY32qf)#lrZT!!V[r +),8$rXL!Zrlk3!+lrZLe!rkjR$#"-)Qlrb#!ZrkkL,LKZrklCl[r)5'lrXLmZrmJ +JEJ!)6T!!)#lrXV#ZrlC36f3'F'GJ!!5U(9crah!!%#lradM!d)"63$e!rqa`!$! +Zrqc3J$e!rqiJEJ!3)"$3VJ!-,8$re#mZ!"`[,[rF5(J"*#m-6VVmG()!-J"+JGR +",bi!(#mZrpK)H!%N,blrh%kk"E`[,[rJ5(J"*#mZrp`[,[rB6VVkCLmZ!"`[,[r +FF!!`,[rX,`![$%kkr#jb!$)!5S(C`5mZ!"`[,[rBF!!`,[rX,`![,[rF6VS&FLm +Zrr"`!$!Zrq`[!#mZrp`[,[rB6VVk'(S!3NFYEJ!-rp"2l`"JB!!$X%*'B!!!Q(! +!-!G+J'Cd)!a5J,#ZrmaMC#e-rkBYE[r-rkSJ$&+!N!#ZrkSY32qL)#lrTT!!V[r +),8$rRL!ZrkU3!+lrTLe!rjTR$#"-)Qlrb#!ZrjUL,LKZrjVCl[r)5'lrRLmZrmJ +JEJ!)6T!!)#lrRV#Zrk*36f3'F'GJ!!0HHJ!D((i)F!(!KGa!F!!`"L"Zrq$3J$` +`#!$LM6!(8dG`!$!'$%!#5'8!rf!%4J*)F!!`"Ja!!3"N%#!Zrp"5V[r3)%!3KQ! +!!ZS%4J%!F!!`"L"ZrqM3J$J`#!"`!$!')'lrj()!%M!)!$e"rm*`!$!Zrm*+J'- +!!+*JH#!-8S#`V[r-Bf3Y62qQ,@lrc2qU)!a5J*!!V[qU,8$rSL!ZrkD3!+lrb#e +!rjiJ,[qUN!#ZrkBY32qDC``J6#*ZrmJJ,[qDSLiSE[qDfHlrb%KZrji[,[r))'i +!#%k3!#!Zrjk`V[qL8%pN"R"RB!!#G(!!%"c[U)U!8%G`!$!($%!!''-!rhj`)*! +!,[r$F[rJUF+&f%&`!$!Zrm,JVCjZrm*#4Q!!!*K`!$!(5S"QG#!-8S#`V[r-Bf3 +Y62q5,@lrc2q@)!a5J*!!V[q@,8$rML!Zrj+3!+lrb#e!riSJ,[q@N!#Zrj)Y32q +'C``J6#*ZrmJJ,[q'SLiSE[q'fHlrb%KZriS[,[r))'i!#%k3!#!ZriU`V[q18%p +N"R"RB!!"b(S!'Kaq#(!"`)AF3(!!-!BJE[r`d)!m-!J!iSd`"e0(['lrlQ8!rf5 +FE[rZF!!`"L"ZrrM3J$e`#!$ra(!!-!BJE[rdFJ!5-!J!28(r`R!!-#lr`NU!B`! +!T'"i)!a5J,#ZrmaMC#e-rkBYE[r-rkSJ$&+!N!#ZrkSY32qL)#lrTT!!V[r),8$ +rRL!ZrkU3!+lrTLe!rjTR$#"-)Qlrb#!ZrjUL,LKZrjVCl[r)5'lrRLmZrmJJEJ! +)6T!!)#lrRV#Zrk*36f3'F'GJ!!$qF!!3(1qSLS"34h!!-!F-3!!BB`$rIR!JN!! +Zrm0brq#T`SA6E[r%F!!`,[r#i+fHE[r#F!!`,[r%5S!QE[r3Pm#hlJ!-C6BJE[r +38Ulrd"#E)'lrd&+Zrp!3Qb!Zrp"5V[r3)%!3Qf!+)'lrd&+Zrp!3Qc!%8d4+3'E +ZB&C@4#!Z!"M3VJ!8FJ!b,[r%*#lrd*5Z!!b5JLC!Pm&J$L"Zrp"5V[r3%*X`"&0 +%5N4R$#!Z!"M3VJ!8X)YLiLCZ!!aJ#L"Zrp"5V[r3%*X`"&0%5N"QlL!Zrp#`V[r +8C3$m5#!Zrp#`V[r8C`4`Cf!3)#lrd*!!VJ!-)'i!%##!F!"-lKM`rfj1ANje6PB +!!%MR$aJQEJ!81#i!#LKZ!""J!!%`2!3q,J!18NDmEJ!1C"*`!$!'FJ!b""!d#!# +`0"J!CHC64lK(C"*`!$!(FJ!b""!d#!#`0"J!BZLq4Q0)F!!`"RS!'M3)!(!!-!G +b!$)''E3)!"J!F!!`"aQ&#!"`!$!'d)!k-`J!F!!`"p#!FJ!b"Y+"0l-)!"J!F!! +`"p#!0i8)!'##Z%GQ"P*%B!!!SR!!-!4k!"Sd#!"`!$!(FJ!b""Qd#!!B!(!!-!F +CK3J!F!!`"0#!1M-)!(!!-!I3J()!-J65J6Hc#!!B!(!!-!I3J$H&#!"`!$!(FJ! +b"*!!JA)!-Li!$R3!0!G5JT+#XS"M(Lm,,`a`!$!(,`"`!$!%,`"1Z[lQ1!G54%r +[!""J)#m,,`a`!$!Z!!i[!(!!-!G5J#m!6VVqa$e(!!j2l`!3F!!`,J!1FJ!b"*! +!JA)"XS"Y!2l!61iBm2rS6Pj1G8j@rra)j`mB+'i!&!DZ!!!"*!!8*Qi!&%*'B#" +`!$!')'i!#()!-JBCX!J!'!"`!$!'d)!hKJJ!-!C54VaZ!!jPfLm,,`a`!$!Z!!i +[!(!!,`"1Z[j)3NC2l`!3B!3`"P*'['i!$Q31F!!`"R)!%M3)!%U"CqK`!#e!rra +JGR!!-!C+J'-NF!!`"R)!%M3)!(!!-!C6J(3!&$3)!**#5-%J,[rmikJY32rmF!! +`"RJ!'$3)!#SZrraq!'!1)!IML()"`S@#J#i"iSd`"&0%5N"QkR!!-!E3J()!-M- +)!#"Z!"$PJ5'('!!`"P*')#lrr&+ZrrbmEJ!1CB4-lKM`rq41ANje)PmJAk!P,S" +U!N+A6Y%LAa)I-"p+!@F%TdCJ!U0',SK1d5*I%Km`(b"I5J&R"+C(B!+L4dl4)Pp +`!D'B6Y%L,`!%)#m!#%(k!!SbI!!#6[#5rQ!'6%%)!8je6VS!*#!"6R8L,`!%)#m +!#%(k!!SbI!!#6[#5rQ!)6%%)!F0!6R9+J'X85S&V"Nkk!%C1G85"6VS!2N5"6R9 +%J%U"D`T1ZJ!`4)"%J8je4)&1ZJ!N4)"1G5)[!!3J,`!)3IS!#M*m!!*1m*,qB!K +-33!"`d"1G6m"5%&+3@BF)J"#38K"C`U#edK"5%!`!8K!J0mb!%*!5%"1G8K"2S) +[!c3!*J&b!8*!5%"Q$%K!-!*b!'!@dN&P%Y4#dB#`JfAdN!#$dN%)`3!!C1iQ(c3 +I6R8!!!%!N!0AHJ!!9RS!!!*k!3,f[$J`!*!$(!*U!"&%394"!*!$NPT&8Nm!N!1 +H4&*&6!#3!kT$6d4&!!-!YP0*@N8!N!2Q4%P86!!(!2*"6&*8!!B"8P088L-!!!' +QGQ9bF`!"!E*69&)J!!%"bP"cCA3!!!(L8%P$9!!"!Hj%6%p(!!!#"NCPBA3!!!) +53Nj%6!!!!Kj'8N9'!!!#+NP$6L-!!!)fBA9cG!!!!N)!!2rr+!#3#Irr#!!#M!# +3"[rr+!!#[`#3"3,rrcJ!!X-"![DF!!(rra`!+SB"![D!!!$rrbJ!,-`"![A-!!2 +rr`!!35i"![A3rj!%!!!Y,!#3"!3"rrmJ!#dk!*!&KIrr*!!YZJ%#pR3!Krrr!!! +Z%!#3"BErrb3!,Q!"![C-!)$rr`!!,Z)!N!@errmJ!#p!!*!&J[rr!!![XJ#3"!2 +SrrmJ!$!3!*!%"!(rrb!!-$`!N!@#rrmJ!$"-!*!&KIrr*!!`A!%#pP`!Krrr)!! +`E!#3"BErrb3!-(`"![CB!)$rrb!!-)`!N!@"rrmJ!$#F!*!&J2rr!!!`V!#3"3( +rrb!!-,m!N!8#rrmJ!$$d!*!%!J#3!b!!-4)!N!3#!3!()!!a)J#3"B$rr`!!-5i +!N!9rrrm!!$9P!*!%!qMrr`!!0TJ!N!3$k2rr)!!rX`#3"[rr)!!rc`#3"B$rr`! +!2pX!N!@!rrm!!$rl!*!&J2rr)!"!"J#3"[rr!!""#J#3"!C`FQpYF(3)a#"cG@C +QDAM(93: diff --git a/mac/tkMacResource.r b/mac/tkMacResource.r index 3ff3db4..491ff72 100644 --- a/mac/tkMacResource.r +++ b/mac/tkMacResource.r @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacResource.r,v 1.3 1998/09/14 18:23:39 stanton Exp $ + * RCS: @(#) $Id: tkMacResource.r,v 1.4 1999/04/16 01:51:32 stanton Exp $ */ /* @@ -73,12 +73,7 @@ resource 'vers' (2) { * will load the TEXT resource named "Init". */ -read 'TEXT' (0, "Init", purgeable, preload) - ":::tcl" TCL_VERSION ":library:init.tcl"; -read 'TEXT' (1, "History", purgeable, preload) - ":::tcl" TCL_VERSION ":library:history.tcl"; -read 'TEXT' (2, "Word", purgeable,preload) - ":::tcl" TCL_VERSION ":library:word.tcl"; +#include "tclMacTclCode.r" read 'TEXT' (10, "tk", purgeable, preload) "::library:tk.tcl"; read 'TEXT' (11, "button", purgeable, preload) "::library:button.tcl"; @@ -128,18 +123,20 @@ resource 'STR#' (128, "Tcl Environment Variables") { */ resource 'DLOG' (128, "Default About Box", purgeable) { - {85, 107, 243, 406}, dBoxProc, visible, goAway, 0, + {85, 107, 260, 412}, dBoxProc, visible, goAway, 0, 128, "", centerMainScreen }; resource 'DITL' (128, "About Box", purgeable) { { - {128, 128, 148, 186}, Button {enabled, "Ok"}, - { 14, 108, 117, 310}, StaticText {disabled, + {143, 147, 167, 201}, Button {enabled, "Ok"}, + { 14, 108, 137, 314}, StaticText {disabled, "Wish - Windowing Shell" "\n" "based on Tcl " - TCL_PATCH_LEVEL " & Tk " TK_PATCH_LEVEL "\n\n" "Ray Johnson" "\n" - "Sun Microsystems Labs" "\n" "ray.johnson@eng.sun.com"}, - { 11, 24, 111, 92}, Picture {enabled, 128} + TCL_PATCH_LEVEL " & Tk " TK_PATCH_LEVEL "\n\n" + "Ray Johnson & Jim Ingham" "\n" + "Sun Microsystems Labs" "\n" "ray.johnson@eng.sun.com" + "\n" "jim.ingham@eng.sun.com"}, + { 19, 24, 119, 92}, Picture {enabled, 128} } }; diff --git a/mac/tkMacSend.c b/mac/tkMacSend.c index 45a63bd..1bc27a4 100644 --- a/mac/tkMacSend.c +++ b/mac/tkMacSend.c @@ -6,18 +6,41 @@ * to interpreter. This current implementation for the Mac * has most functionality stubed out. * + * The current plan, which we have not had time to implement, is + * for the first Wish app to create a gestalt of type 'WIsH'. + * This gestalt will point to a table, in system memory, of + * Tk apps. Each Tk app, when it starts up, will register their + * name, and process ID, in this table. This will allow us to + * implement "tk appname". + * + * Then the send command will look up the process id of the target + * app in this table, and send an AppleEvent to that process. The + * AppleEvent handler is much like the do script handler, except that + * you have to specify the name of the tk app as well, since there may + * be many interps in one wish app, and you need to send it to the + * right one. + * + * Implementing this has been on our list of things to do, but what + * with the demise of Tcl at Sun, and the lack of resources at + * Scriptics it may not get done for awhile. So this sketch is + * offered for the brave to attempt if they need the functionality... + * * Copyright (c) 1989-1994 The Regents of the University of California. - * Copyright (c) 1994-1996 Sun Microsystems, Inc. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacSend.c,v 1.2 1998/09/14 18:23:39 stanton Exp $ + * RCS: @(#) $Id: tkMacSend.c,v 1.3 1999/04/16 01:51:32 stanton Exp $ */ +#include <Gestalt.h> #include "tkPort.h" #include "tkInt.h" +EXTERN int Tk_SendObjCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); + /* * The following structure is used to keep track of the * interpreters registered by this process. @@ -27,17 +50,12 @@ typedef struct RegisteredInterp { char *name; /* Interpreter's name (malloc-ed). */ Tcl_Interp *interp; /* Interpreter associated with * name. */ - TkWindow *winPtr; /* Main window for the application. */ struct RegisteredInterp *nextPtr; /* Next in list of names associated * with interps in this process. * NULL means end of list. */ } RegisteredInterp; -static RegisteredInterp *registry = NULL; -/* List of all interpreters - * registered by this process. */ - /* * A registry of all interpreters for a display is kept in a * property "InterpRegistry" on the root window of the display. @@ -61,54 +79,19 @@ typedef struct NameRegistry { * been modified, so it needs to be written * out when the NameRegistry is closed. */ unsigned long propLength; /* Length of the property, in bytes. */ - char *property; /* The contents of the property. See format - * above; this is *not* terminated by the - * first null character. Dynamically - * allocated. */ + char *property; /* The contents of the property, or NULL + * if none. See format description above; + * this is *not* terminated by the first + * null character. Dynamically allocated. */ int allocedByX; /* Non-zero means must free property with * XFree; zero means use ckfree. */ } NameRegistry; - /* - * When a result is being awaited from a sent command, one of - * the following structures is present on a list of all outstanding - * sent commands. The information in the structure is used to - * process the result when it arrives. You're probably wondering - * how there could ever be multiple outstanding sent commands. - * This could happen if interpreters invoke each other recursively. - * It's unlikely, but possible. - */ +static initialized = false; /* A flag to denote if we have initialized yet. */ -typedef struct PendingCommand { - int serial; /* Serial number expected in - * result. */ - TkDisplay *dispPtr; /* Display being used for communication. */ - char *target; /* Name of interpreter command is - * being sent to. */ - Window commWindow; /* Target's communication window. */ - Tk_TimerToken timeout; /* Token for timer handler used to check - * up on target during long sends. */ - Tcl_Interp *interp; /* Interpreter from which the send - * was invoked. */ - int code; /* Tcl return code for command - * will be stored here. */ - char *result; /* String result for command (malloc'ed), - * or NULL. */ - char *errorInfo; /* Information for "errorInfo" variable, - * or NULL (malloc'ed). */ - char *errorCode; /* Information for "errorCode" variable, - * or NULL (malloc'ed). */ - int gotResponse; /* 1 means a response has been received, - * 0 means the command is still outstanding. */ - struct PendingCommand *nextPtr; - /* Next in list of all outstanding - * commands. NULL means end of - * list. */ -} PendingCommand; - -static PendingCommand *pendingCommands = NULL; -/* List of all commands currently - * being waited for. */ +static RegisteredInterp *interpListPtr = NULL; +/* List of all interpreters + * registered by this process. */ /* * The information below is used for communication between processes @@ -206,9 +189,6 @@ int tkSendSerial = 0; static int AppendErrorProc _ANSI_ARGS_((ClientData clientData, XErrorEvent *errorPtr)); -static void AppendPropCarefully _ANSI_ARGS_((Display *display, - Window window, Atom property, char *value, - int length, PendingCommand *pendingPtr)); static void DeleteProc _ANSI_ARGS_((ClientData clientData)); static void RegAddName _ANSI_ARGS_((NameRegistry *regPtr, char *name, Window commWindow)); @@ -221,8 +201,7 @@ static NameRegistry * RegOpen _ANSI_ARGS_((Tcl_Interp *interp, TkWindow *winPtr, int lock)); static void SendEventProc _ANSI_ARGS_((ClientData clientData, XEvent *eventPtr)); -static int SendInit _ANSI_ARGS_((Tcl_Interp *interp, - TkWindow *winPtr)); +static int SendInit _ANSI_ARGS_((Tcl_Interp *interp)); static Bool SendRestrictProc _ANSI_ARGS_((Display *display, XEvent *eventPtr, char *arg)); static int ServerSecure _ANSI_ARGS_((TkDisplay *dispPtr)); @@ -265,13 +244,103 @@ Tk_SetAppName( * "send" commands. Must be globally * unique. */ { - return name; + TkWindow *winPtr = (TkWindow *) tkwin; + Tcl_Interp *interp = winPtr->mainPtr->interp; + int i, suffix, offset, result; + int createCommand = 0; + RegisteredInterp *riPtr, *prevPtr; + char *actualName; + Tcl_DString dString; + Tcl_Obj *resultObjPtr, *interpNamePtr; + char *interpName; + + if (!initialized) { + SendInit(interp); + } + + /* + * See if the application is already registered; if so, remove its + * current name from the registry. The deletion of the command + * will take care of disposing of this entry. + */ + + for (riPtr = interpListPtr, prevPtr = NULL; riPtr != NULL; + prevPtr = riPtr, riPtr = riPtr->nextPtr) { + if (riPtr->interp == interp) { + if (prevPtr == NULL) { + interpListPtr = interpListPtr->nextPtr; + } else { + prevPtr->nextPtr = riPtr->nextPtr; + } + break; + } + } + + /* + * Pick a name to use for the application. Use "name" if it's not + * already in use. Otherwise add a suffix such as " #2", trying + * larger and larger numbers until we eventually find one that is + * unique. + */ + + actualName = name; + suffix = 1; + offset = 0; + Tcl_DStringInit(&dString); + + TkGetInterpNames(interp, tkwin); + resultObjPtr = Tcl_GetObjResult(interp); + Tcl_IncrRefCount(resultObjPtr); + for (i = 0; ; ) { + result = Tcl_ListObjIndex(NULL, resultObjPtr, i, &interpNamePtr); + if (interpNamePtr == NULL) { + break; + } + interpName = Tcl_GetStringFromObj(interpNamePtr, NULL); + if (strcmp(actualName, interpName) == 0) { + if (suffix == 1) { + Tcl_DStringAppend(&dString, name, -1); + Tcl_DStringAppend(&dString, " #", 2); + offset = Tcl_DStringLength(&dString); + Tcl_DStringSetLength(&dString, offset + 10); + actualName = Tcl_DStringValue(&dString); + } + suffix++; + sprintf(actualName + offset, "%d", suffix); + i = 0; + } else { + i++; + } + } + + Tcl_DecrRefCount(resultObjPtr); + Tcl_ResetResult(interp); + + /* + * We have found a unique name. Now add it to the registry. + */ + + riPtr = (RegisteredInterp *) ckalloc(sizeof(RegisteredInterp)); + riPtr->interp = interp; + riPtr->name = ckalloc(strlen(actualName) + 1); + riPtr->nextPtr = interpListPtr; + interpListPtr = riPtr; + strcpy(riPtr->name, actualName); + + Tcl_CreateObjCommand(interp, "send", Tk_SendObjCmd, + (ClientData) riPtr, NULL /* TODO: DeleteProc */); + if (Tcl_IsSafe(interp)) { + Tcl_HideCommand(interp, "send", "send"); + } + Tcl_DStringFree(&dString); + + return riPtr->name; } /* *-------------------------------------------------------------- * - * Tk_SendCmd -- + * Tk_SendObjCmd -- * * This procedure is invoked to process the "send" Tcl command. * See the user documentation for details on what it does. @@ -286,15 +355,127 @@ Tk_SetAppName( */ int -Tk_SendCmd( - ClientData clientData, /* Information about sender (only - * dispPtr field is used). */ - Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - char **argv) /* Argument strings. */ +Tk_SendObjCmd( + ClientData clientData, /* Used only for deletion */ + Tcl_Interp *interp, /* The interp we are sending from */ + int objc, /* Number of arguments */ + Tcl_Obj *CONST objv[]) /* The arguments */ { - Tcl_SetResult(interp, "Send not yet implemented", TCL_STATIC); - return TCL_ERROR; + static char *sendOptions[] = {"-async", "-displayof", "-", (char *) NULL}; + char *stringRep, *destName; + int async = 0; + int i, index, firstArg; + RegisteredInterp *riPtr; + Tcl_Obj *resultPtr, *listObjPtr; + int result; + + for (i = 1; i < (objc - 1); ) { + stringRep = Tcl_GetStringFromObj(objv[i], NULL); + if (stringRep[0] == '-') { + if (Tcl_GetIndexFromObj(interp, objv[i], sendOptions, "option", 0, + &index) != TCL_OK) { + return TCL_ERROR; + } + if (index == 0) { + async = 1; + i++; + } else if (index == 1) { + i += 2; + } else { + i++; + } + } else { + break; + } + } + + if (objc < (i + 2)) { + Tcl_WrongNumArgs(interp, 1, objv, + "?options? interpName arg ?arg ...?"); + return TCL_ERROR; + } + + destName = Tcl_GetStringFromObj(objv[i], NULL); + firstArg = i + 1; + + resultPtr = Tcl_GetObjResult(interp); + + /* + * See if the target interpreter is local. If so, execute + * the command directly without going through the DDE server. + * The only tricky thing is passing the result from the target + * interpreter to the invoking interpreter. Watch out: they + * could be the same! + */ + + for (riPtr = interpListPtr; (riPtr != NULL) + && (strcmp(destName, riPtr->name)); riPtr = riPtr->nextPtr) { + /* + * Empty loop body. + */ + + } + + if (riPtr != NULL) { + /* + * This command is to a local interp. No need to go through + * the server. + */ + + Tcl_Interp *localInterp; + + Tcl_Preserve((ClientData) riPtr); + localInterp = riPtr->interp; + Tcl_Preserve((ClientData) localInterp); + if (firstArg == (objc - 1)) { + /* + * This might be one of those cases where the new + * parser is faster. + */ + + result = Tcl_EvalObj(localInterp, objv[firstArg], TCL_EVAL_DIRECT); + } else { + listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL); + for (i = firstArg; i < objc; i++) { + Tcl_ListObjAppendList(interp, listObjPtr, objv[i]); + } + Tcl_IncrRefCount(listObjPtr); + result = Tcl_EvalObj(localInterp, listObjPtr, TCL_EVAL_DIRECT); + Tcl_DecrRefCount(listObjPtr); + } + if (interp != localInterp) { + if (result == TCL_ERROR) { + /* Tcl_Obj *errorObjPtr; */ + + /* + * An error occurred, so transfer error information from the + * destination interpreter back to our interpreter. Must clear + * interp's result before calling Tcl_AddErrorInfo, since + * Tcl_AddErrorInfo will store the interp's result in errorInfo + * before appending riPtr's $errorInfo; we've already got + * everything we need in riPtr's $errorInfo. + */ + + Tcl_ResetResult(interp); + Tcl_AddErrorInfo(interp, Tcl_GetVar2(localInterp, + "errorInfo", (char *) NULL, TCL_GLOBAL_ONLY)); + /* errorObjPtr = Tcl_GetObjVar2(localInterp, "errorCode", NULL, + TCL_GLOBAL_ONLY); + Tcl_SetObjErrorCode(interp, errorObjPtr); */ + } + Tcl_SetObjResult(interp, Tcl_GetObjResult(localInterp)); + } + Tcl_Release((ClientData) riPtr); + Tcl_Release((ClientData) localInterp); + } else { + /* + * This is a non-local request. Send the script to the server and poll + * it for a result. TODO!!! + */ + } + +done: + return result; } /* @@ -324,8 +505,19 @@ TkGetInterpNames( Tk_Window tkwin) /* Window whose display is to be used * for the lookup. */ { - Tcl_SetResult(interp, "Send not yet implemented", TCL_STATIC); - return TCL_ERROR; + Tcl_Obj *listObjPtr; + RegisteredInterp *riPtr; + + listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL); + riPtr = interpListPtr; + while (riPtr != NULL) { + Tcl_ListObjAppendElement(interp, listObjPtr, + Tcl_NewStringObj(riPtr->name, -1)); + riPtr = riPtr->nextPtr; + } + + Tcl_SetObjResult(interp, listObjPtr); + return TCL_OK; } /* @@ -348,11 +540,9 @@ TkGetInterpNames( static int SendInit( - Tcl_Interp *interp, /* Interpreter to use for error reporting + Tcl_Interp *interp) /* Interpreter to use for error reporting * (no errors are ever returned, but the * interpreter is needed anyway). */ - TkWindow *winPtr) /* Window that identifies the display to - * initialize. */ { return TCL_OK; } diff --git a/mac/tkMacShLib.exp b/mac/tkMacShLib.exp index 9fcc9ba..e6b4aa5 100644 --- a/mac/tkMacShLib.exp +++ b/mac/tkMacShLib.exp @@ -84,7 +84,6 @@ TkGetMenuHashTable TkGetMenuIndex TkGetMiterPoints TkGetPointerCoords -TkGetProlog TkGetServerInfo TkGetTransientMaster TkGrabDeadWindow diff --git a/mac/tkMacSubwindows.c b/mac/tkMacSubwindows.c index b37e9f8..09bf09b 100644 --- a/mac/tkMacSubwindows.c +++ b/mac/tkMacSubwindows.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacSubwindows.c,v 1.4 1998/09/14 18:23:39 stanton Exp $ + * RCS: @(#) $Id: tkMacSubwindows.c,v 1.5 1999/04/16 01:51:32 stanton Exp $ */ #include "tkInt.h" @@ -930,7 +930,8 @@ TkMacGetDrawablePort( contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr); if (contWinPtr != NULL) { - resultPort = TkMacGetDrawablePort((Drawable) contWinPtr->privatePtr); + resultPort = TkMacGetDrawablePort( + (Drawable) contWinPtr->privatePtr); } else if (gMacEmbedHandler != NULL) { resultPort = gMacEmbedHandler->getPortProc( (Tk_Window) macWin->winPtr); diff --git a/mac/tkMacTest.c b/mac/tkMacTest.c index 6be2ebe..8f6db08 100644 --- a/mac/tkMacTest.c +++ b/mac/tkMacTest.c @@ -9,10 +9,11 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacTest.c,v 1.2 1998/09/14 18:23:39 stanton Exp $ + * RCS: @(#) $Id: tkMacTest.c,v 1.3 1999/04/16 01:51:32 stanton Exp $ */ #include <Types.h> +#include <tcl.h> /* * Forward declarations of procedures defined later in this file: diff --git a/mac/tkMacWindowMgr.c b/mac/tkMacWindowMgr.c index c073ca3..48ada11 100644 --- a/mac/tkMacWindowMgr.c +++ b/mac/tkMacWindowMgr.c @@ -3,12 +3,12 @@ * * Implements common window manager functions for the Macintosh. * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacWindowMgr.c,v 1.3 1998/09/14 18:23:40 stanton Exp $ + * RCS: @(#) $Id: tkMacWindowMgr.c,v 1.4 1999/04/16 01:51:32 stanton Exp $ */ #include <Events.h> @@ -63,7 +63,7 @@ static int GenerateActivateEvents _ANSI_ARGS_((EventRecord *eventPtr, static int GenerateFocusEvent _ANSI_ARGS_((EventRecord *eventPtr, Window window)); static int GenerateKeyEvent _ANSI_ARGS_((EventRecord *eventPtr, - Window window)); + Window window, UInt32 savedCode)); static int GenerateUpdateEvent _ANSI_ARGS_((EventRecord *eventPtr, Window window)); static void GenerateUpdates _ANSI_ARGS_((RgnHandle updateRgn, @@ -104,6 +104,7 @@ WindowManagerMouse( Point where, where2; int xOffset, yOffset; short windowPart; + TkDisplay *dispPtr; frontWindow = FrontWindow(); @@ -122,7 +123,8 @@ WindowManagerMouse( } windowPart = FindWindow(eventPtr->where, &whichWindow); - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); switch (windowPart) { case inSysWindow: SystemClick(eventPtr, (GrafPort *) whichWindow); @@ -293,8 +295,10 @@ GenerateUpdateEvent( { WindowRef macWindow; register TkWindow *winPtr; + TkDisplay *dispPtr; - winPtr = (TkWindow *) Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); if (winPtr == NULL) { return false; @@ -464,6 +468,7 @@ TkGenerateButtonEvent( Point where; Tk_Window tkwin; int dummy; + TkDisplay *dispPtr; /* * ButtonDown events will always occur in the front @@ -480,7 +485,8 @@ TkGenerateButtonEvent( return false; } - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); GlobalToLocal(&where); if (tkwin != NULL) { @@ -517,8 +523,10 @@ GenerateActivateEvents( Window window) /* Root X window for event. */ { TkWindow *winPtr; + TkDisplay *dispPtr; - winPtr = (TkWindow *) Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); if (winPtr == NULL || winPtr->window == None) { return false; } @@ -629,8 +637,10 @@ GenerateFocusEvent( { XEvent event; Tk_Window tkwin; + TkDisplay *dispPtr; - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); if (tkwin == NULL) { return false; } @@ -646,9 +656,9 @@ GenerateFocusEvent( event.xany.type = FocusOut; } - event.xany.serial = tkDisplayList->display->request; + event.xany.serial = dispPtr->display->request; event.xany.send_event = False; - event.xfocus.display = tkDisplayList->display; + event.xfocus.display = dispPtr->display; event.xfocus.window = window; event.xfocus.mode = NotifyNormal; event.xfocus.detail = NotifyDetailNone; @@ -679,23 +689,42 @@ GenerateFocusEvent( static int GenerateKeyEvent( EventRecord *eventPtr, /* Incoming Mac event */ - Window window) /* Root X window for event. */ + Window window, /* Root X window for event. */ + UInt32 savedKeyCode) /* If non-zero, this is a lead byte which + * should be combined with the character + * in this event to form one multi-byte + * character. */ { Point where; Tk_Window tkwin; XEvent event; - + unsigned char byte; + char buf[16]; + TkDisplay *dispPtr; + /* * The focus must be in the FrontWindow on the Macintosh. * We then query Tk to determine the exact Tk window * that owns the focus. */ - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr; if (tkwin == NULL) { return false; } + byte = (unsigned char) (eventPtr->message & charCodeMask); + if ((savedKeyCode == 0) && + (Tcl_ExternalToUtf(NULL, NULL, (char *) &byte, 1, 0, NULL, + buf, sizeof(buf), NULL, NULL, NULL) != TCL_OK)) { + /* + * This event specifies a lead byte. Wait for the second byte + * to come in before sending the XEvent. + */ + + return false; + } where.v = eventPtr->where.v; where.h = eventPtr->where.h; @@ -710,7 +739,10 @@ GenerateKeyEvent( GlobalToLocal(&where); Tk_TopCoordsToWindow(tkwin, where.h, where.v, &event.xkey.x, &event.xkey.y); - event.xkey.keycode = eventPtr->message; + + event.xkey.keycode = byte | + ((savedKeyCode & charCodeMask) << 8) | + ((eventPtr->message & keyCodeMask) << 8); event.xany.serial = Tk_Display(tkwin)->request; event.xkey.window = Tk_WindowId(tkwin); @@ -770,7 +802,8 @@ GeneratePollingEvents() short part; int local_x, local_y; int generatedEvents = false; - + TkDisplay *dispPtr; + /* * First we get the current mouse position and determine * what Tk window the mouse is over (if any). @@ -792,7 +825,8 @@ GeneratePollingEvents() tkwin = NULL; } else { window = TkMacGetXWindow(whichwindow); - rootwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + rootwin = Tk_IdToWindow(dispPtr->display, window); if (rootwin == NULL) { tkwin = NULL; } else { @@ -859,6 +893,7 @@ GeneratePollingEvents2( int local_x, local_y; int generatedEvents = false; Rect bounds; + TkDisplay *dispPtr; /* * First we get the current mouse position and determine @@ -881,7 +916,8 @@ GeneratePollingEvents2( if (whichwindow != frontWin) { tkwin = NULL; } else { - rootwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + rootwin = Tk_IdToWindow(dispPtr->display, window); TkMacWinBounds((TkWindow *) rootwin, &bounds); if (!PtInRect(whereLocal, &bounds)) { tkwin = NULL; @@ -1110,6 +1146,7 @@ TkMacConvertEvent( WindowRef whichWindow; Window window; int eventFound = false; + static UInt32 savedKeyCode; switch (eventPtr->what) { case nullEvent: @@ -1153,11 +1190,28 @@ TkMacConvertEvent( break; } } + /* fall through */ + case keyUp: whichWindow = FrontWindow(); + if (whichWindow == NULL) { + /* + * This happens if we get a key event before Tk has had a + * chance to actually create and realize ".", if they type + * when "." is withdrawn(!), or between the time "." is + * destroyed and the app exits. + */ + + return false; + } window = TkMacGetXWindow(whichWindow); - eventFound |= GenerateKeyEvent(eventPtr, window); + if (GenerateKeyEvent(eventPtr, window, savedKeyCode) == 0) { + savedKeyCode = eventPtr->message; + return false; + } + eventFound = true; break; + case activateEvt: window = TkMacGetXWindow((WindowRef) eventPtr->message); eventFound |= GenerateActivateEvents(eventPtr, window); @@ -1210,6 +1264,7 @@ TkMacConvertEvent( break; } + savedKeyCode = 0; return eventFound; } @@ -1237,6 +1292,7 @@ TkMacConvertTkEvent( { int eventFound = false; Point where; + static UInt32 savedKeyCode; /* * By default, assume it is legal for us to set the cursor @@ -1292,9 +1348,16 @@ TkMacConvertTkEvent( break; } } + /* fall through. */ + case keyUp: - eventFound |= GenerateKeyEvent(eventPtr, window); + if (GenerateKeyEvent(eventPtr, window, savedKeyCode) == 0) { + savedKeyCode = eventPtr->message; + return false; + } + eventFound = true; break; + case activateEvt: /* * It is probably not legal for us to set the cursor @@ -1358,7 +1421,7 @@ TkMacConvertTkEvent( } break; } - + savedKeyCode = 0; return eventFound; } diff --git a/mac/tkMacWm.c b/mac/tkMacWm.c index ba32f5e..f965f5c 100644 --- a/mac/tkMacWm.c +++ b/mac/tkMacWm.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacWm.c,v 1.5 1998/11/11 17:31:51 jingham Exp $ + * RCS: @(#) $Id: tkMacWm.c,v 1.6 1999/04/16 01:51:32 stanton Exp $ */ #include <Gestalt.h> @@ -709,7 +709,7 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 2) { - interp->result = (wmTracing) ? "on" : "off"; + Tcl_SetResult(interp, ((wmTracing) ? "on" : "off"), TCL_STATIC); return TCL_OK; } return Tcl_GetBoolean(interp, argv[2], &wmTracing); @@ -739,9 +739,12 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->sizeHintsFlags & PAspect) { - sprintf(interp->result, "%d %d %d %d", wmPtr->minAspect.x, + char buf[TCL_INTEGER_SPACE * 4]; + + sprintf(buf, "%d %d %d %d", wmPtr->minAspect.x, wmPtr->minAspect.y, wmPtr->maxAspect.x, wmPtr->maxAspect.y); + Tcl_SetResult(interp, buf, TCL_VOLATILE); } return TCL_OK; } @@ -756,7 +759,8 @@ Tk_WmCmd( } if ((numer1 <= 0) || (denom1 <= 0) || (numer2 <= 0) || (denom2 <= 0)) { - interp->result = "aspect number can't be <= 0"; + Tcl_SetResult(interp, "aspect number can't be <= 0", + TCL_STATIC); return TCL_ERROR; } wmPtr->minAspect.x = numer1; @@ -777,7 +781,7 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->clientMachine != NULL) { - interp->result = wmPtr->clientMachine; + Tcl_SetResult(interp, wmPtr->clientMachine, TCL_STATIC); } return TCL_OK; } @@ -875,8 +879,9 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->cmdArgv != NULL) { - interp->result = Tcl_Merge(wmPtr->cmdArgc, wmPtr->cmdArgv); - interp->freeProc = (Tcl_FreeProc *) free; + Tcl_SetResult(interp, + Tcl_Merge(wmPtr->cmdArgc, wmPtr->cmdArgv), + TCL_DYNAMIC); } return TCL_OK; } @@ -926,7 +931,8 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - interp->result = wmPtr->hints.input ? "passive" : "active"; + Tcl_SetResult(interp, (wmPtr->hints.input ? "passive" : "active"), + TCL_STATIC); return TCL_OK; } c = argv[3][0]; @@ -943,6 +949,7 @@ Tk_WmCmd( } else if ((c == 'f') && (strncmp(argv[1], "frame", length) == 0) && (length >= 2)) { Window window; + char buf[TCL_INTEGER_SPACE]; if (argc != 3) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", @@ -953,7 +960,8 @@ Tk_WmCmd( if (window == None) { window = Tk_WindowId((Tk_Window) winPtr); } - sprintf(interp->result, "0x%x", (unsigned int) window); + sprintf(buf, "0x%x", (unsigned int) window); + Tcl_SetResult(interp, buf, TCL_VOLATILE); } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0) && (length >= 2)) { char xSign, ySign; @@ -966,6 +974,8 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { + char buf[16 + TCL_INTEGER_SPACE * 4]; + xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+'; ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+'; if (wmPtr->gridWin != NULL) { @@ -977,8 +987,9 @@ Tk_WmCmd( width = winPtr->changes.width; height = winPtr->changes.height; } - sprintf(interp->result, "%dx%d%c%d%c%d", width, height, - xSign, wmPtr->x, ySign, wmPtr->y); + sprintf(buf, "%dx%d%c%d%c%d", width, height, xSign, wmPtr->x, + ySign, wmPtr->y); + Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } if (*argv[3] == '\0') { @@ -999,9 +1010,12 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->sizeHintsFlags & PBaseSize) { - sprintf(interp->result, "%d %d %d %d", wmPtr->reqGridWidth, + char buf[TCL_INTEGER_SPACE * 4]; + + sprintf(buf, "%d %d %d %d", wmPtr->reqGridWidth, wmPtr->reqGridHeight, wmPtr->widthInc, wmPtr->heightInc); + Tcl_SetResult(interp, buf, TCL_VOLATILE); } return TCL_OK; } @@ -1028,19 +1042,19 @@ Tk_WmCmd( return TCL_ERROR; } if (reqWidth < 0) { - interp->result = "baseWidth can't be < 0"; + Tcl_SetResult(interp, "baseWidth can't be < 0", TCL_STATIC); return TCL_ERROR; } if (reqHeight < 0) { - interp->result = "baseHeight can't be < 0"; + Tcl_SetResult(interp, "baseHeight can't be < 0", TCL_STATIC); return TCL_ERROR; } if (widthInc < 0) { - interp->result = "widthInc can't be < 0"; + Tcl_SetResult(interp, "widthInc can't be < 0", TCL_STATIC); return TCL_ERROR; } if (heightInc < 0) { - interp->result = "heightInc can't be < 0"; + Tcl_SetResult(interp, "heightInc can't be < 0", TCL_STATIC); return TCL_ERROR; } Tk_SetGrid((Tk_Window) winPtr, reqWidth, reqHeight, widthInc, @@ -1060,7 +1074,7 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->hints.flags & WindowGroupHint) { - interp->result = wmPtr->leaderName; + Tcl_SetResult(interp, wmPtr->leaderName, TCL_STATIC); } return TCL_OK; } @@ -1093,8 +1107,9 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->hints.flags & IconPixmapHint) { - interp->result = Tk_NameOfBitmap(winPtr->display, - wmPtr->hints.icon_pixmap); + Tcl_SetResult(interp, + Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_pixmap), + TCL_STATIC); } return TCL_OK; } @@ -1153,8 +1168,9 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->hints.flags & IconMaskHint) { - interp->result = Tk_NameOfBitmap(winPtr->display, - wmPtr->hints.icon_mask); + Tcl_SetResult(interp, + Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_mask), + TCL_STATIC); } return TCL_OK; } @@ -1179,7 +1195,9 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - interp->result = (wmPtr->iconName != NULL) ? wmPtr->iconName : ""; + Tcl_SetResult(interp, + ((wmPtr->iconName != NULL) ? wmPtr->iconName : ""), + TCL_STATIC); return TCL_OK; } else { wmPtr->iconName = Tk_GetUid(argv[3]); @@ -1199,8 +1217,11 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->hints.flags & IconPositionHint) { - sprintf(interp->result, "%d %d", wmPtr->hints.icon_x, + char buf[TCL_INTEGER_SPACE * 2]; + + sprintf(buf, "%d %d", wmPtr->hints.icon_x, wmPtr->hints.icon_y); + Tcl_SetResult(interp, buf, TCL_VOLATILE); } return TCL_OK; } @@ -1228,7 +1249,7 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->icon != NULL) { - interp->result = Tk_PathName(wmPtr->icon); + Tcl_SetResult(interp, Tk_PathName(wmPtr->icon), TCL_STATIC); } return TCL_OK; } @@ -1282,8 +1303,10 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - sprintf(interp->result, "%d %d", wmPtr->maxWidth, - wmPtr->maxHeight); + char buf[TCL_INTEGER_SPACE * 2]; + + sprintf(buf, "%d %d", wmPtr->maxWidth, wmPtr->maxHeight); + Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK) @@ -1303,8 +1326,10 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - sprintf(interp->result, "%d %d", wmPtr->minWidth, - wmPtr->minHeight); + char buf[TCL_INTEGER_SPACE * 2]; + + sprintf(buf, "%d %d", wmPtr->minWidth, wmPtr->minHeight); + Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK) @@ -1328,9 +1353,9 @@ Tk_WmCmd( } if (argc == 3) { if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { - interp->result = "1"; + Tcl_SetResult(interp, "1", TCL_STATIC); } else { - interp->result = "0"; + Tcl_SetResult(interp, "0", TCL_STATIC); } return TCL_OK; } @@ -1351,9 +1376,9 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->sizeHintsFlags & USPosition) { - interp->result = "user"; + Tcl_SetResult(interp, "user", TCL_STATIC); } else if (wmPtr->sizeHintsFlags & PPosition) { - interp->result = "program"; + Tcl_SetResult(interp, "program", TCL_STATIC); } return TCL_OK; } @@ -1408,7 +1433,7 @@ Tk_WmCmd( for (protPtr = wmPtr->protPtr; protPtr != NULL; protPtr = protPtr->nextPtr) { if (protPtr->protocol == protocol) { - interp->result = protPtr->command; + Tcl_SetResult(interp, protPtr->command, TCL_STATIC); return TCL_OK; } } @@ -1452,9 +1477,12 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - sprintf(interp->result, "%d %d", + char buf[TCL_INTEGER_SPACE * 2]; + + sprintf(buf, "%d %d", (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) ? 0 : 1, (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) ? 0 : 1); + Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } if ((Tcl_GetBoolean(interp, argv[3], &width) != TCL_OK) @@ -1487,9 +1515,9 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->sizeHintsFlags & USSize) { - interp->result = "user"; + Tcl_SetResult(interp, "user", TCL_STATIC); } else if (wmPtr->sizeHintsFlags & PSize) { - interp->result = "program"; + Tcl_SetResult(interp, "program", TCL_STATIC); } return TCL_OK; } @@ -1521,20 +1549,20 @@ Tk_WmCmd( return TCL_ERROR; } if (wmPtr->iconFor != NULL) { - interp->result = "icon"; + Tcl_SetResult(interp, "icon", TCL_STATIC); } else { switch (wmPtr->hints.initial_state) { case NormalState: - interp->result = "normal"; + Tcl_SetResult(interp, "normal", TCL_STATIC); break; case IconicState: - interp->result = "iconic"; + Tcl_SetResult(interp, "iconic", TCL_STATIC); break; case WithdrawnState: - interp->result = "withdrawn"; + Tcl_SetResult(interp, "withdrawn", TCL_STATIC); break; case ZoomState: - interp->result = "zoomed"; + Tcl_SetResult(interp, "zoomed", TCL_STATIC); break; } } @@ -1546,8 +1574,9 @@ Tk_WmCmd( return TCL_ERROR; } if (argc == 3) { - interp->result = (wmPtr->titleUid != NULL) ? wmPtr->titleUid - : winPtr->nameUid; + Tcl_SetResult(interp, + ((wmPtr->titleUid != NULL) ? wmPtr->titleUid : winPtr->nameUid), + TCL_STATIC); return TCL_OK; } else { wmPtr->titleUid = Tk_GetUid(argv[3]); @@ -1566,7 +1595,7 @@ Tk_WmCmd( } if (argc == 3) { if (wmPtr->master != None) { - interp->result = wmPtr->masterWindowName; + Tcl_SetResult(interp, wmPtr->masterWindowName, TCL_STATIC); } return TCL_OK; } @@ -2146,7 +2175,7 @@ UpdateSizeHints( * * Results: * A standard Tcl return value, plus an error message in - * interp->result if an error occurs. + * the interp's result if an error occurs. * * Side effects: * The size and/or location of winPtr may change. @@ -2399,6 +2428,7 @@ Tk_CoordsToWindow( * far that contains point. */ int x, y; /* Coordinates in winPtr. */ int tmpx, tmpy, bd; + TkDisplay *dispPtr; /* * Step 1: find the top-level window that contains the desired point. @@ -2411,7 +2441,8 @@ Tk_CoordsToWindow( return NULL; } rootChild = TkMacGetXWindow(whichWin); - winPtr = (TkWindow *) Tk_IdToWindow(tkDisplayList->display, rootChild); + dispPtr = TkGetDisplayList(); + winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, rootChild); if (winPtr == NULL) { return NULL; } @@ -3255,6 +3286,7 @@ TkMacGrowToplevel( Point start) { Point where = start; + TkDisplay *dispPtr; GlobalToLocal(&where); if (where.h > (whichWindow->portRect.right - 16) && @@ -3267,7 +3299,8 @@ TkMacGrowToplevel( long growResult; window = TkMacGetXWindow(whichWindow); - winPtr = (TkWindow *) Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window); wmPtr = winPtr->wmInfoPtr; /* TODO: handle grid size options. */ @@ -3330,15 +3363,19 @@ TkSetWMName( { Str255 pTitle; GWorldPtr macWin; + int destWrote; if (Tk_IsEmbedded(winPtr)) { return; } + Tcl_UtfToExternal(NULL, NULL, titleUid, + strlen(titleUid), 0, NULL, + (char *) &pTitle[1], + 255, NULL, &destWrote, NULL); /* Internalize native */ + pTitle[0] = destWrote; - macWin = TkMacGetDrawablePort(winPtr->window); - - strcpy((char *) pTitle + 1, titleUid); - pTitle[0] = strlen(titleUid); + macWin = TkMacGetDrawablePort(winPtr->window); + SetWTitle((WindowPtr) macWin, pTitle); } @@ -3595,7 +3632,8 @@ TkMacZoomToplevel( * has changed. */ window = TkMacGetXWindow(whichWindow); - tkwin = Tk_IdToWindow(tkDisplayList->display, window); + dispPtr = TkGetDisplayList(); + tkwin = Tk_IdToWindow(dispPtr->display, window); if (tkwin == NULL) { return false; } @@ -3697,42 +3735,42 @@ TkUnsupported1Cmd( switch (wmPtr->style) { case noGrowDocProc: case documentProc: - interp->result = "documentProc"; + Tcl_SetResult(interp, "documentProc", TCL_STATIC); break; case dBoxProc: - interp->result = "dBoxProc"; + Tcl_SetResult(interp, "dBoxProc", TCL_STATIC); break; case plainDBox: - interp->result = "plainDBox"; + Tcl_SetResult(interp, "plainDBox", TCL_STATIC); break; case altDBoxProc: - interp->result = "altDBoxProc"; + Tcl_SetResult(interp, "altDBoxProc", TCL_STATIC); break; case movableDBoxProc: - interp->result = "movableDBoxProc"; + Tcl_SetResult(interp, "movableDBoxProc", TCL_STATIC); break; case zoomDocProc: case zoomNoGrow: - interp->result = "zoomDocProc"; + Tcl_SetResult(interp, "zoomDocProc", TCL_STATIC); break; case rDocProc: - interp->result = "rDocProc"; + Tcl_SetResult(interp, "rDocProc", TCL_STATIC); break; case floatProc: case floatGrowProc: - interp->result = "floatProc"; + Tcl_SetResult(interp, "floatProc", TCL_STATIC); break; case floatZoomProc: case floatZoomGrowProc: - interp->result = "floatZoomProc"; + Tcl_SetResult(interp, "floatZoomProc", TCL_STATIC); break; case floatSideProc: case floatSideGrowProc: - interp->result = "floatSideProc"; + Tcl_SetResult(interp, "floatSideProc", TCL_STATIC); break; case floatSideZoomProc: case floatSideZoomGrowProc: - interp->result = "floatSideZoomProc"; + Tcl_SetResult(interp, "floatSideZoomProc", TCL_STATIC); break; default: panic("invalid style"); diff --git a/mac/tkMacXStubs.c b/mac/tkMacXStubs.c index 04b83a4..f554ed8 100644 --- a/mac/tkMacXStubs.c +++ b/mac/tkMacXStubs.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacXStubs.c,v 1.5 1999/04/16 01:25:55 stanton Exp $ + * RCS: @(#) $Id: tkMacXStubs.c,v 1.6 1999/04/16 01:51:33 stanton Exp $ */ #include "tkInt.h" @@ -22,7 +22,6 @@ #include <Xatom.h> -#include <Gestalt.h> #include <Windows.h> #include <Fonts.h> #include <QDOffscreen.h> @@ -275,15 +274,6 @@ DefaultErrorHandler( } - -void -Tk_FreeXId ( - Display *display, - XID xid) -{ - /* no-op function needed for stubs implementation */ -} - char * XGetAtomName( Display * display, @@ -525,6 +515,47 @@ XForceScreenSaver( */ display->request++; } + +void +Tk_FreeXId ( + Display *display, + XID xid) +{ + /* no-op function needed for stubs implementation. */ +} + +void +Tk_3DHorizontalBevel ( + Tk_Window tkwin, + Drawable d, + Tk_3DBorder b, + int x, + int y, + int width, + int height, + int leftIn, + int rightIn, + int topBevel, + int relief) +{ + /* no-op function needed for stubs implementation. */ +} + +void +Tk_3DVerticalBevel ( + Tk_Window tkwin, + Drawable d, + Tk_3DBorder b, + int x, + int y, + int width, + int height, + int leftBevel, + int relief) +{ + /* no-op function needed for stubs implementation. */ +} + /* *---------------------------------------------------------------------- @@ -551,17 +582,14 @@ TkGetServerInfo( Tk_Window tkwin) /* Token for window; this selects a * particular display and server. */ { - char buffer[50]; - long result; - short low, major, minor, micro; - - Gestalt(gestaltSystemVersion, &result); - low = LoWord(result); - major = (low & 0x0F00) >> 8; - minor = (low & 0x00F0) >> 4; - micro = (low & 0x000F); - sprintf(buffer, "MacOS %d.%d.%d", major, minor, micro); - Tcl_AppendResult(interp, buffer, (char *) NULL); + char buffer[8 + TCL_INTEGER_SPACE * 2]; + char buffer2[TCL_INTEGER_SPACE]; + + sprintf(buffer, "X%dR%d ", ProtocolVersion(Tk_Display(tkwin)), + ProtocolRevision(Tk_Display(tkwin))); + sprintf(buffer2, " %d", VendorRelease(Tk_Display(tkwin))); + Tcl_AppendResult(interp, buffer, ServerVendor(Tk_Display(tkwin)), + buffer2, (char *) NULL); } /* * Image stuff @@ -721,24 +749,3 @@ TkGetDefaultScreenName( } return screenName; } - -void Tk_3DHorizontalBevel ( - Tk_Window tkwin, - Drawable drawable, Tk_3DBorder border, int x, - int y, int width, int height, int leftIn, - int rightIn, int topBevel, int relief ) -{ - /* no-op required for stubs implementation */ - /* this function will probably be filled in at some point */ -} - -void Tk_3DVerticalBevel ( - Tk_Window tkwin, - Drawable drawable, Tk_3DBorder border, int x, - int y, int width, int height, int leftBevel, - int relief ) -{ - /* no-op required for stubs implementation */ - /* this function will probably be filled in at some point */ -} - |