summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mac/MW_TkBuildLibHeader.h7
-rw-r--r--mac/MW_TkBuildLibHeader.pch34
-rwxr-xr-xmac/MW_TkHeader.h7
-rw-r--r--mac/MW_TkHeader.pch32
-rw-r--r--mac/MW_TkHeaderCommon.h38
-rwxr-xr-xmac/MW_TkOldImgHeader.h3
-rw-r--r--mac/MW_TkOldImgStaticHeader.h3
-rw-r--r--mac/MW_TkStaticHeader.h7
-rw-r--r--mac/MW_TkStaticHeader.pch34
-rwxr-xr-xmac/MW_TkTestHeader.h7
-rwxr-xr-xmac/MW_TkTestHeader.pch40
-rw-r--r--mac/README91
-rw-r--r--mac/bugs.doc52
-rwxr-xr-xmac/tclets.r172
-rw-r--r--mac/tclets.tcl223
-rw-r--r--mac/tkMac.h54
-rw-r--r--mac/tkMacAppInit.c418
-rwxr-xr-xmac/tkMacAppearanceStubs.c104
-rw-r--r--mac/tkMacApplication.r315
-rw-r--r--mac/tkMacBitmap.c277
-rw-r--r--mac/tkMacButton.c1709
-rw-r--r--mac/tkMacClipboard.c301
-rw-r--r--mac/tkMacColor.c504
-rw-r--r--mac/tkMacConfig.c43
-rw-r--r--mac/tkMacCursor.c399
-rw-r--r--mac/tkMacCursors.r128
-rw-r--r--mac/tkMacDefault.h527
-rw-r--r--mac/tkMacDialog.c1418
-rw-r--r--mac/tkMacDraw.c1224
-rw-r--r--mac/tkMacEmbed.c1205
-rw-r--r--mac/tkMacFont.c2150
-rw-r--r--mac/tkMacHLEvents.c439
-rw-r--r--mac/tkMacInit.c226
-rw-r--r--mac/tkMacInt.h231
-rw-r--r--mac/tkMacKeyboard.c647
-rw-r--r--mac/tkMacLibrary.r71
-rw-r--r--mac/tkMacMDEF.c114
-rw-r--r--mac/tkMacMDEF.r43
-rw-r--r--mac/tkMacMenu.c4605
-rw-r--r--mac/tkMacMenu.r45
-rw-r--r--mac/tkMacMenubutton.c493
-rw-r--r--mac/tkMacMenus.c353
-rw-r--r--mac/tkMacPort.h160
-rw-r--r--mac/tkMacProjects.sea.hqx3718
-rw-r--r--mac/tkMacRegion.c246
-rw-r--r--mac/tkMacResource.r435
-rw-r--r--mac/tkMacScale.c437
-rw-r--r--mac/tkMacScrlbr.c1067
-rw-r--r--mac/tkMacSend.c546
-rw-r--r--mac/tkMacSubwindows.c1256
-rw-r--r--mac/tkMacTclCode.r69
-rw-r--r--mac/tkMacTest.c80
-rw-r--r--mac/tkMacWindowMgr.c1789
-rw-r--r--mac/tkMacWm.c5785
-rw-r--r--mac/tkMacXCursors.r959
-rw-r--r--mac/tkMacXStubs.c877
-rw-r--r--mac/widget.r18
57 files changed, 0 insertions, 36235 deletions
diff --git a/mac/MW_TkBuildLibHeader.h b/mac/MW_TkBuildLibHeader.h
deleted file mode 100644
index cbca0c2..0000000
--- a/mac/MW_TkBuildLibHeader.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if __POWERPC__
-#include "MW_TkBuildLibHeaderPPC"
-#elif __CFM68K__
-#include "MW_TkBuildLibHeaderCFM68K"
-#else
-#include "MW_TkBuildLibHeader68K"
-#endif
diff --git a/mac/MW_TkBuildLibHeader.pch b/mac/MW_TkBuildLibHeader.pch
deleted file mode 100644
index ff3f477..0000000
--- a/mac/MW_TkBuildLibHeader.pch
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * MW_TkBuildLibHeader.pch --
- *
- * This file is the source for a pre-compilied header that gets used
- * for all files in the Tk projects. This make compilies go a bit
- * faster. This file is only intended to be used in the MetroWerks
- * CodeWarrior environment. It essentially acts as a place to set
- * compiler flags. See MetroWerks documention for more details.
- *
- * 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.
- */
-
-/*
- * To use the compilied header you need to set the "Prefix file" in
- * the "C/C++ Language" preference panel to point to the created
- * compilied header. The name of the header depends on the
- * architecture we are compiling for (see the code below). For
- * example, for a 68k app the prefix file should be: MW_TclHeader68K.
- */
-
-#if __POWERPC__
-#pragma precompile_target "MW_TkBuildLibHeaderPPC"
-#elif __CFM68K__
-#pragma precompile_target "MW_TkBuildLibHeaderCFM68K"
-#else
-#pragma precompile_target "MW_TkBuildLibHeader68K"
-#endif
-
-#define BUILD_tk 1
-
-#include "MW_TkHeaderCommon.h"
diff --git a/mac/MW_TkHeader.h b/mac/MW_TkHeader.h
deleted file mode 100755
index a5ee464..0000000
--- a/mac/MW_TkHeader.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if __POWERPC__
-#include "MW_TkHeaderPPC"
-#elif __CFM68K__
-#include "MW_TkHeaderCFM68K"
-#else
-#include "MW_TkHeader68K"
-#endif
diff --git a/mac/MW_TkHeader.pch b/mac/MW_TkHeader.pch
deleted file mode 100644
index f21685b..0000000
--- a/mac/MW_TkHeader.pch
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * MW_TkHeader.pch --
- *
- * This file is the source for a pre-compilied header that gets used
- * for all files in the Tk projects. This make compilies go a bit
- * faster. This file is only intended to be used in the MetroWerks
- * CodeWarrior environment. It essentially acts as a place to set
- * compiler flags. See MetroWerks documention for more details.
- *
- * 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.
- */
-
-/*
- * To use the compilied header you need to set the "Prefix file" in
- * the "C/C++ Language" preference panel to point to the created
- * compilied header. The name of the header depends on the
- * architecture we are compiling for (see the code below). For
- * example, for a 68k app the prefix file should be: MW_TclHeader68K.
- */
-
-#if __POWERPC__
-#pragma precompile_target "MW_TkHeaderPPC"
-#elif __CFM68K__
-#pragma precompile_target "MW_TkHeaderCFM68K"
-#else
-#pragma precompile_target "MW_TkHeader68K"
-#endif
-
-#include "MW_TkHeaderCommon.h"
diff --git a/mac/MW_TkHeaderCommon.h b/mac/MW_TkHeaderCommon.h
deleted file mode 100644
index 349b562..0000000
--- a/mac/MW_TkHeaderCommon.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * MW_TkHeaderCommon.h --
- *
- * Common includes for precompiled headers
- *
- * 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.
- */
-
-#pragma once
-
-#include "tclMacCommonPch.h"
-
-#ifdef TCL_DEBUG
- #define TK_TEST
-#endif
-
-/*
- * The following defines are for the Xlib.h file to force
- * it to generate prototypes in the way we need it. This is
- * defined here in case X.h & company are ever included before
- * tk.h.
- */
-
-#define NeedFunctionPrototypes 1
-#define NeedWidePrototypes 0
-
-/*
- * Place any includes below that will are needed by the majority of the
- * and is OK to be in any file in the system.
- */
-
-#include "tcl.h"
-
-#include "tk.h"
-#include "tkInt.h"
diff --git a/mac/MW_TkOldImgHeader.h b/mac/MW_TkOldImgHeader.h
deleted file mode 100755
index 309ca20..0000000
--- a/mac/MW_TkOldImgHeader.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#define USE_OLD_IMAGE
-
-#include "MW_TkBuildLibHeader.pch"
diff --git a/mac/MW_TkOldImgStaticHeader.h b/mac/MW_TkOldImgStaticHeader.h
deleted file mode 100644
index 967b763..0000000
--- a/mac/MW_TkOldImgStaticHeader.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#define USE_OLD_IMAGE
-
-#include "MW_TkStaticHeader.pch"
diff --git a/mac/MW_TkStaticHeader.h b/mac/MW_TkStaticHeader.h
deleted file mode 100644
index b381c22..0000000
--- a/mac/MW_TkStaticHeader.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if __POWERPC__
-#include "MW_TkStaticHeaderPPC"
-#elif __CFM68K__
-#include "MW_TkStaticHeaderCFM68K"
-#else
-#include "MW_TkStaticHeader68K"
-#endif
diff --git a/mac/MW_TkStaticHeader.pch b/mac/MW_TkStaticHeader.pch
deleted file mode 100644
index cd619e6..0000000
--- a/mac/MW_TkStaticHeader.pch
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * MW_TkStaticHeader.pch --
- *
- * This file is the source for a pre-compilied header that gets used
- * for all files in the Tk projects. This make compilies go a bit
- * faster. This file is only intended to be used in the MetroWerks
- * CodeWarrior environment. It essentially acts as a place to set
- * compiler flags. See MetroWerks documention for more details.
- *
- * 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.
- */
-
-/*
- * To use the compilied header you need to set the "Prefix file" in
- * the "C/C++ Language" preference panel to point to the created
- * compilied header. The name of the header depends on the
- * architecture we are compiling for (see the code below). For
- * example, for a 68k app the prefix file should be: MW_TclHeader68K.
- */
-
-#if __POWERPC__
-#pragma precompile_target "MW_TkStaticHeaderPPC"
-#elif __CFM68K__
-#pragma precompile_target "MW_TkStaticHeaderCFM68K"
-#else
-#pragma precompile_target "MW_TkStaticHeader68K"
-#endif
-
-#define STATIC_BUILD 1
-
-#include "MW_TkHeaderCommon.h"
diff --git a/mac/MW_TkTestHeader.h b/mac/MW_TkTestHeader.h
deleted file mode 100755
index 995e9fd..0000000
--- a/mac/MW_TkTestHeader.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if __POWERPC__
-#include "MW_TkTestHeaderPPC"
-#elif __CFM68K__
-#include "MW_TkTestHeaderCFM68K"
-#else
-#include "MW_TkTestHeader68K"
-#endif
diff --git a/mac/MW_TkTestHeader.pch b/mac/MW_TkTestHeader.pch
deleted file mode 100755
index 4d0bae8..0000000
--- a/mac/MW_TkTestHeader.pch
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MW_TkTestHeader.pch --
- *
- * This file is the source for a pre-compilied header that gets used
- * for all files in the Tk projects. This make compilies go a bit
- * faster. This file is only intended to be used in the MetroWerks
- * CodeWarrior environment. It essentially acts as a place to set
- * compiler flags. See MetroWerks documention for more details.
- *
- * 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.
- */
-
-/*
- * To use the compilied header you need to set the "Prefix file" in
- * the "C/C++ Language" preference panel to point to the created
- * compilied header. The name of the header depends on the
- * architecture we are compiling for (see the code below). For
- * example, for a 68k app the prefix file should be: MW_TclHeader68K.
- */
-
-#if __POWERPC__
-#pragma precompile_target "MW_TkTestHeaderPPC"
-#elif __CFM68K__
-#pragma precompile_target "MW_TkTestHeaderCFM68K"
-#else
-#pragma precompile_target "MW_TkTestHeader68K"
-#endif
-
-#define BUILD_tk 1
-
-#define STATIC_BUILD 1
-
-#define TCL_DEBUG 1
-
-#define TCL_THREADS 1
-
-#include "MW_TkHeaderCommon.h"
diff --git a/mac/README b/mac/README
deleted file mode 100644
index 1634bc3..0000000
--- a/mac/README
+++ /dev/null
@@ -1,91 +0,0 @@
-Tk 8.4 for Macintosh
-
-Originally by Ray Johnson while at Sun Microsystems Labs
-with major help from Jim Ingham while at Cygnus Solutions
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-Note that Tk on Mac OS Classic is no longer supported and likely no longer
-compiles, the last release known to work is 8.4.2. The 'mac' source
-directory and all other Mac Classic code have been removed from Tk 8.5.
-
-The Mac OS X port of Tk can be found in the 'macosx' source directory.
-
-The information and URLs below are known to be outdated and incorrect.
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-1. Introduction
----------------
-
-This is the README file for the Macintosh version of the Tk
-extension for the Tcl scripting language. The file consists of
-information specific to the Macintosh version of Tcl and Tk. For more
-general information please read the README file in the main Tk
-directory.
-
-3. Mac specific features
-------------------------
-
-There are several features or enhancements in Tk that are unique to
-the Macintosh version of Tk. The list of these features is
-maintained at
- http://www.tcl.tk/software/mac/features.html
-
-4. The Distribution
--------------------
-
-Macintosh Tk is distributed in three different forms. This should
-make it easier to only download what you need. Replace <version>
-with the current version of Tk. The packages are as follows:
-
-mactk<version>.sea.hqx
-
- This distribution is a "binary" only release. It contains an
- installer program that will install a 68k, PowerPC, or Fat
- version of the "Wish" application. In addition, in installs
- the Tcl & Tk libraries in the Extensions folder inside your
- System Folder. (No "INIT"'s or Control Pannels are installed.)
-
-mactcltk-full-<version>.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-<version>.sea.hqx
-
- This release contains the complete source to Tk for the Macintosh
- In addition, Metrowerks CodeWarrior libraries and project files
- are included. However, you must already have the More Files
- package to compile this code.
-
-5. Compiling Tk
----------------
-
-In order to compile Macintosh Tk you must have the
-following items:
-
- CodeWarrior Pro 5 or higher
- Mac Tcl (source)
- (which requires More Files 1.4.9)
- Mac Tk (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, 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:
-
-* Check out the file bugs.doc for information about known bugs.
-
-* We are starting to support the new Appearance Manager that shipped
- with MacOS 8.0. The Tk 8.0.3 release is the first Tk release
- that supported the Appearance Manager well. Tk 8.0.4 extended this support
- to the menu system, though you have to have Appearance 1.0.1 or later
- installed for this to work.
-
-
-If you have comments or Bug reports, use our on-line database at
- http://tcl.sourceforge.net/
diff --git a/mac/bugs.doc b/mac/bugs.doc
deleted file mode 100644
index 91269b2..0000000
--- a/mac/bugs.doc
+++ /dev/null
@@ -1,52 +0,0 @@
-Known bug list for Tk 8.0 for Macintosh
-
-Originally by Ray Johnson
-Sun Microsystems Laboratories
-rjohnson@eng.sun.com
-
-Maintained by:
-Jim Ingham
-Cygnus Solutions, a Red Hat Company
-jingham@cygnus.com
-
-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
-know (and send us test cases) of any bugs you find.
-
-Known bugs:
-
-* Transient windows (set by wm transient) do not go away when the
- master does.
-
-* Tearoff menus should be floating windows & floating windows should
- float. They also shouldn't be resizable.
-
-* The -use and -container windows only work with other Tk windows in
- the same process. Also, if you try really hard (for instance by binding
- on Destroy of an embedded window and destroying the container's toplevel)
- you can get Tk to crash. This should never be necessary, however, since
- the destruction of the embedded window triggers the destruction of the
- container, so you can watch that instead.
- All the focus bugs in Tk8.0 have been fixed, however.
-
-* 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
- be easy to fix.
-
-* The active menu highlight color in Tearoff menus will not match the system-wide
- menu highlight color under Appearance. It will be black instead. This is not
- easy to fix, since the Appearance API's don't really allow you to get your hands
- on this information...
-
-There are many other bugs. However, will no get listed until they
-are reported at least once. Send those bug reports in!
-
-
-
-Jim
diff --git a/mac/tclets.r b/mac/tclets.r
deleted file mode 100755
index e4553ae..0000000
--- a/mac/tclets.r
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * tclets.r --
- *
- */
-
-/*
- * New style DLOG templates have an extra field for the positioning
- * options for the Dialog Box. We will not use this, for now, so we
- * turn it off here.
- */
-
-#define DLOG_RezTemplateVersion 0
-
-#include <Types.r>
-#include <SysTypes.r>
-#include <AEUserTermTypes.r>
-
-/*
- * We now load the Tclets code into the resource fork
- */
-
-#define TK_LIBRARY_RESOURCES 3000
-
-read 'TEXT' (TK_LIBRARY_RESOURCES+114, "tclshrc", purgeable)
- "::mac:tclets.tcl";
-
-data 'icns' (-16455) {
- $"6963 6E73 0000 08F8 6963 7323 0000 0048" /* icns...¯ics#...H */
- $"0100 02EE 05CE 09EE 13DE 23FF 47CE 86C6" /* ...Ó.‘Ó.Þ#G‘Ü */
- $"4681 22C2 12C4 0888 0410 0220 0140 0080" /* FÅ"¬.Ÿ.à... .@.Ä */
- $"0100 03EE 07CE 0FEE 1FFE 3FFF 7FFE FFFE" /* ...Ó.‘.Ó.œ?.œœ */
- $"7FFF 3FFE 1FFC 0FF8 07F0 03E0 01C0 0080" /* .?œ.¸.¯.•.ý.¿.Ä */
- $"6963 7334 0000 0088 0000 000F 0000 0000" /* ics4...à........ */
- $"0000 00FC F6D0 FFF0 0000 0FC5 DD00 F6F0" /* ...¸–­•...‰ð.–• */
- $"0000 FCCD 66F0 F6F0 000F CC6E 66CE F6F0" /* ..¸Õf•–•..Ãnf‘–• */
- $"00FC CC6E 67EF F6FF 0FCC CD66 66CC F6F0" /* .¸ÃngÔ–.ÃÕffÖ• */
- $"FCCC CDDC 66CC CFA0 0FCC CD6C EDCC CC0F" /* ¸ÃÕÐfæÝ.ÃÕlÌÃÃ. */
- $"00FC CC6C E6CC CCF0 000F CC6C 66CC CF00" /* .¸ÃlÊÃÕ..Ãlfæ. */
- $"0000 FCCC 6CCC F000 0000 0FCC DCCF 0000" /* ..¸ÃlÕ....ÃЦ.. */
- $"0000 00FD DCF0 0000 0000 000F CF00 0000" /* ...›Ð•......¦... */
- $"0000 0000 F000 0000 6963 7338 0000 0108" /* ....•...ics8.... */
- $"0000 0000 0000 00FF 0000 0000 0000 0000" /* ............... */
- $"0000 0000 0000 FF2B FFEC 7F00 FFFF FF00" /* ......+Ï... */
- $"0000 0000 00FF 2BB0 7F7F 0000 FFEC FF00" /* .....+ƒ....Ï. */
- $"0000 0000 FF2B 2B7F ECEC FF00 FFEC FF00" /* ....++.ÏÏ.Ï. */
- $"0000 00FF 2B2B ECFC ECEC 2BFB FFEC FF00" /* ...++ϸÏÏ+šÏ. */
- $"0000 FF2B 2B2B ECFC ECC0 FBFF FFEC FFFF" /* ..+++ϸϿšÏ */
- $"00FF 2B2B 2B7F ECEC ECEC 2B2B FFEC FF00" /* .+++.ÏÏÏÏ++Ï. */
- $"FF2B 2B2B 2B7F 7FF6 ECEC 2B2B 2BFF FD00" /* ++++..–ÏÏ+++›. */
- $"00FF 2B2B 2B7F ECF6 FCF9 2B2B 2B2B 00FF" /* .+++.Ï–¸˜++++. */
- $"0000 FF2B 2B2B ECF6 FCEC 2B2B 2B2B FF00" /* ..+++Ï–¸Ï++++. */
- $"0000 00FF 2B2B ECF6 ECEC 2B2B 2BFF 0000" /* ...++Ï–ÏÏ+++.. */
- $"0000 0000 FF2B 2BF6 EC2B 2B2B FF00 0000" /* ....++–Ï+++... */
- $"0000 0000 00FF 2BF6 F92B 2BFF 0000 0000" /* .....+–˜++.... */
- $"0000 0000 0000 FFF9 F92B FF00 0000 0000" /* ......˜˜+..... */
- $"0000 0000 0000 00FF 2BFF 0000 0000 0000" /* .......+...... */
- $"0000 0000 0000 0000 FF00 0000 0000 0000" /* ............... */
- $"4943 4E23 0000 0108 0001 0000 0002 8000" /* ICN#..........Ä. */
- $"0004 78F8 0008 70F8 0010 F0F8 0021 E8F8" /* ..x¯..p¯..•¯.!˯ */
- $"0043 C4F8 0081 FAF8 0107 F1F8 0207 F0F8" /* .CŸ¯.Å™¯..Ò¯..•¯ */
- $"0407 F7FF 0807 E3FE 1007 E1FC 200E E0F8" /* ..—..“œ..·¸ .ý¯ */
- $"4002 E074 800E E022 400E E001 200E C002" /* @.ýtÄ.ý"@.ý. .¿. */
- $"1006 E004 0806 C008 0406 E010 0202 C020" /* ..ý...¿...ý...¿ */
- $"0102 C040 0080 8080 0040 0100 0020 0200" /* ..¿@.ÄÄÄ.@... .. */
- $"0010 0400 0008 0800 0004 1000 0002 2000" /* .............. . */
- $"0001 4000 0000 8000 0001 0000 0003 8000" /* ..@...Ä.......Ä. */
- $"0007 F8F8 000F F0F8 001F F0F8 003F F8F8" /* ..¯¯..•¯..•¯.?¯¯ */
- $"007F FCF8 00FF FEF8 01FF FFF8 03FF FFF8" /* ..¸¯.œ¯.¯.¯ */
- $"07FF FFFF 0FFF FFFE 1FFF FFFC 3FFF FFF8" /* ..œ.¸?¯ */
- $"7FFF FFFC FFFF FFFE 7FFF FFFF 3FFF FFFE" /* .¸œ.?œ */
- $"1FFF FFFC 0FFF FFF8 07FF FFF0 03FF FFE0" /* .¸.¯.•.ý */
- $"01FF FFC0 00FF FF80 007F FF00 003F FE00" /* .¿.Ä....?œ. */
- $"001F FC00 000F F800 0007 F000 0003 E000" /* ..¸...¯...•...ý. */
- $"0001 C000 0000 8000 6963 6C34 0000 0208" /* ..¿...Ä.icl4.... */
- $"0000 0000 0000 000F 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 00FC F000 0000 0000 0000" /* .......¸•....... */
- $"0000 0000 0000 0FCC CFD6 D000 FFFF F000" /* .......æ÷­.•. */
- $"0000 0000 0000 FCCC C556 0000 F767 F000" /* ......¸Ã‰V..—g•. */
- $"0000 0000 000F CCCC 566F 0000 F676 F000" /* ......ÃÃVo..–v•. */
- $"0000 0000 00FC CCC5 6F5C F000 F767 F000" /* .....¸Ã‰o\•.—g•. */
- $"0000 0000 0FCC CC66 66CC 0F00 F676 F000" /* .....ÃÃffÃ..–v•. */
- $"0000 0000 FCCC CCD5 5666 FCF0 F767 F000" /* ....¸ÃùVf¸•—g•. */
- $"0000 000F CCCC C656 5667 CCCF F676 F000" /* ....ÃÃVVgæ–v•. */
- $"0000 00FC CCCC C6E5 5566 CCCC F767 F000" /* ...¸ÃÃÂUfÃ×g•. */
- $"0000 0FCC CCCC C656 5657 CFFF F676 FFFF" /* ...ÃÃÃVVW¦–v */
- $"0000 FCCC CCCC C6E5 565C CCF7 6767 67F0" /* ..¸ÃÃÃÂV\×ggg• */
- $"000F CCCC CCCC C655 565C CCCF 7676 7F00" /* ..ÃÃÃÃUV\ævv.. */
- $"00FC CCCC CCCC 7660 556C CCCC F767 F000" /* .¸ÃÃÃÃv`UlÃ×g•. */
- $"0FCC CCCC CCCC CD5D 567C CCCC CF7F CF00" /* .ÃÃÃÃÃÕ]V|Ãæ.¦. */
- $"FCCC CCCC CCCC 6660 556C CCCC CCFC CCF0" /* ¸ÃÃÃÃÃf`UlÃÃøÕ */
- $"0FCC CCCC CCCC 665C 565C CCCC CCCC CCCF" /* .ÃÃÃÃÃf\V\ÃÃÃÃæ */
- $"00FC CCCC CCCC 6660 E6DC CCCC CCCC CCF0" /* .¸ÃÃÃÃf`ÊÐÃÃÃÃÕ */
- $"000F CCCC CCCC C650 656C CCCC CCCC CF00" /* ..ÃÃÃÃPelÃÃÃæ. */
- $"0000 FCCC CCCC C6EC 5ECC CCCC CCCC F000" /* ..¸ÃÃÃÏ^ÃÃÃÃÕ. */
- $"0000 0FCC CCCC C650 566C CCCC CCCF 0000" /* ...ÃÃÃPVlÃÃæ.. */
- $"0000 00FC CCCC CC50 D5CC CCCC CCF0 0000" /* ...¸ÃÃÃP¹ÃÃÃÕ.. */
- $"0000 000F CCCC CC50 56CC CCCC CF00 0000" /* ....ÃÃÃPVÃÃæ... */
- $"0000 0000 FCCC CCD0 5CCC CCCC F000 0000" /* ....¸Ãí\ÃÃÕ... */
- $"0000 0000 0FCC CCD0 DCCC CCCF 0000 0000" /* .....ÃíÐÃæ.... */
- $"0000 0000 00FC CCD0 DCCC CCF0 0000 0000" /* .....¸Ã­ÐÃÕ.... */
- $"0000 0000 000F CCD0 DCCC CF00 0000 0000" /* ......íÐæ..... */
- $"0000 0000 0000 FCC0 CCCC F000 0000 0000" /* ......¸¿ÃÕ..... */
- $"0000 0000 0000 0FCD CCCF 0000 0000 0000" /* .......Õæ...... */
- $"0000 0000 0000 00FC CCF0 0000 0000 0000" /* .......¸Ã•...... */
- $"0000 0000 0000 000F CF00 0000 0000 0000" /* ........¦....... */
- $"0000 0000 0000 0000 F000 0000 0000 0000" /* ........•....... */
- $"6963 6C38 0000 0408 0000 0000 0000 0000" /* icl8............ */
- $"0000 0000 0000 00FF 0000 0000 0000 0000" /* ............... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 FF2B FF00 0000 0000 0000" /* ......+....... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 00FF 2B2B 2BFF 7FEC 7F00 0000" /* .....+++.Ï.... */
- $"FFFF FFFF FF00 0000 0000 0000 0000 0000" /* ........... */
- $"0000 0000 FF2B 2B2B 2BB0 B0EC 0000 0000" /* ....++++ƒƒÏ.... */
- $"FFC0 ECC0 FF00 0000 0000 0000 0000 0000" /* ¿Ï¿........... */
- $"0000 00FF 2B2B 2B2B B0EC ECFF 0000 0000" /* ...++++ƒÏÏ.... */
- $"FFEC C0EC FF00 0000 0000 0000 0000 0000" /* Ï¿Ï........... */
- $"0000 FF2B 2B2B 2BB0 ECFF B02B FF00 0000" /* ..++++ƒÏƒ+... */
- $"FFC0 ECC0 FF00 0000 0000 0000 0000 0000" /* ¿Ï¿........... */
- $"00FF 2B2B 2B2B ECEC ECEC 2B2B 00FF 0000" /* .++++ÏÏÏÏ++... */
- $"FFEC C0EC FF00 0000 0000 0000 0000 0000" /* Ï¿Ï........... */
- $"FF2B 2B2B 2B2B F9B0 B0EC ECEC FF2B FF00" /* +++++˜ƒƒÏÏÏ+. */
- $"FFC0 ECC0 FF00 0000 0000 0000 0000 00FF" /* ¿Ï¿.......... */
- $"2B2B 2B2B 2BEC B0EC B0EC ECC0 2B2B 2BFF" /* +++++σσÏÏ¿+++ */
- $"FFEC C0EC FF00 0000 0000 0000 0000 FF2B" /* Ï¿Ï.........+ */
- $"2B2B 2B2B 2BEC FCB0 B0B0 ECEC 2B2B 2B2B" /* +++++ϸƒƒƒÏÏ++++ */
- $"FFC0 ECC0 FF00 0000 0000 0000 00FF 2B2B" /* ¿Ï¿........++ */
- $"2B2B 2B2B 2BEC B0EC B0EC B0C0 2BFF FFFF" /* +++++σσσ¿+ */
- $"FFEC C0EC FFFF FFFF 0000 0000 FF2B 2B2B" /* Ï¿Ï....+++ */
- $"2B2B 2B2B 2BEC FCB0 B0EC B02B 2B2B FFC0" /* +++++ϸƒƒÏƒ+++¿ */
- $"ECC0 ECC0 ECC0 FF00 0000 00FF 2B2B 2B2B" /* Ï¿Ï¿Ï¿....++++ */
- $"2B2B 2B2B 2BEC B0B0 B0EC B02B 2B2B 2BFF" /* +++++σƒƒÏƒ++++ */
- $"C0EC C0EC C0FF 0000 0000 FF2B 2B2B 2B2B" /* ¿Ï¿Ï¿....+++++ */
- $"2B2B 2B2B C0EC EC00 B0B0 EC2B 2B2B 2B2B" /* ++++¿ÏÏ.ƒƒÏ+++++ */
- $"FFC0 ECC0 FF00 0000 00FF 2B2B 2B2B 2B2B" /* ¿Ï¿....++++++ */
- $"2B2B 2B2B 2BF9 B0F9 B0EC C02B 2B2B 2B2B" /* +++++˜ƒ˜ƒÏ¿+++++ */
- $"2BFF C0FF 2BFF 0000 FF2B 2B2B 2B2B 2B2B" /* +¿+..+++++++ */
- $"2B2B 2B2B ECEC EC00 B0B0 EC2B 2B2B 2B2B" /* ++++ÏÏÏ.ƒƒÏ+++++ */
- $"2B2B FF2B 2B2B FF00 00FF 2B2B 2B2B 2B2B" /* +++++..++++++ */
- $"2B2B 2B2B ECEC B02B B0EC B02B 2B2B 2B2B" /* ++++Ïσ+ƒÏƒ+++++ */
- $"2B2B 2B2B 2B2B 2BFF 0000 FF2B 2B2B 2B2B" /* +++++++..+++++ */
- $"2B2B 2B2B ECEC EC00 FCEC F92B 2B2B 2B2B" /* ++++ÏÏÏ.¸Ï˜+++++ */
- $"2B2B 2B2B 2B2B FF00 0000 00FF 2B2B 2B2B" /* ++++++....++++ */
- $"2B2B 2B2B 2BEC B000 ECB0 EC2B 2B2B 2B2B" /* +++++σ.σÏ+++++ */
- $"2B2B 2B2B 2BFF 0000 0000 0000 FF2B 2B2B" /* +++++......+++ */
- $"2B2B 2B2B 2BEC FC2B B0FC 2B2B 2B2B 2B2B" /* +++++ϸ+ƒ¸++++++ */
- $"2B2B 2B2B FF00 0000 0000 0000 00FF 2B2B" /* ++++........++ */
- $"2B2B 2B2B 2BEC B000 B0EC EC2B 2B2B 2B2B" /* +++++σ.ƒÏÏ+++++ */
- $"2B2B 2BFF 0000 0000 0000 0000 0000 FF2B" /* +++..........+ */
- $"2B2B 2B2B 2B2B B000 7FB0 2B2B 2B2B 2B2B" /* ++++++ƒ..ƒ++++++ */
- $"2B2B FF00 0000 0000 0000 0000 0000 00FF" /* ++............ */
- $"2B2B 2B2B 2B2B B000 B0EC 2B2B 2B2B 2B2B" /* ++++++ƒ.ƒÏ++++++ */
- $"2BFF 0000 0000 0000 0000 0000 0000 0000" /* +.............. */
- $"FF2B 2B2B 2B2B F900 B02B 2B2B 2B2B 2B2B" /* +++++˜.ƒ+++++++ */
- $"FF00 0000 0000 0000 0000 0000 0000 0000" /* ............... */
- $"00FF 2B2B 2B2B F900 F92B 2B2B 2B2B 2BFF" /* .++++˜.˜++++++ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 FF2B 2B2B F900 F92B 2B2B 2B2B FF00" /* ..+++˜.˜+++++. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 00FF 2B2B F900 F92B 2B2B 2BFF 0000" /* ...++˜.˜++++.. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 FF2B 2B00 2B2B 2B2B FF00 0000" /* ....++.++++... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 00FF 2BF9 2B2B 2BFF 0000 0000" /* .....+˜+++.... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 FF2B 2B2B FF00 0000 0000" /* ......+++..... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 00FF 2BFF 0000 0000 0000" /* .......+...... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 FF00 0000 0000 0000" /* ............... */
- $"0000 0000 0000 0000" /* ........ */
-};
diff --git a/mac/tclets.tcl b/mac/tclets.tcl
deleted file mode 100644
index ccaaae8..0000000
--- a/mac/tclets.tcl
+++ /dev/null
@@ -1,223 +0,0 @@
-# tclets.tcl --
-#
-# Drag & Drop Tclets
-# by Ray Johnson
-#
-# A simple way to create Tcl applications. This applications will copy a
-# droped Tcl file into a copy of a stub application (the user can pick).
-# The file is placed into the TEXT resource named "tclshrc" which is
-# automatically executed on startup.
-#
-# Copyright (c) 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.
-#
-
-namespace eval ::tk {}
-namespace eval ::tk::mac {}
-
-# ::tk::mac::OpenDocument --
-#
-# This procedure is a called whenever Wish recieves an "Open" event. The
-# procedure must be named ::tk::mac::OpenDocument for this to work.
-# Passed in files are assumed to be Tcl files that the user wants to be
-# made into Tclets. (Only the first one is used.) The procedure then
-# creates a copy of the stub app and places the Tcl file in the new
-# application's resource fork.
-#
-# Parameters:
-# args List of files
-#
-# Results:
-# One success a new Tclet is created.
-
-proc ::tk::mac::OpenDocument {args} {
- variable Droped_to_start
-
- # We only deal with the one file droped on the App
- set tclFile [lindex $args 0]
- set stub [GetStub]
-
- # Give a helper screen to guide user
- toplevel .helper -menu .bar
- ::tk::unsupported::MacWindowStyle style .helper dBoxProc
- message .helper.m -aspect 300 -text \
- "Select the name & location of your target Tcl application."
- pack .helper.m
- wm geometry .helper +20+40
- update idletasks
-
- # Get the target file from the end user
- set target [tk_getSaveFile]
- destroy .helper
- if {$target == ""} return
-
- # Copy stub, copy the droped file into the stubs text resource
- file copy $stub $target
- set id [open $tclFile r]
- set rid [resource open $target w]
- resource write -name tclshrc -file $rid TEXT [read $id]
- resource close $rid
- close $id
-
- # This is a hint to the start-up code - always set to true
- set Droped_to_start true
-}
-
-# ::tk::mac::GetStub --
-#
-# Get the location of our stub application. The value may be cached,
-# in the preferences file, or we may need to ask the user.
-#
-# Parameters:
-# None.
-#
-# Results:
-# A path to the stub application.
-
-proc ::tk::mac::GetStub {} {
- global env
- variable Stub_location
-
- if {[info exists Stub_location]} {
- return $Stub_location
- }
-
- set file $env(PREF_FOLDER)
- append file "D&D Tclet Preferences"
-
-
- if {[file exists $file]} {
- uplevel #0 [list source $file]
- if {[info exists Stub_location] && [file exists $Stub_location]} {
- return $Stub_location
- }
- }
-
- SelectStub
-
- if {[info exists Stub_location]} {
- return $Stub_location
- } else {
- exit
- }
-}
-
-# ::tk::mac::SelectStub --
-#
-# This procedure uses tk_getOpenFile to allow the user to select
-# the copy of "Wish" that is used as the basis for Tclets. The
-# result is stored in a preferences file.
-#
-# Parameters:
-# None.
-#
-# Results:
-# None. The prefernce file is updated.
-
-proc ::tk::mac::SelectStub {} {
- global env
- variable Stub_location
-
- # Give a helper screen to guide user
- toplevel .helper -menu .bar
- ::tk::unsupported::MacWindowStyle style .helper dBoxProc
- message .helper.m -aspect 300 -text \
- "Select \"Wish\" stub to clone. A copy of this application will be made to create your Tclet." \
-
- pack .helper.m
- wm geometry .helper +20+40
- update idletasks
-
- set new_location [tk_getOpenFile]
- destroy .helper
- if {$new_location != ""} {
- set Stub_location $new_location
- set file [file join $env(PREF_FOLDER) "D&D Tclet Preferences"]
-
- set id [open $file w]
- puts $id [list set [namespace which -variable Stub_location] \
- $Stub_location]
- close $id
- }
-}
-
-# ::tk::mac::CreateMenus --
-#
-# Create the menubar for this application.
-#
-# Parameters:
-# None.
-#
-# Results:
-# None.
-
-proc ::tk::mac::CreateMenus {} {
- menu .bar
- .bar add cascade -menu .bar.file -label File
- .bar add cascade -menu .bar.apple
- . configure -menu .bar
-
- menu .bar.apple -tearoff 0
- .bar.apple add command -label "About Drag & Drop Tclets..." \
- -command [namespace code ShowAbout]
-
- menu .bar.file -tearoff 0
- .bar.file add command -label "Show Console..." -command {console show}
- .bar.file add command -label "Select Wish Stub..." \
- -command [namespace code SelectStub]
- .bar.file add separator
- .bar.file add command -label "Quit" -accel Command-Q -command exit
-}
-
-# ::tk::mac::ShowAbout --
-#
-# Show the about box for Drag & Drop Tclets.
-#
-# Parameters:
-# None.
-#
-# Results:
-# None.
-
-proc ::tk::mac::ShowAbout {} {
- tk_messageBox -icon info -type ok -message \
-"Drag & Drop Tclets
-by Ray Johnson\n\n\
-Copyright (c) 1997 Sun Microsystems, Inc."
-}
-
-# ::tk::mac::Start --
-#
-# This procedure provides the main start-up code for the application.
-# It should be run first thing on start up. It will create the UI
-# and set up the rest of the state of the application.
-#
-# Parameters:
-# None.
-#
-# Results:
-# None.
-
-proc ::tk::mac::Start {} {
- variable Droped_to_start
-
- # Hide . & console - see if we ran as a droped item
- wm geometry . 1x1-25000-25000
- console hide
-
- # Run update - if we get any drop events we know that we were
- # started by a drag & drop - if so, we quit automatically when done
- set Droped_to_start false
- update
- if {$Droped_to_start == "true"} {
- exit
- }
-
- # We were not started by a drag & drop - create the UI
- CreateMenus
-}
-
-# Now that everything is defined, lets start the app!
-::tk::mac::Start
diff --git a/mac/tkMac.h b/mac/tkMac.h
deleted file mode 100644
index 3caf2eb..0000000
--- a/mac/tkMac.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * tkMacInt.h --
- *
- * Declarations of Macintosh specific exported variables and procedures.
- *
- * 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.
- */
-
-#ifndef _TKMAC
-#define _TKMAC
-
-#ifndef _TK
-#include <tk.h>
-#endif
-
-#ifndef _TKINT
-#include "tkInt.h"
-#endif
-
-#include <Windows.h>
-#include <QDOffscreen.h>
-
-#ifdef BUILD_tk
-# undef TCL_STORAGE_CLASS
-# define TCL_STORAGE_CLASS DLLEXPORT
-#endif
-
-/*
- * This variable is exported and can be used by extensions. It is the
- * way Tk extensions should access the QD Globals. This is so Tk
- * can support embedding itself in another window.
- */
-
-EXTERN QDGlobalsPtr tcl_macQdPtr;
-
-/*
- * Structures and function types for handling Netscape-type in process
- * embedding where Tk does not control the top-level
- */
-typedef int (Tk_MacEmbedRegisterWinProc) (int winID, Tk_Window window);
-typedef GWorldPtr (Tk_MacEmbedGetGrafPortProc) (Tk_Window window);
-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);
-
-#include "tkPlatDecls.h"
-
-# undef TCL_STORAGE_CLASS
-# define TCL_STORAGE_CLASS DLLIMPORT
-
-#endif /* _TKMAC */
diff --git a/mac/tkMacAppInit.c b/mac/tkMacAppInit.c
deleted file mode 100644
index b833c2e..0000000
--- a/mac/tkMacAppInit.c
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * tkMacAppInit.c --
- *
- * Provides a version of the Tcl_AppInit procedure for the example shell.
- *
- * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
- * 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.
- */
-
-#include <Gestalt.h>
-#include <ToolUtils.h>
-#include <Fonts.h>
-#include <Dialogs.h>
-#include <SegLoad.h>
-#include <Traps.h>
-#include <Appearance.h>
-
-#include "tk.h"
-#include "tkInt.h"
-#include "tkMacInt.h"
-#include "tclInt.h"
-#include "tclMac.h"
-#include "tclMacInt.h"
-
-#ifdef TK_TEST
-extern int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp));
-#endif /* TK_TEST */
-
-Tcl_Interp *gStdoutInterp = NULL;
-
-int TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr));
-
-/*
- * Prototypes for functions the ANSI library needs to link against.
- */
-short InstallConsole _ANSI_ARGS_((short fd));
-void RemoveConsole _ANSI_ARGS_((void));
-long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n));
-long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n));
-extern char * __ttyname _ANSI_ARGS_((long fildes));
-int kbhit _ANSI_ARGS_((void));
-int getch _ANSI_ARGS_((void));
-void clrscr _ANSI_ARGS_((void));
-short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event));
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static int MacintoshInit _ANSI_ARGS_((void));
-static int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp));
-static void SetupSIOUX _ANSI_ARGS_((void));
-
-static int inMacExit = 0;
-static pascal void NoMoreOutput() { inMacExit = 1; }
-
-/*
- *----------------------------------------------------------------------
- *
- * main --
- *
- * Main program for Wish.
- *
- * Results:
- * None. This procedure never returns (it exits the process when
- * it's done
- *
- * Side effects:
- * This procedure initializes the wish world and then
- * calls Tk_Main.
- *
- *----------------------------------------------------------------------
- */
-
-void
-main(
- int argc, /* Number of arguments. */
- char **argv) /* Array of argument strings. */
-{
- char *newArgv[2];
-
- if (MacintoshInit() != TCL_OK) {
- Tcl_Exit(1);
- }
-
- argc = 1;
- newArgv[0] = "Wish";
- newArgv[1] = NULL;
-
- /* Tk_Main is actually #defined to
- * Tk_MainEx(argc, argv, Tcl_AppInit, Tcl_CreateInterp())
- * Unfortunately, you also HAVE to call Tcl_FindExecutable
- * BEFORE creating the first interp, or the tcl_library will not
- * get set properly. So we call it by hand here...
- */
-
- Tcl_FindExecutable(newArgv[0]);
- Tk_Main(argc, newArgv, Tcl_AppInit);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tcl_AppInit --
- *
- * This procedure performs application-specific initialization.
- * Most applications, especially those that incorporate additional
- * packages, will have their own version of this procedure.
- *
- * Results:
- * Returns a standard Tcl completion code, and leaves an error
- * message in the interp's result if an error occurs.
- *
- * Side effects:
- * Depends on the startup script.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tcl_AppInit(
- Tcl_Interp *interp) /* Interpreter for application. */
-{
- if (Tcl_Init(interp) == TCL_ERROR) {
- return TCL_ERROR;
- }
- if (Tk_Init(interp) == TCL_ERROR) {
- return TCL_ERROR;
- }
- Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit);
-
- /*
- * Call the init procedures for included packages. Each call should
- * look like this:
- *
- * if (Mod_Init(interp) == TCL_ERROR) {
- * return TCL_ERROR;
- * }
- *
- * where "Mod" is the name of the module.
- */
-
-#ifdef TK_TEST
- if (Tktest_Init(interp) == TCL_ERROR) {
- return TCL_ERROR;
- }
- Tcl_StaticPackage(interp, "Tktest", Tktest_Init,
- (Tcl_PackageInitProc *) NULL);
-#endif /* TK_TEST */
-
- /*
- * Call Tcl_CreateCommand for application-specific commands, if
- * they weren't already created by the init procedures called above.
- * Each call would look like this:
- *
- * Tcl_CreateCommand(interp, "tclName", CFuncCmd, NULL, NULL);
- */
-
- SetupMainInterp(interp);
-
- /*
- * Specify a user-specific startup script to invoke if the application
- * is run interactively. On the Mac we can specifiy either a TEXT resource
- * which contains the script or the more UNIX like file location
- * may also used. (I highly recommend using the resource method.)
- */
-
- Tcl_SetVar(interp, "tcl_rcRsrcName", "tclshrc", TCL_GLOBAL_ONLY);
- /* Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); */
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MacintoshInit --
- *
- * This procedure calls Mac specific initilization calls. Most of
- * these calls must be made as soon as possible in the startup
- * process.
- *
- * Results:
- * Returns TCL_OK if everything went fine. If it didn't the
- * application should probably fail.
- *
- * Side effects:
- * Inits the application.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-MacintoshInit()
-{
- int i;
- long result, mask = 0x0700; /* mask = system 7.x */
-
-#if GENERATING68K && !GENERATINGCFM
- SetApplLimit(GetApplLimit() - (TK_MAC_68K_STACK_GROWTH));
-#endif
- MaxApplZone();
- for (i = 0; i < 4; i++) {
- (void) MoreMasters();
- }
-
- /*
- * Tk needs us to set the qd pointer it uses. This is needed
- * so Tk doesn't have to assume the availablity of the qd global
- * variable. Which in turn allows Tk to be used in code resources.
- */
- tcl_macQdPtr = &qd;
-
- /*
- * If appearance is present, then register Tk as an Appearance client
- * This means that the mapping from non-Appearance to Appearance cdefs
- * will be done for Tk regardless of the setting in the Appearance
- * control panel.
- */
-
- if (TkMacHaveAppearance()) {
- RegisterAppearanceClient();
- }
-
- InitGraf(&tcl_macQdPtr->thePort);
- InitFonts();
- if (TkMacHaveAppearance() >= 0x110) {
- InitFloatingWindows();
- } else {
- InitWindows();
- }
- InitMenus();
- InitDialogs((long) NULL);
- InitCursor();
-
- /*
- * Make sure we are running on system 7 or higher
- */
-
- if ((NGetTrapAddress(_Gestalt, ToolTrap) ==
- NGetTrapAddress(_Unimplemented, ToolTrap))
- || (((Gestalt(gestaltSystemVersion, &result) != noErr)
- || (result < mask)))) {
- panic("Tcl/Tk requires System 7 or higher.");
- }
-
- /*
- * Make sure we have color quick draw
- * (this means we can't run on 68000 macs)
- */
-
- if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr)
- || (result < gestalt32BitQD13))) {
- panic("Tk requires Color QuickDraw.");
- }
-
-
- FlushEvents(everyEvent, 0);
- SetEventMask(everyEvent);
-
-
- Tcl_MacSetEventProc(TkMacConvertEvent);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SetupMainInterp --
- *
- * This procedure calls initalization routines require a Tcl
- * interp as an argument. This call effectively makes the passed
- * iterpreter the "main" interpreter for the application.
- *
- * Results:
- * Returns TCL_OK if everything went fine. If it didn't the
- * application should probably fail.
- *
- * Side effects:
- * More initilization.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-SetupMainInterp(
- Tcl_Interp *interp)
-{
- /*
- * Initialize the console only if we are running as an interactive
- * application.
- */
-
- TkMacInitAppleEvents(interp);
- TkMacInitMenus(interp);
-
- if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1")
- == 0) {
- if (Tk_CreateConsoleWindow(interp) == TCL_ERROR) {
- goto error;
- }
- SetupSIOUX();
- TclMacInstallExitToShellPatch(NoMoreOutput);
- }
-
- /*
- * Attach the global interpreter to tk's expected global console
- */
-
- gStdoutInterp = interp;
-
- return TCL_OK;
-
-error:
- panic(Tcl_GetStringResult(interp));
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * InstallConsole, RemoveConsole, etc. --
- *
- * The following functions provide the UI for the console package.
- * Users wishing to replace SIOUX with their own console package
- * need only provide the four functions below in a library.
- *
- * Results:
- * See SIOUX documentation for details.
- *
- * Side effects:
- * See SIOUX documentation for details.
- *
- *----------------------------------------------------------------------
- */
-
-short
-InstallConsole(short fd)
-{
-#pragma unused (fd)
-
- return 0;
-}
-
-void
-RemoveConsole(void)
-{
-}
-
-long
-WriteCharsToConsole(char *buffer, long n)
-{
- if (!inMacExit) {
- Tcl_DString ds;
- Tcl_ExternalToUtfDString(NULL, buffer, n, &ds);
- TkConsolePrint(gStdoutInterp, TCL_STDOUT, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
- Tcl_DStringFree(&ds);
- return n;
- } else {
- return 0;
- }
-}
-
-long
-ReadCharsFromConsole(char *buffer, long n)
-{
- return 0;
-}
-
-extern char *
-__ttyname(long fildes)
-{
- static char *__devicename = "null device";
-
- if (fildes >= 0 && fildes <= 2) {
- return (__devicename);
- }
-
- return (0L);
-}
-
-int kbhit(void)
-{
- return 0;
-}
-
-int getch(void)
-{
- return 0;
-}
-
-void clrscr(void)
-{
- return;
-}
-
-short
-SIOUXHandleOneEvent(EventRecord *event)
-{
- return 0;
-}
-static void SetupSIOUX(void) {
-#ifndef STATIC_BUILD
- extern DLLIMPORT void SetupConsolePlugins(void*, void*, void*, void*,
- void*, void*, void*, void*);
- SetupConsolePlugins( &InstallConsole,
- &RemoveConsole,
- &WriteCharsToConsole,
- &ReadCharsFromConsole,
- &__ttyname,
- &kbhit,
- &getch,
- &clrscr);
-#endif
-}
diff --git a/mac/tkMacAppearanceStubs.c b/mac/tkMacAppearanceStubs.c
deleted file mode 100755
index 0fd0fee..0000000
--- a/mac/tkMacAppearanceStubs.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * tkMacAppearanceStubs.c --
- *
- * This file contains stubs for some MacOS8.6+ Toolbox calls that
- * are not contained in any of the CFM68K stubs libraries. Their
- * use must be conditionalized by checks (usually for Appearance version
- * greater than 1.1), so they will never get called on a CFM68k system.
- * Putting in the stubs means I don't have to clutter the code BOTH
- * with appearance version checks & #ifdef GENERATING_CFM68K...
- *
- * Copyright (c) 1999 Scriptics Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- *
- */
-
-#include <MacWindows.h>
-#include <Appearance.h>
-
-/* Export these calls from the Tk library, since we may need to use
- * them in shell calls.
- */
-
-pascal OSStatus
-MoveWindowStructure(
- WindowPtr window,
- short hGlobal,
- short vGlobal)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-
-}
-
-pascal OSStatus
-CreateNewWindow(
- WindowClass windowClass,
- WindowAttributes attributes,
- const Rect *bounds,
- WindowPtr *outWindow)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-
-}
-
-pascal WindowPtr
-FrontNonFloatingWindow()
-{
- panic("Error: Running stub for PPC-Only routine");
- return NULL;
-}
-
-pascal OSStatus
-GetWindowClass(
- WindowPtr window,
- WindowClass *outClass)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-}
-
-pascal OSStatus
-ApplyThemeBackground(
- ThemeBackgroundKind inKind,
- const Rect* bounds,
- ThemeDrawState inState,
- SInt16 inDepth,
- Boolean inColorDev)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-}
-
-pascal OSStatus
-InitFloatingWindows(void)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-}
-
-pascal OSStatus
-ShowFloatingWindows(void)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-}
-
-pascal OSStatus
-HideFloatingWindows(void)
-{
- panic("Error: Running stub for PPC-Only routine");
- return noErr;
-}
-
-pascal Boolean
-IsValidWindowPtr(GrafPtr grafPort)
-{
- panic("Error: Running stub for PPC-Only routine");
- return true;
-}
-
diff --git a/mac/tkMacApplication.r b/mac/tkMacApplication.r
deleted file mode 100644
index 6b6b443..0000000
--- a/mac/tkMacApplication.r
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * tkMacApplication.r --
- *
- * This file creates resources for use in the Wish application.
- *
- * Copyright (c) 1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include <Types.r>
-#include <SysTypes.r>
-#include <Balloons.r>
-#include <BalloonTypes.r>
-#include <AEUserTermTypes.r>
-
-/*
- * The folowing include and defines help construct
- * the version string for Tcl.
- */
-
-#define RC_INVOKED
-#include "tk.h"
-
-#if (TK_RELEASE_LEVEL == 0)
-# define RELEASE_LEVEL alpha
-#elif (TK_RELEASE_LEVEL == 1)
-# define RELEASE_LEVEL beta
-#elif (TK_RELEASE_LEVEL == 2)
-# define RELEASE_LEVEL final
-#endif
-
-#if (TK_RELEASE_LEVEL == 2)
-# define MINOR_VERSION (TK_MINOR_VERSION * 16) + TK_RELEASE_SERIAL
-# define RELEASE_CODE 0x00
-#else
-# define MINOR_VERSION TK_MINOR_VERSION * 16
-# define RELEASE_CODE TK_RELEASE_SERIAL
-#endif
-
-resource 'vers' (1) {
- TK_MAJOR_VERSION, MINOR_VERSION,
- RELEASE_LEVEL, RELEASE_CODE, verUS,
- TK_PATCH_LEVEL,
- TK_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
-};
-
-resource 'vers' (2) {
- TK_MAJOR_VERSION, MINOR_VERSION,
- RELEASE_LEVEL, RELEASE_CODE, verUS,
- TK_PATCH_LEVEL,
- "Wish " TK_PATCH_LEVEL " © 1993-2001"
-};
-
-#define TK_APP_RESOURCES 128
-#define TK_APP_CREATOR 'WIsH'
-
-/*
- * The 'BNDL' resource is the primary link between a file's
- * creator/type and its icon. This resource acts for all Tcl shared
- * libraries; other libraries will not need one and ought to use
- * custom icons rather than new file types for a different appearance.
- */
-
-resource 'BNDL' (TK_APP_RESOURCES, "Tk app bundle", purgeable)
-{
- TK_APP_CREATOR,
- 0,
- {
- 'FREF',
- {
- 0, TK_APP_RESOURCES,
- 1, TK_APP_RESOURCES+1
- },
- 'ICN#',
- {
- 0, TK_APP_RESOURCES,
- 1, TK_APP_RESOURCES+1
- }
- }
-};
-
-resource 'FREF' (TK_APP_RESOURCES, purgeable)
-{
- 'APPL', 0, ""
-};
-resource 'FREF' (TK_APP_RESOURCES+1, purgeable)
-{
- 'TEXT', 1, ""
-};
-
-type TK_APP_CREATOR as 'STR ';
-resource TK_APP_CREATOR (0, purgeable) {
- "Wish " TK_PATCH_LEVEL " © 1993-2001"
-};
-
-/*
- * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
- * to affect the text the Finder displays in the "kind" column and
- * file info dialog. This information will be applied to all files
- * with the listed creator and type.
- */
-resource 'kind' (TK_APP_RESOURCES, "Tcl kind", purgeable) {
- TK_APP_CREATOR,
- 0, /* region = USA */
- {
- 'APPL', "Wish",
- 'TEXT', "Tcl/Tk Script"
- }
-};
-
-#define kIconHelpString 256
-
-resource 'hfdr' (-5696, purgeable) {
- HelpMgrVersion, hmDefaultOptions, 0, 0,
- {HMSTRResItem {kIconHelpString}}
-};
-resource 'STR ' (kIconHelpString, purgeable) {
- "This is the interpreter for Tcl & Tk scripts"
- " running on Macintosh computers."
-};
-
-/*
- * The following resource define the icon used by Tcl scripts. Any
- * TEXT file with the creator of WIsH will get this icon.
- */
-
-data 'icl4' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) {
- $"000F FFFF FFFF FFFF FFFF FFF0 0000 0000"
- $"000F 3333 3333 3333 3333 33FF 0000 0000"
- $"000F 3333 3333 3333 3433 33F2 F000 0000"
- $"000F 3333 3333 3333 7D43 33F2 2F00 0000"
- $"000F 3333 3333 3335 5623 33F2 22F0 0000"
- $"000F 3333 3333 3356 6343 33FF FFFF 0000"
- $"000F 3333 3333 256F 5223 3333 333F 0000"
- $"000F 3333 3333 D666 2433 3333 333F 0000"
- $"000F 3333 3333 D5F6 6633 3333 333F 0000"
- $"000F 3333 3332 5666 6733 3333 333F 0000"
- $"000F 3333 3336 E56F 6633 3333 333F 0000"
- $"000F 3333 3336 5656 5733 3333 333F 0000"
- $"000F 3333 3336 E5B6 5233 3333 333F 0000"
- $"000F 3333 3336 5ED6 3333 3333 333F 0000"
- $"000F 3333 3376 6475 6233 3333 333F 0000"
- $"000F 3333 333D 5D56 7333 3333 333F 0000"
- $"000F 3333 3336 6C55 6333 3333 333F 0000"
- $"000F 3333 3336 5C56 7333 3333 333F 0000"
- $"000F 3333 3362 6CE6 D333 3333 333F 0000"
- $"000F 3333 3336 5C65 6333 3333 333F 0000"
- $"000F 3333 3336 EC5E 3333 3333 333F 0000"
- $"000F 3333 3336 5C56 6333 3333 333F 0000"
- $"000F 3333 3333 5C75 3333 3333 333F 0000"
- $"000F 3333 3333 5DD6 3333 3333 333F 0000"
- $"000F 3333 3333 3CDD 3333 3333 333F 0000"
- $"000F 3333 3333 3303 3333 3333 333F 0000"
- $"000F 3333 3333 3C33 3333 3333 333F 0000"
- $"000F 3333 3333 3C33 3333 3333 333F 0000"
- $"000F 3333 3333 3C33 3333 3333 333F 0000"
- $"000F 3333 3333 3333 3333 3333 333F 0000"
- $"000F 3333 3333 3333 3333 3333 333F 0000"
- $"000F FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-};
-
-data 'ICN#' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) {
- $"1FFF FE00 1000 0300 1000 F280 1003 F240"
- $"1003 E220 1007 E3F0 100F C010 100F C010"
- $"100F C010 101F F010 101F F010 101F F010"
- $"101F F010 101F F010 101D E010 101D E010"
- $"101D E010 101D C010 101D C010 101D C010"
- $"101D C010 100D 8010 100D 8010 100D 8010"
- $"1005 8010 1002 0010 1002 0010 1002 0010"
- $"1002 0010 1002 0010 1000 0010 1FFF FFF0"
- $"1FFF FE00 1FFF FF00 1FFF FF80 1FFF FFC0"
- $"1FFF FFE0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
- $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0"
-};
-
-data 'ics#' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) {
- $"7FF0 41D8 419C 4384 43C4 47C4 47C4 4784"
- $"4684 4684 4284 4284 4104 4104 4104 7FFC"
- $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC"
- $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC"
-};
-
-data 'ics4' (TK_APP_RESOURCES + 1, "Tk Doc", purgeable) {
- $"0FFF FFFF FFFF 0000 0F33 3333 53F2 F000"
- $"0F33 3335 52FF FF00 0F33 33E6 3333 3F00"
- $"0F33 3256 6333 3F00 0F33 3556 6333 3F00"
- $"0F33 3A5E 3333 3F00 0F33 65D6 D333 3F00"
- $"0F33 3655 5333 3F00 0F33 65C6 3333 3F00"
- $"0F33 3EC5 E333 3F00 0F33 36C6 3333 3F00"
- $"0F33 33CD 3333 3F00 0F33 33C3 3333 3F00"
- $"0F33 33C3 3333 3F00 0FFF FFFF FFFF FF00"
-};
-
-/*
- * The following resources define the icons for the Wish
- * application.
- */
-
-data 'icl4' (TK_APP_RESOURCES, "Tk App", purgeable) {
- $"0000 0000 0000 000F 0000 0000 0000 0000"
- $"0000 0000 0000 00FC F000 0000 0000 0000"
- $"0000 0000 0000 0FCC CF66 0000 0000 0000"
- $"0000 0000 0000 FCCC C556 0000 0000 0000"
- $"0000 0000 000F CCCC 566F 0000 0000 0000"
- $"0000 0000 00FC CCC5 6F5C F000 0000 0000"
- $"0000 0000 0FCC CC66 66CC CF00 0000 0000"
- $"0000 0000 FCCC CCD5 5666 CCF0 0000 0000"
- $"0000 000F CCCC C656 5667 CCCF 0000 0000"
- $"0000 00FC CCCC C6E5 5566 CCCC F000 0000"
- $"0000 0FCC CCCC C656 5657 CCCC CF00 0000"
- $"0000 FCCC CCCC C6E5 565C CCCC CCF0 0000"
- $"000F CCCC CCCC C655 565C CCCC CCCF 0000"
- $"00FC CCCC CCCC 7660 556C CCCC CCCC F000"
- $"0FCC CCCC CCCC CD5D 567C CCCC CCCC CF00"
- $"FCCC CCCC CCCC 6660 556C CCCC CCCC CCF0"
- $"0FCC CCCC CCCC 665C 565C CCCC CCCC C0CF"
- $"00FC CCCC CCCC 6660 E6DC CCCC CCCC CCF0"
- $"000F CCCC CCCC C650 656C CCCC CCCC CF00"
- $"0000 FCCC CCCC C6EC 5ECC CCCC CCCC F000"
- $"0000 0FCC CCCC C650 566C CCCC CCCF 0000"
- $"0000 00FC CCCC CC50 75CC CCCC CCF0 0000"
- $"0000 000F CCCC CC50 56CC CCCC CF00 0000"
- $"0000 0000 FCCC CCC0 5CCC CCCC F000 0000"
- $"0000 0000 0FCC CCC0 CCCC CCCF 0000 0000"
- $"0000 0000 00FC CCC0 CCCC CCF0 0000 0000"
- $"0000 0000 000F CCC0 CCCC CF00 0000 0000"
- $"0000 0000 0000 FCCC CCCC F000 0000 0000"
- $"0000 0000 0000 0FCC CCCF 0000 0000 0000"
- $"0000 0000 0000 00FC CCF0 0000 0000 0000"
- $"0000 0000 0000 000F CF00 0000 0000 0000"
- $"0000 0000 0000 0000 F000 0000 0000 0000"
-};
-
-data 'ICN#' (TK_APP_RESOURCES, "Tk App", purgeable) {
- $"0001 0000 0002 8000 0004 7000 0008 7000"
- $"0010 F000 0021 E800 0043 C400 0081 F200"
- $"0107 F100 0207 F080 0407 F040 0807 E020"
- $"1007 E010 200E E008 4002 E004 800E E002"
- $"400E E001 200E C002 1006 E004 0806 C008"
- $"0406 E010 0202 C020 0102 C040 0080 8080"
- $"0041 0100 0021 0200 0011 0400 0009 0800"
- $"0004 1000 0002 2000 0001 4000 0000 8000"
- $"0001 0000 0003 8000 0007 F000 000F F000"
- $"001F F000 003F F800 007F FC00 00FF FE00"
- $"01FF FF00 03FF FF80 07FF FFC0 0FFF FFE0"
- $"1FFF FFF0 3FFF FFF8 7FFF FFFC FFFF FFFE"
- $"7FFF FFFF 3FFF FFFE 1FFF FFFC 0FFF FFF8"
- $"07FF FFF0 03FF FFE0 01FF FFC0 00FF FF80"
- $"007F FF00 003F FE00 001F FC00 000F F800"
- $"0007 F000 0003 E000 0001 C000 0000 8000"
-};
-
-data 'ics#' (TK_APP_RESOURCES, "Tk App", purgeable) {
- $"01C0 0260 04E0 09D0 1388 23C4 43C2 8281"
- $"8282 4284 2188 1190 0920 0540 0280 0100"
- $"01C0 03E0 07E0 0FF0 1FF8 3FFC 7FFE FFFF"
- $"FFFE 7FFC 3FF8 1FF0 0FE0 07C0 0380 0100"
-};
-
-data 'ics4' (TK_APP_RESOURCES, "Tk App", purgeable) {
- $"0000 000F C000 0000 0000 00FC 6600 0000"
- $"0000 0FCC 6600 0000 0000 FCC6 66F0 0000"
- $"000F CCD5 56CF 0000 00FC CC66 57CC F000"
- $"0FCC CC65 56CC CF00 FCCC CC56 57CC CCF0"
- $"0FCC CCC6 6CCC CCCF 00FC CCC6 5CCC CCF0"
- $"000F CCC6 6CCC CF00 0000 FCCC 5CCC F000"
- $"0000 0FCC CCCF 0000 0000 00FC CCF0 0000"
- $"0000 000F CF00 0000 0000 0000 F000 0000"
-};
-
-/*
- * The following resource is used when creating the 'env' variable in
- * the Macintosh environment. The creation mechanisim looks for the
- * 'STR#' resource named "Tcl Environment Variables" rather than a
- * specific resource number. (In other words, feel free to change the
- * resource id if it conflicts with your application.) Each string in
- * the resource must be of the form "KEYWORD=SOME STRING". See Tcl
- * documentation for futher information about the env variable.
- */
-
-/* A good example of something you may want to set is:
- * "TCL_LIBRARY=My disk:etc."
- */
-
-resource 'STR#' (128, "Tcl Environment Variables") {
- {
- /*
- "SCHEDULE_NAME=Agent Controller Schedule",
- "SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"
- */
- };
-};
-
-data 'alis' (1000, "Library Folder") {
- $"0000 0000 00BA 0002 0001 012F 0000 0000" /* .....†...../.... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 985C FB00 4244 0000 0000" /* ......ò\š.BD.... */
- $"0002 1328 5375 7070 6F72 7420 4C69 6272" /* ...(Support Libr */
- $"6172 6965 7329 0000 0000 0000 0000 0000" /* aries).......... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0076 8504 B617 A796 003D 0027 025B" /* ...vÖ..ßñ.=.'.[ */
- $"01E4 0001 0001 0000 0000 0000 0000 0000" /* .”.............. */
- $"0000 0000 0000 0000 0001 2F00 0002 0015" /* ........../..... */
- $"2F3A 2853 7570 706F 7274 204C 6962 7261" /* /:(Support Libra */
- $"7269 6573 2900 FFFF 0000" /* ries)... */
-};
-
diff --git a/mac/tkMacBitmap.c b/mac/tkMacBitmap.c
deleted file mode 100644
index 7149288..0000000
--- a/mac/tkMacBitmap.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * tkMacBitmap.c --
- *
- * This file handles the implementation of native bitmaps.
- *
- * 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.
- */
-
-#include "tkPort.h"
-#include "tk.h"
-#include "tkMacInt.h"
-
-#include <Icons.h>
-#include <Dialogs.h>
-#include <Resources.h>
-#include <Strings.h>
-
-/*
- * Depending on the resource type there are different ways to
- * draw native icons.
- */
-#define TYPE1 0 /* Family icon suite. */
-#define TYPE2 1 /* ICON resource. */
-#define TYPE3 2 /* cicn resource. */
-
-/*
- * This data structure describes the id and type of a given icon.
- * It is used as the source for native icons.
- */
-typedef struct {
- int id; /* Resource Id for Icon. */
- long int type; /* Type of icon. */
-} NativeIcon;
-
-/*
- * This structure holds information about native bitmaps.
- */
-
-typedef struct {
- char *name; /* Name of icon. */
- long int type; /* Type of icon. */
- int id; /* Id of icon. */
- int size; /* Size of icon. */
-} BuiltInIcon;
-
-/*
- * This array mapps a string name to the supported builtin icons
- * on the Macintosh.
- */
-
-static BuiltInIcon builtInIcons[] = {
- {"document", TYPE1, kGenericDocumentIconResource, 32},
- {"stationery", TYPE1, kGenericStationeryIconResource, 32},
- {"edition", TYPE1, kGenericEditionFileIconResource, 32},
- {"application", TYPE1, kGenericApplicationIconResource, 32},
- {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32},
- {"folder", TYPE1, kGenericFolderIconResource, 32},
- {"pfolder", TYPE1, kPrivateFolderIconResource, 32},
- {"trash", TYPE1, kTrashIconResource, 32},
- {"floppy", TYPE1, kFloppyIconResource, 32},
- {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32},
- {"cdrom", TYPE1, kGenericCDROMIconResource, 32},
- {"preferences", TYPE1, kGenericPreferencesIconResource, 32},
- {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32},
- {"stop", TYPE2, kStopIcon, 32},
- {"note", TYPE2, kNoteIcon, 32},
- {"caution", TYPE2, kCautionIcon, 32},
- {(char *) NULL, 0, 0, 0}
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDefineNativeBitmaps --
- *
- * Add native bitmaps.
- *
- * Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * 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
- * here on to refer to the given bitmap.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDefineNativeBitmaps()
-{
- int new;
- Tcl_HashEntry *predefHashPtr;
- TkPredefBitmap *predefPtr;
- CONST char * name;
- BuiltInIcon *builtInPtr;
- NativeIcon *nativeIconPtr;
- Tcl_HashTable *tablePtr;
-
- for (builtInPtr = builtInIcons; builtInPtr->name != NULL; builtInPtr++) {
- name = Tk_GetUid(builtInPtr->name);
- tablePtr = TkGetBitmapPredefTable();
- predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &new);
- if (!new) {
- continue;
- }
- predefPtr = (TkPredefBitmap *) ckalloc(sizeof(TkPredefBitmap));
- nativeIconPtr = (NativeIcon *) ckalloc(sizeof(NativeIcon));
- nativeIconPtr->id = builtInPtr->id;
- nativeIconPtr->type = builtInPtr->type;
- predefPtr->source = (char *) nativeIconPtr;
- predefPtr->width = builtInPtr->size;
- predefPtr->height = builtInPtr->size;
- predefPtr->native = 1;
- Tcl_SetHashValue(predefHashPtr, predefPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCreateNativeBitmap --
- *
- * Add native bitmaps.
- *
- * Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * 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
- * here on to refer to the given bitmap.
- *
- *----------------------------------------------------------------------
- */
-
-Pixmap
-TkpCreateNativeBitmap(
- Display *display,
- CONST char * source) /* Info about the icon to build. */
-{
- Pixmap pix;
- GWorldPtr destPort;
- Rect destRect;
- Handle icon;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- NativeIcon *nativeIconPtr;
-
- pix = Tk_GetPixmap(display, None, 32, 32, 0);
- destPort = TkMacGetDrawablePort(pix);
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- nativeIconPtr = (NativeIcon *) source;
- SetRect(&destRect, 0, 0, 32, 32);
- if (nativeIconPtr->type == TYPE1) {
- RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
-
- RGBForeColor(&white);
- PaintRect(&destRect);
- PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id);
- } else if (nativeIconPtr->type == TYPE2) {
- icon = GetIcon(nativeIconPtr->id);
- if (icon != NULL) {
- RGBColor black = {0, 0, 0};
-
- RGBForeColor(&black);
- PlotIcon(&destRect, icon);
- ReleaseResource(icon);
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
- return pix;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetNativeAppBitmap --
- *
- * Add native bitmaps.
- *
- * Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * 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
- * here on to refer to the given bitmap.
- *
- *----------------------------------------------------------------------
- */
-
-Pixmap
-TkpGetNativeAppBitmap(
- Display *display, /* The display. */
- CONST char *name, /* The name of the bitmap. */
- int *width, /* The width & height of the bitmap. */
- int *height)
-{
- Pixmap pix;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- Rect destRect;
- Handle resource;
- 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;
-
- resource = GetNamedResource('cicn', nativeName);
- if (resource != NULL) {
- type = TYPE3;
- } else {
- resource = GetNamedResource('ICON', nativeName);
- if (resource != NULL) {
- type = TYPE2;
- }
- }
-
- if (resource == NULL) {
- return NULL;
- }
-
- pix = Tk_GetPixmap(display, None, 32, 32, 0);
- destPort = TkMacGetDrawablePort(pix);
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- SetRect(&destRect, 0, 0, 32, 32);
- if (type == TYPE2) {
- RGBColor black = {0, 0, 0};
-
- RGBForeColor(&black);
- PlotIcon(&destRect, resource);
- ReleaseResource(resource);
- } else if (type == TYPE3) {
- RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
- short id;
- ResType theType;
- Str255 dummy;
-
- /*
- * We need to first paint the background white. Also, for
- * some reason we *must* use GetCIcon instead of GetNamedResource
- * for PlotCIcon to work - so we use GetResInfo to get the id.
- */
- RGBForeColor(&white);
- PaintRect(&destRect);
- GetResInfo(resource, &id, &theType, dummy);
- ReleaseResource(resource);
- resource = (Handle) GetCIcon(id);
- PlotCIcon(&destRect, (CIconHandle) resource);
- DisposeCIcon((CIconHandle) resource);
- }
-
- *width = 32;
- *height = 32;
- SetGWorld(saveWorld, saveDevice);
- return pix;
-}
diff --git a/mac/tkMacButton.c b/mac/tkMacButton.c
deleted file mode 100644
index 887d813..0000000
--- a/mac/tkMacButton.c
+++ /dev/null
@@ -1,1709 +0,0 @@
-/*
- * tkMacButton.c --
- *
- * This file implements the Macintosh specific portion of the
- * button widgets.
- *
- * Copyright (c) 1996-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.
- */
-
-#include "tkButton.h"
-#include "tkMacInt.h"
-#include <Controls.h>
-#include <ControlDefinitions.h>
-#include <LowMem.h>
-#include <Appearance.h>
-
-
-#include <ToolUtils.h>
-
-/*
- * Some defines used to control what type of control is drawn.
- */
-
-#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
-
-/*
- * The following structures are used to draw our controls. Rather than
- * having many Mac controls we just use one control of each type and
- * reuse them for all Tk widgets. When the windowRef variable is NULL
- * it means none of the data structures have been allocated.
- */
-
-static WindowRef windowRef = NULL;
-static CWindowRecord windowRecord;
-static ControlRef buttonHandle;
-static ControlRef checkHandle;
-static ControlRef radioHandle;
-static ControlRef smallBevelHandle;
-static ControlRef smallStickyBevelHandle;
-static ControlRef medBevelHandle;
-static ControlRef medStickyBevelHandle;
-static ControlRef largeBevelHandle;
-static ControlRef largeStickyBevelHandle;
-
-/*
- * These are used to store the image content for
- * beveled buttons - i.e. buttons with images.
- */
-
-static ControlButtonContentInfo bevelButtonContent;
-static OpenCPicParams picParams;
-
-static CCTabHandle buttonTabHandle;
-static CCTabHandle checkTabHandle;
-static CCTabHandle radioTabHandle;
-static PixMapHandle oldPixPtr;
-
-/*
- * These functions are used when Appearance is present.
- * By embedding all our controls in a userPane control,
- * we can color the background of the text in radiobuttons
- * and checkbuttons. Thanks to Peter Gontier of Apple DTS
- * for help on this one.
- */
-
-static ControlRef userPaneHandle;
-static RGBColor gUserPaneBackground = { ~0, ~0, ~0};
-static pascal OSErr SetUserPaneDrawProc(ControlRef control,
- ControlUserPaneDrawProcPtr upp);
-static pascal OSErr SetUserPaneSetUpSpecialBackgroundProc(ControlRef control,
- ControlUserPaneBackgroundProcPtr upp);
-static pascal void UserPaneDraw(ControlRef control, ControlPartCode cpc);
-static pascal void UserPaneBackgroundProc(ControlHandle,
- ControlBackgroundPtr info);
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static void ButtonEventProc _ANSI_ARGS_((
- ClientData clientData, XEvent *eventPtr));
-static int UpdateControlColors _ANSI_ARGS_((TkButton *butPtr,
- ControlRef controlHandle, CCTabHandle ccTabHandle,
- RGBColor *saveColorPtr));
-static void DrawBufferedControl _ANSI_ARGS_((TkButton *butPtr,
- GWorldPtr destPort, GC gc, Pixmap pixmap));
-static void InitSampleControls();
-static void SetupBevelButton _ANSI_ARGS_((TkButton *butPtr,
- ControlRef controlHandle,
- GWorldPtr destPort, GC gc, Pixmap pixmap));
-static void ChangeBackgroundWindowColor _ANSI_ARGS_((
- WindowRef macintoshWindow, RGBColor rgbColor,
- RGBColor *oldColor));
-static void ButtonExitProc _ANSI_ARGS_((ClientData clientData));
-
-/*
- * The class procedure table for the button widgets.
- */
-
-Tk_ClassProcs tkpButtonProcs = {
- sizeof(Tk_ClassProcs), /* size */
- TkButtonWorldChanged, /* worldChangedProc */
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCreateButton --
- *
- * Allocate a new TkButton structure.
- *
- * Results:
- * Returns a newly allocated TkButton structure.
- *
- * Side effects:
- * Registers an event handler for the widget.
- *
- *----------------------------------------------------------------------
- */
-
-TkButton *
-TkpCreateButton(
- Tk_Window tkwin)
-{
- TkButton *buttonPtr;
- buttonPtr = (TkButton *) ckalloc(sizeof(TkButton));
- Tk_CreateEventHandler(tkwin, ActivateMask,
- ButtonEventProc, (ClientData) buttonPtr);
- return buttonPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDisplayButton --
- *
- * This procedure is invoked to display a button widget. It is
- * normally invoked as an idle handler.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the button in its
- * current mode. The REDRAW_PENDING flag is cleared.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDisplayButton(
- ClientData clientData) /* Information about widget. */
-{
- TkButton *butPtr = (TkButton *) clientData;
- Pixmap pixmap;
- GC gc;
- Tk_3DBorder border;
- int x = 0; /* Initialization only needed to stop
- * compiler warning. */
- int y, relief;
- register Tk_Window tkwin = butPtr->tkwin;
- int width, height, fullWidth, fullHeight;
- int textXOffset, textYOffset;
- int haveImage = 0, haveText = 0;
- int offset; /* 0 means this is a normal widget. 1 means
- * it is an image button, so we offset the
- * image to make the button appear to move
- * up and down as the relief changes. */
- int hasImageOrBitmap;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- int drawType, borderWidth;
- int imageWidth, imageHeight;
- int imageXOffset = 0, imageYOffset = 0; /* image information that will
- * be used to restrict disabled
- * pixmap as well */
-
- GetGWorld(&saveWorld, &saveDevice);
-
- butPtr->flags &= ~REDRAW_PENDING;
- if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
- return;
- }
-
- /*
- * In order to avoid screen flashes, this procedure redraws
- * the button in a pixmap, then copies the pixmap to the
- * screen in a single operation. This means that there's no
- * point in time where the on-sreen image has been cleared.
- */
-
- pixmap = Tk_GetPixmap(butPtr->display, Tk_WindowId(tkwin),
- Tk_Width(tkwin), Tk_Height(tkwin), Tk_Depth(tkwin));
-
- hasImageOrBitmap = ((butPtr->image != NULL) || (butPtr->bitmap != None));
- offset = (butPtr->type == TYPE_BUTTON) && hasImageOrBitmap;
-
- border = butPtr->normalBorder;
- if ((butPtr->state == STATE_DISABLED) && (butPtr->disabledFg != NULL)) {
- gc = butPtr->disabledGC;
- } else if ((butPtr->type == TYPE_BUTTON)
- && (butPtr->state == STATE_ACTIVE)) {
- gc = butPtr->activeTextGC;
- border = butPtr->activeBorder;
- } else {
- gc = butPtr->normalTextGC;
- }
-
- if ((butPtr->flags & SELECTED) && (butPtr->state != STATE_ACTIVE)
- && (butPtr->selectBorder != NULL) && !butPtr->indicatorOn) {
- border = butPtr->selectBorder;
- }
-
- /*
- * Override the relief specified for the button if this is a
- * checkbutton or radiobutton and there's no indicator.
- * However, don't do this in the presence of Appearance, since
- * then the bevel button will take care of the relief.
- */
-
- relief = butPtr->relief;
-
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) {
- if (!TkMacHaveAppearance() || !hasImageOrBitmap) {
- if (butPtr->flags & SELECTED) {
- relief = TK_RELIEF_SUNKEN;
- } else if (butPtr->overRelief != relief) {
- relief = butPtr->offRelief;
- }
- }
- }
-
- /*
- * See the comment in UpdateControlColors as to why we use the
- * highlightbackground for the border of Macintosh buttons.
- */
-
- if (butPtr->type == TYPE_BUTTON) {
- 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);
- }
-
- if (butPtr->type == TYPE_LABEL) {
- drawType = DRAW_LABEL;
- } else if (butPtr->type == TYPE_BUTTON) {
- if (!hasImageOrBitmap) {
- drawType = DRAW_CONTROL;
- } else if (butPtr->image != None) {
- drawType = DRAW_BEVEL;
- } else {
- /*
- * TO DO - The current way the we draw bitmaps (XCopyPlane)
- * uses CopyDeepMask in this one case. The Picture recording
- * 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
- * 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;
- } 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;
- }
- }
- }
- } else {
- if (butPtr->indicatorOn) {
- drawType = DRAW_CONTROL;
- } else if (hasImageOrBitmap) {
- if (gc->clip_mask == 0) {
- 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;
- }
- }
- } else {
- drawType = DRAW_CUSTOM;
- }
- }
-
- /*
- * 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())) {
- borderWidth = 0;
-
- /*
- * This part uses Macintosh rather than Tk calls to draw
- * to the screen. Make sure the ports etc. are set correctly.
- */
-
- destPort = TkMacGetDrawablePort(pixmap);
- SetGWorld(destPort, NULL);
- DrawBufferedControl(butPtr, destPort, gc, pixmap);
- }
-
- if ((drawType == DRAW_CUSTOM) || (drawType == DRAW_LABEL)) {
- borderWidth = butPtr->borderWidth;
- }
-
- /*
- * Display image or bitmap or text for button. This has
- * already been done under Appearance with the Bevel
- * button types.
- */
-
- if ((drawType == DRAW_BEVEL) && TkMacHaveAppearance()) {
- /* Empty Body */
- } else {
- if (butPtr->image != None) {
- Tk_SizeOfImage(butPtr->image, &width, &height);
- haveImage = 1;
- } else if (butPtr->bitmap != None) {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
- haveImage = 1;
- }
- imageWidth = width;
- imageHeight = height;
-
- haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0);
- if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) {
- textXOffset = 0;
- textYOffset = 0;
- fullWidth = 0;
- fullHeight = 0;
-
- switch ((enum compound) butPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- /* Image is above or below text */
- if (butPtr->compound == COMPOUND_TOP) {
- textYOffset = height + butPtr->padY;
- } else {
- imageYOffset = butPtr->textHeight + butPtr->padY;
- }
- fullHeight = height + butPtr->textHeight + butPtr->padY;
- fullWidth = (width > butPtr->textWidth ? width :
- butPtr->textWidth);
- textXOffset = (fullWidth - butPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- /* Image is left or right of text */
- if (butPtr->compound == COMPOUND_LEFT) {
- textXOffset = width + butPtr->padX;
- } else {
- imageXOffset = butPtr->textWidth + butPtr->padX;
- }
- fullWidth = butPtr->textWidth + butPtr->padX + width;
- fullHeight = (height > butPtr->textHeight ? height :
- butPtr->textHeight);
- textYOffset = (fullHeight - butPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_CENTER: {
- /* Image and text are superimposed */
- fullWidth = (width > butPtr->textWidth ? width :
- butPtr->textWidth);
- fullHeight = (height > butPtr->textHeight ? height :
- butPtr->textHeight);
- textXOffset = (fullWidth - butPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- textYOffset = (fullHeight - butPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_NONE: {break;}
- }
-
- TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY,
- butPtr->indicatorSpace + fullWidth, fullHeight, &x, &y);
-
- x += butPtr->indicatorSpace;
-
- x += offset;
- y += offset;
- if (relief == TK_RELIEF_RAISED) {
- x -= offset;
- y -= offset;
- } else if (relief == TK_RELIEF_SUNKEN) {
- x += offset;
- y += offset;
- }
- imageXOffset += x;
- imageYOffset += y;
- if (butPtr->image != NULL) {
- if ((butPtr->selectImage != NULL) &&
- (butPtr->flags & SELECTED)) {
- Tk_RedrawImage(butPtr->selectImage, 0, 0,
- width, height, pixmap, imageXOffset, imageYOffset);
- } else {
- Tk_RedrawImage(butPtr->image, 0, 0, width,
- height, pixmap, imageXOffset, imageYOffset);
- }
- } else {
- XSetClipOrigin(butPtr->display, gc,
- imageXOffset, imageYOffset);
- XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc,
- 0, 0, (unsigned int) width, (unsigned int) height,
- imageXOffset, imageYOffset, 1);
- XSetClipOrigin(butPtr->display, gc, 0, 0);
- }
-
- Tk_DrawTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout,
- x + textXOffset, y + textYOffset, 0, -1);
- Tk_UnderlineTextLayout(butPtr->display, pixmap, gc,
- butPtr->textLayout, x + textXOffset, y + textYOffset,
- butPtr->underline);
- y += fullHeight/2;
- } else {
- if (haveImage) {
- TkComputeAnchor(butPtr->anchor, tkwin, 0, 0,
- butPtr->indicatorSpace + width, height, &x, &y);
- x += butPtr->indicatorSpace;
-
- x += offset;
- y += offset;
- if (relief == TK_RELIEF_RAISED) {
- x -= offset;
- y -= offset;
- } else if (relief == TK_RELIEF_SUNKEN) {
- x += offset;
- y += offset;
- }
- imageXOffset += x;
- imageYOffset += y;
- if (butPtr->image != NULL) {
- if ((butPtr->selectImage != NULL) &&
- (butPtr->flags & SELECTED)) {
- Tk_RedrawImage(butPtr->selectImage, 0, 0, width,
- height, pixmap, imageXOffset, imageYOffset);
- } else {
- Tk_RedrawImage(butPtr->image, 0, 0, width, height,
- pixmap, imageXOffset, imageYOffset);
- }
- } else {
- XSetClipOrigin(butPtr->display, gc, x, y);
- XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc,
- 0, 0, (unsigned int) width,
- (unsigned int) height, x, y, 1);
- XSetClipOrigin(butPtr->display, gc, 0, 0);
- }
- y += height/2;
- } else {
- TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX,
- butPtr->padY,
- butPtr->indicatorSpace + butPtr->textWidth,
- butPtr->textHeight, &x, &y);
-
- x += butPtr->indicatorSpace;
-
- Tk_DrawTextLayout(butPtr->display, pixmap, gc,
- butPtr->textLayout, x, y, 0, -1);
- y += butPtr->textHeight/2;
- }
- }
- }
-
- /*
- * If the button is disabled with a stipple rather than a special
- * 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 so the stippling is the right color.
- */
-
- if ((butPtr->state == STATE_DISABLED)
- && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) {
- if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
- && (butPtr->selectBorder != NULL)) {
- XSetForeground(butPtr->display, butPtr->stippleGC,
- Tk_3DBorderColor(butPtr->selectBorder)->pixel);
- }
- /*
- * Stipple the whole button if no disabledFg was specified,
- * otherwise restrict stippling only to displayed image
- */
- if (butPtr->disabledFg == NULL) {
- XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, 0, 0,
- (unsigned) Tk_Width(tkwin), (unsigned) Tk_Height(tkwin));
- } else {
- XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC,
- imageXOffset, imageYOffset,
- (unsigned) imageWidth, (unsigned) imageHeight);
- }
- if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
- && (butPtr->selectBorder != NULL)) {
- XSetForeground(butPtr->display, butPtr->stippleGC,
- Tk_3DBorderColor(butPtr->normalBorder)->pixel);
- }
- }
-
- /*
- * Draw the border and traversal highlight last. This way, if the
- * button's contents overflow they'll be covered up by the border.
- */
-
- if (relief != TK_RELIEF_FLAT) {
- int inset = butPtr->highlightWidth;
- Tk_Draw3DRectangle(tkwin, pixmap, border, inset, inset,
- Tk_Width(tkwin) - 2*inset, Tk_Height(tkwin) - 2*inset,
- butPtr->borderWidth, relief);
- }
-
- /*
- * Copy the information from the off-screen pixmap onto the screen,
- * then delete the pixmap.
- */
-
- XCopyArea(butPtr->display, pixmap, Tk_WindowId(tkwin),
- butPtr->copyGC, 0, 0, (unsigned) Tk_Width(tkwin),
- (unsigned) Tk_Height(tkwin), 0, 0);
- Tk_FreePixmap(butPtr->display, pixmap);
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpComputeButtonGeometry --
- *
- * After changes in a button's text or bitmap, this procedure
- * recomputes the button's geometry and passes this information
- * along to the geometry manager for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The button's window may change size.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpComputeButtonGeometry(
- TkButton *butPtr) /* Button whose geometry may have changed. */
-{
- int width, height, avgWidth, haveImage = 0, haveText = 0;
- int txtWidth, txtHeight;
- Tk_FontMetrics fm;
-
- width = 0;
- height = 0;
- txtWidth = 0;
- txtHeight = 0;
- avgWidth = 0;
-
- /*
- * First figure out the size of the contents of the button.
- */
-
- butPtr->indicatorSpace = 0;
- if (butPtr->image != NULL) {
- Tk_SizeOfImage(butPtr->image, &width, &height);
- haveImage = 1;
- } else if (butPtr->bitmap != None) {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
- haveImage = 1;
- }
-
- if (haveImage == 0 || butPtr->compound != COMPOUND_NONE) {
- Tk_FreeTextLayout(butPtr->textLayout);
- butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont,
- Tcl_GetString(butPtr->textPtr), -1, butPtr->wrapLength,
- butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight);
-
- txtWidth = butPtr->textWidth;
- txtHeight = butPtr->textHeight;
- avgWidth = Tk_TextWidth(butPtr->tkfont, "0", 1);
- Tk_GetFontMetrics(butPtr->tkfont, &fm);
- haveText = (txtWidth != 0 && txtHeight != 0);
- }
-
- /*
- * If the button is compound (ie, it shows both an image and text),
- * the new geometry is a combination of the image and text geometry.
- * We only honor the compound bit if the button has both text and an
- * image, because otherwise it is not really a compound button.
- */
-
- if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) {
- switch ((enum compound) butPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- /* Image is above or below text */
- height += txtHeight + butPtr->padY;
- width = (width > txtWidth ? width : txtWidth);
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- /* Image is left or right of text */
- width += txtWidth + butPtr->padX;
- height = (height > txtHeight ? height : txtHeight);
- break;
- }
- case COMPOUND_CENTER: {
- /* Image and text are superimposed */
- width = (width > txtWidth ? width : txtWidth);
- height = (height > txtHeight ? height : txtHeight);
- break;
- }
- case COMPOUND_NONE: {break;}
- }
- if (butPtr->width > 0) {
- width = butPtr->width;
- }
- if (butPtr->height > 0) {
- height = butPtr->height;
- }
-
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorSpace = height;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter = (65*height)/100;
- } else {
- butPtr->indicatorDiameter = (75*height)/100;
- }
- }
-
- width += 2*butPtr->padX;
- height += 2*butPtr->padY;
-
- } else {
- if (haveImage) {
- if (butPtr->width > 0) {
- width = butPtr->width;
- }
- if (butPtr->height > 0) {
- height = butPtr->height;
- }
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorSpace = height;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter = (65*height)/100;
- } else {
- butPtr->indicatorDiameter = (75*height)/100;
- }
- }
- } else {
- width = txtWidth;
- height = txtHeight;
- if (butPtr->width > 0) {
- width = butPtr->width * avgWidth;
- }
- if (butPtr->height > 0) {
- height = butPtr->height * fm.linespace;
- }
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorDiameter = fm.linespace;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter =
- (80*butPtr->indicatorDiameter)/100;
- }
- butPtr->indicatorSpace = butPtr->indicatorDiameter + avgWidth;
- }
- }
- }
-
- /*
- * Now figure out the size of the border decorations for the button.
- */
-
- if (butPtr->highlightWidth < 0) {
- butPtr->highlightWidth = 0;
- }
-
- /*
- * The width and height calculation for Appearance buttons with images &
- * 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.
- *
- * When issuing the geometry request, add extra space for the indicator,
- * if any, and for the border and padding, plus if this is an image two
- * extra pixels so the display can be offset by 1 pixel in either
- * direction for the raised or lowered effect.
- *
- * 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
- * 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.
- */
-
- if ((butPtr->image == None) && (butPtr->bitmap == None)) {
- width += 2*butPtr->padX;
- height += 2*butPtr->padY;
- }
-
- if ((butPtr->type == TYPE_BUTTON)) {
- 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;
- width += (2 * butPtr->borderWidth + 4);
- height += (2 * butPtr->borderWidth + 4);
- } else {
- 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) {
- 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;
- }
- }
- } else {
- butPtr->inset = butPtr->borderWidth;
- }
-
-
-
- Tk_GeometryRequest(butPtr->tkwin, (int) (width + butPtr->indicatorSpace
- + 2*butPtr->inset), (int) (height + 2*butPtr->inset));
- Tk_SetInternalBorder(butPtr->tkwin, butPtr->inset);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyButton --
- *
- * Free data structures associated with the button control.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Restores the default control state.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyButton(
- TkButton *butPtr)
-{
- /* Do nothing. */
-}
-
-/*
- *--------------------------------------------------------------
- *
- * DrawBufferedControl --
- *
- * This function uses a dummy Macintosh window to allow
- * drawing Mac controls to any GWorld (including off-screen
- * bitmaps). In addition, this code may apply custom
- * colors passed in the TkButton.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Control is to the GWorld. Static state created on
- * first invocation of this routine.
- *
- *--------------------------------------------------------------
- */
-
-static void
-DrawBufferedControl(
- TkButton *butPtr, /* Tk button. */
- GWorldPtr destPort, /* Off screen GWorld. */
- GC gc, /* The GC we are drawing into - needed for
- * the bevel button */
- Pixmap pixmap /* The pixmap we are drawing into - needed
- for the bevel button */
- )
-{
- ControlRef controlHandle;
- CCTabHandle ccTabHandle;
- int windowColorChanged = false;
- RGBColor saveBackColor;
- int isBevel = 0;
-
- if (windowRef == NULL) {
- 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
- * 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.portRect = destPort->portRect;
- RectRgn(((CWindowPeek) windowRef)->port.visRgn, &destPort->portRect);
- RectRgn(((CWindowPeek) windowRef)->strucRgn, &destPort->portRect);
- RectRgn(((CWindowPeek) windowRef)->updateRgn, &destPort->portRect);
- RectRgn(((CWindowPeek) windowRef)->contRgn, &destPort->portRect);
- PortChanged(windowRef);
-
- /*
- * Set up control in hidden window to match what we need
- * 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;
- }
- } else {
- 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;
- }
- } else {
- 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;
- }
- } else {
- controlHandle = checkHandle;
- ccTabHandle = checkTabHandle;
- }
- break;
- }
-
- (**controlHandle).contrlRect.left = butPtr->inset;
- (**controlHandle).contrlRect.top = butPtr->inset;
- (**controlHandle).contrlRect.right = Tk_Width(butPtr->tkwin)
- - butPtr->inset;
- (**controlHandle).contrlRect.bottom = Tk_Height(butPtr->tkwin)
- - butPtr->inset;
-
- /*
- * Setting the control visibility by hand does not
- * seem to work under Appearance.
- */
-
- 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;
- }
-
-
-
- if (butPtr->flags & SELECTED) {
- (**controlHandle).contrlValue = 1;
- } else {
- (**controlHandle).contrlValue = 0;
- }
-
- if (!tkMacAppInFront || butPtr->state == STATE_DISABLED) {
- (**controlHandle).contrlHilite = kControlInactivePart;
- } else if (butPtr->state == STATE_ACTIVE) {
- if (isBevel) {
- (**controlHandle).contrlHilite = kControlButtonPart;
- } else {
- switch (butPtr->type) {
- case TYPE_BUTTON:
- (**controlHandle).contrlHilite = kControlButtonPart;
- break;
- case TYPE_RADIO_BUTTON:
- (**controlHandle).contrlHilite = kControlRadioButtonPart;
- break;
- case TYPE_CHECK_BUTTON:
- (**controlHandle).contrlHilite = kControlCheckBoxPart;
- break;
- }
- }
- } else {
- (**controlHandle).contrlHilite = kControlNoPart;
- }
- /*
- * Before we draw the control we must add the hidden window back to the
- * main window list. Otherwise, radiobuttons and checkbuttons will draw
- * incorrectly. I don't really know why - but clearly the control draw
- * proc needs to have the controls window in the window list. This is not
- * necessary under Appearance, and will have to go when we Carbonize Tk...
- */
- if (!TkMacHaveAppearance()) {
- ((CWindowPeek) windowRef)->nextWindow = (CWindowPeek) LMGetWindowList();
- LMSetWindowList(windowRef);
- }
-
- /*
- * Now we can set the port to our doctered up window. We next need
- * to muck with the colors for the port & window to draw the control
- * with the proper Tk colors. If we need to we also draw a default
- * ring for buttons.
- * Under Appearance, we draw the control directly into destPort, and
- * just set the default control data.
- */
-
- if (TkMacHaveAppearance()) {
- SetPort((GrafPort *) destPort);
- } else {
- SetPort(windowRef);
- }
-
- windowColorChanged = UpdateControlColors(butPtr, controlHandle,
- ccTabHandle, &saveBackColor);
-
- if ((butPtr->type == TYPE_BUTTON) && TkMacHaveAppearance()) {
- Boolean isDefault;
-
- if (butPtr->defaultState == STATE_ACTIVE) {
- isDefault = true;
- } else {
- isDefault = false;
- }
- SetControlData(controlHandle, kControlNoPart,
- kControlPushButtonDefaultTag,
- sizeof(isDefault), (Ptr) &isDefault);
- }
-
- if (TkMacHaveAppearance()) {
- DrawControlInCurrentPort(userPaneHandle);
- } else {
- Draw1Control(controlHandle);
- }
-
- if (!TkMacHaveAppearance() &&
- (butPtr->type == TYPE_BUTTON) &&
- (butPtr->defaultState == STATE_ACTIVE)) {
- Rect box = (**controlHandle).contrlRect;
- RGBColor rgbColor;
-
- TkSetMacColor(butPtr->highlightColorPtr->pixel, &rgbColor);
- RGBForeColor(&rgbColor);
- PenSize(butPtr->highlightWidth - 1, butPtr->highlightWidth - 1);
- InsetRect(&box, -butPtr->highlightWidth, -butPtr->highlightWidth);
- FrameRoundRect(&box, 16, 16);
- }
-
- if (windowColorChanged) {
- RGBColor dummyColor;
- ChangeBackgroundWindowColor(windowRef, saveBackColor, &dummyColor);
- }
-
- /*
- * Clean up: remove the hidden window from the main window list, and
- * hide the control we drew.
- */
-
- if (TkMacHaveAppearance()) {
- SetControlVisibility(controlHandle, false, false);
- if (isBevel) {
- KillPicture(bevelButtonContent.u.picture);
- }
- } else {
- (**controlHandle).contrlVis = 0;
- }
- if (!TkMacHaveAppearance()) {
- LMSetWindowList((WindowRef) ((CWindowPeek) windowRef)->nextWindow);
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * InitSampleControls --
- *
- * This function initializes a dummy Macintosh window and
- * sample controls to allow drawing Mac controls to any GWorld
- * (including off-screen bitmaps).
- *
- * Results:
- * None.
- *
- * Side effects:
- * Controls & a window are created.
- *
- *--------------------------------------------------------------
- */
-
-static void
-InitSampleControls()
-{
- Rect geometry = {0, 0, 10, 10};
- CWindowPeek windowList;
- GWorldPtr frontWin = NULL;
- TkMacWindowList *winListPtr;
-
- /*
- * Create a dummy window that we can draw to. We will
- * actually replace this window's bitmap with the one
- * we want to draw to at a later time. This window and
- * the data structures attached to it are only deallocated
- * on exit of the application.
- */
-
- /*
- * This is a bit of a hack... The problem is that under appearance,
- * taking a window out of the window list causes instability, so we can't
- * do that. OTOH, we need to make sure that this window is NEVER the front
- * window, or we may inadvertently send keystrokes to it...
- * So we put it BEHIND ".", and then we won't ever be able to destroy
- * ALL the windows that are above it.
- */
-
- for (winListPtr = tkMacWindowListPtr; winListPtr != NULL;
- winListPtr = winListPtr->nextPtr) {
- frontWin = ((MacDrawable *) tkMacWindowListPtr->winPtr->privatePtr)->portPtr;
- if (strcmp(tkMacWindowListPtr->winPtr->pathName, ".") == 0) {
- break;
- }
- }
-
- windowRef = NewCWindow(NULL, &geometry, "\pempty", false,
- zoomDocProc, (WindowRef) frontWin, true, 0);
- if (windowRef == NULL) {
- panic("Can't allocate buffer window.");
- }
-
- /*
- * Now add the three standard controls to hidden window. We
- * only create one of each and reuse them for every widget in
- * Tk.
- * Under Appearance, we have to embed the controls in a UserPane
- * control, so that we can color the background text in
- * radiobuttons and checkbuttons.
- */
-
- 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.
- */
-
- err = CreateRootControl(windowRef, &dontCare);
- if (err != noErr) {
- panic("Can't create root control in DrawBufferedControl");
- }
-
- userPaneHandle = NewControl(windowRef, &geometry, "\p",
- true, kControlSupportsEmbedding|kControlHasSpecialBackground,
- 0, 1, kControlUserPaneProc, (SInt32) 0);
- SetUserPaneSetUpSpecialBackgroundProc(userPaneHandle,
- UserPaneBackgroundProc);
- SetUserPaneDrawProc(userPaneHandle, UserPaneDraw);
-
- buttonHandle = NewControl(windowRef, &geometry, "\p",
- false, 1, 0, 1, kControlPushButtonProc, (SInt32) 0);
- EmbedControl(buttonHandle, userPaneHandle);
- 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);
- 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);
-
- picParams.version = -2;
- picParams.hRes = 0x00480000;
- picParams.vRes = 0x00480000;
- picParams.srcRect.top = 0;
- picParams.srcRect.left = 0;
-
- ((CWindowPeek) windowRef)->visible = true;
- } else {
- buttonHandle = NewControl(windowRef, &geometry, "\p",
- false, 1, 0, 1, pushButProc, (SInt32) 0);
- checkHandle = NewControl(windowRef, &geometry, "\p",
- false, 1, 0, 1, checkBoxProc, (SInt32) 0);
- radioHandle = NewControl(windowRef, &geometry, "\p",
- false, 1, 0, 1, radioButProc, (SInt32) 0);
- ((CWindowPeek) windowRef)->visible = true;
-
- buttonTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab));
- checkTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab));
- radioTabHandle = (CCTabHandle) NewHandle(sizeof(CtlCTab));
- }
-
- /*
- * 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.
- * I actually don't see the point of doing this, and it causes Floating
- * Window support to crash under Appearance, so I just leave it out.
- * Note that we have to do without this under Carbon, since you can't
- * go poking at the window list...
- */
-
- if (!TkMacHaveAppearance()) {
- windowList = (CWindowPeek) LMGetWindowList();
- if (windowList == (CWindowPeek) windowRef) {
- LMSetWindowList((WindowRef) windowList->nextWindow);
- } else {
- while ((windowList != NULL)
- && (windowList->nextWindow != (CWindowPeek) windowRef)) {
- windowList = windowList->nextWindow;
- }
- if (windowList != NULL) {
- windowList->nextWindow = windowList->nextWindow->nextWindow;
- }
- }
- ((CWindowPeek) windowRef)->nextWindow = NULL;
- }
-
- /*
- * Create an exit handler to clean up this mess if we our
- * unloaded etc. We need to remember the windows portPixMap
- * so it isn't leaked.
- *
- * 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;
- TkCreateExitHandler(ButtonExitProc, (ClientData) NULL);
- */
-
-}
-
-/*
- *--------------------------------------------------------------
- *
- * SetupBevelButton --
- *
- * Sets up the Bevel Button with image by copying the
- * source image onto the PicHandle for the button.
- *
- * Results:
- * None
- *
- * Side effects:
- * The image or bitmap for the button is copied over to a picture.
- *
- *--------------------------------------------------------------
- */
-void
-SetupBevelButton(
- TkButton *butPtr, /* Tk button. */
- 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 */
- Pixmap pixmap /* The pixmap we are drawing into - needed
- for the bevel button */
- )
-{
- int height, width;
- ControlButtonGraphicAlignment theAlignment;
-
- SetPort((GrafPtr) destPort);
-
- if (butPtr->image != None) {
- Tk_SizeOfImage(butPtr->image,
- &width, &height);
- } else {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap,
- &width, &height);
- }
-
- if ((butPtr->width > 0) && (butPtr->width < width)) {
- width = butPtr->width;
- }
- if ((butPtr->height > 0) && (butPtr->height < height)) {
- height = butPtr->height;
- }
-
- picParams.srcRect.right = width;
- picParams.srcRect.bottom = height;
-
- bevelButtonContent.u.picture = OpenCPicture(&picParams);
-
- /*
- * TO DO - There is one case where XCopyPlane calls CopyDeepMask,
- * which does not get recorded in the picture. So the bitmap code
- * will fail in that case.
- */
-
- if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) {
- 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);
- }
-
- ClosePicture();
-
- SetControlData(controlHandle, kControlButtonPart,
- 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;
- }
-
- SetControlData(controlHandle, kControlButtonPart,
- kControlBevelButtonGraphicAlignTag,
- sizeof(ControlButtonGraphicAlignment),
- (char *) &theAlignment);
-
-}
-
-/*
- *--------------------------------------------------------------
- *
- * SetUserPaneDrawProc --
- *
- * Utility function to add a UserPaneDrawProc
- * to a userPane control. From MoreControls code
- * from Apple DTS.
- *
- * Results:
- * MacOS system error.
- *
- * Side effects:
- * The user pane gets a new UserPaneDrawProc.
- *
- *--------------------------------------------------------------
- */
-pascal OSErr SetUserPaneDrawProc (
- ControlRef control,
- ControlUserPaneDrawProcPtr upp)
-{
- ControlUserPaneDrawUPP myControlUserPaneDrawUPP;
- myControlUserPaneDrawUPP = NewControlUserPaneDrawProc(upp);
- return SetControlData (control,
- kControlNoPart, kControlUserPaneDrawProcTag,
- sizeof(myControlUserPaneDrawUPP),
- (Ptr) &myControlUserPaneDrawUPP);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * SetUserPaneSetUpSpecialBackgroundProc --
- *
- * Utility function to add a UserPaneBackgroundProc
- * to a userPane control
- *
- * Results:
- * MacOS system error.
- *
- * Side effects:
- * The user pane gets a new UserPaneBackgroundProc.
- *
- *--------------------------------------------------------------
- */
-pascal OSErr
-SetUserPaneSetUpSpecialBackgroundProc(
- ControlRef control,
- ControlUserPaneBackgroundProcPtr upp)
-{
- ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP;
- myControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundProc(upp);
- return SetControlData (control, kControlNoPart,
- kControlUserPaneBackgroundProcTag,
- sizeof(myControlUserPaneBackgroundUPP),
- (Ptr) &myControlUserPaneBackgroundUPP);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * UserPaneDraw --
- *
- * This function draws the background of the user pane that will
- * lie under checkboxes and radiobuttons.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The user pane gets updated to the current color.
- *
- *--------------------------------------------------------------
- */
-pascal void
-UserPaneDraw(
- ControlRef control,
- ControlPartCode cpc)
-{
- Rect contrlRect = (**control).contrlRect;
- RGBBackColor (&gUserPaneBackground);
- EraseRect (&contrlRect);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * UserPaneBackgroundProc --
- *
- * This function sets up the background of the user pane that will
- * lie under checkboxes and radiobuttons.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The user pane background gets set to the current color.
- *
- *--------------------------------------------------------------
- */
-
-pascal void
-UserPaneBackgroundProc(
- ControlHandle,
- ControlBackgroundPtr info)
-{
- if (info->colorDevice) {
- RGBBackColor (&gUserPaneBackground);
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * UpdateControlColors --
- *
- * This function will review the colors used to display
- * a Macintosh button. If any non-standard colors are
- * 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.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The Macintosh control may get a custom palette installed.
- *
- *--------------------------------------------------------------
- */
-
-static int
-UpdateControlColors(
- TkButton *butPtr,
- ControlRef controlHandle,
- CCTabHandle ccTabHandle,
- RGBColor *saveColorPtr)
-{
- XColor *xcolor;
-
- /*
- * 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
- * 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
- * button, you usually also color the highlightbackground as well,
- * or you will get a thin grey ring around the button.
- */
-
- if (TkMacHaveAppearance() && (butPtr->type == TYPE_BUTTON)) {
- xcolor = Tk_3DBorderColor(butPtr->highlightBorder);
- } else {
- xcolor = Tk_3DBorderColor(butPtr->normalBorder);
- }
- if (TkMacHaveAppearance()) {
- TkSetMacColor(xcolor->pixel, &gUserPaneBackground);
- } else {
- (**ccTabHandle).ccSeed = 0;
- (**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].rgb);
- (**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))) {
- RGBColor newColor;
-
- if (TkSetMacColor(xcolor->pixel, &newColor)) {
- ChangeBackgroundWindowColor((**controlHandle).contrlOwner,
- newColor, saveColorPtr);
- }
- return true;
- }
- }
-
- return false;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ChangeBackgroundWindowColor --
- *
- * 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
- * the drawing routines for checkboxes and radiobuttons.
- * Any change should be temporary and be reverted after
- * the widget is drawn.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The Window's color table will be adjusted.
- *
- *--------------------------------------------------------------
- */
-
-static void
-ChangeBackgroundWindowColor(
- WindowRef macintoshWindow, /* A Mac window whose color to change. */
- RGBColor rgbColor, /* The new RGB Color for the background. */
- RGBColor *oldColor) /* The old color of the background. */
-{
- AuxWinHandle auxWinHandle;
- WCTabHandle winCTabHandle;
- short ctIndex;
- ColorSpecPtr rgbScan;
-
- GetAuxWin(macintoshWindow, &auxWinHandle);
- winCTabHandle = (WCTabHandle) ((**auxWinHandle).awCTable);
-
- /*
- * Scan through the color table until we find the content
- * (background) color for the window. Don't tell the system
- * about the change - it will generate damage and we will get
- * into an infinite loop.
- */
-
- ctIndex = (**winCTabHandle).ctSize;
- while (ctIndex > -1) {
- rgbScan = ctIndex + (**winCTabHandle).ctTable;
-
- if (rgbScan->value == wContentColor) {
- *oldColor = rgbScan->rgb;
- rgbScan->rgb = rgbColor;
- break;
- }
- ctIndex--;
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ButtonEventProc --
- *
- * This procedure is invoked by the Tk dispatcher for various
- * events on buttons.
- *
- * Results:
- * None.
- *
- * Side effects:
- * When it gets exposed, it is redisplayed.
- *
- *--------------------------------------------------------------
- */
-
-static void
-ButtonEventProc(
- ClientData clientData, /* Information about window. */
- XEvent *eventPtr) /* Information about event. */
-{
- TkButton *buttonPtr = (TkButton *) clientData;
-
- if (eventPtr->type == ActivateNotify
- || eventPtr->type == DeactivateNotify) {
- if ((buttonPtr->tkwin == NULL) || (!Tk_IsMapped(buttonPtr->tkwin))) {
- return;
- }
- if ((buttonPtr->flags & REDRAW_PENDING) == 0) {
- Tcl_DoWhenIdle(TkpDisplayButton, (ClientData) buttonPtr);
- buttonPtr->flags |= REDRAW_PENDING;
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ButtonExitProc --
- *
- * This procedure is invoked just before the application exits.
- * It frees all of the control handles, our dummy window, etc.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Memory is freed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ButtonExitProc(clientData)
- ClientData clientData; /* Not used. */
-{
- Rect pixRect = {0, 0, 10, 10};
- Rect rgnRect = {0, 0, 0, 0};
-
- /*
- * Restore our dummy window to it's origional state by putting it
- * back in the window list and restoring it's bits. The destroy
- * the controls and window.
- */
-
- ((CWindowPeek) windowRef)->nextWindow = (CWindowPeek) LMGetWindowList();
- LMSetWindowList(windowRef);
- ((CWindowPeek) windowRef)->port.portPixMap = oldPixPtr;
- ((CWindowPeek) windowRef)->port.portRect = pixRect;
- RectRgn(((CWindowPeek) windowRef)->port.visRgn, &rgnRect);
- RectRgn(((CWindowPeek) windowRef)->strucRgn, &rgnRect);
- RectRgn(((CWindowPeek) windowRef)->updateRgn, &rgnRect);
- RectRgn(((CWindowPeek) windowRef)->contRgn, &rgnRect);
- PortChanged(windowRef);
-
- DisposeControl(buttonHandle);
- DisposeControl(checkHandle);
- DisposeControl(radioHandle);
- DisposeWindow(windowRef);
- windowRef = NULL;
-}
diff --git a/mac/tkMacClipboard.c b/mac/tkMacClipboard.c
deleted file mode 100644
index c25dc69..0000000
--- a/mac/tkMacClipboard.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * tkMacClipboard.c --
- *
- * This file manages the clipboard for the Tk toolkit.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include "tkPort.h"
-#include "tkMacInt.h"
-
-#include <Scrap.h>
-#include <Events.h>
-
-#include "tkSelect.h"
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSelGetSelection --
- *
- * Retrieve the specified selection from another process. For
- * now, only fetching XA_STRING from CLIPBOARD is supported.
- * Eventually other types should be allowed.
- *
- * 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 the interp's result.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkSelGetSelection(
- Tcl_Interp *interp, /* Interpreter to use for reporting
- * errors. */
- Tk_Window tkwin, /* Window on whose behalf to retrieve
- * the selection (determines display
- * from which to retrieve). */
- Atom selection, /* Selection to retrieve. */
- Atom target, /* Desired form in which selection
- * is to be returned. */
- Tk_GetSelProc *proc, /* Procedure to call to process the
- * selection, once it has been retrieved. */
- ClientData clientData) /* Arbitrary value to pass to proc. */
-{
- int result;
- long length, offset = 0;
- Handle handle;
-
- if ((selection == Tk_InternAtom(tkwin, "CLIPBOARD"))
- && (target == XA_STRING)) {
- /*
- * Get the scrap from the Macintosh global clipboard.
- */
- handle = NewHandle(1);
- length = GetScrap(handle, 'TEXT', &offset);
- if (length > 0) {
- Tcl_DString encodedText;
-
- SetHandleSize(handle, (Size) length + 1);
- HLock(handle);
- (*handle)[length] = '\0';
-
- Tcl_ExternalToUtfDString(NULL, *handle, length, &encodedText);
- result = (*proc)(clientData, interp,
- Tcl_DStringValue(&encodedText));
- Tcl_DStringFree(&encodedText);
-
- HUnlock(handle);
- DisposeHandle(handle);
- return result;
- }
-
- DisposeHandle(handle);
- }
-
- Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
- " selection doesn't exist or form \"", Tk_GetAtomName(tkwin, target),
- "\" not defined", (char *) NULL);
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSetSelectionOwner --
- *
- * This function claims ownership of the specified selection.
- * If the selection is CLIPBOARD, then we empty the system
- * clipboard.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-XSetSelectionOwner(
- Display* display, /* X Display. */
- Atom selection, /* What selection to own. */
- Window owner, /* Window to be the owner. */
- Time time) /* The current time? */
-{
- Tk_Window tkwin;
- TkDisplay *dispPtr;
-
- /*
- * This is a gross hack because the Tk_InternAtom interface is broken.
- * It expects a Tk_Window, even though it only needs a Tk_Display.
- */
-
- tkwin = (Tk_Window) TkGetMainInfoList()->winPtr;
-
- if (selection == Tk_InternAtom(tkwin, "CLIPBOARD")) {
-
- /*
- * Only claim and empty the clipboard if we aren't already the
- * owner of the clipboard.
- */
-
- dispPtr = TkGetMainInfoList()->winPtr->dispPtr;
- if (!dispPtr->clipboardActive) {
- ZeroScrap();
- }
- }
- return Success;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSelUpdateClipboard --
- *
- * This function is called to force the clipboard to be updated
- * after new data is added. On the Mac we don't need to do
- * anything.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkSelUpdateClipboard(
- TkWindow *winPtr, /* Window associated with clipboard. */
- TkClipboardTarget *targetPtr) /* Info about the content. */
-{
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkSelEventProc --
- *
- * This procedure is invoked whenever a selection-related
- * event occurs.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Lots: depends on the type of event.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkSelEventProc(
- Tk_Window tkwin, /* Window for which event was
- * targeted. */
- register XEvent *eventPtr) /* X event: either SelectionClear,
- * SelectionRequest, or
- * SelectionNotify. */
-{
- if (eventPtr->type == SelectionClear) {
- TkSelClearSelection(tkwin, eventPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSelPropProc --
- *
- * This procedure is invoked when property-change events
- * occur on windows not known to the toolkit. This is a stub
- * function under Windows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkSelPropProc(
- register XEvent *eventPtr) /* X PropertyChange event. */
-{
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSuspendClipboard --
- *
- * Handle clipboard conversion as required by the suppend event.
- * This function is also called on exit.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The local scrap is moved to the global scrap.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkSuspendClipboard()
-{
- TkClipboardTarget *targetPtr;
- TkClipboardBuffer *cbPtr;
- TkDisplay *dispPtr;
- char *buffer, *p, *endPtr, *buffPtr;
- long length;
-
- dispPtr = TkGetDisplayList();
- if ((dispPtr == NULL) || !dispPtr->clipboardActive) {
- return;
- }
-
- for (targetPtr = dispPtr->clipTargetPtr; targetPtr != NULL;
- targetPtr = targetPtr->nextPtr) {
- if (targetPtr->type == XA_STRING)
- break;
- }
- if (targetPtr != NULL) {
- Tcl_DString encodedText;
-
- length = 0;
- for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
- cbPtr = cbPtr->nextPtr) {
- length += cbPtr->length;
- }
-
- buffer = ckalloc(length);
- buffPtr = buffer;
- for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
- cbPtr = cbPtr->nextPtr) {
- for (p = cbPtr->buffer, endPtr = p + cbPtr->length;
- p < endPtr; p++) {
- if (*p == '\n') {
- *buffPtr++ = '\r';
- } else {
- *buffPtr++ = *p;
- }
- }
- }
-
- ZeroScrap();
- Tcl_UtfToExternalDString(NULL, buffer, length, &encodedText);
- PutScrap(Tcl_DStringLength(&encodedText), 'TEXT',
- Tcl_DStringValue(&encodedText));
- Tcl_DStringFree(&encodedText);
- ckfree(buffer);
- }
-
- /*
- * The system now owns the scrap. We tell Tk that it has
- * lost the selection so that it will look for it the next time
- * it needs it. (Window list NULL if quiting.)
- */
-
- if (TkGetMainInfoList() != NULL) {
- Tk_ClearSelection((Tk_Window) TkGetMainInfoList()->winPtr,
- Tk_InternAtom((Tk_Window) TkGetMainInfoList()->winPtr,
- "CLIPBOARD"));
- }
-
- return;
-}
diff --git a/mac/tkMacColor.c b/mac/tkMacColor.c
deleted file mode 100644
index dad7396..0000000
--- a/mac/tkMacColor.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * tkMacColor.c --
- *
- * This file maintains a database of color values for the Tk
- * toolkit, in order to avoid round-trips to the server to
- * map color names to pixel values.
- *
- * Copyright (c) 1990-1994 The Regents of the University of California.
- * Copyright (c) 1994-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include <tkColor.h>
-#include "tkMacInt.h"
-
-#include <LowMem.h>
-#include <Palettes.h>
-#include <Quickdraw.h>
-
-/*
- * Default Auxillary Control Record for all controls. This is cached once
- * and is updated by the system. We use this to get the default system
- * colors used by controls.
- */
-static AuxCtlHandle defaultAuxCtlHandle = NULL;
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static int GetControlPartColor _ANSI_ARGS_((short part, RGBColor *macColor));
-static int GetMenuPartColor _ANSI_ARGS_((int part, RGBColor *macColor));
-static int GetWindowPartColor _ANSI_ARGS_((short part, RGBColor *macColor));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSetMacColor --
- *
- * Populates a Macintosh RGBColor structure from a X style
- * pixel value.
- *
- * Results:
- * Returns false if not a real pixel, true otherwise.
- *
- * Side effects:
- * The variable macColor is updated to the pixels value.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkSetMacColor(
- unsigned long pixel, /* Pixel value to convert. */
- RGBColor *macColor) /* Mac color struct to modify. */
-{
- switch (pixel >> 24) {
- case HIGHLIGHT_PIXEL:
- LMGetHiliteRGB(macColor);
- return true;
- case HIGHLIGHT_TEXT_PIXEL:
- LMGetHiliteRGB(macColor);
- if ((macColor->red == 0) && (macColor->green == 0)
- && (macColor->blue == 0)) {
- macColor->red = macColor->green = macColor->blue = 0xFFFFFFFF;
- } else {
- macColor->red = macColor->green = macColor->blue = 0;
- }
- return true;
- case CONTROL_TEXT_PIXEL:
- GetControlPartColor(cTextColor, macColor);
- return true;
- case CONTROL_BODY_PIXEL:
- GetControlPartColor(cBodyColor, macColor);
- return true;
- case CONTROL_FRAME_PIXEL:
- GetControlPartColor(cFrameColor, macColor);
- return true;
- case WINDOW_BODY_PIXEL:
- GetWindowPartColor(wContentColor, macColor);
- return true;
- case MENU_ACTIVE_PIXEL:
- case MENU_ACTIVE_TEXT_PIXEL:
- case MENU_BACKGROUND_PIXEL:
- case MENU_DISABLED_PIXEL:
- case MENU_TEXT_PIXEL:
- return GetMenuPartColor((pixel >> 24), macColor);
- case APPEARANCE_PIXEL:
- return false;
- case PIXEL_MAGIC:
- default:
- macColor->blue = (unsigned short) ((pixel & 0xFF) << 8);
- macColor->green = (unsigned short) (((pixel >> 8) & 0xFF) << 8);
- macColor->red = (unsigned short) (((pixel >> 16) & 0xFF) << 8);
- return true;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Stub functions --
- *
- * These functions are just stubs for functions that either
- * don't make sense on the Mac or have yet to be implemented.
- *
- * Results:
- * None.
- *
- * Side effects:
- * These calls do nothing - which may not be expected.
- *
- *----------------------------------------------------------------------
- */
-
-Status
-XAllocColor(
- Display *display, /* Display. */
- Colormap map, /* Not used. */
- XColor *colorPtr) /* XColor struct to modify. */
-{
- display->request++;
- colorPtr->pixel = TkpGetPixel(colorPtr);
- return 1;
-}
-
-Colormap
-XCreateColormap(
- Display *display, /* Display. */
- Window window, /* X window. */
- Visual *visual, /* Not used. */
- int alloc) /* Not used. */
-{
- static Colormap index = 1;
-
- /*
- * Just return a new value each time.
- */
- return index++;
-}
-
-int
-XFreeColormap(
- Display* display, /* Display. */
- Colormap colormap) /* Colormap. */
-{
- return Success;
-}
-
-int
-XFreeColors(
- Display* display, /* Display. */
- Colormap colormap, /* Colormap. */
- unsigned long* pixels, /* Array of pixels. */
- int npixels, /* Number of pixels. */
- unsigned long planes) /* Number of pixel planes. */
-{
- /*
- * The Macintosh version of Tk uses TrueColor. Nothing
- * needs to be done to release colors as there really is
- * no colormap in the Tk sense.
- */
- return Success;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetColor --
- *
- * Allocate a new TkColor for the color with the given name.
- *
- * Results:
- * Returns a newly allocated TkColor, or NULL on failure.
- *
- * Side effects:
- * May invalidate the colormap cache associated with tkwin upon
- * allocating a new colormap entry. Allocates a new TkColor
- * structure.
- *
- *----------------------------------------------------------------------
- */
-
-TkColor *
-TkpGetColor(
- Tk_Window tkwin, /* Window in which color will be used. */
- Tk_Uid name) /* Name of color to allocated (in form
- * suitable for passing to XParseColor). */
-{
- Display *display = Tk_Display(tkwin);
- Colormap colormap = Tk_Colormap(tkwin);
- TkColor *tkColPtr;
- XColor color;
-
- /*
- * Check to see if this is a system color. Otherwise, XParseColor
- * will do all the work.
- */
- if (strncasecmp(name, "system", 6) == 0) {
- int foundSystemColor = false;
- RGBColor rgbValue;
- char pixelCode;
-
- if (!strcasecmp(name+6, "Highlight")) {
- LMGetHiliteRGB(&rgbValue);
- pixelCode = HIGHLIGHT_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "HighlightText")) {
- LMGetHiliteRGB(&rgbValue);
- if ((rgbValue.red == 0) && (rgbValue.green == 0)
- && (rgbValue.blue == 0)) {
- rgbValue.red = rgbValue.green = rgbValue.blue = 0xFFFFFFFF;
- } else {
- rgbValue.red = rgbValue.green = rgbValue.blue = 0;
- }
- pixelCode = HIGHLIGHT_TEXT_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "ButtonText")) {
- GetControlPartColor(cTextColor, &rgbValue);
- pixelCode = CONTROL_TEXT_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "ButtonFace")) {
- GetControlPartColor(cBodyColor, &rgbValue);
- pixelCode = CONTROL_BODY_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "ButtonFrame")) {
- GetControlPartColor(cFrameColor, &rgbValue);
- pixelCode = CONTROL_FRAME_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "WindowBody")) {
- GetWindowPartColor(wContentColor, &rgbValue);
- pixelCode = WINDOW_BODY_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "MenuActive")) {
- GetMenuPartColor(MENU_ACTIVE_PIXEL, &rgbValue);
- pixelCode = MENU_ACTIVE_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "MenuActiveText")) {
- GetMenuPartColor(MENU_ACTIVE_TEXT_PIXEL, &rgbValue);
- pixelCode = MENU_ACTIVE_TEXT_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "Menu")) {
- GetMenuPartColor(MENU_BACKGROUND_PIXEL, &rgbValue);
- pixelCode = MENU_BACKGROUND_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "MenuDisabled")) {
- GetMenuPartColor(MENU_DISABLED_PIXEL, &rgbValue);
- pixelCode = MENU_DISABLED_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "MenuText")) {
- GetMenuPartColor(MENU_TEXT_PIXEL, &rgbValue);
- pixelCode = MENU_TEXT_PIXEL;
- foundSystemColor = true;
- } else if (!strcasecmp(name+6, "AppearanceColor")) {
- color.red = 0;
- color.green = 0;
- color.blue = 0;
- pixelCode = APPEARANCE_PIXEL;
- foundSystemColor = true;
- }
-
- if (foundSystemColor) {
- color.red = rgbValue.red;
- color.green = rgbValue.green;
- color.blue = rgbValue.blue;
- color.pixel = ((((((pixelCode << 8)
- | ((color.red >> 8) & 0xff)) << 8)
- | ((color.green >> 8) & 0xff)) << 8)
- | ((color.blue >> 8) & 0xff));
-
- tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
- tkColPtr->color = color;
- return tkColPtr;
- }
- }
-
- if (TkParseColor(display, colormap, name, &color) == 0) {
- return (TkColor *) NULL;
- }
-
- tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
- tkColPtr->color = color;
-
- return tkColPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetColorByValue --
- *
- * Given a desired set of red-green-blue intensities for a color,
- * locate a pixel value to use to draw that color in a given
- * window.
- *
- * Results:
- * The return value is a pointer to an TkColor structure that
- * indicates the closest red, blue, and green intensities available
- * to those specified in colorPtr, and also specifies a pixel
- * value to use to draw in that color.
- *
- * Side effects:
- * May invalidate the colormap cache for the specified window.
- * Allocates a new TkColor structure.
- *
- *----------------------------------------------------------------------
- */
-
-TkColor *
-TkpGetColorByValue(
- Tk_Window tkwin, /* Window in which color will be used. */
- XColor *colorPtr) /* Red, green, and blue fields indicate
- * desired color. */
-{
- TkColor *tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
-
- tkColPtr->color.red = colorPtr->red;
- tkColPtr->color.green = colorPtr->green;
- tkColPtr->color.blue = colorPtr->blue;
- tkColPtr->color.pixel = TkpGetPixel(&tkColPtr->color);
- return tkColPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetControlPartColor --
- *
- * Given a part number this function will return the standard
- * system default color for that part. It does this by looking
- * in the system's 'cctb' resource.
- *
- * Results:
- * True if a color is found, false otherwise.
- *
- * Side effects:
- * If a color is found then the RGB variable will be changed to
- * the parts color.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GetControlPartColor(
- short part, /* Part code. */
- RGBColor *macColor) /* Pointer to Mac color. */
-{
- short index;
- CCTabHandle ccTab;
-
- if (defaultAuxCtlHandle == NULL) {
- GetAuxiliaryControlRecord(NULL, &defaultAuxCtlHandle);
- }
- ccTab = (**defaultAuxCtlHandle).acCTable;
- if(ccTab && (ResError() == noErr)) {
- for(index = 0; index <= (**ccTab).ctSize; index++) {
- if((**ccTab).ctTable[index].value == part) {
- *macColor = (**ccTab).ctTable[index].rgb;
- return true;
- }
- }
- }
- return false;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetWindowPartColor --
- *
- * Given a part number this function will return the standard
- * system default color for that part. It does this by looking
- * in the system's 'wctb' resource.
- *
- * Results:
- * True if a color is found, false otherwise.
- *
- * Side effects:
- * If a color is found then the RGB variable will be changed to
- * the parts color.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GetWindowPartColor(
- short part, /* Part code. */
- RGBColor *macColor) /* Pointer to Mac color. */
-{
- short index;
- WCTabHandle wcTab;
-
- wcTab = (WCTabHandle) GetResource('wctb', 0);
- if(wcTab && (ResError() == noErr)) {
- for(index = 0; index <= (**wcTab).ctSize; index++) {
- if((**wcTab).ctTable[index].value == part) {
- *macColor = (**wcTab).ctTable[index].rgb;
- return true;
- }
- }
- }
- return false;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetMenuPartColor --
- *
- * Given a magic pixel value, returns the RGB color associated
- * with it by looking the value up in the system's 'mctb' resource.
- *
- * Results:
- * True if a color is found, false otherwise.
- *
- * Side effects:
- * If a color is found then the RGB variable will be changed to
- * the parts color.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GetMenuPartColor(
- int pixel, /* The magic pixel value */
- RGBColor *macColor) /* Pointer to Mac color */
-{
- RGBColor backColor, foreColor;
- GDHandle maxDevice;
- Rect globalRect;
- MCEntryPtr mcEntryPtr;
-
- /* 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 {
-
- /*
- * 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;
-}
-}
diff --git a/mac/tkMacConfig.c b/mac/tkMacConfig.c
deleted file mode 100644
index 30d9386..0000000
--- a/mac/tkMacConfig.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.
- */
-
-#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. */
- CONST char *dbName, /* The option database name. */
- CONST char *className) /* The name of the option class. */
-{
- return NULL;
-}
diff --git a/mac/tkMacCursor.c b/mac/tkMacCursor.c
deleted file mode 100644
index 2a255e0..0000000
--- a/mac/tkMacCursor.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * tkMacCursor.c --
- *
- * This file contains Macintosh specific cursor related routines.
- *
- * 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.
- */
-
-#include "tkPort.h"
-#include "tkInt.h"
-#include "tkMacInt.h"
-
-#include <Resources.h>
-#include <ToolUtils.h>
-#include <Strings.h>
-
-/*
- * There are three different ways to set the cursor on the Mac.
- */
-#define ARROW 0 /* The arrow cursor. */
-#define COLOR 1 /* Cursors of type crsr. */
-#define NORMAL 2 /* Cursors of type CURS. */
-
-/*
- * The following data structure contains the system specific data
- * necessary to control Windows cursors.
- */
-
-typedef struct {
- TkCursor info; /* Generic cursor info used by tkCursor.c */
- Handle macCursor; /* Resource containing Macintosh cursor. */
- int type; /* Type of Mac cursor: arrow, crsr, CURS */
-} TkMacCursor;
-
-/*
- * The table below is used to map from the name of a predefined cursor
- * to its resource identifier.
- */
-
-static struct CursorName {
- char *name;
- int id;
-} cursorNames[] = {
- {"ibeam", 1},
- {"text", 1},
- {"xterm", 1},
- {"cross", 2},
- {"crosshair", 2},
- {"cross-hair", 2},
- {"plus", 3},
- {"watch", 4},
- {"arrow", 5},
- {NULL, 0}
-};
-
-/*
- * Declarations of static variables used in this file.
- */
-
-static TkMacCursor * gCurrentCursor = NULL; /* A pointer to the current
- * cursor. */
-static int gResizeOverride = false; /* A boolean indicating whether
- * we should use the resize
- * cursor during installations. */
-static int gTkOwnsCursor = true; /* A boolean indicating whether
- Tk owns the cursor. If not (for
- instance, in the case where a Tk
- window is embedded in another app's
- window, and the cursor is out of
- the tk window, we will not attempt
- to adjust the cursor */
-
-/*
- * Declarations of procedures local to this file
- */
-
-static void FindCursorByName _ANSI_ARGS_ ((TkMacCursor *macCursorPtr,
- CONST char *string));
-
-/*
- *----------------------------------------------------------------------
- *
- * FindCursorByName --
- *
- * Retrieve a system cursor by name, and fill the macCursorPtr
- * structure. If the cursor cannot be found, the macCursor field
- * will be NULL. The function first attempts to load a color
- * cursor. If that fails it will attempt to load a black & white
- * cursor.
- *
- * Results:
- * Fills the macCursorPtr record.
- *
- * Side effects:
- * None
- *
- *----------------------------------------------------------------------
- */
-
-void
-FindCursorByName(
- TkMacCursor *macCursorPtr,
- CONST char *string)
-{
- Handle resource;
- Str255 curName;
- int destWrote, inCurLen;
-
- inCurLen = strlen(string);
- if (inCurLen > 255) {
- return;
- }
-
- /*
- * 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) {
- short id;
- Str255 theName;
- ResType theType;
-
- HLock(resource);
- GetResInfo(resource, &id, &theType, theName);
- HUnlock(resource);
- macCursorPtr->macCursor = (Handle) GetCCursor(id);
- macCursorPtr->type = COLOR;
- }
-
- if (resource == NULL) {
- macCursorPtr->macCursor = GetNamedResource('CURS', curName);
- macCursorPtr->type = NORMAL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetCursorByName --
- *
- * Retrieve a system cursor by name.
- *
- * Results:
- * Returns a new cursor, or NULL on errors.
- *
- * Side effects:
- * Allocates a new cursor.
- *
- *----------------------------------------------------------------------
- */
-
-TkCursor *
-TkGetCursorByName(
- Tcl_Interp *interp, /* Interpreter to use for error reporting. */
- Tk_Window tkwin, /* Window in which cursor will be used. */
- Tk_Uid string) /* Description of cursor. See manual entry
- * for details on legal syntax. */
-{
- struct CursorName *namePtr;
- TkMacCursor *macCursorPtr;
-
- macCursorPtr = (TkMacCursor *) ckalloc(sizeof(TkMacCursor));
- macCursorPtr->info.cursor = (Tk_Cursor) macCursorPtr;
-
- /*
- * To find a cursor we must first determine if it is one of the
- * builtin cursors or the standard arrow cursor. Otherwise, we
- * attempt to load the cursor as a named Mac resource.
- */
-
- for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) {
- if (strcmp(namePtr->name, string) == 0) {
- break;
- }
- }
-
-
- if (namePtr->name != NULL) {
- if (namePtr->id == 5) {
- macCursorPtr->macCursor = (Handle) -1;
- macCursorPtr->type = ARROW;
- } else {
- macCursorPtr->macCursor = (Handle) GetCursor(namePtr->id);
- macCursorPtr->type = NORMAL;
- }
- } else {
- FindCursorByName(macCursorPtr, string);
-
- if (macCursorPtr->macCursor == NULL) {
- CONST char **argv;
- int argc, err;
-
- /*
- * The user may be trying to specify an XCursor with fore
- * & back colors. We don't want this to be an error, so pick
- * off the first word, and try again.
- */
-
- err = Tcl_SplitList(interp, string, &argc, &argv);
- if (err == TCL_OK ) {
- if (argc > 1) {
- FindCursorByName(macCursorPtr, argv[0]);
- }
-
- ckfree((char *) argv);
- }
- }
- }
-
- if (macCursorPtr->macCursor == NULL) {
- ckfree((char *)macCursorPtr);
- Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"",
- (char *) NULL);
- return NULL;
- } else {
- return (TkCursor *) macCursorPtr;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkCreateCursorFromData --
- *
- * Creates a cursor from the source and mask bits.
- *
- * Results:
- * Returns a new cursor, or NULL on errors.
- *
- * Side effects:
- * Allocates a new cursor.
- *
- *----------------------------------------------------------------------
- */
-
-TkCursor *
-TkCreateCursorFromData(
- Tk_Window tkwin, /* Window in which cursor will be used. */
- CONST char *source, /* Bitmap data for cursor shape. */
- CONST char *mask, /* Bitmap data for cursor mask. */
- int width, int height, /* Dimensions of cursor. */
- int xHot, int yHot, /* Location of hot-spot in cursor. */
- XColor fgColor, /* Foreground color for cursor. */
- XColor bgColor) /* Background color for cursor. */
-{
- return NULL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpFreeCursor --
- *
- * This procedure is called to release a cursor allocated by
- * TkGetCursorByName.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The cursor data structure is deallocated.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpFreeCursor(
- TkCursor *cursorPtr)
-{
- TkMacCursor *macCursorPtr = (TkMacCursor *) cursorPtr;
-
- switch (macCursorPtr->type) {
- case COLOR:
- DisposeCCursor((CCrsrHandle) macCursorPtr->macCursor);
- break;
- case NORMAL:
- ReleaseResource(macCursorPtr->macCursor);
- break;
- }
-
- if (macCursorPtr == gCurrentCursor) {
- gCurrentCursor = NULL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacInstallCursor --
- *
- * Installs either the current cursor as defined by TkpSetCursor
- * or a resize cursor as the cursor the Macintosh should currently
- * display.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the Macintosh mouse cursor.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacInstallCursor(
- int resizeOverride)
-{
- TkMacCursor *macCursorPtr = gCurrentCursor;
- CCrsrHandle ccursor;
- CursHandle cursor;
-
- gResizeOverride = resizeOverride;
-
- if (resizeOverride) {
- cursor = (CursHandle) GetNamedResource('CURS', "\presize");
- SetCursor(*cursor);
- } else if (macCursorPtr == NULL || macCursorPtr->type == ARROW) {
- SetCursor(&tcl_macQdPtr->arrow);
- } else {
- switch (macCursorPtr->type) {
- case COLOR:
- ccursor = (CCrsrHandle) macCursorPtr->macCursor;
- SetCCursor(ccursor);
- break;
- case NORMAL:
- cursor = (CursHandle) macCursorPtr->macCursor;
- SetCursor(*cursor);
- break;
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpSetCursor --
- *
- * Set the current cursor and install it.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the current cursor.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpSetCursor(
- TkpCursor cursor)
-{
- if (!gTkOwnsCursor) {
- return;
- }
- if (cursor == None) {
- gCurrentCursor = NULL;
- } else {
- gCurrentCursor = (TkMacCursor *) cursor;
- }
-
- if (tkMacAppInFront) {
- TkMacInstallCursor(gResizeOverride);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_MacTkOwnsCursor --
- *
- * Sets whether Tk has the right to adjust the cursor.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May keep Tk from changing the cursor.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_MacTkOwnsCursor(
- int tkOwnsIt)
-{
- gTkOwnsCursor = tkOwnsIt;
-}
diff --git a/mac/tkMacCursors.r b/mac/tkMacCursors.r
deleted file mode 100644
index 0d2ad29..0000000
--- a/mac/tkMacCursors.r
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * tkMacCursors.r --
- *
- * This file defines a set of Macintosh cursor resources that
- * are only available on the Macintosh platform.
- *
- * Copyright (c) 1995-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-/*
- * These are resource definitions for Macintosh cursors.
- * The are identified and loaded by the "name" of the
- * cursor. However, the ids must be unique.
- */
-
-data 'CURS' (1000, "hand") {
- $"0180 1A70 2648 264A 124D 1249 6809 9801"
- $"8802 4002 2002 2004 1004 0808 0408 0408"
- $"0180 1BF0 3FF8 3FFA 1FFF 1FFF 6FFF FFFF"
- $"FFFE 7FFE 3FFE 3FFC 1FFC 0FF8 07F8 07F8"
- $"0009 0008"
-};
-
-data 'CURS' (1002, "bucket") {
- $"0000 0000 0600 0980 0940 0B30 0D18 090C"
- $"129C 212C 104C 088C 050C 0208 0000 0000"
- $"0000 0000 0600 0980 09C0 0BF0 0FF8 0FFC"
- $"1FFC 3FEC 1FCC 0F8C 070C 0208 0000 0000"
- $"000D 000C"
-};
-
-data 'CURS' (1003, "cancel") {
- $"0000 0000 0000 0000 3180 4A40 4A40 3F80"
- $"0A00 3F80 4A40 4A46 3186 0000 0000 0000"
- $"0000 0000 0000 3180 7BC0 FFE0 FFE0 7FC0"
- $"3F80 7FC0 FFE6 FFEF 7BCF 3186 0000 0000"
- $"0008 0005"
-};
-
-data 'CURS' (1004, "Resize") {
- $"FFFF 8001 BF01 A181 A1F9 A18D A18D BF8D"
- $"9F8D 880D 880D 880D 8FFD 87FD 8001 FFFF"
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
- $"0008 0008"
-};
-
-data 'CURS' (1005, "eyedrop") {
- $"000E 001F 001F 00FF 007E 00B8 0118 0228"
- $"0440 0880 1100 2200 4400 4800 B000 4000"
- $"000E 001F 001F 00FF 007E 00F8 01F8 03E8"
- $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000"
- $"000F 0000"
-};
-
-data 'CURS' (1006, "eyedrop-full") {
- $"000E 001F 001F 00FF 007E 00B8 0118 0328"
- $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000"
- $"000E 001F 001F 00FF 007E 00F8 01F8 03E8"
- $"07C0 0F80 1F00 3E00 7C00 7800 F000 4000"
- $"000F 0000"
-};
-
-data 'CURS' (1007, "zoom-in") {
- $"0780 1860 2790 5868 5028 A014 AFD4 AFD4"
- $"A014 5028 5868 2798 187C 078E 0007 0003"
- $"0780 1FE0 3FF0 7878 7038 E01C EFDC EFDC"
- $"E01C 7038 7878 3FF8 1FFC 078E 0007 0003"
- $"0007 0007"
-};
-
-data 'CURS' (1008, "zoom-out") {
- $"0780 1860 2790 5868 5328 A314 AFD4 AFD4"
- $"A314 5328 5868 2798 187C 078E 0007 0003"
- $"0780 1FE0 3FF0 7878 7338 E31C EFDC EFDC"
- $"E31C 7338 7878 3FF8 1FFC 078E 0007 0003"
- $"0007 0007"
-};
-
-/*
- * The following are resource definitions for color
- * cursors on the Macintosh. If a color cursor and
- * a black & white cursor are both defined with the
- * same name preference will be given to the color
- * cursors.
- */
-
-data 'crsr' (1000, "hand") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0180 1A70 2648 264A 124D 1249"
- $"6809 9801 8802 4002 2002 2004 1004 0808"
- $"0408 0408 0180 1BF0 3FF8 3FFA 1FFF 1FFF"
- $"6FFF FFFF FFFE 7FFE 3FFE 3FFC 1FFC 0FF8"
- $"07F8 07F8 0008 0008 0000 0000 0000 0000"
- $"0000 0000 8004 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0002 0001 0002 0000 0000 0000 00D2 0000"
- $"0000 0003 C000 03CD 7F00 0D7D 75C0 0D7D"
- $"75CC 035D 75F7 035D 75D7 3CD5 55D7 D7D5"
- $"5557 D5D5 555C 3555 555C 0D55 555C 0D55"
- $"5570 0355 5570 00D5 55C0 0035 55C0 0035"
- $"55C0 0000 0000 0000 0002 0000 FFFF FFFF"
- $"FFFF 0001 FFFF CCCC 9999 0003 0000 0000"
- $"0000"
-};
-
-data 'crsr' (1001, "fist") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0DB0 124C"
- $"100A 0802 1802 2002 2002 2004 1004 0808"
- $"0408 0408 0000 0000 0000 0000 0DB0 1FFC"
- $"1FFE 0FFE 1FFE 3FFE 3FFE 3FFC 1FFC 0FF8"
- $"07F8 07F8 0008 0008 0000 0000 0000 0000"
- $"0000 0000 8004 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0002 0001 0002 0000 0000 0000 00D2 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 00F3 CF00 035D 75F0 0355 55DC 00D5"
- $"555C 03D5 555C 0D55 555C 0D55 555C 0D55"
- $"5570 0355 5570 00D5 55C0 0035 55C0 0035"
- $"55C0 0000 0000 0000 0002 0000 FFFF FFFF"
- $"FFFF 0001 FFFF CCCC 9999 0003 0000 0000"
- $"0000"
-};
-
diff --git a/mac/tkMacDefault.h b/mac/tkMacDefault.h
deleted file mode 100644
index 30cf1f3..0000000
--- a/mac/tkMacDefault.h
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * tkMacDefault.h --
- *
- * This file defines the defaults for all options for all of
- * the Tk widgets.
- *
- * Copyright (c) 1991-1994 The Regents of the University of California.
- * Copyright (c) 1994-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.
- */
-
-#ifndef _TKMACDEFAULT
-#define _TKMACDEFAULT
-
-/*
- * The definitions below provide symbolic names for the default colors.
- * NORMAL_BG - Normal background color.
- * ACTIVE_BG - Background color when widget is active.
- * SELECT_BG - Background color for selected text.
- * SELECT_FG - Foreground color for selected text.
- * TROUGH - Background color for troughs in scales and scrollbars.
- * INDICATOR - Color for indicator when button is selected.
- * DISABLED - Foreground color when widget is disabled.
- */
-
-#define BLACK "Black"
-#define WHITE "White"
-
-#define NORMAL_BG "systemWindowBody"
-#define ACTIVE_BG "#ececec"
-#define SELECT_BG "systemHighlight"
-#define SELECT_FG "systemHighlightText"
-#define TROUGH "#c3c3c3"
-#define INDICATOR "#b03060"
-#define DISABLED "#a3a3a3"
-
-/*
- * Defaults for labels, buttons, checkbuttons, and radiobuttons:
- */
-
-#define DEF_BUTTON_ANCHOR "center"
-#define DEF_BUTTON_ACTIVE_BG_COLOR "systemButtonText"
-#define DEF_BUTTON_ACTIVE_BG_MONO BLACK
-#define DEF_BUTTON_ACTIVE_FG_COLOR "systemButtonFace"
-#define DEF_CHKRAD_ACTIVE_FG_COLOR DEF_BUTTON_ACTIVE_FG_COLOR
-#define DEF_BUTTON_ACTIVE_FG_MONO WHITE
-#define DEF_BUTTON_BG_COLOR "systemButtonFace"
-#define DEF_BUTTON_BG_MONO WHITE
-#define DEF_BUTTON_BITMAP ""
-#define DEF_BUTTON_BORDER_WIDTH "2"
-#define DEF_BUTTON_CURSOR ""
-#define DEF_BUTTON_COMMAND ""
-#define DEF_BUTTON_COMPOUND "none"
-#define DEF_BUTTON_DEFAULT "disabled"
-#define DEF_BUTTON_DISABLED_FG_COLOR DISABLED
-#define DEF_BUTTON_DISABLED_FG_MONO ""
-#define DEF_BUTTON_FG "systemButtonText"
-#define DEF_CHKRAD_FG DEF_BUTTON_FG
-#define DEF_BUTTON_FONT "system"
-#define DEF_BUTTON_HEIGHT "0"
-#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"
-#define DEF_BUTTON_IMAGE (char *) NULL
-#define DEF_BUTTON_INDICATOR "1"
-#define DEF_BUTTON_JUSTIFY "center"
-#define DEF_BUTTON_OFF_VALUE "0"
-#define DEF_BUTTON_ON_VALUE "1"
-#define DEF_BUTTON_OVER_RELIEF ""
-#define DEF_BUTTON_PADX "7"
-#define DEF_LABCHKRAD_PADX "1"
-#define DEF_BUTTON_PADY "3"
-#define DEF_LABCHKRAD_PADY "1"
-#define DEF_BUTTON_RELIEF "flat"
-#define DEF_LABCHKRAD_RELIEF "flat"
-#define DEF_BUTTON_REPEAT_DELAY "0"
-#define DEF_BUTTON_REPEAT_INTERVAL "0"
-#define DEF_BUTTON_SELECT_COLOR INDICATOR
-#define DEF_BUTTON_SELECT_MONO BLACK
-#define DEF_BUTTON_SELECT_IMAGE (char *) NULL
-#define DEF_BUTTON_STATE "normal"
-#define DEF_LABEL_TAKE_FOCUS "0"
-#define DEF_BUTTON_TAKE_FOCUS (char *) NULL
-#define DEF_BUTTON_TEXT ""
-#define DEF_BUTTON_TEXT_VARIABLE ""
-#define DEF_BUTTON_UNDERLINE "-1"
-#define DEF_BUTTON_VALUE ""
-#define DEF_BUTTON_WIDTH "0"
-#define DEF_BUTTON_WRAP_LENGTH "0"
-#define DEF_RADIOBUTTON_VARIABLE "selectedButton"
-#define DEF_CHECKBUTTON_VARIABLE ""
-
-/*
- * Defaults for canvases:
- */
-
-#define DEF_CANVAS_BG_COLOR NORMAL_BG
-#define DEF_CANVAS_BG_MONO WHITE
-#define DEF_CANVAS_BORDER_WIDTH "0"
-#define DEF_CANVAS_CLOSE_ENOUGH "1"
-#define DEF_CANVAS_CONFINE "1"
-#define DEF_CANVAS_CURSOR ""
-#define DEF_CANVAS_HEIGHT "7c"
-#define DEF_CANVAS_HIGHLIGHT_BG NORMAL_BG
-#define DEF_CANVAS_HIGHLIGHT BLACK
-#define DEF_CANVAS_HIGHLIGHT_WIDTH "3"
-#define DEF_CANVAS_INSERT_BG BLACK
-#define DEF_CANVAS_INSERT_BD_COLOR "0"
-#define DEF_CANVAS_INSERT_BD_MONO "0"
-#define DEF_CANVAS_INSERT_OFF_TIME "300"
-#define DEF_CANVAS_INSERT_ON_TIME "600"
-#define DEF_CANVAS_INSERT_WIDTH "2"
-#define DEF_CANVAS_RELIEF "flat"
-#define DEF_CANVAS_SCROLL_REGION ""
-#define DEF_CANVAS_SELECT_COLOR SELECT_BG
-#define DEF_CANVAS_SELECT_MONO BLACK
-#define DEF_CANVAS_SELECT_BD_COLOR "1"
-#define DEF_CANVAS_SELECT_BD_MONO "0"
-#define DEF_CANVAS_SELECT_FG_COLOR BLACK
-#define DEF_CANVAS_SELECT_FG_MONO WHITE
-#define DEF_CANVAS_TAKE_FOCUS (char *) NULL
-#define DEF_CANVAS_WIDTH "10c"
-#define DEF_CANVAS_X_SCROLL_CMD ""
-#define DEF_CANVAS_X_SCROLL_INCREMENT "0"
-#define DEF_CANVAS_Y_SCROLL_CMD ""
-#define DEF_CANVAS_Y_SCROLL_INCREMENT "0"
-
-/*
- * Defaults for entries:
- */
-
-#define DEF_ENTRY_BG_COLOR NORMAL_BG
-#define DEF_ENTRY_BG_MONO WHITE
-/* #define DEF_ENTRY_BORDER_WIDTH "2" */
-#define DEF_ENTRY_BORDER_WIDTH "1"
-#define DEF_ENTRY_CURSOR "xterm"
-#define DEF_ENTRY_DISABLED_BG_COLOR NORMAL_BG
-#define DEF_ENTRY_DISABLED_BG_MONO WHITE
-#define DEF_ENTRY_DISABLED_FG DISABLED
-#define DEF_ENTRY_EXPORT_SELECTION "1"
-#define DEF_ENTRY_FONT "Helvetica 12"
-#define DEF_ENTRY_FG BLACK
-#define DEF_ENTRY_HIGHLIGHT_BG NORMAL_BG
-#define DEF_ENTRY_HIGHLIGHT BLACK
-/* #define DEF_ENTRY_HIGHLIGHT_WIDTH "3" */
-#define DEF_ENTRY_HIGHLIGHT_WIDTH "0"
-#define DEF_ENTRY_INSERT_BG BLACK
-#define DEF_ENTRY_INSERT_BD_COLOR "0"
-#define DEF_ENTRY_INSERT_BD_MONO "0"
-#define DEF_ENTRY_INSERT_OFF_TIME "300"
-#define DEF_ENTRY_INSERT_ON_TIME "600"
-/* #define DEF_ENTRY_INSERT_WIDTH "2" */
-#define DEF_ENTRY_INSERT_WIDTH "1"
-#define DEF_ENTRY_JUSTIFY "left"
-#define DEF_ENTRY_READONLY_BG_COLOR NORMAL_BG
-#define DEF_ENTRY_READONLY_BG_MONO WHITE
-/* #define DEF_ENTRY_RELIEF "sunken" */
-#define DEF_ENTRY_RELIEF "solid"
-#define DEF_ENTRY_SCROLL_COMMAND ""
-#define DEF_ENTRY_SELECT_COLOR SELECT_BG
-#define DEF_ENTRY_SELECT_MONO BLACK
-#define DEF_ENTRY_SELECT_BD_COLOR "1"
-#define DEF_ENTRY_SELECT_BD_MONO "0"
-#define DEF_ENTRY_SELECT_FG_COLOR SELECT_FG
-#define DEF_ENTRY_SELECT_FG_MONO WHITE
-#define DEF_ENTRY_SHOW (char *) NULL
-#define DEF_ENTRY_STATE "normal"
-#define DEF_ENTRY_TAKE_FOCUS (char *) NULL
-#define DEF_ENTRY_TEXT_VARIABLE ""
-#define DEF_ENTRY_WIDTH "20"
-
-/*
- * Defaults for frames:
- */
-
-#define DEF_FRAME_BG_COLOR NORMAL_BG
-#define DEF_FRAME_BG_MONO WHITE
-#define DEF_FRAME_BORDER_WIDTH "0"
-#define DEF_FRAME_CLASS "Frame"
-#define DEF_FRAME_COLORMAP ""
-#define DEF_FRAME_CONTAINER "0"
-#define DEF_FRAME_CURSOR ""
-#define DEF_FRAME_HEIGHT "0"
-#define DEF_FRAME_HIGHLIGHT_BG NORMAL_BG
-#define DEF_FRAME_HIGHLIGHT BLACK
-#define DEF_FRAME_HIGHLIGHT_WIDTH "0"
-#define DEF_FRAME_PADX "0"
-#define DEF_FRAME_PADY "0"
-#define DEF_FRAME_RELIEF "flat"
-#define DEF_FRAME_TAKE_FOCUS "0"
-#define DEF_FRAME_VISUAL ""
-#define DEF_FRAME_WIDTH "0"
-
-/*
- * Defaults for labelframes:
- */
-
-#define DEF_LABELFRAME_BORDER_WIDTH "2"
-#define DEF_LABELFRAME_CLASS "Labelframe"
-#define DEF_LABELFRAME_RELIEF "groove"
-#define DEF_LABELFRAME_FG "systemButtonText"
-#define DEF_LABELFRAME_FONT "system"
-#define DEF_LABELFRAME_TEXT ""
-#define DEF_LABELFRAME_LABELANCHOR "nw"
-
-/*
- * Defaults for listboxes:
- */
-
-#define DEF_LISTBOX_ACTIVE_STYLE "underline"
-#define DEF_LISTBOX_BG_COLOR NORMAL_BG
-#define DEF_LISTBOX_BG_MONO WHITE
-#define DEF_LISTBOX_BORDER_WIDTH "1"
-#define DEF_LISTBOX_CURSOR ""
-#define DEF_LISTBOX_DISABLED_FG DISABLED
-#define DEF_LISTBOX_EXPORT_SELECTION "1"
-#define DEF_LISTBOX_FONT "application"
-#define DEF_LISTBOX_FG BLACK
-#define DEF_LISTBOX_HEIGHT "10"
-#define DEF_LISTBOX_HIGHLIGHT_BG NORMAL_BG
-#define DEF_LISTBOX_HIGHLIGHT BLACK
-#define DEF_LISTBOX_HIGHLIGHT_WIDTH "0"
-#define DEF_LISTBOX_RELIEF "solid"
-#define DEF_LISTBOX_SCROLL_COMMAND ""
-#define DEF_LISTBOX_LIST_VARIABLE ""
-#define DEF_LISTBOX_SELECT_COLOR SELECT_BG
-#define DEF_LISTBOX_SELECT_MONO BLACK
-#define DEF_LISTBOX_SELECT_BD "0"
-#define DEF_LISTBOX_SELECT_FG_COLOR SELECT_FG
-#define DEF_LISTBOX_SELECT_FG_MONO WHITE
-#define DEF_LISTBOX_SELECT_MODE "browse"
-#define DEF_LISTBOX_SET_GRID "0"
-#define DEF_LISTBOX_STATE "normal"
-#define DEF_LISTBOX_TAKE_FOCUS (char *) NULL
-#define DEF_LISTBOX_WIDTH "20"
-
-/*
- * Defaults for individual entries of menus:
- */
-
-#define DEF_MENU_ENTRY_ACTIVE_BG (char *) NULL
-#define DEF_MENU_ENTRY_ACTIVE_FG (char *) NULL
-#define DEF_MENU_ENTRY_ACCELERATOR (char *) NULL
-#define DEF_MENU_ENTRY_BG (char *) NULL
-#define DEF_MENU_ENTRY_BITMAP None
-#define DEF_MENU_ENTRY_COLUMN_BREAK "0"
-#define DEF_MENU_ENTRY_COMMAND (char *) NULL
-#define DEF_MENU_ENTRY_COMPOUND "none"
-#define DEF_MENU_ENTRY_FG (char *) NULL
-#define DEF_MENU_ENTRY_FONT (char *) NULL
-#define DEF_MENU_ENTRY_HIDE_MARGIN "0"
-#define DEF_MENU_ENTRY_IMAGE (char *) NULL
-#define DEF_MENU_ENTRY_INDICATOR "1"
-#define DEF_MENU_ENTRY_LABEL (char *) NULL
-#define DEF_MENU_ENTRY_MENU (char *) NULL
-#define DEF_MENU_ENTRY_OFF_VALUE "0"
-#define DEF_MENU_ENTRY_ON_VALUE "1"
-#define DEF_MENU_ENTRY_SELECT_IMAGE (char *) NULL
-#define DEF_MENU_ENTRY_STATE "normal"
-#define DEF_MENU_ENTRY_VALUE (char *) NULL
-#define DEF_MENU_ENTRY_CHECK_VARIABLE (char *) NULL
-#define DEF_MENU_ENTRY_RADIO_VARIABLE "selectedButton"
-#define DEF_MENU_ENTRY_SELECT (char *) NULL
-#define DEF_MENU_ENTRY_UNDERLINE "-1"
-
-/*
- * Defaults for menus overall:
- */
-
-#define DEF_MENU_ACTIVE_BG_COLOR "SystemMenuActive"
-#define DEF_MENU_ACTIVE_BG_MONO BLACK
-#define DEF_MENU_ACTIVE_BORDER_WIDTH "0"
-#define DEF_MENU_ACTIVE_FG_COLOR "SystemMenuActiveText"
-#define DEF_MENU_ACTIVE_FG_MONO WHITE
-#define DEF_MENU_BG_COLOR "SystemMenu"
-#define DEF_MENU_BG_MONO WHITE
-#define DEF_MENU_BORDER_WIDTH "0"
-#define DEF_MENU_CURSOR "arrow"
-#define DEF_MENU_DISABLED_FG_COLOR "SystemMenuDisabled"
-#define DEF_MENU_DISABLED_FG_MONO ""
-#define DEF_MENU_FONT "system"
-#define DEF_MENU_FG "SystemMenuText"
-#define DEF_MENU_POST_COMMAND ""
-#define DEF_MENU_RELIEF "flat"
-#define DEF_MENU_SELECT_COLOR "SystemMenuActive"
-#define DEF_MENU_SELECT_MONO BLACK
-#define DEF_MENU_TAKE_FOCUS "0"
-#define DEF_MENU_TEAROFF "1"
-#define DEF_MENU_TEAROFF_CMD (char *) NULL
-#define DEF_MENU_TITLE ""
-#define DEF_MENU_TYPE "normal"
-
-/*
- * Defaults for menubuttons:
- */
-
-#define DEF_MENUBUTTON_ANCHOR "center"
-#define DEF_MENUBUTTON_ACTIVE_BG_COLOR ACTIVE_BG
-#define DEF_MENUBUTTON_ACTIVE_BG_MONO BLACK
-#define DEF_MENUBUTTON_ACTIVE_FG_COLOR BLACK
-#define DEF_MENUBUTTON_ACTIVE_FG_MONO WHITE
-#define DEF_MENUBUTTON_BG_COLOR NORMAL_BG
-#define DEF_MENUBUTTON_BG_MONO WHITE
-#define DEF_MENUBUTTON_BITMAP ""
-#define DEF_MENUBUTTON_BORDER_WIDTH "2"
-#define DEF_MENUBUTTON_CURSOR ""
-#define DEF_MENUBUTTON_DIRECTION "below"
-#define DEF_MENUBUTTON_DISABLED_FG_COLOR DISABLED
-#define DEF_MENUBUTTON_DISABLED_FG_MONO ""
-#define DEF_MENUBUTTON_FONT "system"
-#define DEF_MENUBUTTON_FG BLACK
-#define DEF_MENUBUTTON_HEIGHT "0"
-#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
-#define DEF_MENUBUTTON_INDICATOR "0"
-/* #define DEF_MENUBUTTON_JUSTIFY "center" */
-#define DEF_MENUBUTTON_JUSTIFY "left"
-#define DEF_MENUBUTTON_MENU ""
-#define DEF_MENUBUTTON_PADX "4p"
-#define DEF_MENUBUTTON_PADY "3p"
-#define DEF_MENUBUTTON_RELIEF "flat"
-#define DEF_MENUBUTTON_STATE "normal"
-#define DEF_MENUBUTTON_TAKE_FOCUS "0"
-#define DEF_MENUBUTTON_TEXT ""
-#define DEF_MENUBUTTON_TEXT_VARIABLE ""
-#define DEF_MENUBUTTON_UNDERLINE "-1"
-#define DEF_MENUBUTTON_WIDTH "0"
-#define DEF_MENUBUTTON_WRAP_LENGTH "0"
-
-/*
- * Defaults for messages:
- */
-
-#define DEF_MESSAGE_ANCHOR "center"
-#define DEF_MESSAGE_ASPECT "150"
-#define DEF_MESSAGE_BG_COLOR NORMAL_BG
-#define DEF_MESSAGE_BG_MONO WHITE
-#define DEF_MESSAGE_BORDER_WIDTH "2"
-#define DEF_MESSAGE_CURSOR ""
-#define DEF_MESSAGE_FG BLACK
-#define DEF_MESSAGE_FONT "system"
-#define DEF_MESSAGE_HIGHLIGHT_BG NORMAL_BG
-#define DEF_MESSAGE_HIGHLIGHT BLACK
-#define DEF_MESSAGE_HIGHLIGHT_WIDTH "0"
-#define DEF_MESSAGE_JUSTIFY "left"
-#define DEF_MESSAGE_PADX "-1"
-#define DEF_MESSAGE_PADY "-1"
-#define DEF_MESSAGE_RELIEF "flat"
-#define DEF_MESSAGE_TAKE_FOCUS "0"
-#define DEF_MESSAGE_TEXT ""
-#define DEF_MESSAGE_TEXT_VARIABLE ""
-#define DEF_MESSAGE_WIDTH "0"
-
-/*
- * Defaults for panedwindows
- */
-
-#define DEF_PANEDWINDOW_BG_COLOR NORMAL_BG
-#define DEF_PANEDWINDOW_BG_MONO WHITE
-#define DEF_PANEDWINDOW_BORDERWIDTH "2"
-#define DEF_PANEDWINDOW_CURSOR ""
-#define DEF_PANEDWINDOW_HANDLEPAD "8"
-#define DEF_PANEDWINDOW_HANDLESIZE "8"
-#define DEF_PANEDWINDOW_HEIGHT ""
-#define DEF_PANEDWINDOW_OPAQUERESIZE "0"
-#define DEF_PANEDWINDOW_ORIENT "horizontal"
-#define DEF_PANEDWINDOW_RELIEF "flat"
-#define DEF_PANEDWINDOW_SASHCURSOR ""
-#define DEF_PANEDWINDOW_SASHPAD "2"
-#define DEF_PANEDWINDOW_SASHRELIEF "raised"
-#define DEF_PANEDWINDOW_SASHWIDTH "2"
-#define DEF_PANEDWINDOW_SHOWHANDLE "0"
-#define DEF_PANEDWINDOW_WIDTH ""
-
-/*
- * Defaults for panedwindow panes
- */
-
-#define DEF_PANEDWINDOW_PANE_AFTER ""
-#define DEF_PANEDWINDOW_PANE_BEFORE ""
-#define DEF_PANEDWINDOW_PANE_HEIGHT ""
-#define DEF_PANEDWINDOW_PANE_MINSIZE "0"
-#define DEF_PANEDWINDOW_PANE_PADX "0"
-#define DEF_PANEDWINDOW_PANE_PADY "0"
-#define DEF_PANEDWINDOW_PANE_STICKY "nsew"
-#define DEF_PANEDWINDOW_PANE_WIDTH ""
-
-/*
- * Defaults for scales:
- */
-
-#define DEF_SCALE_ACTIVE_BG_COLOR ACTIVE_BG
-#define DEF_SCALE_ACTIVE_BG_MONO BLACK
-#define DEF_SCALE_BG_COLOR NORMAL_BG
-#define DEF_SCALE_BG_MONO WHITE
-#define DEF_SCALE_BIG_INCREMENT "0"
-#define DEF_SCALE_BORDER_WIDTH "2"
-#define DEF_SCALE_COMMAND ""
-#define DEF_SCALE_CURSOR ""
-#define DEF_SCALE_DIGITS "0"
-#define DEF_SCALE_FONT "system"
-#define DEF_SCALE_FG_COLOR BLACK
-#define DEF_SCALE_FG_MONO BLACK
-#define DEF_SCALE_FROM "0"
-#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 ""
-#define DEF_SCALE_LENGTH "100"
-#define DEF_SCALE_ORIENT "vertical"
-#define DEF_SCALE_RELIEF "flat"
-#define DEF_SCALE_REPEAT_DELAY "300"
-#define DEF_SCALE_REPEAT_INTERVAL "100"
-#define DEF_SCALE_RESOLUTION "1"
-#define DEF_SCALE_TROUGH_COLOR TROUGH
-#define DEF_SCALE_TROUGH_MONO WHITE
-#define DEF_SCALE_SHOW_VALUE "1"
-#define DEF_SCALE_SLIDER_LENGTH "30"
-#define DEF_SCALE_SLIDER_RELIEF "raised"
-#define DEF_SCALE_STATE "normal"
-#define DEF_SCALE_TAKE_FOCUS (char *) NULL
-#define DEF_SCALE_TICK_INTERVAL "0"
-#define DEF_SCALE_TO "100"
-#define DEF_SCALE_VARIABLE ""
-#define DEF_SCALE_WIDTH "15"
-
-/*
- * Defaults for scrollbars:
- */
-
-#define DEF_SCROLLBAR_ACTIVE_BG_COLOR ACTIVE_BG
-#define DEF_SCROLLBAR_ACTIVE_BG_MONO BLACK
-#define DEF_SCROLLBAR_ACTIVE_RELIEF "raised"
-#define DEF_SCROLLBAR_BG_COLOR NORMAL_BG
-#define DEF_SCROLLBAR_BG_MONO WHITE
-/* #define DEF_SCROLLBAR_BORDER_WIDTH "2" */
-#define DEF_SCROLLBAR_BORDER_WIDTH "0"
-#define DEF_SCROLLBAR_COMMAND ""
-#define DEF_SCROLLBAR_CURSOR ""
-#define DEF_SCROLLBAR_EL_BORDER_WIDTH "-1"
-#define DEF_SCROLLBAR_HIGHLIGHT_BG NORMAL_BG
-#define DEF_SCROLLBAR_HIGHLIGHT BLACK
-/* #define DEF_SCROLLBAR_HIGHLIGHT_WIDTH "2" */
-#define DEF_SCROLLBAR_HIGHLIGHT_WIDTH "0"
-#define DEF_SCROLLBAR_JUMP "0"
-#define DEF_SCROLLBAR_ORIENT "vertical"
-/*#define DEF_SCROLLBAR_RELIEF "sunken" */
-#define DEF_SCROLLBAR_RELIEF "flat"
-#define DEF_SCROLLBAR_REPEAT_DELAY "300"
-#define DEF_SCROLLBAR_REPEAT_INTERVAL "100"
-#define DEF_SCROLLBAR_TAKE_FOCUS (char *) NULL
-#define DEF_SCROLLBAR_TROUGH_COLOR TROUGH
-#define DEF_SCROLLBAR_TROUGH_MONO WHITE
-/*#define DEF_SCROLLBAR_WIDTH "15" */
-#define DEF_SCROLLBAR_WIDTH "16"
-
-/*
- * Defaults for texts:
- */
-
-#define DEF_TEXT_AUTO_SEPARATORS "1"
-#define DEF_TEXT_BG_COLOR NORMAL_BG
-#define DEF_TEXT_BG_MONO WHITE
-#define DEF_TEXT_BORDER_WIDTH "0"
-#define DEF_TEXT_CURSOR "xterm"
-#define DEF_TEXT_FG BLACK
-#define DEF_TEXT_EXPORT_SELECTION "1"
-#define DEF_TEXT_FONT "Courier 12"
-#define DEF_TEXT_HEIGHT "24"
-#define DEF_TEXT_HIGHLIGHT_BG NORMAL_BG
-#define DEF_TEXT_HIGHLIGHT BLACK
-#define DEF_TEXT_HIGHLIGHT_WIDTH "3"
-#define DEF_TEXT_INSERT_BG BLACK
-#define DEF_TEXT_INSERT_BD_COLOR "0"
-#define DEF_TEXT_INSERT_BD_MONO "0"
-#define DEF_TEXT_INSERT_OFF_TIME "300"
-#define DEF_TEXT_INSERT_ON_TIME "600"
-#define DEF_TEXT_INSERT_WIDTH "1"
-#define DEF_TEXT_MAX_UNDO "0"
-#define DEF_TEXT_PADX "1"
-#define DEF_TEXT_PADY "1"
-#define DEF_TEXT_RELIEF "flat"
-#define DEF_TEXT_SELECT_COLOR SELECT_BG
-#define DEF_TEXT_SELECT_MONO BLACK
-#define DEF_TEXT_SELECT_BD_COLOR "1"
-#define DEF_TEXT_SELECT_BD_MONO "0"
-#define DEF_TEXT_SELECT_FG_COLOR SELECT_FG
-#define DEF_TEXT_SELECT_FG_MONO WHITE
-#define DEF_TEXT_SELECT_RELIEF "solid"
-#define DEF_TEXT_SET_GRID "0"
-#define DEF_TEXT_SPACING1 "0"
-#define DEF_TEXT_SPACING2 "0"
-#define DEF_TEXT_SPACING3 "0"
-#define DEF_TEXT_STATE "normal"
-#define DEF_TEXT_TABS ""
-#define DEF_TEXT_TAKE_FOCUS (char *) NULL
-#define DEF_TEXT_UNDO "0"
-#define DEF_TEXT_WIDTH "80"
-#define DEF_TEXT_WRAP "char"
-#define DEF_TEXT_XSCROLL_COMMAND ""
-#define DEF_TEXT_YSCROLL_COMMAND ""
-
-/*
- * Defaults for canvas text:
- */
-
-#define DEF_CANVTEXT_FONT "Helvetica 12"
-
-/*
- * Defaults for toplevels (most of the defaults for frames also apply
- * to toplevels):
- */
-
-#define DEF_TOPLEVEL_CLASS "Toplevel"
-#define DEF_TOPLEVEL_MENU ""
-#define DEF_TOPLEVEL_SCREEN ""
-#define DEF_TOPLEVEL_USE ""
-
-#endif /* _TKMACDEFAULT */
diff --git a/mac/tkMacDialog.c b/mac/tkMacDialog.c
deleted file mode 100644
index b00ff9d..0000000
--- a/mac/tkMacDialog.c
+++ /dev/null
@@ -1,1418 +0,0 @@
-/*
- * tkMacDialog.c --
- *
- * Contains the Mac implementation of the common dialog boxes.
- *
- * 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.
- */
-
-#include <Gestalt.h>
-#include <Aliases.h>
-#include <Errors.h>
-#include <Strings.h>
-#include <MoreFiles.h>
-#include <MoreFilesExtras.h>
-#include <StandardFile.h>
-#include <ColorPicker.h>
-#include <Lowmem.h>
-#include <Navigation.h>
-#include "tkPort.h"
-#include "tkInt.h"
-#include "tclMacInt.h"
-#include "tkMacInt.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
- */
-#define OPEN_BOX 130
-#define OPEN_POPUP 131
-#define OPEN_MENU 132
-#define OPEN_POPUP_ITEM 10
-
-#define SAVE_FILE 0
-#define OPEN_FILE 1
-#define CHOOSE_FOLDER 2
-
-#define MATCHED 0
-#define UNMATCHED 1
-
-/*
- * The following structure is used in the GetFileName() function. It stored
- * information about the file dialog and the file filters.
- */
-typedef struct _OpenFileData {
- FileFilterList fl; /* List of file filters. */
- SInt16 curType; /* The filetype currently being
- * 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). */
-} OpenFileData;
-
-
-static pascal Boolean FileFilterProc _ANSI_ARGS_((CInfoPBPtr pb,
- void *myData));
-static int GetFileName _ANSI_ARGS_ ((ClientData clientData,
- Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[], int isOpen));
-static int NavGetFileName _ANSI_ARGS_ ((ClientData clientData,
- Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[], int isOpen));
-static Boolean MatchOneType _ANSI_ARGS_((StringPtr fileNamePtr, OSType fileType,
- OpenFileData *myofdPtr, FileFilter *filterPtr));
-static pascal short OpenHookProc _ANSI_ARGS_((short item,
- DialogPtr theDialog, OpenFileData * myofdPtr));
-static int ParseFileDlgArgs _ANSI_ARGS_ ((Tcl_Interp * interp,
- OpenFileData * myofdPtr, int argc, char ** argv,
- int isOpen));
-static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info,
- NavCallBackUserData callBackUD,
- NavFilterModes filterMode );
-pascal void OpenEventProc(NavEventCallbackMessage callBackSelector,
- NavCBRecPtr callBackParms,
- NavCallBackUserData callBackUD );
-static void InitFileDialogs();
-static int StdGetFile(Tcl_Interp *interp, OpenFileData *ofd,
- unsigned char *initialFile, int isOpen);
-static int NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd,
- AEDesc *initialDesc, unsigned char *initialFile,
- StringPtr title, StringPtr message, int multiple, int isOpen);
-static int HandleInitialDirectory (Tcl_Interp *interp, char *initialDir, FSSpec *dirSpec,
- AEDesc *dirDescPtr);
-/*
- * Filter and hook functions used by the tk_getOpenFile and tk_getSaveFile
- * commands.
- */
-
-int fileDlgInited = 0;
-int useNavServices = 0;
-NavObjectFilterUPP openFileFilterUPP;
-NavEventUPP openFileEventUPP;
-
-static FileFilterYDUPP openFilter = NULL;
-static DlgHookYDUPP openHook = NULL;
-static DlgHookYDUPP saveHook = NULL;
-
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_ChooseColorObjCmd --
- *
- * This procedure implements the color dialog box for the Mac
- * platform. See the user documentation for details on what it
- * does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_ChooseColorObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
-{
- Tk_Window parent;
- char *title;
- int i, picked, srcRead, dstWrote;
- long response;
- OSErr err;
- static inited = 0;
- static RGBColor in;
- static CONST 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
- * we can assume version 1.0 is available as it comes with
- * Color Quickdraw which Tk requires to run at all.
- */
-
- err = Gestalt(gestaltColorPicker, &response);
- if ((err == noErr) && (response == 0x0200L)) {
- ColorPickerInfo cpinfo;
-
- /*
- * Version 2.0 of the color picker is available. Let's use it
- */
-
- cpinfo.theColor.profile = 0L;
- cpinfo.theColor.color.rgb.red = in.red;
- cpinfo.theColor.color.rgb.green = in.green;
- cpinfo.theColor.color.rgb.blue = in.blue;
- cpinfo.dstProfile = 0L;
- cpinfo.flags = kColorPickerCanModifyPalette | kColorPickerCanAnimatePalette;
- cpinfo.placeWhere = kDeepestColorScreen;
- cpinfo.pickerType = 0L;
- 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;
-
- if (GetColor(point, prompt, &in, &out)) {
- in = out;
- picked = 1;
- }
- }
-
- if (picked != 0) {
- char result[32];
-
- sprintf(result, "#%02x%02x%02x", in.red >> 8, in.green >> 8,
- in.blue >> 8);
- Tcl_AppendResult(interp, result, NULL);
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetOpenFileObjCmd --
- *
- * This procedure implements the "open file" dialog box for the
- * Mac platform. See the user documentation for details on what
- * it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See user documentation.
- *----------------------------------------------------------------------
- */
-
-int
-Tk_GetOpenFileObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
-{
- int i, result, multiple;
- OpenFileData ofd;
- Tk_Window parent;
- Str255 message, title;
- AEDesc initialDesc = {typeNull, NULL};
- FSSpec dirSpec;
- static CONST char *openOptionStrings[] = {
- "-defaultextension", "-filetypes",
- "-initialdir", "-initialfile",
- "-message", "-multiple",
- "-parent", "-title", NULL
- };
- enum openOptions {
- OPEN_DEFAULT, OPEN_TYPES,
- OPEN_INITDIR, OPEN_INITFILE,
- OPEN_MESSAGE, OPEN_MULTIPLE,
- OPEN_PARENT, OPEN_TITLE
- };
-
- if (!fileDlgInited) {
- InitFileDialogs();
- }
-
- result = TCL_ERROR;
- parent = (Tk_Window) clientData;
- multiple = false;
- title[0] = 0;
- message[0] = 0;
-
- TkInitFileFilters(&ofd.fl);
-
- ofd.curType = 0;
- ofd.popupItem = OPEN_POPUP_ITEM;
- ofd.usePopup = 1;
-
- for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
- int srcRead, dstWrote;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], openOptionStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- if (i + 1 == objc) {
- string = Tcl_GetStringFromObj(objv[i], NULL);
- Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
- result = TCL_ERROR;
- goto end;
- }
-
- switch (index) {
- case OPEN_DEFAULT:
- break;
- case OPEN_TYPES:
- choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
- if (TkGetFileFilters(interp, &ofd.fl, choice, 0)
- != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
- if (HandleInitialDirectory(interp, choice, &dirSpec,
- &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_INITFILE:
- break;
- case OPEN_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(message), 255,
- &srcRead, &dstWrote, NULL);
- message[0] = dstWrote;
- break;
- case OPEN_MULTIPLE:
- if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &multiple) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(title), 255,
- &srcRead, &dstWrote, NULL);
- title[0] = dstWrote;
- break;
- }
- }
-
- if (useNavServices) {
- AEDesc *initialPtr = NULL;
-
- if (initialDesc.descriptorType == typeFSS) {
- initialPtr = &initialDesc;
- }
- result = NavServicesGetFile(interp, &ofd, initialPtr, NULL,
- title, message, multiple, OPEN_FILE);
- } else {
- result = StdGetFile(interp, &ofd, NULL, OPEN_FILE);
- }
-
- end:
- TkFreeFileFilters(&ofd.fl);
- AEDisposeDesc(&initialDesc);
-
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetSaveFileObjCmd --
- *
- * Same as Tk_GetOpenFileCmd but opens a "save file" dialog box
- * instead
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See user documentation.
- *----------------------------------------------------------------------
- */
-
-int
-Tk_GetSaveFileObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
-{
- int i, result;
- Str255 initialFile;
- Tk_Window parent;
- AEDesc initialDesc = {typeNull, NULL};
- FSSpec dirSpec;
- Str255 title, message;
- OpenFileData ofd;
- static CONST char *saveOptionStrings[] = {
- "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
- "-message", "-parent", "-title", NULL
- };
- enum saveOptions {
- SAVE_DEFAULT, SAVE_TYPES, SAVE_INITDIR, SAVE_INITFILE,
- SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE
- };
-
- if (!fileDlgInited) {
- InitFileDialogs();
- }
-
- result = TCL_ERROR;
- parent = (Tk_Window) clientData;
- StrLength(initialFile) = 0;
- title[0] = 0;
- message[0] = 0;
-
-
- for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
- Tcl_DString ds;
- int srcRead, dstWrote;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], saveOptionStrings, "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;
- }
- switch (index) {
- case SAVE_DEFAULT:
- break;
- case SAVE_TYPES:
- break;
- case SAVE_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
- if (HandleInitialDirectory(interp, choice, &dirSpec,
- &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case SAVE_INITFILE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- if (Tcl_TranslateFileName(interp, choice, &ds) == NULL) {
- result = TCL_ERROR;
- 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);
- break;
- case SAVE_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(message), 255,
- &srcRead, &dstWrote, NULL);
- StrLength(message) = (unsigned char) dstWrote;
- break;
- case SAVE_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case SAVE_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(title), 255,
- &srcRead, &dstWrote, NULL);
- StrLength(title) = (unsigned char) dstWrote;
- break;
- }
- }
-
- TkInitFileFilters(&ofd.fl);
- ofd.usePopup = 0;
-
- if (useNavServices) {
- AEDesc *initialPtr = NULL;
-
- if (initialDesc.descriptorType == typeFSS) {
- initialPtr = &initialDesc;
- }
- result = NavServicesGetFile(interp, &ofd, initialPtr, initialFile,
- title, message, false, SAVE_FILE);
- } else {
- result = StdGetFile(interp, NULL, initialFile, SAVE_FILE);
- }
-
- end:
-
- AEDisposeDesc(&initialDesc);
-
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_ChooseDirectoryObjCmd --
- *
- * This procedure implements the "tk_chooseDirectory" dialog box
- * for the Windows platform. See the user documentation for details
- * on what it does.
- *
- * Results:
- * See user documentation.
- *
- * Side effects:
- * A modal dialog window is created. Tcl_SetServiceMode() is
- * called to allow background events to be processed
- *
- *----------------------------------------------------------------------
- */
-
-int
-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. */
-{
- int i, result;
- Tk_Window parent;
- AEDesc initialDesc = {typeNull, NULL};
- FSSpec dirSpec;
- Str255 message, title;
- int srcRead, dstWrote;
- OpenFileData ofd;
- static CONST char *chooseOptionStrings[] = {
- "-initialdir", "-message", "-mustexist", "-parent", "-title", NULL
- };
- enum chooseOptions {
- CHOOSE_INITDIR, CHOOSE_MESSAGE, CHOOSE_MUSTEXIST,
- CHOOSE_PARENT, CHOOSE_TITLE
- };
-
-
- if (!NavServicesAvailable()) {
- return TCL_ERROR;
- }
-
- if (!fileDlgInited) {
- InitFileDialogs();
- }
- result = TCL_ERROR;
- parent = (Tk_Window) clientData;
- title[0] = 0;
- message[0] = 0;
-
- for (i = 1; i < objc; i += 2) {
- char *choice;
- int index, choiceLen;
- char *string;
-
- if (Tcl_GetIndexFromObj(interp, objv[i], chooseOptionStrings, "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;
- }
- switch (index) {
- case CHOOSE_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], NULL);
- if (HandleInitialDirectory(interp, choice, &dirSpec,
- &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case CHOOSE_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(message), 255,
- &srcRead, &dstWrote, NULL);
- StrLength(message) = (unsigned char) dstWrote;
- break;
- case CHOOSE_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case CHOOSE_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- Tcl_UtfToExternal(NULL, NULL, choice, choiceLen,
- 0, NULL, StrBody(title), 255,
- &srcRead, &dstWrote, NULL);
- StrLength(title) = (unsigned char) dstWrote;
- break;
- }
- }
-
- TkInitFileFilters(&ofd.fl);
- ofd.usePopup = 0;
-
- if (useNavServices) {
- AEDesc *initialPtr = NULL;
-
- if (initialDesc.descriptorType == typeFSS) {
- initialPtr = &initialDesc;
- }
- result = NavServicesGetFile(interp, &ofd, initialPtr, NULL,
- title, message, false, CHOOSE_FOLDER);
- } else {
- result = TCL_ERROR;
- }
-
- end:
- AEDisposeDesc(&initialDesc);
-
- return result;
-}
-
-int
-HandleInitialDirectory (
- Tcl_Interp *interp,
- char *initialDir,
- FSSpec *dirSpec,
- AEDesc *dirDescPtr)
-{
- Tcl_DString ds;
- long dirID;
- OSErr err;
- Boolean isDirectory;
- Str255 dir;
- int srcRead, dstWrote;
-
- if (Tcl_TranslateFileName(interp, initialDir, &ds) == NULL) {
- return TCL_ERROR;
- }
- 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 \"", initialDir, "\"", NULL);
- return TCL_ERROR;
- }
- err = FSpGetDirectoryIDTcl(dirSpec, &dirID, &isDirectory);
- if ((err != noErr) || !isDirectory) {
- Tcl_AppendResult(interp, "bad directory \"", initialDir, "\"", NULL);
- return TCL_ERROR;
- }
-
- if (useNavServices) {
- AECreateDesc( typeFSS, dirSpec, sizeof(*dirSpec), dirDescPtr);
- } else {
- /*
- * Make sure you negate -dirSpec.vRefNum because the
- * standard file package wants it that way !
- */
-
- LMSetSFSaveDisk(-dirSpec->vRefNum);
- LMSetCurDirStore(dirID);
- }
- return TCL_OK;
-}
-
-static void
-InitFileDialogs()
-{
- fileDlgInited = 1;
-
- if (NavServicesAvailable()) {
- openFileFilterUPP = NewNavObjectFilterProc(OpenFileFilterProc);
- openFileEventUPP = NewNavEventProc(OpenEventProc);
- useNavServices = 1;
- } else {
- openFilter = NewFileFilterYDProc(FileFilterProc);
- openHook = NewDlgHookYDProc(OpenHookProc);
- saveHook = NewDlgHookYDProc(OpenHookProc);
- useNavServices = 0;
- }
-
-
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * GetFileName --
- *
- * Calls the Mac file dialog functions for the user to choose a
- * file to or save.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * If the user selects a file, the native pathname of the file
- * is returned in the interp's result. Otherwise an empty string
- * is returned in the interp's result.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GetFileName(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- 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() */
-{
- return TCL_OK;
-}
-
-static int
-NavServicesGetFile(
- Tcl_Interp *interp,
- OpenFileData *ofdPtr,
- AEDesc *initialDesc,
- unsigned char *initialFile,
- StringPtr title,
- StringPtr message,
- int multiple,
- int isOpen)
-{
- NavReplyRecord theReply;
- NavDialogOptions diagOptions;
- OSErr err;
- Tcl_Obj *theResult;
- int result;
-
-
- diagOptions.location.h = -1;
- diagOptions.location.v = -1;
- diagOptions.dialogOptionFlags = kNavDontAutoTranslate
- + kNavDontAddTranslateItems;
-
- if (multiple) {
- diagOptions.dialogOptionFlags += kNavAllowMultipleFiles;
- }
-
- if (ofdPtr != NULL && ofdPtr->usePopup) {
- FileFilter *filterPtr;
-
- filterPtr = ofdPtr->fl.filters;
- if (filterPtr == NULL) {
- ofdPtr->usePopup = 0;
- }
- }
-
- if (ofdPtr != NULL && ofdPtr->usePopup) {
- NavMenuItemSpecHandle popupExtensionHandle = NULL;
- NavMenuItemSpec *popupItems;
- FileFilter *filterPtr;
- short index = 0;
-
- ofdPtr->curType = 0;
-
- popupExtensionHandle = (NavMenuItemSpecHandle) NewHandle(ofdPtr->fl.numFilters
- * sizeof(NavMenuItemSpec));
- HLock((Handle) popupExtensionHandle);
- popupItems = *popupExtensionHandle;
-
- for (filterPtr = ofdPtr->fl.filters; filterPtr != NULL;
- filterPtr = filterPtr->next, popupItems++, index++) {
- int len;
-
- len = strlen(filterPtr->name);
- BlockMove(filterPtr->name, popupItems->menuItemName + 1, len);
- popupItems->menuItemName[0] = len;
- popupItems->menuCreator = 'WIsH';
- popupItems->menuType = index;
- }
- HUnlock((Handle) popupExtensionHandle);
- diagOptions.popupExtension = popupExtensionHandle;
- } else {
- diagOptions.dialogOptionFlags += kNavNoTypePopup;
- diagOptions.popupExtension = NULL;
- }
-
- if ((initialFile != NULL) && (initialFile[0] != 0)) {
- char *lastColon;
- int len;
-
- len = initialFile[0];
-
- p2cstr(initialFile);
- lastColon = strrchr((char *)initialFile, ':');
- if (lastColon != NULL) {
- len -= lastColon - ((char *) (initialFile + 1));
- BlockMove(lastColon + 1, diagOptions.savedFileName + 1, len);
- diagOptions.savedFileName[0] = len;
- } else {
- BlockMove(initialFile, diagOptions.savedFileName + 1, len);
- diagOptions.savedFileName[0] = len;
- }
- } else {
- diagOptions.savedFileName[0] = 0;
- }
-
- strcpy((char *) (diagOptions.clientName + 1),"Wish");
- diagOptions.clientName[0] = strlen("Wish");
-
- if (title == NULL) {
- diagOptions.windowTitle[0] = 0;
- } else {
- BlockMove(title, diagOptions.windowTitle, title[0] + 1);
- diagOptions.windowTitle[0] = title[0];
- }
-
- if (message == NULL) {
- diagOptions.message[0] = 0;
- } else {
- BlockMove(message, diagOptions.message, message[0] + 1);
- diagOptions.message[0] = message[0];
- }
-
- diagOptions.actionButtonLabel[0] = 0;
- diagOptions.cancelButtonLabel[0] = 0;
- diagOptions.preferenceKey = 0;
-
- /* Now process the selection list. We have to use the popupExtension
- * to fill the menu.
- */
-
-
- if (isOpen == OPEN_FILE) {
- err = NavGetFile(initialDesc, &theReply, &diagOptions, openFileEventUPP,
- NULL, openFileFilterUPP, NULL, ofdPtr);
- } else if (isOpen == SAVE_FILE) {
- err = NavPutFile (initialDesc, &theReply, &diagOptions, openFileEventUPP,
- 'TEXT', 'WIsH', NULL);
- } else if (isOpen == CHOOSE_FOLDER) {
- err = NavChooseFolder (initialDesc, &theReply, &diagOptions,
- openFileEventUPP, NULL, NULL);
- }
-
-
- /*
- * Most commands assume that the file dialogs return a single
- * item, not a list. So only build a list if multiple is true...
- */
-
- if (multiple) {
- theResult = Tcl_NewListObj(0, NULL);
- } else {
- theResult = Tcl_NewObj();
- }
-
- if ( theReply.validRecord && err == noErr ) {
- AEDesc resultDesc;
- long count;
- Tcl_DString fileName;
- Handle pathHandle;
- int length;
-
- if ( err == noErr ) {
- err = AECountItems(&(theReply.selection), &count);
- if (err == noErr) {
- long i;
- for (i = 1; i <= count; i++ ) {
- err = AEGetNthDesc(&(theReply.selection),
- i, typeFSS, NULL, &resultDesc);
- if (err == noErr) {
- HLock(resultDesc.dataHandle);
- pathHandle = NULL;
- FSpPathFromLocation((FSSpec *) *resultDesc.dataHandle,
- &length, &pathHandle);
- HLock(pathHandle);
- Tcl_ExternalToUtfDString(NULL, (char *) *pathHandle, -1, &fileName);
- if (multiple) {
- Tcl_ListObjAppendElement(interp, theResult,
- Tcl_NewStringObj(Tcl_DStringValue(&fileName),
- Tcl_DStringLength(&fileName)));
- } else {
- Tcl_SetStringObj(theResult, Tcl_DStringValue(&fileName),
- Tcl_DStringLength(&fileName));
- }
-
- Tcl_DStringFree(&fileName);
- HUnlock(pathHandle);
- DisposeHandle(pathHandle);
- HUnlock(resultDesc.dataHandle);
- AEDisposeDesc( &resultDesc );
- }
- }
- }
- }
- err = NavDisposeReply( &theReply );
- Tcl_SetObjResult(interp, theResult);
- result = TCL_OK;
- } else if (err == userCanceledErr) {
- result = TCL_OK;
- } else {
- result = TCL_ERROR;
- }
-
- if (diagOptions.popupExtension != NULL) {
- DisposeHandle((Handle) diagOptions.popupExtension);
- }
-
- return result;
-}
-
-static pascal Boolean
-OpenFileFilterProc(
- AEDesc* theItem, void* info,
- NavCallBackUserData callBackUD,
- NavFilterModes filterMode )
-{
- OpenFileData *ofdPtr = (OpenFileData *) callBackUD;
- if (!ofdPtr->usePopup) {
- return true;
- } else {
- if (ofdPtr->fl.numFilters == 0) {
- return true;
- } else {
-
- if ( theItem->descriptorType == typeFSS ) {
- NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*)info;
- int result;
-
- if ( !theInfo->isFolder ) {
- OSType fileType;
- StringPtr fileNamePtr;
- int i;
- FileFilter *filterPtr;
-
- fileType = theInfo->fileAndFolder.fileInfo.finderInfo.fdType;
- HLock(theItem->dataHandle);
- fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
-
- if (ofdPtr->usePopup) {
- i = ofdPtr->curType;
- for (filterPtr=ofdPtr->fl.filters; filterPtr && i>0; i--) {
- filterPtr = filterPtr->next;
- }
- if (filterPtr) {
- result = MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr);
- } else {
- result = false;
- }
- } else {
- /*
- * We are not using the popup menu. In this case, the file is
- * considered matched if it matches any of the file filters.
- */
- result = UNMATCHED;
- for (filterPtr=ofdPtr->fl.filters; filterPtr;
- filterPtr=filterPtr->next) {
- if (MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr) == MATCHED) {
- result = MATCHED;
- break;
- }
- }
- }
-
- HUnlock(theItem->dataHandle);
- return (result == MATCHED);
- } else {
- return true;
- }
- }
- }
-
- return true;
- }
-}
-
-pascal void
-OpenEventProc(
- NavEventCallbackMessage callBackSelector,
- NavCBRecPtr callBackParams,
- NavCallBackUserData callBackUD )
-{
- NavMenuItemSpec *chosenItem;
- OpenFileData *ofd = (OpenFileData *) callBackUD;
-
- if (callBackSelector == kNavCBPopupMenuSelect) {
- chosenItem = (NavMenuItemSpec *) callBackParams->eventData.eventDataParms.param;
- ofd->curType = chosenItem->menuType;
- } else if (callBackSelector == kNavCBEvent) {
- if (callBackParams->eventData.eventDataParms.event->what == updateEvt) {
- if (TkMacConvertEvent( callBackParams->eventData.eventDataParms.event)) {
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS|TCL_DONT_WAIT|TCL_WINDOW_EVENTS)) {
- /* Empty Body */
- }
- }
- }
- }
-}
-
-static int
-StdGetFile(
- Tcl_Interp *interp,
- OpenFileData *ofd,
- unsigned char *initialFile,
- int isOpen)
-{
- int i;
- StandardFileReply reply;
- Point mypoint;
- MenuHandle menu = NULL;
-
-
- /*
- * Set the items in the file types popup.
- */
-
- /*
- * Delete all the entries inside the popup menu, in case there's any
- * left overs from previous invocation of this command
- */
-
- if (ofd != NULL && 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(menu, i);
- }
-
- filterPtr = ofd->fl.filters;
- if (filterPtr == NULL) {
- ofd->usePopup = 0;
- } else {
- for ( ; filterPtr != NULL; filterPtr = filterPtr->next) {
- Str255 str;
-
- StrLength(str) = (unsigned char) strlen(filterPtr->name);
- strcpy(StrBody(str), filterPtr->name);
- AppendMenu(menu, str);
- }
- }
- }
-
- /*
- * Call the toolbox file dialog function.
- */
-
- SetPt(&mypoint, -1, -1);
- TkpSetCursor(NULL);
- if (isOpen == OPEN_FILE) {
- if (ofd != NULL && ofd->usePopup) {
- CustomGetFile(openFilter, (short) -1, NULL, &reply, OPEN_BOX,
- mypoint, openHook, NULL, NULL, NULL, (void*) ofd);
- } else {
- StandardGetFile(NULL, -1, NULL, &reply);
- }
- } else if (isOpen == SAVE_FILE) {
- static Str255 prompt = "\pSave as";
-
- if (ofd != NULL && ofd->usePopup) {
- /*
- * Currently this never gets called because we don't use
- * popup for the save dialog.
- */
- CustomPutFile(prompt, initialFile, &reply, OPEN_BOX,
- mypoint, saveHook, NULL, NULL, NULL, (void *) ofd);
- } else {
- StandardPutFile(prompt, initialFile, &reply);
- }
- }
-
- /*
- * Now parse the reply, and populate the Tcl result.
- */
-
- if (reply.sfGood) {
- int length;
- Handle pathHandle;
-
- pathHandle = NULL;
- FSpPathFromLocation(&reply.sfFile, &length, &pathHandle);
- if (pathHandle != NULL) {
- Tcl_DString ds;
-
- HLock(pathHandle);
- Tcl_ExternalToUtfDString(NULL, (char *) *pathHandle, -1, &ds);
- Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL);
- Tcl_DStringFree(&ds);
- HUnlock(pathHandle);
- DisposeHandle(pathHandle);
- }
- }
-
- if (menu != NULL) {
- DisposeMenu(menu);
- }
-
- return TCL_OK;
-}
-/*
- *----------------------------------------------------------------------
- *
- * OpenHookProc --
- *
- * Gets called for various events that occur in the file dialog box.
- * Initializes the popup menu or rebuild the file list depending on
- * the type of the event.
- *
- * Results:
- * A standard result understood by the Mac file dialog event dispatcher.
- *
- * Side effects:
- * The contents in the file dialog may be changed depending on
- * the type of the event.
- *----------------------------------------------------------------------
- */
-
-static pascal short
-OpenHookProc(
- short item, /* Event description. */
- DialogPtr theDialog, /* The dialog where the event occurs. */
- OpenFileData *ofdPtr) /* Information about the file dialog. */
-{
- short ignore;
- Rect rect;
- Handle handle;
- int newType;
-
- switch (item) {
- case sfHookFirstCall:
- if (ofdPtr->usePopup) {
- /*
- * Set the popup list to display the selected type.
- */
- GetDialogItem(theDialog, ofdPtr->popupItem, &ignore, &handle,
- &rect);
- SetControlValue((ControlRef) handle, ofdPtr->curType + 1);
- }
- return sfHookNullEvent;
-
- case OPEN_POPUP_ITEM:
- if (ofdPtr->usePopup) {
- GetDialogItem(theDialog, ofdPtr->popupItem,
- &ignore, &handle, &rect);
- newType = GetControlValue((ControlRef) handle) - 1;
- 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 {
- ofdPtr->curType = newType;
- }
- return sfHookRebuildList;
- }
- }
- break;
- }
-
- return item;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * FileFilterProc --
- *
- * Filters files according to file types. Get called whenever the
- * file list needs to be updated inside the dialog box.
- *
- * Results:
- * Returns MATCHED if the file should be shown in the listbox, returns
- * UNMATCHED otherwise.
- *
- * Side effects:
- * If MATCHED is returned, the file is shown in the listbox.
- *
- *----------------------------------------------------------------------
- */
-
-static pascal Boolean
-FileFilterProc(
- CInfoPBPtr pb, /* Information about the file */
- void *myData) /* Client data for this file dialog */
-{
- int i;
- OpenFileData * ofdPtr = (OpenFileData*)myData;
- FileFilter * filterPtr;
-
- if (ofdPtr->fl.numFilters == 0) {
- /*
- * No types have been specified. List all files by default
- */
- return MATCHED;
- }
-
- if (pb->dirInfo.ioFlAttrib & 0x10) {
- /*
- * This is a directory: always show it
- */
- return MATCHED;
- }
-
- if (ofdPtr->usePopup) {
- i = ofdPtr->curType;
- for (filterPtr=ofdPtr->fl.filters; filterPtr && i>0; i--) {
- filterPtr = filterPtr->next;
- }
- if (filterPtr) {
- return MatchOneType(pb->hFileInfo.ioNamePtr, pb->hFileInfo.ioFlFndrInfo.fdType,
- ofdPtr, filterPtr);
- } else {
- return UNMATCHED;
- }
- } else {
- /*
- * We are not using the popup menu. In this case, the file is
- * considered matched if it matches any of the file filters.
- */
-
- for (filterPtr=ofdPtr->fl.filters; filterPtr;
- filterPtr=filterPtr->next) {
- if (MatchOneType(pb->hFileInfo.ioNamePtr, pb->hFileInfo.ioFlFndrInfo.fdType,
- ofdPtr, filterPtr) == MATCHED) {
- return MATCHED;
- }
- }
- return UNMATCHED;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MatchOneType --
- *
- * Match a file with one file type in the list of file types.
- *
- * Results:
- * Returns MATCHED if the file matches with the file type; returns
- * UNMATCHED otherwise.
- *
- * Side effects:
- * None
- *
- *----------------------------------------------------------------------
- */
-
-static Boolean
-MatchOneType(
- StringPtr fileNamePtr, /* Name of the file */
- OSType fileType, /* Type of the file */
- OpenFileData * ofdPtr, /* Information about this file dialog */
- FileFilter * filterPtr) /* Match the file described by pb against
- * this filter */
-{
- FileFilterClause * clausePtr;
-
- /*
- * A file matches with a file type if it matches with at least one
- * clause of the type.
- *
- * If the clause has both glob patterns and ostypes, the file must
- * match with at least one pattern AND at least one ostype.
- *
- * If the clause has glob patterns only, the file must match with at least
- * one pattern.
- *
- * If the clause has mac types only, the file must match with at least
- * one mac type.
- *
- * If the clause has neither glob patterns nor mac types, it's
- * considered an error.
- */
-
- for (clausePtr=filterPtr->clauses; clausePtr; clausePtr=clausePtr->next) {
- int macMatched = 0;
- int globMatched = 0;
- GlobPattern * globPtr;
- MacFileType * mfPtr;
-
- if (clausePtr->patterns == NULL) {
- globMatched = 1;
- }
- if (clausePtr->macTypes == NULL) {
- macMatched = 1;
- }
-
- for (globPtr=clausePtr->patterns; globPtr; globPtr=globPtr->next) {
- char filename[256];
- int len;
- char * p, *q, *ext;
-
- if (fileNamePtr == NULL) {
- continue;
- }
- p = (char*)(fileNamePtr);
- len = p[0];
- strncpy(filename, p+1, len);
- filename[len] = '\0';
- ext = globPtr->pattern;
-
- if (ext[0] == '\0') {
- /*
- * We don't want any extensions: OK if the filename doesn't
- * have "." in it
- */
- for (q=filename; *q; q++) {
- if (*q == '.') {
- goto glob_unmatched;
- }
- }
- goto glob_matched;
- }
-
- if (Tcl_StringMatch(filename, ext)) {
- goto glob_matched;
- } else {
- goto glob_unmatched;
- }
-
- glob_unmatched:
- continue;
-
- glob_matched:
- globMatched = 1;
- break;
- }
-
- for (mfPtr=clausePtr->macTypes; mfPtr; mfPtr=mfPtr->next) {
- if (fileType == mfPtr->type) {
- macMatched = 1;
- break;
- }
- }
-
- if (globMatched && macMatched) {
- return MATCHED;
- }
- }
-
- return UNMATCHED;
-}
-
-
diff --git a/mac/tkMacDraw.c b/mac/tkMacDraw.c
deleted file mode 100644
index 5fd718e..0000000
--- a/mac/tkMacDraw.c
+++ /dev/null
@@ -1,1224 +0,0 @@
-/*
- * tkMacDraw.c --
- *
- * This file contains functions that preform drawing to
- * Xlib windows. Most of the functions simple emulate
- * Xlib functions.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include "X.h"
-#include "Xlib.h"
-#include <stdio.h>
-#include <tcl.h>
-
-#include <Windows.h>
-#include <Fonts.h>
-#include <QDOffscreen.h>
-#include "tkMacInt.h"
-#include "tkPort.h"
-
-#ifndef PI
-# define PI 3.14159265358979323846
-#endif
-
-/*
- * Temporary regions that can be reused.
- */
-static RgnHandle tmpRgn = NULL;
-static RgnHandle tmpRgn2 = NULL;
-
-static PixPatHandle gPenPat = NULL;
-
-/*
- * Prototypes for functions used only in this file.
- */
-static unsigned char InvertByte _ANSI_ARGS_((unsigned char data));
-
-/*
- *----------------------------------------------------------------------
- *
- * XCopyArea --
- *
- * Copies data from one drawable to another using block transfer
- * routines.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Data is moved from a window or bitmap to a second window or
- * bitmap.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XCopyArea(
- Display* display, /* Display. */
- Drawable src, /* Source drawable. */
- Drawable dest, /* Destination drawable. */
- GC gc, /* GC to use. */
- int src_x, /* X & Y, width & height */
- int src_y, /* define the source rectangle */
- unsigned int width, /* the will be copied. */
- unsigned int height,
- int dest_x, /* Dest X & Y on dest rect. */
- int dest_y)
-{
- Rect srcRect, destRect;
- BitMapPtr srcBit, destBit;
- MacDrawable *srcDraw = (MacDrawable *) src;
- MacDrawable *destDraw = (MacDrawable *) dest;
- GWorldPtr srcPort, destPort;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- short tmode;
- RGBColor origForeColor, origBackColor, whiteColor, blackColor;
-
- destPort = TkMacGetDrawablePort(dest);
- srcPort = TkMacGetDrawablePort(src);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- GetForeColor(&origForeColor);
- GetBackColor(&origBackColor);
- whiteColor.red = 0;
- whiteColor.blue = 0;
- whiteColor.green = 0;
- RGBForeColor(&whiteColor);
- blackColor.red = 0xFFFF;
- blackColor.blue = 0xFFFF;
- blackColor.green = 0xFFFF;
- RGBBackColor(&blackColor);
-
-
- TkMacSetUpClippingRgn(dest);
-
- /*
- * We will change the clip rgn in this routine, so we need to
- * be able to restore it when we exit.
- */
-
- if (tmpRgn2 == NULL) {
- tmpRgn2 = NewRgn();
- }
- GetClip(tmpRgn2);
-
- if (((TkpClipMask*)gc->clip_mask)->type == TKP_CLIP_REGION) {
- RgnHandle clipRgn = (RgnHandle)
- ((TkpClipMask*)gc->clip_mask)->value.region;
-
- int xOffset, yOffset;
-
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
-
- xOffset = destDraw->xOff + gc->clip_x_origin;
- yOffset = destDraw->yOff + gc->clip_y_origin;
-
- OffsetRgn(clipRgn, xOffset, yOffset);
-
- GetClip(tmpRgn);
- SectRgn(tmpRgn, clipRgn, tmpRgn);
-
- SetClip(tmpRgn);
-
- OffsetRgn(clipRgn, -xOffset, -yOffset);
- }
-
- srcBit = &((GrafPtr) srcPort)->portBits;
- destBit = &((GrafPtr) destPort)->portBits;
- SetRect(&srcRect, (short) (srcDraw->xOff + src_x),
- (short) (srcDraw->yOff + src_y),
- (short) (srcDraw->xOff + src_x + width),
- (short) (srcDraw->yOff + src_y + height));
- SetRect(&destRect, (short) (destDraw->xOff + dest_x),
- (short) (destDraw->yOff + dest_y),
- (short) (destDraw->xOff + dest_x + width),
- (short) (destDraw->yOff + dest_y + height));
- tmode = srcCopy;
-
- CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL);
- RGBForeColor(&origForeColor);
- RGBBackColor(&origBackColor);
- SetClip(tmpRgn2);
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XCopyPlane --
- *
- * Copies a bitmap from a source drawable to a destination
- * drawable. The plane argument specifies which bit plane of
- * the source contains the bitmap. Note that this implementation
- * ignores the gc->function.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the destination drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XCopyPlane(
- Display* display, /* Display. */
- Drawable src, /* Source drawable. */
- Drawable dest, /* Destination drawable. */
- GC gc, /* The GC to use. */
- int src_x, /* X, Y, width & height */
- int src_y, /* define the source rect. */
- unsigned int width,
- unsigned int height,
- int dest_x, /* X & Y on dest where we will copy. */
- int dest_y,
- unsigned long plane) /* Which plane to copy. */
-{
- Rect srcRect, destRect;
- BitMapPtr srcBit, destBit, maskBit;
- MacDrawable *srcDraw = (MacDrawable *) src;
- MacDrawable *destDraw = (MacDrawable *) dest;
- GWorldPtr srcPort, destPort, maskPort;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- RGBColor macColor;
- TkpClipMask *clipPtr = (TkpClipMask*)gc->clip_mask;
- short tmode;
-
- destPort = TkMacGetDrawablePort(dest);
- srcPort = TkMacGetDrawablePort(src);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(dest);
-
- srcBit = &((GrafPtr) srcPort)->portBits;
- destBit = &((GrafPtr) destPort)->portBits;
- SetRect(&srcRect, (short) (srcDraw->xOff + src_x),
- (short) (srcDraw->yOff + src_y),
- (short) (srcDraw->xOff + src_x + width),
- (short) (srcDraw->yOff + src_y + height));
- SetRect(&destRect, (short) (destDraw->xOff + dest_x),
- (short) (destDraw->yOff + dest_y),
- (short) (destDraw->xOff + dest_x + width),
- (short) (destDraw->yOff + dest_y + height));
- tmode = srcOr;
- tmode = srcCopy + transparent;
-
- if (TkSetMacColor(gc->foreground, &macColor) == true) {
- RGBForeColor(&macColor);
- }
-
- if (clipPtr == NULL || clipPtr->type == TKP_CLIP_REGION) {
-
- /*
- * Case 1: opaque bitmaps.
- */
-
- TkSetMacColor(gc->background, &macColor);
- RGBBackColor(&macColor);
- tmode = srcCopy;
- CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL);
- } else if (clipPtr->type == TKP_CLIP_PIXMAP) {
- if (clipPtr->value.pixmap == src) {
- /*
- * Case 2: transparent bitmaps. If it's color we ignore
- * the forecolor.
- */
- if ((**(srcPort->portPixMap)).pixelSize == 1) {
- tmode = srcOr;
- } else {
- tmode = transparent;
- }
- CopyBits(srcBit, destBit, &srcRect, &destRect, tmode, NULL);
- } else {
- /*
- * Case 3: two arbitrary bitmaps.
- */
- tmode = srcCopy;
- maskPort = TkMacGetDrawablePort(clipPtr->value.pixmap);
- maskBit = &((GrafPtr) maskPort)->portBits;
- CopyDeepMask(srcBit, maskBit, destBit, &srcRect, &srcRect, &destRect, tmode, NULL);
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkPutImage --
- *
- * Copies a subimage from an in-memory image to a rectangle of
- * of the specified drawable.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws the image on the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkPutImage(
- unsigned long *colors, /* Unused on Macintosh. */
- int ncolors, /* Unused on Macintosh. */
- Display* display, /* Display. */
- Drawable d, /* Drawable to place image on. */
- GC gc, /* GC to use. */
- XImage* image, /* Image to place. */
- int src_x, /* Source X & Y. */
- int src_y,
- int dest_x, /* Destination X & Y. */
- int dest_y,
- unsigned int width, /* Same width & height for both */
- unsigned int height) /* distination and source. */
-{
- MacDrawable *destDraw = (MacDrawable *) d;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- int i, j;
- BitMap bitmap;
- char *newData = NULL;
- Rect destRect, srcRect;
-
- destPort = TkMacGetDrawablePort(d);
- SetRect(&destRect, dest_x, dest_y, dest_x + width, dest_y + height);
- SetRect(&srcRect, src_x, src_y, src_x + width, src_y + height);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- if (image->depth == 1) {
-
- /*
- * This code assumes a pixel depth of 1
- */
-
- bitmap.bounds.top = bitmap.bounds.left = 0;
- bitmap.bounds.right = (short) image->width;
- bitmap.bounds.bottom = (short) image->height;
- if ((image->bytes_per_line % 2) == 1) {
- char *newPtr, *oldPtr;
- newData = (char *) ckalloc(image->height *
- (image->bytes_per_line + 1));
- newPtr = newData;
- oldPtr = image->data;
- for (i = 0; i < image->height; i++) {
- for (j = 0; j < image->bytes_per_line; j++) {
- *newPtr = InvertByte((unsigned char) *oldPtr);
- newPtr++, oldPtr++;
- }
- *newPtr = 0;
- newPtr++;
- }
- bitmap.baseAddr = newData;
- bitmap.rowBytes = image->bytes_per_line + 1;
- } else {
- newData = (char *) ckalloc(image->height * image->bytes_per_line);
- for (i = 0; i < image->height * image->bytes_per_line; i++) {
- newData[i] = InvertByte((unsigned char) image->data[i]);
- }
- bitmap.baseAddr = newData;
- bitmap.rowBytes = image->bytes_per_line;
- }
-
- CopyBits(&bitmap, &((GrafPtr) destPort)->portBits,
- &srcRect, &destRect, srcCopy, NULL);
-
- } else {
- /* Color image */
- PixMap pixmap;
-
- pixmap.bounds.left = 0;
- pixmap.bounds.top = 0;
- pixmap.bounds.right = (short) image->width;
- pixmap.bounds.bottom = (short) image->height;
- pixmap.pixelType = RGBDirect;
- pixmap.pmVersion = 4; /* 32bit clean */
- pixmap.packType = 0;
- pixmap.packSize = 0;
- pixmap.hRes = 0x00480000;
- pixmap.vRes = 0x00480000;
- pixmap.pixelSize = 32;
- pixmap.cmpCount = 3;
- pixmap.cmpSize = 8;
- pixmap.planeBytes = 0;
- pixmap.pmTable = NULL;
- pixmap.pmReserved = 0;
- pixmap.baseAddr = image->data;
- if (image->bytes_per_line >= 0x4000) {
- panic("TkImage too wide!");
- }
- pixmap.rowBytes = image->bytes_per_line | 0x8000;
-
- CopyBits((BitMap *) &pixmap, &((GrafPtr) destPort)->portBits,
- &srcRect, &destRect, srcCopy, NULL);
- }
-
- if (newData != NULL) {
- ckfree(newData);
- }
- SetGWorld(saveWorld, saveDevice);
- return Success;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XFillRectangles --
- *
- * Fill multiple rectangular areas in the given drawable.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws onto the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-int
-XFillRectangles(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- XRectangle *rectangles, /* Rectangle array. */
- int n_rectangels) /* Number of rectangles. */
-{
- MacDrawable *macWin = (MacDrawable *) d;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- Rect theRect;
- int i;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- for (i=0; i<n_rectangels; i++) {
- theRect.left = (short) (macWin->xOff + rectangles[i].x);
- theRect.top = (short) (macWin->yOff + rectangles[i].y);
- theRect.right = (short) (theRect.left + rectangles[i].width);
- theRect.bottom = (short) (theRect.top + rectangles[i].height);
- FillCRect(&theRect, gPenPat);
- }
-
- SetGWorld(saveWorld, saveDevice);
- return Success;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XDrawLines --
- *
- * Draw connected lines.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Renders a series of connected lines.
- *
- *----------------------------------------------------------------------
- */
-
-int
-XDrawLines(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- XPoint* points, /* Array of points. */
- int npoints, /* Number of points. */
- int mode) /* Line drawing mode. */
-{
- MacDrawable *macWin = (MacDrawable *) d;
- CGrafPtr saveWorld;
- GWorldPtr destPort;
- GDHandle saveDevice;
- int i;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
- if (npoints < 2) {
- return 0; /* TODO: generate BadValue error. */
- }
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- ShowPen();
-
- PenPixPat(gPenPat);
- MoveTo((short) (macWin->xOff + points[0].x),
- (short) (macWin->yOff + points[0].y));
- for (i = 1; i < npoints; i++) {
- if (mode == CoordModeOrigin) {
- LineTo((short) (macWin->xOff + points[i].x),
- (short) (macWin->yOff + points[i].y));
- } else {
- Line((short) (macWin->xOff + points[i].x),
- (short) (macWin->yOff + points[i].y));
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
- return 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XDrawSegments --
- *
- * Draw unconnected lines.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Renders a series of connected lines.
- *
- *----------------------------------------------------------------------
- */
-
-void XDrawSegments(
- Display *display,
- Drawable d,
- GC gc,
- XSegment *segments,
- int nsegments)
-{
- MacDrawable *macWin = (MacDrawable *) d;
- CGrafPtr saveWorld;
- GWorldPtr destPort;
- GDHandle saveDevice;
- int i;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- ShowPen();
-
- PenPixPat(gPenPat);
- for (i = 0; i < nsegments; i++) {
- MoveTo((short) (macWin->xOff + segments[i].x1),
- (short) (macWin->yOff + segments[i].y1));
- LineTo((short) (macWin->xOff + segments[i].x2),
- (short) (macWin->yOff + segments[i].y2));
- }
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XFillPolygon --
- *
- * Draws a filled polygon.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws a filled polygon on the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XFillPolygon(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- XPoint* points, /* Array of points. */
- int npoints, /* Number of points. */
- int shape, /* Shape to draw. */
- int mode) /* Drawing mode. */
-{
- MacDrawable *macWin = (MacDrawable *) d;
- PolyHandle polygon;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- int i;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- PenNormal();
- polygon = OpenPoly();
-
- MoveTo((short) (macWin->xOff + points[0].x),
- (short) (macWin->yOff + points[0].y));
- for (i = 1; i < npoints; i++) {
- if (mode == CoordModePrevious) {
- Line((short) (macWin->xOff + points[i].x),
- (short) (macWin->yOff + points[i].y));
- } else {
- LineTo((short) (macWin->xOff + points[i].x),
- (short) (macWin->yOff + points[i].y));
- }
- }
-
- ClosePoly();
-
- FillCPoly(polygon, gPenPat);
-
- KillPoly(polygon);
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XDrawRectangle --
- *
- * Draws a rectangle.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws a rectangle on the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XDrawRectangle(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left corner. */
- int y,
- unsigned int width, /* Width & height of rect. */
- unsigned int height)
-{
- MacDrawable *macWin = (MacDrawable *) d;
- Rect theRect;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- theRect.left = (short) (macWin->xOff + x);
- theRect.top = (short) (macWin->yOff + y);
- theRect.right = (short) (theRect.left + width);
- theRect.bottom = (short) (theRect.top + height);
-
- ShowPen();
- PenPixPat(gPenPat);
- FrameRect(&theRect);
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XDrawArc --
- *
- * Draw an arc.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws an arc on the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XDrawArc(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left of */
- int y, /* bounding rect. */
- unsigned int width, /* Width & height. */
- unsigned int height,
- int angle1, /* Staring angle of arc. */
- int angle2) /* Ending angle of arc. */
-{
- MacDrawable *macWin = (MacDrawable *) d;
- Rect theRect;
- short start, extent;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(d);
-
- display->request++;
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(d);
-
- TkMacSetUpGraphicsPort(gc);
-
- theRect.left = (short) (macWin->xOff + x);
- theRect.top = (short) (macWin->yOff + y);
- theRect.right = (short) (theRect.left + width);
- theRect.bottom = (short) (theRect.top + height);
- start = (short) (90 - (angle1 / 64));
- extent = (short) (-(angle2 / 64));
-
- ShowPen();
- PenPixPat(gPenPat);
- FrameArc(&theRect, start, extent);
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XFillArc --
- *
- * Draw a filled arc.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws a filled arc on the specified drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XFillArc(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left of */
- int y, /* bounding rect. */
- unsigned int width, /* Width & height. */
- unsigned int height,
- int angle1, /* Staring angle of arc. */
- int angle2) /* Ending angle of arc. */
-{
- MacDrawable *macWin = (MacDrawable *) d;
- Rect theRect;
- short start, extent;
- PolyHandle polygon;
- 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);
-
- theRect.left = (short) (macWin->xOff + x);
- theRect.top = (short) (macWin->yOff + y);
- theRect.right = (short) (theRect.left + width);
- theRect.bottom = (short) (theRect.top + height);
- start = (short) (90 - (angle1 / 64));
- extent = (short) (- (angle2 / 64));
-
- if (gc->arc_mode == ArcChord) {
- boxWidth = theRect.right - theRect.left;
- boxHeight = theRect.bottom - theRect.top;
- angle = -(angle1/64.0)*PI/180.0;
- sin1 = sin(angle);
- cos1 = cos(angle);
- angle -= (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
- * a damage region.
- *
- * Results:
- * Returns 0 if the scroll genereated no additional damage.
- * Otherwise, sets the region that needs to be repainted after
- * scrolling and returns 1.
- *
- * Side effects:
- * Scrolls the bits in the window.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkScrollWindow(
- Tk_Window tkwin, /* The window to be scrolled. */
- GC gc, /* GC for window to be scrolled. */
- int x, /* Position rectangle to be scrolled. */
- int y,
- int width,
- int height,
- int dx, /* Distance rectangle should be moved. */
- int dy,
- TkRegion damageRgn) /* Region to accumulate damage in. */
-{
- MacDrawable *destDraw = (MacDrawable *) Tk_WindowId(tkwin);
- RgnHandle rgn = (RgnHandle) damageRgn;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- Rect srcRect, scrollRect;
-
- destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin));
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(Tk_WindowId(tkwin));
-
- /*
- * Due to the implementation below the behavior may be differnt
- * than X in certain cases that should never occur in Tk. The
- * scrollRect is the source rect extended by the offset (the union
- * of the source rect and the offset rect). Everything
- * in the extended scrollRect is scrolled. On X, it's possible
- * to "skip" over an area if the offset makes the source and
- * destination rects disjoint and non-aligned.
- */
-
- SetRect(&srcRect, (short) (destDraw->xOff + x),
- (short) (destDraw->yOff + y),
- (short) (destDraw->xOff + x + width),
- (short) (destDraw->yOff + y + height));
- scrollRect = srcRect;
- if (dx < 0) {
- scrollRect.left += dx;
- } else {
- scrollRect.right += dx;
- }
- if (dy < 0) {
- scrollRect.top += dy;
- } else {
- scrollRect.bottom += dy;
- }
-
- /*
- * Adjust clip region so that we don't copy any windows
- * that may overlap us.
- */
- RectRgn(rgn, &srcRect);
- DiffRgn(rgn, destPort->visRgn, rgn);
- OffsetRgn(rgn, dx, dy);
- DiffRgn(destPort->clipRgn, rgn, destPort->clipRgn);
- SetEmptyRgn(rgn);
-
- /*
- * When a menu is up, the Mac does not expect drawing to occur and
- * does not clip out the menu. We have to do it ourselves. This
- * is pretty gross.
- */
-
- if (tkUseMenuCascadeRgn == 1) {
- Point scratch = {0, 0};
- MacDrawable *macDraw = (MacDrawable *) Tk_WindowId(tkwin);
-
- LocalToGlobal(&scratch);
- CopyRgn(tkMenuCascadeRgn, rgn);
- OffsetRgn(rgn, -scratch.h, -scratch.v);
- DiffRgn(destPort->clipRgn, rgn, destPort->clipRgn);
- SetEmptyRgn(rgn);
- macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU;
- }
-
- ScrollRect(&scrollRect, dx, dy, rgn);
-
- SetGWorld(saveWorld, saveDevice);
-
- /*
- * 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.
- */
- if (EmptyRgn(rgn)) {
- return 0;
- } else {
- return 1;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacSetUpGraphicsPort --
- *
- * Set up the graphics port from the given GC.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The current port is adjusted.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacSetUpGraphicsPort(
- GC gc) /* GC to apply to current port. */
-{
- RGBColor macColor;
-
- if (gPenPat == NULL) {
- gPenPat = NewPixPat();
- }
-
- 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);
- }
- if (gc->line_style != LineSolid) {
- unsigned char *p = (unsigned char *) &(gc->dashes);
- /*
- * Here the dash pattern should be set in the drawing,
- * environment, but I don't know how to do that for the Mac.
- *
- * p[] is an array of unsigned chars containing the dash list.
- * A '\0' indicates the end of this list.
- *
- * Someone knows how to implement this? If you have a more
- * complete implementation of SetUpGraphicsPort() for
- * the Mac (or for Windows), please let me know.
- *
- * Jan Nijtmans
- * CMG Arnhem, B.V.
- * email: j.nijtmans@chello.nl (private)
- * jan.nijtmans@cmg.nl (work)
- * url: http://purl.oclc.org/net/nijtmans/
- */
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacSetUpClippingRgn --
- *
- * Set up the clipping region so that drawing only occurs on the
- * specified X subwindow.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The clipping region in the current port is changed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacSetUpClippingRgn(
- Drawable drawable) /* Drawable to update. */
-{
- MacDrawable *macDraw = (MacDrawable *) drawable;
-
- if (macDraw->winPtr != NULL) {
- if (macDraw->flags & TK_CLIP_INVALID) {
- TkMacUpdateClipRgn(macDraw->winPtr);
- }
-
- /*
- * When a menu is up, the Mac does not expect drawing to occur and
- * does not clip out the menu. We have to do it ourselves. This
- * is pretty gross.
- */
-
- if (macDraw->clipRgn != NULL) {
- if (tkUseMenuCascadeRgn == 1) {
- Point scratch = {0, 0};
- GDHandle saveDevice;
- GWorldPtr saveWorld;
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(TkMacGetDrawablePort(drawable), NULL);
- LocalToGlobal(&scratch);
- SetGWorld(saveWorld, saveDevice);
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
- CopyRgn(tkMenuCascadeRgn, tmpRgn);
- OffsetRgn(tmpRgn, -scratch.h, -scratch.v);
- DiffRgn(macDraw->clipRgn, tmpRgn, tmpRgn);
- SetClip(tmpRgn);
- macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU;
- } else {
- SetClip(macDraw->clipRgn);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacMakeStippleMap --
- *
- * Given a drawable and a stipple pattern this function draws the
- * pattern repeatedly over the drawable. The drawable can then
- * be used as a mask for bit-bliting a stipple pattern over an
- * object.
- *
- * Results:
- * A BitMap data structure.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-BitMapPtr
-TkMacMakeStippleMap(
- Drawable drawable, /* Window to apply stipple. */
- Drawable stipple) /* The stipple pattern. */
-{
- MacDrawable *destDraw = (MacDrawable *) drawable;
- GWorldPtr destPort;
- BitMapPtr bitmapPtr;
- int width, height, stippleHeight, stippleWidth;
- int i, j;
- char * data;
- Rect bounds;
-
- destPort = TkMacGetDrawablePort(drawable);
- width = destPort->portRect.right - destPort->portRect.left;
- height = destPort->portRect.bottom - destPort->portRect.top;
-
- bitmapPtr = (BitMap *) ckalloc(sizeof(BitMap));
- data = (char *) ckalloc(height * ((width / 8) + 1));
- bitmapPtr->bounds.top = bitmapPtr->bounds.left = 0;
- bitmapPtr->bounds.right = (short) width;
- bitmapPtr->bounds.bottom = (short) height;
- bitmapPtr->baseAddr = data;
- bitmapPtr->rowBytes = (width / 8) + 1;
-
- destPort = TkMacGetDrawablePort(stipple);
- stippleWidth = destPort->portRect.right - destPort->portRect.left;
- stippleHeight = destPort->portRect.bottom - destPort->portRect.top;
-
- for (i = 0; i < height; i += stippleHeight) {
- for (j = 0; j < width; j += stippleWidth) {
- bounds.left = j;
- bounds.top = i;
- bounds.right = j + stippleWidth;
- bounds.bottom = i + stippleHeight;
-
- CopyBits(&((GrafPtr) destPort)->portBits, bitmapPtr,
- &((GrafPtr) destPort)->portRect, &bounds, srcCopy, NULL);
- }
- }
- return bitmapPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * InvertByte --
- *
- * This function reverses the bits in the passed in Byte of data.
- *
- * Results:
- * The incoming byte in reverse bit order.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static unsigned char
-InvertByte(
- unsigned char data) /* Byte of data. */
-{
- unsigned char i;
- unsigned char mask = 1, result = 0;
-
- for (i = (1 << 7); i != 0; i /= 2) {
- if (data & mask) {
- result |= i;
- }
- mask = mask << 1;
- }
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDrawHighlightBorder --
- *
- * This procedure draws a rectangular ring around the outside of
- * a widget to indicate that it has received the input focus.
- *
- * On the Macintosh, this puts a 1 pixel border in the bgGC color
- * between the widget and the focus ring, except in the case where
- * highlightWidth is 1, in which case the border is left out.
- *
- * For proper Mac L&F, use highlightWidth of 3.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A rectangle "width" pixels wide is drawn in "drawable",
- * corresponding to the outer area of "tkwin".
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDrawHighlightBorder (
- Tk_Window tkwin,
- GC fgGC,
- GC bgGC,
- int highlightWidth,
- Drawable drawable)
-{
- if (highlightWidth == 1) {
- TkDrawInsetFocusHighlight (tkwin, fgGC, highlightWidth, drawable, 0);
- } else {
- TkDrawInsetFocusHighlight (tkwin, bgGC, highlightWidth, drawable, 0);
- if (fgGC != bgGC) {
- TkDrawInsetFocusHighlight (tkwin, fgGC, highlightWidth - 1, drawable, 0);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDrawFrame --
- *
- * This procedure draws the rectangular frame area.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Draws inside the tkwin area.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDrawFrame (Tk_Window tkwin, Tk_3DBorder border,
- int highlightWidth, int borderWidth, int relief)
-{
- Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin),
- border, highlightWidth, highlightWidth,
- Tk_Width(tkwin) - 2 * highlightWidth,
- Tk_Height(tkwin) - 2 * highlightWidth,
- borderWidth, relief);
-}
diff --git a/mac/tkMacEmbed.c b/mac/tkMacEmbed.c
deleted file mode 100644
index 77908da..0000000
--- a/mac/tkMacEmbed.c
+++ /dev/null
@@ -1,1205 +0,0 @@
-/*
- * tkMacEmbed.c --
- *
- * This file contains platform-specific procedures for theMac to provide
- * basic operations needed for application embedding (where one
- * application can use as its main window an internal window from
- * some other application).
- * Currently only Toplevel embedding within the same Tk application is
- * allowed on the Macintosh.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include "tkPort.h"
-#include "X.h"
-#include "Xlib.h"
-#include <stdio.h>
-
-#include <Windows.h>
-#include <QDOffscreen.h>
-#include "tkMacInt.h"
-
-/*
- * One of the following structures exists for each container in this
- * application. It keeps track of the container window and its
- * associated embedded window.
- */
-
-typedef struct Container {
- Window parent; /* The Mac Drawable for the parent of
- * the pair (the container). */
- TkWindow *parentPtr; /* Tk's information about the container,
- * or NULL if the container isn't
- * in this process. */
- Window embedded; /* The MacDrawable for the embedded
- * window. Starts off as None, but
- * gets filled in when the window is
- * eventually created. */
- TkWindow *embeddedPtr; /* Tk's information about the embedded
- * window, or NULL if the
- * embedded application isn't in
- * this process. */
- struct Container *nextPtr; /* Next in list of all containers in
- * this process. */
-} Container;
-
-static Container *firstContainerPtr = NULL;
- /* First in list of all containers
- * managed by this process. */
-/*
- * Globals defined in this file
- */
-
-TkMacEmbedHandler *gMacEmbedHandler = NULL;
-
-/*
- * Prototypes for static procedures defined in this file:
- */
-
-static void ContainerEventProc _ANSI_ARGS_((
- ClientData clientData, XEvent *eventPtr));
-static void EmbeddedEventProc _ANSI_ARGS_((
- ClientData clientData, XEvent *eventPtr));
-static void EmbedActivateProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static void EmbedFocusProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static void EmbedGeometryRequest _ANSI_ARGS_((
- Container * containerPtr, int width, int height));
-static void EmbedSendConfigure _ANSI_ARGS_((
- Container *containerPtr));
-static void EmbedStructureProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static void EmbedWindowDeleted _ANSI_ARGS_((TkWindow *winPtr));
-
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_MacSetEmbedHandler --
- *
- * Registers a handler for an in process form of embedding, like
- * Netscape plugins, where Tk is loaded into the process, but does
- * not control the main window
- *
- * Results:
- * None
- *
- * Side effects:
- * The embed handler is set.
- *
- *----------------------------------------------------------------------
- */
-void
-Tk_MacSetEmbedHandler(
- Tk_MacEmbedRegisterWinProc *registerWinProc,
- Tk_MacEmbedGetGrafPortProc *getPortProc,
- Tk_MacEmbedMakeContainerExistProc *containerExistProc,
- Tk_MacEmbedGetClipProc *getClipProc,
- Tk_MacEmbedGetOffsetInParentProc *getOffsetProc)
-{
- if (gMacEmbedHandler == NULL) {
- gMacEmbedHandler = (TkMacEmbedHandler *) ckalloc(sizeof(TkMacEmbedHandler));
- }
- gMacEmbedHandler->registerWinProc = registerWinProc;
- gMacEmbedHandler->getPortProc = getPortProc;
- gMacEmbedHandler->containerExistProc = containerExistProc;
- gMacEmbedHandler->getClipProc = getClipProc;
- gMacEmbedHandler->getOffsetProc = getOffsetProc;
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMakeWindow --
- *
- * Creates an X Window (Mac subwindow).
- *
- * Results:
- * The window id is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Window
-TkpMakeWindow(
- TkWindow *winPtr,
- Window parent)
-{
- MacDrawable *macWin;
- XEvent event;
-
- /*
- * If this window is marked as embedded then
- * the window structure should have already been
- * created in the TkpUseWindow function.
- */
-
- if (Tk_IsEmbedded(winPtr)) {
- return (Window) winPtr->privatePtr;
- }
-
- /*
- * Allocate sub window
- */
-
- macWin = (MacDrawable *) ckalloc(sizeof(MacDrawable));
- if (macWin == NULL) {
- winPtr->privatePtr = NULL;
- return None;
- }
- macWin->winPtr = winPtr;
- winPtr->privatePtr = macWin;
- macWin->clipRgn = NewRgn();
- macWin->aboveClipRgn = NewRgn();
- macWin->referenceCount = 0;
- macWin->flags = TK_CLIP_INVALID;
-
- if (Tk_IsTopLevel(macWin->winPtr)) {
-
- /*
- *This will be set when we are mapped.
- */
-
- macWin->portPtr = (GWorldPtr) NULL;
- macWin->toplevel = macWin;
- macWin->xOff = 0;
- macWin->yOff = 0;
- } else {
- macWin->portPtr = NULL;
- macWin->xOff = winPtr->parentPtr->privatePtr->xOff +
- winPtr->parentPtr->changes.border_width +
- winPtr->changes.x;
- macWin->yOff = winPtr->parentPtr->privatePtr->yOff +
- winPtr->parentPtr->changes.border_width +
- winPtr->changes.y;
- macWin->toplevel = winPtr->parentPtr->privatePtr->toplevel;
- }
-
- macWin->toplevel->referenceCount++;
-
- /*
- * TODO: need general solution for visibility events.
- */
- event.xany.serial = Tk_Display(winPtr)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(winPtr);
-
- event.xvisibility.type = VisibilityNotify;
- event.xvisibility.window = (Window) macWin;;
- event.xvisibility.state = VisibilityUnobscured;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- return (Window) macWin;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpUseWindow --
- *
- * This procedure causes a Tk window to use a given X window as
- * its parent window, rather than the root window for the screen.
- * It is invoked by an embedded application to specify the window
- * in which it is embedded.
- *
- * 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 the interp's result if
- * interp is non-NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpUseWindow(
- Tcl_Interp *interp, /* If not NULL, used for error reporting
- * if string is bogus. */
- Tk_Window tkwin, /* Tk window that does not yet have an
- * associated X window. */
- CONST char *string) /* String identifying an X window to use
- * for tkwin; must be an integer value. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- TkWindow *usePtr;
- MacDrawable *parent, *macWin;
- Container *containerPtr;
- XEvent event;
- int result;
-
- if (winPtr->window != None) {
- panic("TkpUseWindow: X window already assigned");
- }
-
- /*
- * Decode the container pointer, and look for it among the
- *list of available containers.
- *
- * N.B. For now, we are limiting the containers to be in the same Tk
- * application as tkwin, since otherwise they would not be in our list
- * of containers.
- *
- */
-
- if (Tcl_GetInt(interp, string, &result) != TCL_OK) {
- return TCL_ERROR;
- }
-
- usePtr = (TkWindow *) Tk_IdToWindow(winPtr->display, (Window) result);
-
- if (usePtr == NULL) {
- Tcl_AppendResult(interp, "Tk window does not correspond to id \"",
- string, "\"", (char *) NULL);
- return TCL_ERROR;
- } else {
- if (!(usePtr->flags & TK_CONTAINER)) {
- Tcl_AppendResult(interp, "window \"", usePtr->pathName,
- "\" doesn't have -container option set", (char *) NULL);
- return TCL_ERROR;
- }
- }
-
- parent = (MacDrawable *) result;
-
- /*
- * Save information about the container and the embedded window
- * in a Container structure. Currently, there must already be an existing
- * Container structure, since we only allow the case where both container
- * and embedded app. are in the same process.
- */
-
- for (containerPtr = firstContainerPtr; containerPtr != NULL;
- containerPtr = containerPtr->nextPtr) {
- if (containerPtr->parent == (Window) parent) {
- winPtr->flags |= TK_BOTH_HALVES;
- containerPtr->parentPtr->flags |= TK_BOTH_HALVES;
- break;
- }
- }
-
- /*
- * Make the embedded window.
- */
-
- macWin = (MacDrawable *) ckalloc(sizeof(MacDrawable));
- if (macWin == NULL) {
- winPtr->privatePtr = NULL;
- return TCL_ERROR;
- }
-
- macWin->winPtr = winPtr;
- winPtr->privatePtr = macWin;
-
- /*
- * The portPtr will be NULL for a Tk in Tk embedded window.
- * It is none of our business what it is for a Tk not in Tk embedded window,
- * but we will initialize it to NULL, and let the registerWinProc
- * set it. In any case, you must always use TkMacGetDrawablePort
- * to get the portPtr. It will correctly find the container's port.
- */
-
- macWin->portPtr = (GWorldPtr) NULL;
-
- macWin->clipRgn = NewRgn();
- macWin->aboveClipRgn = NewRgn();
- macWin->referenceCount = 0;
- macWin->flags = TK_CLIP_INVALID;
- macWin->toplevel = macWin;
- macWin->toplevel->referenceCount++;
-
- winPtr->flags |= TK_EMBEDDED;
-
-
- /*
- * Make a copy of the TK_EMBEDDED flag, since sometimes
- * we need this to get the port after the TkWindow structure
- * has been freed.
- */
-
- macWin->flags |= TK_EMBEDDED;
-
- /*
- * Now check whether it is embedded in another Tk widget. If not (the first
- * case below) we see if there is an in-process embedding handler registered,
- * and if so, let that fill in the rest of the macWin.
- */
-
- if (containerPtr == NULL) {
- /*
- * If someone has registered an in process embedding handler, then
- * see if it can handle this window...
- */
-
- if (gMacEmbedHandler == NULL ||
- gMacEmbedHandler->registerWinProc(result, (Tk_Window) winPtr) != TCL_OK) {
- Tcl_AppendResult(interp, "The window ID ", string,
- " does not correspond to a valid Tk Window.",
- (char *) NULL);
- return TCL_ERROR;
- } else {
- containerPtr = (Container *) ckalloc(sizeof(Container));
-
- containerPtr->parentPtr = NULL;
- containerPtr->embedded = (Window) macWin;
- containerPtr->embeddedPtr = macWin->winPtr;
- containerPtr->nextPtr = firstContainerPtr;
- firstContainerPtr = containerPtr;
-
- }
- } else {
-
- /*
- * The window is embedded in another Tk window.
- */
-
- macWin->xOff = parent->winPtr->privatePtr->xOff +
- parent->winPtr->changes.border_width +
- winPtr->changes.x;
- macWin->yOff = parent->winPtr->privatePtr->yOff +
- parent->winPtr->changes.border_width +
- winPtr->changes.y;
-
-
- /*
- * Finish filling up the container structure with the embedded window's
- * information.
- */
-
- containerPtr->embedded = (Window) macWin;
- containerPtr->embeddedPtr = macWin->winPtr;
-
- /*
- * Create an event handler to clean up the Container structure when
- * tkwin is eventually deleted.
- */
-
- Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbeddedEventProc,
- (ClientData) winPtr);
-
- }
-
- /*
- * TODO: need general solution for visibility events.
- */
-
- event.xany.serial = Tk_Display(winPtr)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(winPtr);
-
- event.xvisibility.type = VisibilityNotify;
- event.xvisibility.window = (Window) macWin;;
- event.xvisibility.state = VisibilityUnobscured;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
-
- /*
- * TODO: need general solution for visibility events.
- */
-
- event.xany.serial = Tk_Display(winPtr)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(winPtr);
-
- event.xvisibility.type = VisibilityNotify;
- event.xvisibility.window = (Window) macWin;;
- event.xvisibility.state = VisibilityUnobscured;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMakeContainer --
- *
- * This procedure is called to indicate that a particular window
- * will be a container for an embedded application. This changes
- * certain aspects of the window's behavior, such as whether it
- * will receive events anymore.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpMakeContainer(
- Tk_Window tkwin) /* Token for a window that is about to
- * become a container. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- Container *containerPtr;
-
- /*
- * Register the window as a container so that, for example, we can
- * make sure the argument to -use is valid.
- */
-
-
- Tk_MakeWindowExist(tkwin);
- containerPtr = (Container *) ckalloc(sizeof(Container));
- containerPtr->parent = Tk_WindowId(tkwin);
- containerPtr->parentPtr = winPtr;
- containerPtr->embedded = None;
- containerPtr->embeddedPtr = NULL;
- containerPtr->nextPtr = firstContainerPtr;
- firstContainerPtr = containerPtr;
- winPtr->flags |= TK_CONTAINER;
-
- /*
- * Request SubstructureNotify events so that we can find out when
- * the embedded application creates its window or attempts to
- * resize it. Also watch Configure events on the container so that
- * we can resize the child to match. Also, pass activate events from
- * the container down to the embedded toplevel.
- */
-
- Tk_CreateEventHandler(tkwin,
- SubstructureNotifyMask|SubstructureRedirectMask,
- ContainerEventProc, (ClientData) winPtr);
- Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbedStructureProc,
- (ClientData) containerPtr);
- Tk_CreateEventHandler(tkwin, ActivateMask, EmbedActivateProc,
- (ClientData) containerPtr);
- Tk_CreateEventHandler(tkwin, FocusChangeMask, EmbedFocusProc,
- (ClientData) containerPtr);
-
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacContainerId --
- *
- * Given an embedded window, this procedure returns the MacDrawable
- * identifier for the associated container window.
- *
- * Results:
- * The return value is the MacDrawable for winPtr's
- * container window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-MacDrawable *
-TkMacContainerId(winPtr)
- TkWindow *winPtr; /* Tk's structure for an embedded window. */
-{
- Container *containerPtr;
-
- for (containerPtr = firstContainerPtr; containerPtr != NULL;
- containerPtr = containerPtr->nextPtr) {
- if (containerPtr->embeddedPtr == winPtr) {
- return (MacDrawable *) containerPtr->parent;
- }
- }
- panic("TkMacContainerId couldn't find window");
- return None;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGetHostToplevel --
- *
- * Given the TkWindow, return the MacDrawable for the outermost
- * toplevel containing it. This will be a real Macintosh window.
- *
- * Results:
- * Returns a MacDrawable corresponding to a Macintosh Toplevel
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-MacDrawable *
-TkMacGetHostToplevel(
- TkWindow *winPtr) /* Tk's structure for a window. */
-{
- TkWindow *contWinPtr, *topWinPtr;
-
- topWinPtr = winPtr->privatePtr->toplevel->winPtr;
- if (!Tk_IsEmbedded(topWinPtr)) {
- return winPtr->privatePtr->toplevel;
- } else {
- contWinPtr = TkpGetOtherWindow(topWinPtr);
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- if (contWinPtr != NULL) {
- return TkMacGetHostToplevel(contWinPtr);
- } else {
- return None;
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpClaimFocus --
- *
- * This procedure is invoked when someone asks for the input focus
- * to be put on a window in an embedded application, but the
- * application doesn't currently have the focus. It requests the
- * input focus from the container application.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The input focus may change.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpClaimFocus(
- TkWindow *topLevelPtr, /* Top-level window containing desired
- * focus window; should be embedded. */
- int force) /* One means that the container should
- * claim the focus if it doesn't
- * currently have it. */
-{
- XEvent event;
- Container *containerPtr;
-
- if (!(topLevelPtr->flags & TK_EMBEDDED)) {
- return;
- }
-
- for (containerPtr = firstContainerPtr;
- containerPtr->embeddedPtr != topLevelPtr;
- containerPtr = containerPtr->nextPtr) {
- /* Empty loop body. */
- }
-
-
- event.xfocus.type = FocusIn;
- event.xfocus.serial = LastKnownRequestProcessed(topLevelPtr->display);
- event.xfocus.send_event = 1;
- event.xfocus.display = topLevelPtr->display;
- event.xfocus.window = containerPtr->parent;
- event.xfocus.mode = EMBEDDED_APP_WANTS_FOCUS;
- event.xfocus.detail = force;
- Tk_QueueWindowEvent(&event,TCL_QUEUE_TAIL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpTestembedCmd --
- *
- * This procedure implements the "testembed" command. It returns
- * some or all of the information in the list pointed to by
- * firstContainerPtr.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpTestembedCmd(
- ClientData clientData, /* Main window for application. */
- Tcl_Interp *interp, /* Current interpreter. */
- int argc, /* Number of arguments. */
- CONST char **argv) /* Argument strings. */
-{
- int all;
- Container *containerPtr;
- Tcl_DString dString;
- char buffer[50];
-
- if ((argc > 1) && (strcmp(argv[1], "all") == 0)) {
- all = 1;
- } else {
- all = 0;
- }
- Tcl_DStringInit(&dString);
- for (containerPtr = firstContainerPtr; containerPtr != NULL;
- containerPtr = containerPtr->nextPtr) {
- Tcl_DStringStartSublist(&dString);
- if (containerPtr->parent == None) {
- Tcl_DStringAppendElement(&dString, "");
- } else {
- if (all) {
- sprintf(buffer, "0x%x", (int) containerPtr->parent);
- Tcl_DStringAppendElement(&dString, buffer);
- } else {
- Tcl_DStringAppendElement(&dString, "XXX");
- }
- }
- if (containerPtr->parentPtr == NULL) {
- Tcl_DStringAppendElement(&dString, "");
- } else {
- Tcl_DStringAppendElement(&dString,
- containerPtr->parentPtr->pathName);
- }
- if (containerPtr->embedded == None) {
- Tcl_DStringAppendElement(&dString, "");
- } else {
- if (all) {
- sprintf(buffer, "0x%x", (int) containerPtr->embedded);
- Tcl_DStringAppendElement(&dString, buffer);
- } else {
- Tcl_DStringAppendElement(&dString, "XXX");
- }
- }
- if (containerPtr->embeddedPtr == NULL) {
- Tcl_DStringAppendElement(&dString, "");
- } else {
- Tcl_DStringAppendElement(&dString,
- containerPtr->embeddedPtr->pathName);
- }
- Tcl_DStringEndSublist(&dString);
- }
- Tcl_DStringResult(interp, &dString);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpRedirectKeyEvent --
- *
- * This procedure is invoked when a key press or release event
- * arrives for an application that does not believe it owns the
- * input focus. This can happen because of embedding; for example,
- * X can send an event to an embedded application when the real
- * focus window is in the container application and is an ancestor
- * of the container. This procedure's job is to forward the event
- * back to the application where it really belongs.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The event may get sent to a different application.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpRedirectKeyEvent(
- TkWindow *winPtr, /* Window to which the event was originally
- * reported. */
- XEvent *eventPtr) /* X event to redirect (should be KeyPress
- * or KeyRelease). */
-{
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetOtherWindow --
- *
- * If both the container and embedded window are in the same
- * process, this procedure will return either one, given the other.
- *
- * Results:
- * If winPtr is a container, the return value is the token for the
- * embedded window, and vice versa. If the "other" window isn't in
- * this process, NULL is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkWindow *
-TkpGetOtherWindow(
- TkWindow *winPtr) /* Tk's structure for a container or
- * embedded window. */
-{
- Container *containerPtr;
-
- /*
- * TkpGetOtherWindow returns NULL if both windows are not
- * in the same process...
- */
-
- if (!(winPtr->flags & TK_BOTH_HALVES)) {
- return NULL;
- }
-
- for (containerPtr = firstContainerPtr; containerPtr != NULL;
- containerPtr = containerPtr->nextPtr) {
- if (containerPtr->embeddedPtr == winPtr) {
- return containerPtr->parentPtr;
- } else if (containerPtr->parentPtr == winPtr) {
- return containerPtr->embeddedPtr;
- }
- }
- return NULL;
-}
-/*
- *----------------------------------------------------------------------
- *
- * EmbeddedEventProc --
- *
- * This procedure is invoked by the Tk event dispatcher when various
- * useful events are received for a window that is embedded in
- * another application.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Our internal state gets cleaned up when an embedded window is
- * destroyed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbeddedEventProc(clientData, eventPtr)
- ClientData clientData; /* Token for container window. */
- XEvent *eventPtr; /* ResizeRequest event. */
-{
- TkWindow *winPtr = (TkWindow *) clientData;
-
- if (eventPtr->type == DestroyNotify) {
- EmbedWindowDeleted(winPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ContainerEventProc --
- *
- * This procedure is invoked by the Tk event dispatcher when various
- * useful events are received for the children of a container
- * window. It forwards relevant information, such as geometry
- * requests, from the events into the container's application.
- *
- * NOTE: on the Mac, only the DestroyNotify branch is ever taken.
- * We don't synthesize the other events.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Depends on the event. For example, when ConfigureRequest events
- * occur, geometry information gets set for the container window.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ContainerEventProc(clientData, eventPtr)
- ClientData clientData; /* Token for container window. */
- XEvent *eventPtr; /* ResizeRequest event. */
-{
- TkWindow *winPtr = (TkWindow *) clientData;
- Container *containerPtr;
- Tk_ErrorHandler errHandler;
-
- /*
- * Ignore any X protocol errors that happen in this procedure
- * (almost any operation could fail, for example, if the embedded
- * application has deleted its window).
- */
-
- errHandler = Tk_CreateErrorHandler(eventPtr->xfocus.display, -1,
- -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL);
-
- /*
- * Find the Container structure associated with the parent window.
- */
-
- for (containerPtr = firstContainerPtr;
- containerPtr->parent != eventPtr->xmaprequest.parent;
- containerPtr = containerPtr->nextPtr) {
- if (containerPtr == NULL) {
- panic("ContainerEventProc couldn't find Container record");
- }
- }
-
- if (eventPtr->type == CreateNotify) {
- /*
- * A new child window has been created in the container. Record
- * its id in the Container structure (if more than one child is
- * created, just remember the last one and ignore the earlier
- * ones).
- */
-
- containerPtr->embedded = eventPtr->xcreatewindow.window;
- } else if (eventPtr->type == ConfigureRequest) {
- if ((eventPtr->xconfigurerequest.x != 0)
- || (eventPtr->xconfigurerequest.y != 0)) {
- /*
- * The embedded application is trying to move itself, which
- * isn't legal. At this point, the window hasn't actually
- * moved, but we need to send it a ConfigureNotify event to
- * let it know that its request has been denied. If the
- * embedded application was also trying to resize itself, a
- * ConfigureNotify will be sent by the geometry management
- * code below, so we don't need to do anything. Otherwise,
- * generate a synthetic event.
- */
-
- if ((eventPtr->xconfigurerequest.width == winPtr->changes.width)
- && (eventPtr->xconfigurerequest.height
- == winPtr->changes.height)) {
- EmbedSendConfigure(containerPtr);
- }
- }
- EmbedGeometryRequest(containerPtr,
- eventPtr->xconfigurerequest.width,
- eventPtr->xconfigurerequest.height);
- } else if (eventPtr->type == MapRequest) {
- /*
- * The embedded application's map request was ignored and simply
- * passed on to us, so we have to map the window for it to appear
- * on the screen.
- */
-
- XMapWindow(eventPtr->xmaprequest.display,
- eventPtr->xmaprequest.window);
- } else if (eventPtr->type == DestroyNotify) {
- /*
- * The embedded application is gone. Destroy the container window.
- */
-
- Tk_DestroyWindow((Tk_Window) winPtr);
- }
- Tk_DeleteErrorHandler(errHandler);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedStructureProc --
- *
- * This procedure is invoked by the Tk event dispatcher when
- * a container window owned by this application gets resized
- * (and also at several other times that we don't care about).
- * This procedure reflects the size change in the embedded
- * window that corresponds to the container.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The embedded window gets resized to match the container.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedStructureProc(clientData, eventPtr)
- ClientData clientData; /* Token for container window. */
- XEvent *eventPtr; /* ResizeRequest event. */
-{
- Container *containerPtr = (Container *) clientData;
- Tk_ErrorHandler errHandler;
-
- if (eventPtr->type == ConfigureNotify) {
- if (containerPtr->embedded != None) {
- /*
- * Ignore errors, since the embedded application could have
- * deleted its window.
- */
-
- errHandler = Tk_CreateErrorHandler(eventPtr->xfocus.display, -1,
- -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL);
- Tk_MoveResizeWindow((Tk_Window) containerPtr->embeddedPtr, 0, 0,
- (unsigned int) Tk_Width(
- (Tk_Window) containerPtr->parentPtr),
- (unsigned int) Tk_Height(
- (Tk_Window) containerPtr->parentPtr));
- Tk_DeleteErrorHandler(errHandler);
- }
- } else if (eventPtr->type == DestroyNotify) {
- EmbedWindowDeleted(containerPtr->parentPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedActivateProc --
- *
- * This procedure is invoked by the Tk event dispatcher when
- * Activate and Deactivate events occur for a container window owned
- * by this application. It is responsible for forwarding an activate
- * event down into the embedded toplevel.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The X focus may change.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedActivateProc(clientData, eventPtr)
- ClientData clientData; /* Token for container window. */
- XEvent *eventPtr; /* ResizeRequest event. */
-{
- Container *containerPtr = (Container *) clientData;
-
- if (containerPtr->embeddedPtr != NULL) {
- if (eventPtr->type == ActivateNotify) {
- TkGenerateActivateEvents(containerPtr->embeddedPtr,1);
- } else if (eventPtr->type == DeactivateNotify) {
- TkGenerateActivateEvents(containerPtr->embeddedPtr,0);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedFocusProc --
- *
- * This procedure is invoked by the Tk event dispatcher when
- * FocusIn and FocusOut events occur for a container window owned
- * by this application. It is responsible for moving the focus
- * back and forth between a container application and an embedded
- * application.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The X focus may change.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedFocusProc(clientData, eventPtr)
- ClientData clientData; /* Token for container window. */
- XEvent *eventPtr; /* ResizeRequest event. */
-{
- Container *containerPtr = (Container *) clientData;
- Display *display;
- XEvent event;
-
- if (containerPtr->embeddedPtr != NULL) {
- display = Tk_Display(containerPtr->parentPtr);
- event.xfocus.serial = LastKnownRequestProcessed(display);
- event.xfocus.send_event = false;
- event.xfocus.display = display;
- event.xfocus.mode = NotifyNormal;
- event.xfocus.window = containerPtr->embedded;
-
- if (eventPtr->type == FocusIn) {
- /*
- * The focus just arrived at the container. Change the X focus
- * to move it to the embedded application, if there is one.
- * Ignore X errors that occur during this operation (it's
- * possible that the new focus window isn't mapped).
- */
-
- event.xfocus.detail = NotifyNonlinear;
- event.xfocus.type = FocusIn;
-
- } else if (eventPtr->type == FocusOut) {
- /* When the container gets a FocusOut event, it has to tell the embedded app
- * that it has lost the focus.
- */
-
- event.xfocus.type = FocusOut;
- event.xfocus.detail = NotifyNonlinear;
- }
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_MARK);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedGeometryRequest --
- *
- * This procedure is invoked when an embedded application requests
- * a particular size. It processes the request (which may or may
- * not actually honor the request) and reflects the results back
- * to the embedded application.
- *
- * NOTE: On the Mac, this is a stub, since we don't synthesize
- * ConfigureRequest events.
- *
- * Results:
- * None.
- *
- * Side effects:
- * If we deny the child's size change request, a Configure event
- * is synthesized to let the child know how big it ought to be.
- * Events get processed while we're waiting for the geometry
- * managers to do their thing.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedGeometryRequest(containerPtr, width, height)
- Container *containerPtr; /* Information about the embedding. */
- int width, height; /* Size that the child has requested. */
-{
- TkWindow *winPtr = containerPtr->parentPtr;
-
- /*
- * Forward the requested size into our geometry management hierarchy
- * via the container window. We need to send a Configure event back
- * to the embedded application if we decide not to honor its
- * request; to make this happen, process all idle event handlers
- * synchronously here (so that the geometry managers have had a
- * chance to do whatever they want to do), and if the window's size
- * didn't change then generate a configure event.
- */
-
- Tk_GeometryRequest((Tk_Window) winPtr, width, height);
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)) {
- /* Empty loop body. */
- }
- if ((winPtr->changes.width != width)
- || (winPtr->changes.height != height)) {
- EmbedSendConfigure(containerPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedSendConfigure --
- *
- * This is currently a stub. It is called to notify an
- * embedded application of its current size and location. This
- * procedure is called when the embedded application made a
- * geometry request that we did not grant, so that the embedded
- * application knows that its geometry didn't change after all.
- * It is a response to ConfigureRequest events, which we do not
- * currently synthesize on the Mac
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedSendConfigure(containerPtr)
- Container *containerPtr; /* Information about the embedding. */
-{
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * EmbedWindowDeleted --
- *
- * This procedure is invoked when a window involved in embedding
- * (as either the container or the embedded application) is
- * destroyed. It cleans up the Container structure for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A Container structure may be freed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-EmbedWindowDeleted(winPtr)
- TkWindow *winPtr; /* Tk's information about window that
- * was deleted. */
-{
- Container *containerPtr, *prevPtr;
-
- /*
- * Find the Container structure for this window. Delete the
- * information about the embedded application and free the container's
- * record.
- */
-
- prevPtr = NULL;
- containerPtr = firstContainerPtr;
- while (1) {
- if (containerPtr->embeddedPtr == winPtr) {
-
- /*
- * We also have to destroy our parent, to clean up the container.
- * Fabricate an event to do this.
- */
-
- if (containerPtr->parentPtr != NULL &&
- containerPtr->parentPtr->flags & TK_BOTH_HALVES) {
- XEvent event;
-
- event.xany.serial =
- Tk_Display(containerPtr->parentPtr)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(containerPtr->parentPtr);
-
- event.xany.type = DestroyNotify;
- event.xany.window = containerPtr->parent;
- event.xdestroywindow.event = containerPtr->parent;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_HEAD);
-
- }
-
- containerPtr->embedded = None;
- containerPtr->embeddedPtr = NULL;
-
- break;
- }
- if (containerPtr->parentPtr == winPtr) {
- containerPtr->parentPtr = NULL;
- break;
- }
- prevPtr = containerPtr;
- containerPtr = containerPtr->nextPtr;
- }
- if ((containerPtr->embeddedPtr == NULL)
- && (containerPtr->parentPtr == NULL)) {
- if (prevPtr == NULL) {
- firstContainerPtr = containerPtr->nextPtr;
- } else {
- prevPtr->nextPtr = containerPtr->nextPtr;
- }
- ckfree((char *) containerPtr);
- }
-}
-
diff --git a/mac/tkMacFont.c b/mac/tkMacFont.c
deleted file mode 100644
index 2cf270b..0000000
--- a/mac/tkMacFont.c
+++ /dev/null
@@ -1,2150 +0,0 @@
-/*
- * tkMacFont.c --
- *
- * Contains the Macintosh implementation of the platform-independant
- * font package interface.
- *
- * Copyright (c) 1990-1994 The Regents of the University of California.
- * Copyright (c) 1994-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.
- */
-
-#include <Windows.h>
-#include <Strings.h>
-#include <Fonts.h>
-#include <Script.h>
-#include <Resources.h>
-#include <TextUtils.h>
-
-#include "tkMacInt.h"
-#include "tkFont.h"
-
-/*
- * 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. */
- 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;
-
-/*
- * 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,
- CONST 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 CONST 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");
- AppendResMenu(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;
- }
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * TkpGetNativeFont --
- *
- * Map a platform-specific native font name to a TkFont.
- *
- * Results:
- * The return value is a pointer to a TkFont that represents the
- * native font. If a native font by the given name could not be
- * found, the return value is NULL.
- *
- * Every call to this procedure returns a new TkFont structure,
- * even if the name has already been seen before. The caller should
- * call TkpDeleteFont() when the font is no longer needed.
- *
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generics TkFont before calling TkpDeleteFont().
- *
- * Side effects:
- * None.
- *
- *---------------------------------------------------------------------------
- */
-
-TkFont *
-TkpGetNativeFont(
- Tk_Window tkwin, /* For display where font will be used. */
- CONST char *name) /* Platform-specific font name. */
-{
- short family;
- MacFont *fontPtr;
-
- if (strcmp(name, "system") == 0) {
- family = GetSysFont();
- } else if (strcmp(name, "application") == 0) {
- family = GetAppFont();
- } else {
- return NULL;
- }
-
- fontPtr = (MacFont *) ckalloc(sizeof(MacFont));
- InitFont(tkwin, family, 0, 0, fontPtr);
-
- return (TkFont *) fontPtr;
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * TkpGetFontFromAttributes --
- *
- * Given a desired set of attributes for a font, find a font with
- * the closest matching attributes.
- *
- * Results:
- * The return value is a pointer to a TkFont that represents the
- * font with the desired attributes. If a font with the desired
- * attributes could not be constructed, some other font will be
- * substituted automatically.
- *
- * Every call to this procedure returns a new TkFont structure,
- * even if the specified attributes have already been seen before.
- * The caller should call TkpDeleteFont() to free the platform-
- * specific data when the font is no longer needed.
- *
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generic TkFont before calling TkpDeleteFont().
- *
- * Side effects:
- * None.
- *
- *---------------------------------------------------------------------------
- */
-TkFont *
-TkpGetFontFromAttributes(
- 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. */
- Tk_Window tkwin, /* For display where font will be used. */
- CONST TkFontAttributes *faPtr)
- /* Set of attributes to match. */
-{
- short faceNum, style;
- int i, j;
- CONST char *faceName;
- char *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;
- }
- }
- }
-
- found:
- style = 0;
- if (faPtr->weight != TK_FW_NORMAL) {
- style |= bold;
- }
- if (faPtr->slant != TK_FS_ROMAN) {
- style |= italic;
- }
- if (faPtr->underline) {
- style |= underline;
- }
- if (tkFontPtr == NULL) {
- fontPtr = (MacFont *) ckalloc(sizeof(MacFont));
- } else {
- fontPtr = (MacFont *) tkFontPtr;
- ReleaseFont(fontPtr);
- }
- InitFont(tkwin, faceNum, faPtr->size, style, fontPtr);
-
- return (TkFont *) fontPtr;
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * TkpDeleteFont --
- *
- * Called to release a font allocated by TkpGetNativeFont() or
- * TkpGetFontFromAttributes(). The caller should have already
- * released the fields of the TkFont that are used exclusively by
- * the generic TkFont code.
- *
- * Results:
- * None.
- *
- * Side effects:
- * TkFont is deallocated.
- *
- *---------------------------------------------------------------------------
- */
-
-void
-TkpDeleteFont(
- TkFont *tkFontPtr) /* Token of font to be deleted. */
-{
- MacFont *fontPtr;
-
- fontPtr = (MacFont *) tkFontPtr;
- ReleaseFont(fontPtr);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * TkpGetFontFamilies --
- *
- * Return information about the font families that are available
- * on the display of the given window.
- *
- * Results:
- * Modifies interp's result object to hold a list of all the available
- * font families.
- *
- * Side effects:
- * None.
- *
- *---------------------------------------------------------------------------
- */
-
-void
-TkpGetFontFamilies(
- Tcl_Interp *interp, /* Interp to hold result. */
- Tk_Window tkwin) /* For display to query. */
-{
- 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);
- }
-}
-
-/*
- *-------------------------------------------------------------------------
- *
- * TkpGetSubFonts --
- *
- * A function used by the testing package for querying the actual
- * screen fonts that make up a font object.
- *
- * Results:
- * 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.
- *
- *-------------------------------------------------------------------------
- */
-
-void
-TkpGetSubFonts(interp, tkfont)
- Tcl_Interp *interp; /* Interp to hold result. */
- Tk_Font tkfont; /* Font object to query. */
-{
- int i;
- Tcl_Obj *resultPtr, *strPtr;
- MacFont *fontPtr;
- FontFamily *familyPtr;
- Str255 nativeName;
-
- 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);
- }
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Tk_MeasureChars --
- *
- * Determine the number of characters from the string that will fit
- * in the given horizontal span. The measurement is done under the
- * assumption that Tk_DrawChars() will be used to actually display
- * the characters.
- *
- * Results:
- * 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.
- *
- * Side effects:
- * None.
- *
- *---------------------------------------------------------------------------
- */
-
-int
-Tk_MeasureChars(
- Tk_Font tkfont, /* Font in which characters will be drawn. */
- 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 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
- * unbounded and the flags argument is
- * ignored. */
- 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. */
- int *lengthPtr) /* Filled with x-location just after the
- * terminating character. */
-{
- MacFont *fontPtr;
- FontFamily *lastFamilyPtr;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- int curX, curByte;
-
- /*
- * 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;
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(gWorld, NULL);
-
- TextSize(fontPtr->size);
- TextFace(fontPtr->style);
-
- lastFamilyPtr = fontPtr->subFontArray[0].familyPtr;
-
- 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 {
- CONST char *p, *end, *next, *sourceOrig;
- int widthLeft;
- FontFamily *thisFamilyPtr;
- Tcl_UniChar ch;
- CONST 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;
- }
- }
-
- if (p > source) {
- rest = BreakLine(lastFamilyPtr, flags, source, p - source,
- &widthLeft);
- }
-
- if (rest == NULL) {
- curByte = numBytes;
- } else {
- curByte = rest - sourceOrig;
- }
- curX = maxLength - widthLeft;
- }
-
- 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 CONST 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;
-
- 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++;
- }
- }
-
- 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);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Tk_DrawChars --
- *
- * Draw a string of characters on the screen.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Information gets drawn on the screen.
- *
- *---------------------------------------------------------------------------
- */
-
-void
-Tk_DrawChars(
- Display *display, /* Display on which to draw. */
- Drawable drawable, /* Window or pixmap in which to draw. */
- 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, /* 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 numBytes, /* Number of bytes in string. */
- int x, int y) /* Coordinates at which to place origin of
- * string when drawing. */
-{
- MacFont *fontPtr;
- MacDrawable *macWin;
- RGBColor macColor, origColor;
- GWorldPtr destPort;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- short txFont, txFace, txSize;
- BitMapPtr stippleMap;
-
- fontPtr = (MacFont *) tkfont;
- macWin = (MacDrawable *) drawable;
-
- destPort = TkMacGetDrawablePort(drawable);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- TkMacSetUpClippingRgn(drawable);
- TkMacSetUpGraphicsPort(gc);
-
- txFont = tcl_macQdPtr->thePort->txFont;
- txFace = tcl_macQdPtr->thePort->txFace;
- txSize = tcl_macQdPtr->thePort->txSize;
- GetForeColor(&origColor);
-
- if ((gc->fill_style == FillStippled
- || gc->fill_style == FillOpaqueStippled)
- && gc->stipple != None) {
- Pixmap pixmap;
- GWorldPtr bufferPort;
-
- stippleMap = TkMacMakeStippleMap(drawable, gc->stipple);
-
- pixmap = Tk_GetPixmap(display, drawable,
- stippleMap->bounds.right, stippleMap->bounds.bottom, 0);
-
- bufferPort = TkMacGetDrawablePort(pixmap);
- SetGWorld(bufferPort, NULL);
-
- if (TkSetMacColor(gc->foreground, &macColor) == true) {
- RGBForeColor(&macColor);
- }
- ShowPen();
- FillRect(&stippleMap->bounds, &tcl_macQdPtr->white);
- MultiFontDrawText(fontPtr, source, numBytes, 0, 0);
-
- SetGWorld(destPort, NULL);
- CopyDeepMask(&((GrafPtr) bufferPort)->portBits, stippleMap,
- &((GrafPtr) destPort)->portBits, &stippleMap->bounds,
- &stippleMap->bounds, &((GrafPtr) destPort)->portRect,
- srcOr, NULL);
-
- /* TODO: this doesn't work quite right - it does a blend. you can't
- * draw white text when you have a stipple.
- */
-
- Tk_FreePixmap(display, pixmap);
- ckfree(stippleMap->baseAddr);
- ckfree((char *)stippleMap);
- } else {
- if (TkSetMacColor(gc->foreground, &macColor) == true) {
- RGBForeColor(&macColor);
- }
- ShowPen();
- MultiFontDrawText(fontPtr, source, numBytes, macWin->xOff + x,
- macWin->yOff + y);
- }
-
- TextFont(txFont);
- TextSize(txSize);
- TextFace(txFace);
- RGBForeColor(&origColor);
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *-------------------------------------------------------------------------
- *
- * 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);
- }
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * TkMacIsCharacterMissing --
- *
- * 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 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 void
-InitFont(
- Tk_Window tkwin, /* For display where font will be used. */
- int faceNum, /* Macintosh font number. */
- int size, /* Point size for Macintosh font. */
- int style, /* Macintosh style bits. */
- MacFont *fontPtr) /* Filled with information constructed from
- * the above arguments. */
-{
- Str255 nativeName;
- FontInfo fi;
- TkFontAttributes *faPtr;
- TkFontMetrics *fmPtr;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- short pixels;
-
- if (size == 0) {
- size = -GetDefFontSize();
- }
- pixels = (short) TkFontGetPixels(tkwin, size);
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(gWorld, NULL);
- TextFont(faceNum);
- TextSize(pixels);
- TextFace(style);
-
- GetFontInfo(&fi);
- GetFontName(faceNum, nativeName);
-
- fontPtr->font.fid = (Font) fontPtr;
-
- 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;
- fmPtr->ascent = fi.ascent;
- fmPtr->descent = fi.descent;
- fmPtr->maxWidth = fi.widMax;
- fmPtr->fixed = (CharWidth('i') == CharWidth('w'));
-
- 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;
-
- 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;
- CONST 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;
- Handle fHandle;
- short theID;
- ResType theType;
- Str255 theName;
-
- 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)
- fHandle = FMSwapFont(&fm)->fontHandle;
-#else
- fHandle = FMSwapFont(&fm)->fontHandle;
-#endif
- GetResInfo(fHandle, &theID, &theType, theName);
- isMultiByteFont = subFontPtr->familyPtr->isMultiByteFont;
- if( theType=='sfnt' ) {
- /*
- * Found an outline font which has very complex font record.
- * Let's just assume *ALL* the characters are allowed.
- */
-
- 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) {
- bitOffset = i & (FONTMAP_BITSPERPAGE - 1);
- subFontPtr->fontMap[row][bitOffset >> 3] |= 1
- << (bitOffset & 7);
- }
- }
- } else {
- /*
- * Found an old bitmap font which has a well-defined record.
- * We can check the width table to see which characters exist.
- */
-
- fontRecPtr = *((FontRec **) fHandle );
- widths = (short *) ((long) &fontRecPtr->owTLoc
- + ((long) (fontRecPtr->owTLoc - fontRecPtr->firstChar)
- * sizeof(short)));
-
- 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. */
- 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. */
- 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
deleted file mode 100644
index c74766b..0000000
--- a/mac/tkMacHLEvents.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * tkMacHLEvents.c --
- *
- * Implements high level event support for the Macintosh. Currently,
- * the only event that really does anything is the Quit event.
- *
- * 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.
- */
-
-#include "tcl.h"
-#include "tclMacInt.h"
-#include "tkMacInt.h"
-
-#include <Aliases.h>
-#include <AppleEvents.h>
-#include <SegLoad.h>
-#include <ToolUtils.h>
-
-/*
- * This is a Tcl_Event structure that the Quit AppleEvent handler
- * uses to schedule the tkReallyKillMe function.
- */
-
-typedef struct KillEvent {
- Tcl_Event header; /* Information that is standard for
- * all events. */
- Tcl_Interp *interp; /* Interp that was passed to the
- * Quit AppleEvent */
-} KillEvent;
-
-/*
- * Static functions used only in this file.
- */
-
-static pascal OSErr QuitHandler _ANSI_ARGS_((AppleEvent* event,
- AppleEvent* reply, long refcon));
-static pascal OSErr OappHandler _ANSI_ARGS_((AppleEvent* event,
- AppleEvent* reply, long refcon));
-static pascal OSErr OdocHandler _ANSI_ARGS_((AppleEvent* event,
- AppleEvent* reply, long refcon));
-static pascal OSErr PrintHandler _ANSI_ARGS_((AppleEvent* event,
- AppleEvent* reply, long refcon));
-static pascal OSErr ScriptHandler _ANSI_ARGS_((AppleEvent* event,
- AppleEvent* reply, long refcon));
-static int MissedAnyParameters _ANSI_ARGS_((AppleEvent *theEvent));
-static int ReallyKillMe _ANSI_ARGS_((Tcl_Event *eventPtr, int flags));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacInitAppleEvents --
- *
- * Initilize the Apple Events on the Macintosh. This registers the
- * core event handlers.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacInitAppleEvents(
- Tcl_Interp *interp) /* Interp to handle basic events. */
-{
- OSErr err;
- AEEventHandlerUPP OappHandlerUPP, OdocHandlerUPP,
- PrintHandlerUPP, QuitHandlerUPP, ScriptHandlerUPP;
-
- /*
- * Install event handlers for the core apple events.
- */
- QuitHandlerUPP = NewAEEventHandlerProc(QuitHandler);
- err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
- QuitHandlerUPP, (long) interp, false);
-
- OappHandlerUPP = NewAEEventHandlerProc(OappHandler);
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
- OappHandlerUPP, (long) interp, false);
-
- OdocHandlerUPP = NewAEEventHandlerProc(OdocHandler);
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
- OdocHandlerUPP, (long) interp, false);
-
- PrintHandlerUPP = NewAEEventHandlerProc(PrintHandler);
- err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
- PrintHandlerUPP, (long) interp, false);
-
- if (interp != NULL) {
- ScriptHandlerUPP = NewAEEventHandlerProc(ScriptHandler);
- err = AEInstallEventHandler('misc', 'dosc',
- ScriptHandlerUPP, (long) interp, false);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacDoHLEvent --
- *
- * Dispatch incomming highlevel events.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Depends on the incoming event.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacDoHLEvent(
- EventRecord *theEvent)
-{
- AEProcessAppleEvent(theEvent);
-
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * QuitHandler, OappHandler, etc. --
- *
- * These are the core Apple event handlers. Only the Quit event does
- * anything interesting.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static pascal OSErr
-QuitHandler(
- AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefcon)
-{
- Tcl_Interp *interp = (Tcl_Interp *) handlerRefcon;
- KillEvent *eventPtr;
-
- /*
- * Call the exit command from the event loop, since you are not supposed
- * to call ExitToShell in an Apple Event Handler. We put this at the head
- * of Tcl's event queue because this message usually comes when the Mac is
- * shutting down, and we want to kill the shell as quickly as possible.
- */
-
- eventPtr = (KillEvent *) ckalloc(sizeof(KillEvent));
- eventPtr->header.proc = ReallyKillMe;
- eventPtr->interp = interp;
-
- Tcl_QueueEvent((Tcl_Event *) eventPtr, TCL_QUEUE_HEAD);
-
- return noErr;
-}
-
-static pascal OSErr
-OappHandler(
- AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefcon)
-{
- return noErr;
-}
-
-static pascal OSErr
-OdocHandler(
- AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefcon)
-{
- Tcl_Interp *interp = (Tcl_Interp *) handlerRefcon;
- AEDescList fileSpecList;
- FSSpec file;
- OSErr err;
- DescType type;
- Size actual;
- long count;
- AEKeyword keyword;
- long index;
- Tcl_DString command;
- Tcl_DString pathName;
- Tcl_CmdInfo dummy;
-
- /*
- * Don't bother if we don't have an interp or
- * the open document procedure doesn't exist.
- */
-
- if ((interp == NULL) ||
- (Tcl_GetCommandInfo(interp, "::tk::mac::OpenDocument", &dummy)) == 0) {
- return noErr;
- }
-
- /*
- * If we get any errors wil retrieving our parameters
- * we just return with no error.
- */
-
- err = AEGetParamDesc(theAppleEvent, keyDirectObject,
- typeAEList, &fileSpecList);
- if (err != noErr) {
- return noErr;
- }
-
- err = MissedAnyParameters(theAppleEvent);
- if (err != noErr) {
- return noErr;
- }
-
- err = AECountItems(&fileSpecList, &count);
- if (err != noErr) {
- return noErr;
- }
-
- Tcl_DStringInit(&command);
- Tcl_DStringAppend(&command, "::tk::mac::OpenDocument", -1);
- for (index = 1; index <= count; index++) {
- int length;
- Handle fullPath;
-
- err = AEGetNthPtr(&fileSpecList, index, typeFSS,
- &keyword, &type, (Ptr) &file, sizeof(FSSpec), &actual);
- if ( err != noErr ) {
- continue;
- }
-
- err = FSpPathFromLocation(&file, &length, &fullPath);
- HLock(fullPath);
- Tcl_ExternalToUtfDString(NULL, *fullPath, length, &pathName);
- HUnlock(fullPath);
- DisposeHandle(fullPath);
-
- Tcl_DStringAppendElement(&command, Tcl_DStringValue(&pathName));
- Tcl_DStringFree(&pathName);
- }
-
- Tcl_GlobalEval(interp, Tcl_DStringValue(&command));
-
- Tcl_DStringFree(&command);
- return noErr;
-}
-
-static pascal OSErr
-PrintHandler(
- AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefcon)
-{
- return noErr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DoScriptHandler --
- *
- * This handler process the do script event.
- *
- * Results:
- * Scedules the given event to be processed.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static pascal OSErr
-ScriptHandler(
- AppleEvent *theAppleEvent,
- AppleEvent *reply,
- long handlerRefcon)
-{
- OSErr theErr;
- AEDescList theDesc;
- int tclErr = -1;
- Tcl_Interp *interp;
- char errString[128];
-
- interp = (Tcl_Interp *) handlerRefcon;
-
- /*
- * The do script event receives one parameter that should be data or a file.
- */
- theErr = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard,
- &theDesc);
- if (theErr != noErr) {
- sprintf(errString, "AEDoScriptHandler: GetParamDesc error %d", theErr);
- theErr = AEPutParamPtr(reply, keyErrorString, typeChar, errString,
- strlen(errString));
- } else if (MissedAnyParameters(theAppleEvent)) {
- sprintf(errString, "AEDoScriptHandler: extra parameters");
- AEPutParamPtr(reply, keyErrorString, typeChar, errString,
- strlen(errString));
- theErr = -1771;
- } else {
- if (theDesc.descriptorType == (DescType)'TEXT') {
- Tcl_DString encodedText;
- short length, i;
-
- length = GetHandleSize(theDesc.dataHandle);
- SetHandleSize(theDesc.dataHandle, length + 1);
- *(*theDesc.dataHandle + length) = '\0';
- for (i=0; i<length; i++) {
- if ((*theDesc.dataHandle)[i] == '\r') {
- (*theDesc.dataHandle)[i] = '\n';
- }
- }
-
- HLock(theDesc.dataHandle);
- Tcl_ExternalToUtfDString(NULL, *theDesc.dataHandle, length,
- &encodedText);
- tclErr = Tcl_GlobalEval(interp, Tcl_DStringValue(&encodedText));
- Tcl_DStringFree(&encodedText);
- HUnlock(theDesc.dataHandle);
- } else if (theDesc.descriptorType == (DescType)'alis') {
- Boolean dummy;
- FSSpec theFSS;
- Handle fullPath;
- int length;
-
- theErr = ResolveAlias(NULL, (AliasHandle)theDesc.dataHandle,
- &theFSS, &dummy);
- if (theErr == noErr) {
- FSpPathFromLocation(&theFSS, &length, &fullPath);
- HLock(fullPath);
- Tcl_EvalFile(interp, *fullPath);
- HUnlock(fullPath);
- DisposeHandle(fullPath);
- } else {
- sprintf(errString, "AEDoScriptHandler: file not found");
- AEPutParamPtr(reply, keyErrorString, typeChar,
- errString, strlen(errString));
- }
- } else {
- sprintf(errString,
- "AEDoScriptHandler: invalid script type '%-4.4s', must be 'alis' or 'TEXT'",
- &theDesc.descriptorType);
- AEPutParamPtr(reply, keyErrorString, typeChar,
- errString, strlen(errString));
- theErr = -1770;
- }
- }
-
- /*
- * If we actually go to run Tcl code - put the result in the reply.
- */
- if (tclErr >= 0) {
- if (tclErr == TCL_OK) {
- AEPutParamPtr(reply, keyDirectObject, typeChar,
- Tcl_GetStringResult(interp),
- strlen(Tcl_GetStringResult(interp)));
- } else {
- AEPutParamPtr(reply, keyErrorString, typeChar,
- Tcl_GetStringResult(interp),
- strlen(Tcl_GetStringResult(interp)));
- AEPutParamPtr(reply, keyErrorNumber, typeInteger,
- (Ptr) &tclErr, sizeof(int));
- }
- }
-
- AEDisposeDesc(&theDesc);
-
- return theErr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ReallyKillMe --
- *
- * This proc tries to kill the shell by running exit, and if that
- * has not succeeded (e.g. because someone has renamed the exit
- * command), calls Tcl_Exit to really kill the shell. Called from
- * an event scheduled by the "Quit" AppleEvent handler.
- *
- * Results:
- * Kills the shell.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-ReallyKillMe(Tcl_Event *eventPtr, int flags)
-{
- Tcl_Interp *interp = ((KillEvent *) eventPtr)->interp;
- if (interp != NULL) {
- Tcl_GlobalEval(interp, "exit");
- }
- Tcl_Exit(0);
-
- return 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MissedAnyParameters --
- *
- * Checks to see if parameters are still left in the event.
- *
- * Results:
- * True or false.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-MissedAnyParameters(
- AppleEvent *theEvent)
-{
- DescType returnedType;
- Size actualSize;
- OSErr err;
-
- err = AEGetAttributePtr(theEvent, keyMissedKeywordAttr, typeWildCard,
- &returnedType, NULL, 0, &actualSize);
-
- return (err != errAEDescNotFound);
-}
diff --git a/mac/tkMacInit.c b/mac/tkMacInit.c
deleted file mode 100644
index 4e73c14..0000000
--- a/mac/tkMacInit.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * tkMacInit.c --
- *
- * This file contains Mac-specific interpreter initialization
- * functions.
- *
- * 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.
- */
-
-#include <Resources.h>
-#include <Files.h>
-#include <TextUtils.h>
-#include <Strings.h>
-#include "tkInt.h"
-#include "tkMacInt.h"
-#include "tclMacInt.h"
-
-/*
- * The following global is used by various parts of Tk to access
- * information in the global qd variable. It is provided as a pointer
- * in the AppInit because we don't assume that Tk is running as an
- * application. For example, Tk could be a plugin and may not have
- * access to the qd variable. This mechanism provides a way for the
- * container application to give a pointer to the qd variable.
- */
-
-QDGlobalsPtr tcl_macQdPtr = NULL;
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpInit --
- *
- * Performs Mac-specific interpreter initialization related to the
- * tk_library variable.
- *
- * Results:
- * A standard Tcl completion code (TCL_OK or TCL_ERROR). Also
- * leaves information in the interp's result.
- *
- * Side effects:
- * Sets "tk_library" Tcl variable, runs initialization scripts
- * for Tk.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpInit(
- Tcl_Interp *interp) /* Interp to initialize. */
-{
- CONST char *libDir, *tempPath;
- Tcl_DString path, ds;
- int result;
-
- static char initCmd[] = "if {[info proc tkInit]==\"\"} {\n\
-proc tkInit {} {\n\
-proc sourcePath {file} {\n\
- global tk_library\n\
- if {[catch {uplevel #0 [list source [file join $tk_library $file.tcl]]}] == 0} {\n\
- return\n\
- }\n\
- if {[catch {uplevel #0 [list source -rsrc $file]}] == 0} {\n\
- return\n\
- }\n\
- rename sourcePath {}\n\
- set msg \"Can't find $file resource or a usable $file.tcl file\"\n\
- append msg \" perhaps you need to install Tk or set your\"\n\
- append msg \" TK_LIBRARY environment variable?\"\n\
- error $msg\n\
-}\n\
-sourcePath tk\n\
-sourcePath dialog\n\
-sourcePath focus\n\
-sourcePath optMenu\n\
-sourcePath palette\n\
-sourcePath tearoff\n\
-if {[catch {package require msgcat}]} {sourcePath msgcat}\n\
-sourcePath bgerror\n\
-sourcePath msgbox\n\
-sourcePath comdlg\n\
-rename sourcePath {}\n\
-rename tkInit {}\n\
-} }\n\
-tkInit";
-
- Tcl_DStringInit(&path);
- Tcl_DStringInit(&ds);
-
- /*
- * The tk_library path can be found in several places. Here is the order
- * in which the are searched.
- * 1) the variable may already exist
- * 2) env array
- * 3) System Folder:Extensions:Tool Command Language:
- */
-
- libDir = Tcl_GetVar(interp, "tk_library", TCL_GLOBAL_ONLY);
- if (libDir == NULL) {
- libDir = TclGetEnv("TK_LIBRARY", &ds);
- }
- if ((libDir == NULL) || (libDir[0] == '\0')) {
- tempPath = TclGetEnv("EXT_FOLDER", &ds);
- if ((tempPath != NULL) && (tempPath[0] != '\0')) {
- Tcl_DString libPath;
- CONST char *argv[3];
-
- argv[0] = tempPath;
- argv[1] = "Tool Command Language";
- Tcl_DStringInit(&libPath);
- Tcl_DStringAppend(&libPath, "tk", -1);
- argv[2] = Tcl_DStringAppend(&libPath, TK_VERSION, -1);
- libDir = Tcl_JoinPath(3, argv, &path);
- Tcl_DStringFree(&libPath);
- }
- }
- if (libDir == NULL) {
- libDir = "no library";
- }
-
- /*
- * Assign path to the global Tcl variable tcl_library.
- */
- Tcl_SetVar(interp, "tk_library", libDir, TCL_GLOBAL_ONLY);
- Tcl_DStringFree(&path);
- Tcl_DStringFree(&ds);
-
- result = Tcl_Eval(interp, initCmd);
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetAppName --
- *
- * Retrieves the name of the current application from a platform
- * specific location. On the Macintosh we look to see if the
- * App Name is specified in a resource. If not, the application
- * name is the root of the tail of the path contained in the tcl
- * variable argv0.
- *
- * Results:
- * Returns the application name in the given Tcl_DString.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpGetAppName(
- Tcl_Interp *interp, /* The main interpreter. */
- Tcl_DString *namePtr) /* A previously initialized Tcl_DString. */
-{
- int argc;
- CONST char **argv = NULL, *name, *p;
- int nameLength = -1;
- Handle h = NULL;
-
- h = GetNamedResource('STR ', "\pTk App Name");
- if (h != NULL) {
- HLock(h);
- Tcl_DStringAppend(namePtr, (*h)+1, **h);
- HUnlock(h);
- ReleaseResource(h);
- return;
- }
-
- name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY);
- if (name != NULL) {
- Tcl_SplitPath(name, &argc, &argv);
- if (argc > 0) {
- name = argv[argc-1];
- p = strrchr(name, '.');
- if (p != NULL) {
- nameLength = p - name;
- }
- } else {
- name = NULL;
- }
- }
- if ((name == NULL) || (*name == 0) || (nameLength == 0)) {
- name = "tk";
- nameLength = -1;
- }
- Tcl_DStringAppend(namePtr, name, nameLength);
- if (argv != NULL) {
- ckfree((char *)argv);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDisplayWarning --
- *
- * This routines is called from Tk_Main to display warning
- * messages that occur during startup.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Displays a message box.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDisplayWarning(
- CONST char *msg, /* Message to be displayed. */
- CONST char *title) /* Title of warning. */
-{
- Tcl_DString ds;
- Tcl_DStringInit(&ds);
- Tcl_DStringAppend(&ds, title, -1);
- Tcl_DStringAppend(&ds, ": ", -1);
- Tcl_DStringAppend(&ds, msg, -1);
- panic(Tcl_DStringValue(&ds));
- Tcl_DStringFree(&ds);
-}
diff --git a/mac/tkMacInt.h b/mac/tkMacInt.h
deleted file mode 100644
index 4713d39..0000000
--- a/mac/tkMacInt.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * tkMacInt.h --
- *
- * Declarations of Macintosh specific shared variables and procedures.
- *
- * 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.
- */
-
-#ifndef _TKMACINT
-#define _TKMACINT
-
-#ifndef _TKINT
-#include "tkInt.h"
-#endif
-
-/*
- * Include platform specific public interfaces.
- */
-
-#ifndef _TKMAC
-#include "tkMac.h"
-#endif
-
-#ifndef _TKPORT
-#include "tkPort.h"
-#endif
-
-#include <AppleEvents.h>
-#include <Windows.h>
-#include <QDOffscreen.h>
-#include <Menus.h>
-
-#define TK_MAC_68K_STACK_GROWTH (256*1024)
-
-struct TkWindowPrivate {
- TkWindow *winPtr; /* Ptr to tk window or NULL if Pixmap */
- GWorldPtr portPtr; /* Either WindowRef or off screen world */
- int xOff; /* X offset from toplevel window */
- int yOff; /* Y offset from toplevel window */
- RgnHandle clipRgn; /* Visable region of window */
- RgnHandle aboveClipRgn; /* Visable region of window & it's children */
- int referenceCount; /* Don't delete toplevel until children are
- * gone. */
- struct TkWindowPrivate *toplevel; /* Pointer to the toplevel
- * datastruct. */
- int flags; /* Various state see defines below. */
-};
-typedef struct TkWindowPrivate MacDrawable;
-
-/*
- * This list is used to keep track of toplevel windows that have a Mac
- * window attached. This is useful for several things, not the least
- * of which is maintaining floating windows.
- */
-
-typedef struct TkMacWindowList {
- struct TkMacWindowList *nextPtr; /* The next window in the list. */
- TkWindow *winPtr; /* This window */
-} TkMacWindowList;
-
-/*
- * Defines use for the flags field of the MacDrawable data structure.
- */
-
-#define TK_SCROLLBAR_GROW 1
-#define TK_CLIP_INVALID 2
-#define TK_HOST_EXISTS 4
-#define TK_DRAWN_UNDER_MENU 8
-
-/*
- * I am reserving TK_EMBEDDED = 0x100 in the MacDrawable flags
- * This is defined in tk.h. We need to duplicate the TK_EMBEDDED flag in the
- * TkWindow structure for the window, but in the MacWin. This way we can still tell
- * what the correct port is after the TKWindow structure has been freed. This
- * actually happens when you bind destroy of a toplevel to Destroy of a child.
- */
-
-/*
- * This structure is for handling Netscape-type in process
- * embedding where Tk does not control the top-level. It contains
- * various functions that are needed by Mac specific routines, like
- * TkMacGetDrawablePort. The definitions of the function types
- * are in tkMac.h.
- */
-
-typedef struct {
- Tk_MacEmbedRegisterWinProc *registerWinProc;
- Tk_MacEmbedGetGrafPortProc *getPortProc;
- Tk_MacEmbedMakeContainerExistProc *containerExistProc;
- Tk_MacEmbedGetClipProc *getClipProc;
- Tk_MacEmbedGetOffsetInParentProc *getOffsetProc;
-} TkMacEmbedHandler;
-
-extern TkMacEmbedHandler *gMacEmbedHandler;
-
-/*
- * Defines used for TkMacInvalidateWindow
- */
-
-#define TK_WINDOW_ONLY 0
-#define TK_PARENT_WINDOW 1
-
-/*
- * Accessor for the privatePtr flags field for the TK_HOST_EXISTS field
- */
-
-#define TkMacHostToplevelExists(tkwin) \
- (((TkWindow *) (tkwin))->privatePtr->toplevel->flags & TK_HOST_EXISTS)
-
-/*
- * Defines use for the flags argument to TkGenWMConfigureEvent.
- */
-
-#define TK_LOCATION_CHANGED 1
-#define TK_SIZE_CHANGED 2
-#define TK_BOTH_CHANGED 3
-
-/*
- * Variables shared among various Mac Tk modules but are not
- * exported to the outside world.
- */
-
-extern int tkMacAppInFront;
-
-/*
- * Globals shared among Macintosh Tk
- */
-
-extern MenuHandle tkAppleMenu; /* Handle to the Apple Menu */
-extern MenuHandle tkFileMenu; /* Handles to menus */
-extern MenuHandle tkEditMenu; /* Handles to menus */
-extern RgnHandle tkMenuCascadeRgn; /* A region to clip with. */
-extern int tkUseMenuCascadeRgn; /* If this is 1, clipping code
- * should intersect tkMenuCascadeRgn
- * before drawing occurs.
- * tkMenuCascadeRgn will only
- * be valid when the value of this
- * variable is 1. */
-extern TkMacWindowList *tkMacWindowListPtr;
- /* The list of toplevels */
-
-/*
- * The following types and defines are for MDEF support.
- */
-
-#if STRUCTALIGNMENTSUPPORTED
-#pragma options align=mac8k
-#endif
-typedef struct TkMenuLowMemGlobals {
- long menuDisable; /* A combination of the menu and the item
- * that the mouse is currently over. */
- short menuTop; /* Where in global coords the top of the
- * menu is. */
- short menuBottom; /* Where in global coords the bottom of
- * the menu is. */
- Rect itemRect; /* This is the rectangle of the currently
- * selected item. */
- short scrollFlag; /* This is used by the MDEF and the
- * Menu Manager to control when scrolling
- * starts. With hierarchicals, an
- * mChooseMsg can come before an
- * mDrawMsg, and scrolling should not
- * occur until after the mDrawMsg.
- * The mDrawMsg sets this flag;
- * mChooseMsg checks the flag and
- * does not scroll if it is set;
- * and then resets the flag. */
-} TkMenuLowMemGlobals;
-#if STRUCTALIGNMENTSUPPORTED
-#pragma options align=reset
-#endif
-
-typedef pascal void (*TkMenuDefProcPtr) (short message, MenuHandle theMenu,
- Rect *menuRectPtr, Point hitPt, short *whichItemPtr,
- TkMenuLowMemGlobals *globalsPtr);
-enum {
- tkUppMenuDefProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(MenuRef)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Rect*)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(Point)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(short*)))
- | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(TkMenuLowMemGlobals *)))
-};
-
-#if GENERATINGCFM
-typedef UniversalProcPtr TkMenuDefUPP;
-#else
-typedef TkMenuDefProcPtr TkMenuDefUPP;
-#endif
-
-#if GENERATINGCFM
-#define TkNewMenuDefProc(userRoutine) \
- (TkMenuDefUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), \
- tkUppMenuDefProcInfo, GetCurrentArchitecture())
-#else
-#define TkNewMenuDefProc(userRoutine) \
- ((TkMenuDefUPP) (userRoutine))
-#endif
-
-#if GENERATINGCFM
-#define TkCallMenuDefProc(userRoutine, message, theMenu, menuRectPtr, hitPt, \
- whichItemPtr, globalsPtr) \
- CallUniversalProc((UniversalProcPtr)(userRoutine), TkUppMenuDefProcInfo, \
- (message), (theMenu), (menuRectPtr), (hitPt), (whichItemPtr), \
- (globalsPtr))
-#else
-#define TkCallMenuDefProc(userRoutine, message, theMenu, menuRectPtr, hitPt, \
- whichItemPtr, globalsPtr) \
- (*(userRoutine))((message), (theMenu), (menuRectPtr), (hitPt), \
- (whichItemPtr), (globalsPtr))
-#endif
-
-#include "tkIntPlatDecls.h"
-
-#ifdef BUILD_tk
-#undef TCL_STORAGE_CLASS
-#define TCL_STORAGE_CLASS DLLEXPORT
-#endif
-
-/*
- * mac specific procedures exported from the DLL
- */
-
-#undef TCL_STORAGE_CLASS
-#define TCL_STORAGE_CLASS DLLIMPORT
-
-#endif /* _TKMACINT */
diff --git a/mac/tkMacKeyboard.c b/mac/tkMacKeyboard.c
deleted file mode 100644
index a79d813..0000000
--- a/mac/tkMacKeyboard.c
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- * tkMacKeyboard.c --
- *
- * Routines to support keyboard events on the Macintosh.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include "Xlib.h"
-#include "keysym.h"
-
-#include <Events.h>
-#include <Script.h>
-
-typedef struct {
- short keycode; /* Macintosh keycode */
- KeySym keysym; /* X windows Keysym */
-} KeyInfo;
-
-static KeyInfo keyArray[] = {
- {0x4C, XK_Return},
- {0x24, XK_Return},
- {0x33, XK_BackSpace},
- {0x75, XK_Delete},
- {0x30, XK_Tab},
- {0x74, XK_Page_Up},
- {0x79, XK_Page_Down},
- {0x73, XK_Home},
- {0x77, XK_End},
- {0x7B, XK_Left},
- {0x7C, XK_Right},
- {0x7E, XK_Up},
- {0x7D, XK_Down},
- {0x72, XK_Help},
- {0x35, XK_Escape},
- {0x47, XK_Clear},
- {0, 0}
-};
-
-static KeyInfo vituralkeyArray[] = {
- {122, XK_F1},
- {120, XK_F2},
- {99, XK_F3},
- {118, XK_F4},
- {96, XK_F5},
- {97, XK_F6},
- {98, XK_F7},
- {100, XK_F8},
- {101, XK_F9},
- {109, XK_F10},
- {103, XK_F11},
- {111, XK_F12},
- {105, XK_F13},
- {107, XK_F14},
- {113, XK_F15},
- {0, 0}
-};
-
-static int initialized = 0;
-static Tcl_HashTable keycodeTable; /* keyArray hashed by keycode value. */
-static Tcl_HashTable vkeyTable; /* vituralkeyArray hashed by virtual
- keycode value. */
-static Ptr KCHRPtr; /* Pointer to 'KCHR' resource. */
-
-/*
- * Prototypes for static functions used in this file.
- */
-static void InitKeyMaps _ANSI_ARGS_((void));
-
-
-/*
- *----------------------------------------------------------------------
- *
- * InitKeyMaps --
- *
- * Creates hash tables used by some of the functions in this file.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Allocates memory & creates some hash tables.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-InitKeyMaps()
-{
- register Tcl_HashEntry *hPtr;
- register KeyInfo *kPtr;
- int dummy;
-
- Tcl_InitHashTable(&keycodeTable, TCL_ONE_WORD_KEYS);
- for (kPtr = keyArray; kPtr->keycode != 0; kPtr++) {
- hPtr = Tcl_CreateHashEntry(&keycodeTable, (char *) kPtr->keycode,
- &dummy);
- Tcl_SetHashValue(hPtr, kPtr->keysym);
- }
- Tcl_InitHashTable(&vkeyTable, TCL_ONE_WORD_KEYS);
- for (kPtr = vituralkeyArray; kPtr->keycode != 0; kPtr++) {
- hPtr = Tcl_CreateHashEntry(&vkeyTable, (char *) kPtr->keycode,
- &dummy);
- Tcl_SetHashValue(hPtr, kPtr->keysym);
- }
- KCHRPtr = (Ptr) GetScriptManagerVariable(smKCHRCache);
- initialized = 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XKeycodeToKeysym --
- *
- * Translate from a system-dependent keycode to a
- * system-independent keysym.
- *
- * Results:
- * Returns the translated keysym, or NoSymbol on failure.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-KeySym
-XKeycodeToKeysym(
- Display* display,
- KeyCode keycode,
- int index)
-{
- register Tcl_HashEntry *hPtr;
- int c;
- char virtualKey;
- int newKeycode;
- unsigned long dummy, newChar;
-
- if (!initialized) {
- InitKeyMaps();
- }
-
- virtualKey = (char) (keycode >> 16);
- c = (keycode) & 0xffff;
- if (c > 255) {
- return NoSymbol;
- }
-
- /*
- * When determining what keysym to produce we firt check to see if
- * the key is a function key. We then check to see if the character
- * is another non-printing key. Finally, we return the key syms
- * for all ASCI chars.
- */
- if (c == 0x10) {
- hPtr = Tcl_FindHashEntry(&vkeyTable, (char *) virtualKey);
- if (hPtr != NULL) {
- return (KeySym) Tcl_GetHashValue(hPtr);
- }
- }
- hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey);
- if (hPtr != NULL) {
- return (KeySym) Tcl_GetHashValue(hPtr);
- }
-
- /*
- * Recompute the character based on the Shift key only.
- * TODO: The index may also specify the NUM_LOCK.
- */
- newKeycode = virtualKey;
- if (index & 0x01) {
- newKeycode += 0x0200;
- }
- dummy = 0;
- newChar = KeyTranslate(KCHRPtr, (short) newKeycode, &dummy);
- c = newChar & charCodeMask;
-
- if (c >= XK_space && c < XK_asciitilde) {
- return c;
- }
-
- return NoSymbol;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetString --
- *
- * Retrieve the string equivalent for the given keyboard event.
- *
- * Results:
- * Returns the UTF string.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-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;
- int c, len;
-
- if (!initialized) {
- InitKeyMaps();
- }
-
- 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) {
- len = 0;
- } else {
- hPtr = Tcl_FindHashEntry(&keycodeTable, (char *) virtualKey);
- if (hPtr != NULL) {
- len = 0;
- }
- }
- return Tcl_ExternalToUtfDString(NULL, string, len, dsPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XGetModifierMapping --
- *
- * Fetch the current keycodes used as modifiers.
- *
- * Results:
- * Returns a new modifier map.
- *
- * Side effects:
- * Allocates a new modifier map data structure.
- *
- *----------------------------------------------------------------------
- */
-
-XModifierKeymap *
-XGetModifierMapping(
- Display* display)
-{
- XModifierKeymap * modmap;
-
- modmap = (XModifierKeymap *) ckalloc(sizeof(XModifierKeymap));
- modmap->max_keypermod = 0;
- modmap->modifiermap = NULL;
- return modmap;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XFreeModifiermap --
- *
- * Deallocate a modifier map that was created by
- * XGetModifierMapping.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Frees the datastructure referenced by modmap.
- *
- *----------------------------------------------------------------------
- */
-
-int
-XFreeModifiermap(
- XModifierKeymap *modmap)
-{
- if (modmap->modifiermap != NULL) {
- ckfree((char *) modmap->modifiermap);
- }
- ckfree((char *) modmap);
- return Success;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XKeysymToString, XStringToKeysym --
- *
- * These X window functions map Keysyms to strings & strings to
- * keysyms. However, Tk already does this for the most common keysyms.
- * Therefor, these functions only need to support keysyms that will be
- * specific to the Macintosh. Currently, there are none.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-char *
-XKeysymToString(
- KeySym keysym)
-{
- return NULL;
-}
-
-KeySym
-XStringToKeysym(
- const char* string)
-{
- return NoSymbol;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XKeysymToKeycode --
- *
- * The function XKeysymToKeycode is only used by tkTest.c and
- * currently only implementes the support for keys used in the
- * Tk test suite.
- * FIXME - This is no longer true. This function is now used in
- * "event generate" so we really should make it work.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-KeyCode
-XKeysymToKeycode(
- Display* display,
- KeySym keysym)
-{
- KeyCode keycode = 0;
- char virtualKeyCode = 0;
-
- if ((keysym >= XK_space) && (XK_asciitilde)) {
- if (keysym == 'a') {
- virtualKeyCode = 0x00;
- } else if (keysym == 'b' || keysym == 'B') {
- virtualKeyCode = 0x0B;
- } else if (keysym == 'c') {
- virtualKeyCode = 0x08;
- } else if (keysym == 'x' || keysym == 'X') {
- virtualKeyCode = 0x07;
- } else if (keysym == 'z') {
- virtualKeyCode = 0x06;
- } else if (keysym == ' ') {
- virtualKeyCode = 0x31;
- } else if (keysym == XK_Return) {
- virtualKeyCode = 0x24;
- keysym = '\r';
- }
- keycode = keysym + (virtualKeyCode <<16);
- }
-
- return keycode;
-}
-
-/*
- * When mapping from a keysym to a keycode, need
- * information about the modifier state that should be used
- * so that when they call XKeycodeToKeysym taking into
- * account the xkey.state, they will get back the original
- * keysym.
- */
-
-void
-TkpSetKeycodeAndState(tkwin, keySym, eventPtr)
- Tk_Window tkwin;
- KeySym keySym;
- XEvent *eventPtr;
-{
- Display *display;
- int state;
- KeyCode keycode;
-
- display = Tk_Display(tkwin);
-
- if (keySym == NoSymbol) {
- keycode = 0;
- } else {
- keycode = XKeysymToKeycode(display, keySym);
- }
- if (keycode != 0) {
- for (state = 0; state < 4; state++) {
- if (XKeycodeToKeysym(display, keycode, state) == keySym) {
- if (state & 1) {
- eventPtr->xkey.state |= ShiftMask;
- }
- if (state & 2) {
- TkDisplay *dispPtr;
-
- dispPtr = ((TkWindow *) tkwin)->dispPtr;
- eventPtr->xkey.state |= dispPtr->modeModMask;
- }
- break;
- }
- }
- }
- eventPtr->xkey.keycode = keycode;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetKeySym --
- *
- * Given an X KeyPress or KeyRelease event, map the
- * keycode in the event into a KeySym.
- *
- * Results:
- * The return value is the KeySym corresponding to
- * eventPtr, or NoSymbol if no matching Keysym could be
- * found.
- *
- * Side effects:
- * In the first call for a given display, keycode-to-
- * KeySym maps get loaded.
- *
- *----------------------------------------------------------------------
- */
-
-KeySym
-TkpGetKeySym(dispPtr, eventPtr)
- TkDisplay *dispPtr; /* Display in which to
- * map keycode. */
- XEvent *eventPtr; /* Description of X event. */
-{
- KeySym sym;
- int index;
-
- /*
- * Refresh the mapping information if it's stale
- */
-
- if (dispPtr->bindInfoStale) {
- TkpInitKeymapInfo(dispPtr);
- }
-
- /*
- * Figure out which of the four slots in the keymap vector to
- * use for this key. Refer to Xlib documentation for more info
- * on how this computation works.
- */
-
- index = 0;
- if (eventPtr->xkey.state & dispPtr->modeModMask) {
- index = 2;
- }
- if ((eventPtr->xkey.state & ShiftMask)
- || ((dispPtr->lockUsage != LU_IGNORE)
- && (eventPtr->xkey.state & LockMask))) {
- index += 1;
- }
- sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, index);
-
- /*
- * Special handling: if the key was shifted because of Lock, but
- * lock is only caps lock, not shift lock, and the shifted keysym
- * isn't upper-case alphabetic, then switch back to the unshifted
- * keysym.
- */
-
- if ((index & 1) && !(eventPtr->xkey.state & ShiftMask)
- && (dispPtr->lockUsage == LU_CAPS)) {
- if (!(((sym >= XK_A) && (sym <= XK_Z))
- || ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))
- || ((sym >= XK_Ooblique) && (sym <= XK_Thorn)))) {
- index &= ~1;
- sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode,
- index);
- }
- }
-
- /*
- * Another bit of special handling: if this is a shifted key and there
- * is no keysym defined, then use the keysym for the unshifted key.
- */
-
- if ((index & 1) && (sym == NoSymbol)) {
- sym = XKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode,
- index & ~1);
- }
- return sym;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpInitKeymapInfo --
- *
- * This procedure is invoked to scan keymap information
- * to recompute stuff that's important for binding, such
- * as the modifier key (if any) that corresponds to "mode
- * switch".
- *
- * Results:
- * None.
- *
- * Side effects:
- * Keymap-related information in dispPtr is updated.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkpInitKeymapInfo(dispPtr)
- TkDisplay *dispPtr; /* Display for which to recompute keymap
- * information. */
-{
- XModifierKeymap *modMapPtr;
- KeyCode *codePtr;
- KeySym keysym;
- int count, i, j, max, arraySize;
-#define KEYCODE_ARRAY_SIZE 20
-
- dispPtr->bindInfoStale = 0;
- modMapPtr = XGetModifierMapping(dispPtr->display);
-
- /*
- * Check the keycodes associated with the Lock modifier. If
- * any of them is associated with the XK_Shift_Lock modifier,
- * then Lock has to be interpreted as Shift Lock, not Caps Lock.
- */
-
- dispPtr->lockUsage = LU_IGNORE;
- codePtr = modMapPtr->modifiermap + modMapPtr->max_keypermod*LockMapIndex;
- for (count = modMapPtr->max_keypermod; count > 0; count--, codePtr++) {
- if (*codePtr == 0) {
- continue;
- }
- keysym = XKeycodeToKeysym(dispPtr->display, *codePtr, 0);
- if (keysym == XK_Shift_Lock) {
- dispPtr->lockUsage = LU_SHIFT;
- break;
- }
- if (keysym == XK_Caps_Lock) {
- dispPtr->lockUsage = LU_CAPS;
- break;
- }
- }
-
- /*
- * Look through the keycodes associated with modifiers to see if
- * the the "mode switch", "meta", or "alt" keysyms are associated
- * with any modifiers. If so, remember their modifier mask bits.
- */
-
- dispPtr->modeModMask = 0;
- dispPtr->metaModMask = 0;
- dispPtr->altModMask = 0;
- codePtr = modMapPtr->modifiermap;
- max = 8*modMapPtr->max_keypermod;
- for (i = 0; i < max; i++, codePtr++) {
- if (*codePtr == 0) {
- continue;
- }
- keysym = XKeycodeToKeysym(dispPtr->display, *codePtr, 0);
- if (keysym == XK_Mode_switch) {
- dispPtr->modeModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
- }
- if ((keysym == XK_Meta_L) || (keysym == XK_Meta_R)) {
- dispPtr->metaModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
- }
- if ((keysym == XK_Alt_L) || (keysym == XK_Alt_R)) {
- dispPtr->altModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
- }
- }
-
- /*
- * Create an array of the keycodes for all modifier keys.
- */
-
- if (dispPtr->modKeyCodes != NULL) {
- ckfree((char *) dispPtr->modKeyCodes);
- }
- dispPtr->numModKeyCodes = 0;
- arraySize = KEYCODE_ARRAY_SIZE;
- dispPtr->modKeyCodes = (KeyCode *) ckalloc((unsigned)
- (KEYCODE_ARRAY_SIZE * sizeof(KeyCode)));
- for (i = 0, codePtr = modMapPtr->modifiermap; i < max; i++, codePtr++) {
- if (*codePtr == 0) {
- continue;
- }
-
- /*
- * Make sure that the keycode isn't already in the array.
- */
-
- for (j = 0; j < dispPtr->numModKeyCodes; j++) {
- if (dispPtr->modKeyCodes[j] == *codePtr) {
- goto nextModCode;
- }
- }
- if (dispPtr->numModKeyCodes >= arraySize) {
- KeyCode *new;
-
- /*
- * Ran out of space in the array; grow it.
- */
-
- arraySize *= 2;
- new = (KeyCode *) ckalloc((unsigned)
- (arraySize * sizeof(KeyCode)));
- memcpy((VOID *) new, (VOID *) dispPtr->modKeyCodes,
- (dispPtr->numModKeyCodes * sizeof(KeyCode)));
- ckfree((char *) dispPtr->modKeyCodes);
- dispPtr->modKeyCodes = new;
- }
- dispPtr->modKeyCodes[dispPtr->numModKeyCodes] = *codePtr;
- dispPtr->numModKeyCodes++;
- nextModCode: continue;
- }
- XFreeModifiermap(modMapPtr);
-}
diff --git a/mac/tkMacLibrary.r b/mac/tkMacLibrary.r
deleted file mode 100644
index 5acede1..0000000
--- a/mac/tkMacLibrary.r
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * tkMacLibrary.r --
- *
- * This file creates resources for use in most Tk applications.
- * This is designed to be an example of using the Tcl/Tk
- * libraries in a Macintosh Application.
- *
- * Copyright (c) 1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include <Types.r>
-#include <SysTypes.r>
-#include <AEUserTermTypes.r>
-
-/*
- * The folowing include and defines help construct
- * the version string for Tcl.
- */
-
-#define RC_INVOKED
-#include <tcl.h>
-#include "tk.h"
-
-#if (TK_RELEASE_LEVEL == 0)
-# define RELEASE_LEVEL alpha
-#elif (TK_RELEASE_LEVEL == 1)
-# define RELEASE_LEVEL beta
-#elif (TK_RELEASE_LEVEL == 2)
-# define RELEASE_LEVEL final
-#endif
-
-#if (TK_RELEASE_LEVEL == 2)
-# define MINOR_VERSION (TK_MINOR_VERSION * 16) + TK_RELEASE_SERIAL
-# define RELEASE_CODE 0x00
-#else
-# define MINOR_VERSION TK_MINOR_VERSION * 16
-# define RELEASE_CODE TK_RELEASE_SERIAL
-#endif
-
-#define RELEASE_CODE 0x00
-
-resource 'vers' (1) {
- TK_MAJOR_VERSION, MINOR_VERSION,
- RELEASE_LEVEL, RELEASE_CODE, verUS,
- TK_PATCH_LEVEL,
- TK_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
-};
-
-resource 'vers' (2) {
- TK_MAJOR_VERSION, MINOR_VERSION,
- RELEASE_LEVEL, RELEASE_CODE, verUS,
- TK_PATCH_LEVEL,
- "Tk Library " TK_PATCH_LEVEL " © 1993-2001"
-};
-
-/*
- * The -16397 string will be displayed by Finder when a user
- * tries to open the shared library. The string should
- * give the user a little detail about the library's capabilities
- * and enough information to install the library in the correct location.
- * A similar string should be placed in all shared libraries.
- */
-resource 'STR ' (-16397, purgeable) {
- "Tk Library\n\n"
- "This is the library needed to run Tcl/Tk programs. "
- "To work properly, it should be placed in the Tool Command Language folder "
- "within the Extensions folder."
-};
diff --git a/mac/tkMacMDEF.c b/mac/tkMacMDEF.c
deleted file mode 100644
index 27dbac0..0000000
--- a/mac/tkMacMDEF.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * TkMacMDEF.c --
- *
- * This module is implements the MDEF for tkMenus. The address of the
- * real entry proc will be blasted into the MDEF.
- *
- * Copyright (c) 1996 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.
- */
-
-#define MAC_TCL
-#define NeedFunctionPrototypes 1
-#define NeedWidePrototypes 0
-
-#include <Menus.h>
-#include <LowMem.h>
-#include "tkMacInt.h"
-
-
-/*
- * The following structure is built from assembly equates in MPW 3.0
- * AIncludes file: "Private.a." We're forced to update several locations not
- * documented in "Inside Mac" to make our MDEF behave properly with hierarchical
- * menus.
- */
-
-#if STRUCTALIGNMENTSUPPORTED
-#pragma options align=mac68k
-#endif
-typedef struct mbPrivate {
- Byte unknown[6];
- Rect mbItemRect; /* rect of currently chosen menu item */
-} mbPrivate;
-#if STRUCTALIGNMENTSUPPORTED
-#pragma options align=reset
-#endif
-
-/*
- * We are forced to update a low-memory global to get cascades to work. This
- * global does not have a LMEquate associated with it.
- */
-
-#define SELECTRECT (*(Rect *)0x09fa) /* Menu select seems to need this */
-#define MBSAVELOC (*(short *)0x0B5C) /* address of handle to mbarproc private data redefined below */
-
-pascal void main _ANSI_ARGS_((short message,
- MenuHandle menu, Rect *menuRect,
- Point hitPt, short *whichItem));
-
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacStdMenu --
- *
- * The dispatch routine called by the system to handle menu drawing,
- * scrolling, etc. This is a stub; the address of the real routine
- * is blasted in. The real routine will be a UniversalProcPtr,
- * which will give the real dispatch routine in Tk globals
- * and the like.
- *
- * Results:
- * None.
- *
- * Side effects:
- * This routine causes menus to be drawn and will certainly allocate
- * memory as a result. Also, the menu can scroll up and down, and
- * various other interface actions can take place
- *
- *----------------------------------------------------------------------
- */
-
-pascal void
-main(
- short message, /* What action are we taking? */
- MenuHandle menu, /* The menu we are working with */
- Rect *menuRect, /* A pointer to the rect we are working with */
- Point hitPt, /* Where the mouse was hit for appropriate
- * messages. */
- short *whichItemPtr) /* Output result. Which item was hit by
- * the user? */
-{
- /*
- * The constant 'MDEF' is what will be punched during menu intialization.
- */
-
- TkMenuDefProcPtr procPtr = (TkMenuDefProcPtr) 'MDEF';
- TkMenuLowMemGlobals globals;
- short oldItem;
-
- globals.menuDisable = LMGetMenuDisable();
- globals.menuTop = LMGetTopMenuItem();
- globals.menuBottom = LMGetAtMenuBottom();
- if (MBSAVELOC == -1) {
- globals.itemRect = (**(mbPrivate***)&MBSAVELOC)->mbItemRect;
- }
- if (message == mChooseMsg) {
- oldItem = *whichItemPtr;
- }
-
- TkCallMenuDefProc(procPtr, message, menu, menuRect, hitPt, whichItemPtr,
- &globals);
-
- LMSetMenuDisable(globals.menuDisable);
- LMSetTopMenuItem(globals.menuTop);
- LMSetAtMenuBottom(globals.menuBottom);
- if ((message == mChooseMsg) && (oldItem != *whichItemPtr)
- && (MBSAVELOC != -1)) {
- (**(mbPrivate***)&MBSAVELOC)->mbItemRect = globals.itemRect;
- SELECTRECT = globals.itemRect;
- }
-}
diff --git a/mac/tkMacMDEF.r b/mac/tkMacMDEF.r
deleted file mode 100644
index cc87c93..0000000
--- a/mac/tkMacMDEF.r
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * tkMacMDEF.r --
- *
- * This file contains the actual MDEF. Since this is not likely to
- * change much, this seems the easiest method to use. The address
- * of the routine descriptor is written into offset 0x24 hex, and
- * then when the MDEF is called, the Mixed Mode Manager will take
- * care of the setup.
- *
- * This file also contains the icons 'SICN' used by the menu code
- * in menu items.
- *
- * 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.
- */
-
-#include <Types.r>
-
-/*
- * This code was generated by a project file and will not need to be changed.
- * It is just a stub. The address of the real MDEF handler will be blasted
- * in.
- */
-
-data 'MDEF' (591, preload) {
- $"600A 0000 4D44 4546 024F 0000 4EFA 0004" /* `...MDEF.O..N™.. */
- $"4E75 48E7 1030 4FEF FFEE 266F 0022 247C" /* NuHÁ.0OÔÓ&o."$| */
- $"4D44 4546 594F 2EB8 0B54 2E9F 554F 3EB8" /* MDEFYO.½.T.üUO>½ */
- $"0A0A 3F5F 0004 554F 3EB8 0A0C 3F5F 0006" /* ..?_..UO>½..?_.. */
- $"3038 0B5C 48C0 0C80 FFFF FFFF 6612 2078" /* 08.\H¿.Äf. x */
- $"0B5C 2050 2F68 0006 0008 2F68 000A 000C" /* .\ P/h..../h.... */
- $"302F 0032 48C0 0C80 0000 0001 6602 3613" /* 0/.2H¿.Ä....f.6. */
- $"3F2F 0032 2F2F 0030 2F2F 0030 2F2F 0030" /* ?/.2//.0//.0//.0 */
- $"2F0B 486F 0012 4E92 2F17 21DF 0B54 3F2F" /* /.Ho..Ní/.!þ.T?/ */
- $"0004 31DF 0A0A 3F2F 0006 31DF 0A0C 302F" /* ..1þ..?/..1þ..0/ */
- $"0032 48C0 0C80 0000 0001 6638 3013 48C0" /* .2H¿.Ä....f80.H¿ */
- $"3203 48C1 B280 672C 3038 0B5C 48C0 0C80" /* 2.H¡¾Äg,08.\H¿.Ä */
- $"FFFF FFFF 671E 2078 0B5C 2050 216F 0008" /* g. x.\ P!o.. */
- $"0006 216F 000C 000A 21EF 0008 09FA 21EF" /* ..!o....!Ô..™!Ô */
- $"000C 09FE 4FEF 0012 4CDF 0C08 4E74 0012" /* ..œOÔ..Lþ..Nt.. */
-};
diff --git a/mac/tkMacMenu.c b/mac/tkMacMenu.c
deleted file mode 100644
index d9ec4fd..0000000
--- a/mac/tkMacMenu.c
+++ /dev/null
@@ -1,4605 +0,0 @@
-/*
- * tkMacMenu.c --
- *
- * This module implements the Mac-platform specific features of menus.
- *
- * Copyright (c) 1996-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.
- */
-
-#include "tkMacInt.h"
-#include "tkMenu.h"
-#include "tkMenuButton.h"
-#include "tkColor.h"
-#include "tkMacInt.h"
-#undef Status
-#include <Menus.h>
-#include <OSUtils.h>
-#include <Palettes.h>
-#include <Resources.h>
-#include <string.h>
-#include <ToolUtils.h>
-#include <Balloons.h>
-#include <Appearance.h>
-#include <Devices.h>
-
-typedef struct MacMenu {
- MenuHandle menuHdl; /* The Menu Manager data structure. */
- Rect menuRect; /* The rectangle as calculated in the
- * MDEF. This is used to figure ou the
- * clipping rgn before we push
- * the <<MenuSelect>> virtual binding
- * through. */
-} MacMenu;
-
-typedef struct MenuEntryUserData {
- Drawable mdefDrawable;
- TkMenuEntry *mePtr;
- Tk_Font tkfont;
- Tk_FontMetrics *fmPtr;
-} MenuEntryUserData;
-/*
- * Various geometry definitions:
- */
-
-#define CASCADE_ARROW_HEIGHT 10
-#define CASCADE_ARROW_WIDTH 8
-#define DECORATION_BORDER_WIDTH 2
-#define MAC_MARGIN_WIDTH 8
-
-/*
- * The following are constants relating to the SICNs used for drawing the MDEF.
- */
-
-#define SICN_RESOURCE_NUMBER 128
-
-#define SICN_HEIGHT 16
-#define SICN_ROWS 2
-#define CASCADE_ICON_WIDTH 7
-#define SHIFT_ICON_WIDTH 10
-#define OPTION_ICON_WIDTH 16
-#define CONTROL_ICON_WIDTH 12
-#define COMMAND_ICON_WIDTH 10
-
-#define CASCADE_ARROW 0
-#define SHIFT_ICON 1
-#define OPTION_ICON 2
-#define CONTROL_ICON 3
-#define COMMAND_ICON 4
-#define DOWN_ARROW 5
-#define UP_ARROW 6
-
-/*
- * Platform specific flags for menu entries
- *
- * ENTRY_COMMAND_ACCEL Indicates the entry has the command key
- * in its accelerator string.
- * ENTRY_OPTION_ACCEL Indicates the entry has the option key
- * in its accelerator string.
- * ENTRY_SHIFT_ACCEL Indicates the entry has the shift key
- * in its accelerator string.
- * ENTRY_CONTROL_ACCEL Indicates the entry has the control key
- * in its accelerator string.
- */
-
-#define ENTRY_COMMAND_ACCEL ENTRY_PLATFORM_FLAG1
-#define ENTRY_OPTION_ACCEL ENTRY_PLATFORM_FLAG2
-#define ENTRY_SHIFT_ACCEL ENTRY_PLATFORM_FLAG3
-#define ENTRY_CONTROL_ACCEL ENTRY_PLATFORM_FLAG4
-#define ENTRY_ACCEL_MASK (ENTRY_COMMAND_ACCEL | ENTRY_OPTION_ACCEL \
- | ENTRY_SHIFT_ACCEL | ENTRY_CONTROL_ACCEL)
-
-/*
- * This structure is used to keep track of subfields within Macintosh menu
- * items.
- */
-
-typedef struct EntryGeometry {
- int accelTextStart; /* Offset into the accel string where
- * the text starts. Everything before
- * this is modifier key descriptions.
- */
- int modifierWidth; /* Width of modifier symbols. */
- int accelTextWidth; /* Width of the text after the modifier
- * keys. */
- int nonAccelMargin; /* The width of the margin for entries
- * without accelerators. */
-} EntryGeometry;
-
-/*
- * Structure to keep track of toplevel windows and their menubars.
- */
-
-typedef struct TopLevelMenubarList {
- struct TopLevelMenubarList *nextPtr;
- /* The next window in the list. */
- Tk_Window tkwin; /* The toplevel window. */
- TkMenu *menuPtr; /* The menu associated with this
- * toplevel. */
-} TopLevelMenubarList;
-
-/*
- * Platform-specific flags for menus.
- *
- * MENU_APPLE_MENU 0 indicates a custom Apple menu has
- * not been installed; 1 a custom Apple
- * menu has been installed.
- * MENU_HELP_MENU 0 indicates a custom Help menu has
- * not been installed; 1 a custom Help
- * menu has been installed.
- * MENU_RECONFIGURE_PENDING 1 indicates that an idle handler has
- * been scheduled to reconfigure the
- * Macintosh MenuHandle.
- */
-
-#define MENU_APPLE_MENU MENU_PLATFORM_FLAG1
-#define MENU_HELP_MENU MENU_PLATFORM_FLAG2
-#define MENU_RECONFIGURE_PENDING MENU_PLATFORM_FLAG3
-
-#define CASCADE_CMD (0x1b)
- /* The special command char for cascade
- * menus. */
-#define SEPARATOR_TEXT "\p(-"
- /* The text for a menu separator. */
-
-#define MENUBAR_REDRAW_PENDING 1
-
-static int gNoTkMenus = 0; /* This is used by Tk_MacTurnOffMenus as the
- * flag that Tk is not to draw any menus. */
-RgnHandle tkMenuCascadeRgn = NULL;
- /* The region to clip drawing to when the
- * MDEF is up. */
-int tkUseMenuCascadeRgn = 0; /* If this is 1, clipping code
- * should intersect tkMenuCascadeRgn
- * before drawing occurs.
- * tkMenuCascadeRgn will only
- * be valid when the value of this
- * variable is 1. */
-
-static Tcl_HashTable commandTable;
- /* The list of menuInstancePtrs associated with
- * menu ids */
-static short currentAppleMenuID;
- /* The id of the current Apple menu. 0 for
- * none. */
-static short currentHelpMenuID; /* The id of the current Help menu. 0 for
- * none. */
-static Tcl_Interp *currentMenuBarInterp;
- /* The interpreter of the window that owns
- * the current menubar. */
-static char *currentMenuBarName;
- /* Malloced. Name of current menu in menu bar.
- * NULL if no menu set. TO DO: make this a
- * 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
- * the automatically generated separator. */
-static int inPostMenu; /* We cannot be re-entrant like X
- * windows. */
-static short lastMenuID; /* To pass to NewMenu; need to figure out
- * a good way to do this. */
-static unsigned char lastCascadeID;
- /* Cascades have to have ids that are
- * less than 256. */
-static MacDrawable macMDEFDrawable;
- /* Drawable for use by MDEF code */
-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 = NULL ;
- /* The routine descriptor to the MDEF proc.
- * The MDEF is needed to draw menus with
- * non-standard attributes and to support
- * tearoff menus. */
-static struct TearoffSelect {
- TkMenu *menuPtr; /* The menu that is torn off */
- Point point; /* The point to place the new menu */
- Rect excludeRect; /* We don't want to drag tearoff highlights
- * when we are in this menu */
-} tearoffStruct;
-
-static RgnHandle totalMenuRgn = NULL;
- /* Used to update windows which have been
- * obscured by menus. */
-static RgnHandle utilRgn = NULL;/* Used when creating the region that is to
- * be clipped out while the MDEF is active. */
-
-static TopLevelMenubarList *windowListPtr;
- /* A list of windows that have menubars set. */
-static MenuItemDrawingUPP tkThemeMenuItemDrawingUPP;
- /* Points to the UPP for theme Item drawing. */
-
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static void CompleteIdlers _ANSI_ARGS_((TkMenu *menuPtr));
-static void DrawMenuBarWhenIdle _ANSI_ARGS_((
- ClientData clientData));
-static void DrawMenuBackground _ANSI_ARGS_((
- Rect *menuRectPtr, Drawable d, ThemeMenuType type));
-static void DrawMenuEntryAccelerator _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, GC gc, Tk_Font tkfont,
- CONST Tk_FontMetrics *fmPtr,
- Tk_3DBorder activeBorder, int x, int y,
- int width, int height, int drawArrow));
-static void DrawMenuEntryBackground _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, Tk_3DBorder activeBorder,
- Tk_3DBorder bgBorder, int x, int y,
- int width, int heigth));
-static void DrawMenuEntryIndicator _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, GC gc, GC indicatorGC,
- Tk_Font tkfont,
- CONST Tk_FontMetrics *fmPtr, int x, int y,
- int width, int height));
-static void DrawMenuEntryLabel _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 void DrawMenuSeparator _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 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 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,
- int *textWidthPtr, int *heightPtr));
-static void GetMenuLabelGeometry _ANSI_ARGS_((TkMenuEntry *mePtr,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetMenuIndicatorGeometry _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetMenuSeparatorGeometry _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetTearoffEntryGeometry _ANSI_ARGS_((TkMenu *menuPtr,
- TkMenuEntry *mePtr, Tk_Font tkfont,
- CONST Tk_FontMetrics *fmPtr, int *widthPtr,
- int *heightPtr));
-static int GetNewID _ANSI_ARGS_((Tcl_Interp *interp,
- TkMenu *menuInstPtr, int cascade,
- short *menuIDPtr));
-static char FindMarkCharacter _ANSI_ARGS_((TkMenuEntry *mePtr));
-static void FreeID _ANSI_ARGS_((short menuID));
-static void InvalidateMDEFRgns _ANSI_ARGS_((void));
-static void MenuDefProc _ANSI_ARGS_((short message,
- MenuHandle menu, Rect *menuRectPtr,
- Point hitPt, short *whichItem,
- TkMenuLowMemGlobals *globalsPtr));
-static void MenuSelectEvent _ANSI_ARGS_((TkMenu *menuPtr));
-static void ReconfigureIndividualMenu _ANSI_ARGS_((
- TkMenu *menuPtr, MenuHandle macMenuHdl,
- int base));
-static void ReconfigureMacintoshMenu _ANSI_ARGS_ ((
- ClientData clientData));
-static void RecursivelyClearActiveMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-static void RecursivelyDeleteMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-static void RecursivelyInsertMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-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,
- int x, int y, int width, int height));
-pascal void tkThemeMenuItemDrawingProc _ANSI_ARGS_ ((const Rect *inBounds,
- SInt16 inDepth, Boolean inIsColorDevice,
- SInt32 inUserData));
-
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacUseID --
- *
- * Take the ID out of the available list for new menus. Used by the
- * default menu bar's menus so that they do not get created at the tk
- * level. See GetNewID for more information.
- *
- * Results:
- * Returns TCL_OK if the id was not in use. Returns TCL_ERROR if the
- * id was in use.
- *
- * Side effects:
- * A hash table entry in the command table is created with a NULL
- * value.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacUseMenuID(
- short macID) /* The id to take out of the table */
-{
- Tcl_HashEntry *commandEntryPtr;
- int newEntry;
-
- TkMenuInit();
- commandEntryPtr = Tcl_CreateHashEntry(&commandTable, (char *) macID,
- &newEntry);
- if (newEntry == 1) {
- Tcl_SetHashValue(commandEntryPtr, NULL);
- return TCL_OK;
- } else {
- return TCL_ERROR;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetNewID --
- *
- * Allocates a new menu id and marks it in use. Each menu on the
- * mac must be designated by a unique id, which is a short. In
- * addition, some ids are reserved by the system. Since Tk uses
- * mostly dynamic menus, we must allocate and free these ids on
- * the fly. We use the id as a key into a hash table; if there
- * is no hash entry, we know that we can use the id.
- *
- * Results:
- * Returns TCL_OK if succesful; TCL_ERROR if there are no more
- * ids of the appropriate type to allocate. menuIDPtr contains
- * the new id if succesful.
- *
- * Side effects:
- * An entry is created for the menu in the command hash table,
- * and the hash entry is stored in the appropriate field in the
- * menu data structure.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GetNewID(
- Tcl_Interp *interp, /* Used for error reporting */
- TkMenu *menuPtr, /* The menu we are working with */
- int cascade, /* 0 if we are working with a normal menu;
- 1 if we are working with a cascade */
- short *menuIDPtr) /* The resulting id */
-{
- int found = 0;
- int newEntry;
- Tcl_HashEntry *commandEntryPtr;
- short returnID = *menuIDPtr;
-
- /*
- * The following code relies on shorts and unsigned chars wrapping
- * when the highest value is incremented. Also, the values between
- * 236 and 255 inclusive are reserved for DA's by the Mac OS.
- */
-
- if (!cascade) {
- short curID = lastMenuID + 1;
- if (curID == 236) {
- curID = 256;
- }
-
- while (curID != lastMenuID) {
- commandEntryPtr = Tcl_CreateHashEntry(&commandTable,
- (char *) curID, &newEntry);
- if (newEntry == 1) {
- found = 1;
- lastMenuID = returnID = curID;
- break;
- }
- curID++;
- if (curID == 236) {
- curID = 256;
- }
- }
- } else {
-
- /*
- * Cascade ids must be between 0 and 235 only, so they must be
- * dealt with separately.
- */
-
- unsigned char curID = lastCascadeID + 1;
- if (curID == 236) {
- curID = 0;
- }
-
- while (curID != lastCascadeID) {
- commandEntryPtr = Tcl_CreateHashEntry(&commandTable,
- (char *) curID, &newEntry);
- if (newEntry == 1) {
- found = 1;
- lastCascadeID = returnID = curID;
- break;
- }
- curID++;
- if (curID == 236) {
- curID = 0;
- }
- }
- }
-
- if (found) {
- Tcl_SetHashValue(commandEntryPtr, (char *) menuPtr);
- *menuIDPtr = returnID;
- return TCL_OK;
- } else {
- Tcl_ResetResult(interp);
- Tcl_AppendResult(interp, "No more menus can be allocated.",
- (char *) NULL);
- return TCL_ERROR;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * FreeID --
- *
- * Marks the id as free.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The hash table entry for the ID is cleared.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-FreeID(
- short menuID) /* The id to free */
-{
- Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(&commandTable,
- (char *) menuID);
-
- if (entryPtr != NULL) {
- Tcl_DeleteHashEntry(entryPtr);
- }
- if (menuID == currentAppleMenuID) {
- currentAppleMenuID = 0;
- }
- if (menuID == currentHelpMenuID) {
- currentHelpMenuID = 0;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpNewMenu --
- *
- * Gets a new blank menu. Only the platform specific options are filled
- * in.
- *
- * Results:
- * Returns a standard TCL error.
- *
- * Side effects:
- * Allocates a Macintosh menu handle and puts in the platformData
- * field of the menuPtr.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpNewMenu(
- TkMenu *menuPtr) /* The common structure we are making the
- * platform structure for. */
-{
- short menuID;
- Str255 itemText;
- int length;
- MenuHandle macMenuHdl;
- int error = TCL_OK;
-
- error = GetNewID(menuPtr->interp, menuPtr, 0, &menuID);
- if (error != TCL_OK) {
- return error;
- }
- length = strlen(Tk_PathName(menuPtr->tkwin));
- memmove(&itemText[1], Tk_PathName(menuPtr->tkwin),
- (length > 230) ? 230 : length);
- itemText[0] = (length > 230) ? 230 : length;
- macMenuHdl = NewMenu(menuID, itemText);
-#if GENERATINGCFM
- {
- Handle mdefProc = FixMDEF();
- if ((mdefProc != NULL)) {
- (*macMenuHdl)->menuProc = mdefProc;
- }
- }
-#endif
- menuPtr->platformData = (TkMenuPlatformData) ckalloc(sizeof(MacMenu));
- ((MacMenu *) menuPtr->platformData)->menuHdl = macMenuHdl;
- SetRect(&((MacMenu *) menuPtr->platformData)->menuRect, 0, 0, 0, 0);
-
- if ((currentMenuBarInterp == menuPtr->interp)
- && (currentMenuBarName != NULL)) {
- Tk_Window parentWin = Tk_Parent(menuPtr->tkwin);
-
- if (strcmp(currentMenuBarName, Tk_PathName(parentWin)) == 0) {
- if ((strcmp(Tk_PathName(menuPtr->tkwin)
- + strlen(Tk_PathName(parentWin)), ".apple") == 0)
- || (strcmp(Tk_PathName(menuPtr->tkwin)
- + strlen(Tk_PathName(parentWin)), ".help") == 0)) {
- if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
- }
- }
- }
- }
-
- menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyMenu --
- *
- * Destroys platform-specific menu structures.
- *
- * Results:
- * None.
- *
- * Side effects:
- * All platform-specific allocations are freed up.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyMenu(
- TkMenu *menuPtr) /* The common menu structure */
-{
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
-
- if (menuPtr->menuFlags & MENU_RECONFIGURE_PENDING) {
- Tcl_CancelIdleCall(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- menuPtr->menuFlags &= ~MENU_RECONFIGURE_PENDING;
- }
-
- if ((*macMenuHdl)->menuID == currentHelpMenuID) {
- MenuHandle helpMenuHdl;
-
- if ((HMGetHelpMenuHandle(&helpMenuHdl) == noErr)
- && (helpMenuHdl != NULL)) {
- int i, count = CountMItems(helpMenuHdl);
-
- for (i = helpItemCount; i <= count; i++) {
- DeleteMenuItem(helpMenuHdl, helpItemCount);
- }
- }
- currentHelpMenuID = 0;
- }
-
- if (menuPtr->platformData != NULL) {
- DeleteMenu((*macMenuHdl)->menuID);
- FreeID((*macMenuHdl)->menuID);
- DisposeMenu(macMenuHdl);
- ckfree((char *) menuPtr->platformData);
- menuPtr->platformData = NULL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SetMenuCascade --
- *
- * Does any cleanup to change a menu from a normal to a cascade.
- *
- * Results:
- * Standard Tcl error.
- *
- * Side effects:
- * The mac menu id is reset.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-SetMenuCascade(
- TkMenu* menuPtr) /* The menu we are setting up to be a
- * cascade. */
-{
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
- short newMenuID, menuID = (*macMenuHdl)->menuID;
- int error = TCL_OK;
-
- if (menuID >= 256) {
- error = GetNewID(menuPtr->interp, menuPtr, 1, &newMenuID);
- if (error == TCL_OK) {
- FreeID(menuID);
- (*macMenuHdl)->menuID = newMenuID;
- }
- }
- return error;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyMenuEntry --
- *
- * Cleans up platform-specific menu entry items.
- *
- * Results:
- * None
- *
- * Side effects:
- * All platform-specific allocations are freed up.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyMenuEntry(
- TkMenuEntry *mePtr) /* The common structure for the menu
- * entry. */
-{
- TkMenu *menuPtr = mePtr->menuPtr;
-
- ckfree((char *) mePtr->platformEntryData);
- if ((menuPtr->platformData != NULL)
- && !(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
- menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetEntryText --
- *
- * 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. This is primarily used to do a substitution
- * between "..." and "Š".
- *
- * Results:
- * itemText points to the new text for the item.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetEntryText(
- TkMenuEntry *mePtr, /* A pointer to the menu entry. */
- 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) {
- Tcl_DStringAppend(dStringPtr, "(Tear-off)", -1);
- } else if ((mePtr->imagePtr != NULL) && (mePtr->compound == COMPOUND_NONE)) {
- Tcl_DStringAppend(dStringPtr, "(Image)", -1);
- } else if ((mePtr->bitmapPtr != NULL) && (mePtr->compound == COMPOUND_NONE)) {
- Tcl_DStringAppend(dStringPtr, "(Pixmap)", -1);
- } else if (mePtr->labelPtr == NULL || mePtr->labelLength == 0) {
- /*
- * The Mac menu manager does not like null strings.
- */
-
- Tcl_DStringAppend(dStringPtr, " ", -1);
- } else {
- int length;
- char *text = Tcl_GetStringFromObj(mePtr->labelPtr, &length);
- char *dStringText;
- int i;
-
- for (i = 0; *text; text++, i++) {
- if ((*text == '.')
- && (*(text + 1) != '\0') && (*(text + 1) == '.')
- && (*(text + 2) != '\0') && (*(text + 2) == '.')) {
- Tcl_DStringAppend(dStringPtr, elipsisString, -1);
- i += strlen(elipsisString) - 1;
- text += 2;
- } else {
- Tcl_DStringSetLength(dStringPtr,
- Tcl_DStringLength(dStringPtr) + 1);
- dStringText = Tcl_DStringValue(dStringPtr);
- dStringText[i] = *text;
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * FindMarkCharacter --
- *
- * Finds the Macintosh mark character based on the font of the
- * item. We calculate a good mark character based on the font
- * that this item is rendered in.
- *
- * We try the following special mac characters. If none of them
- * are present, just use the check mark.
- * '' - Check mark character (\022)
- * '€' - Mac Bullet character (\245)
- * '' - Filled diamond (\023)
- * '×' - Hollow diamond (\327)
- * '‹' = Mac Long dash ("em dash") (\321)
- * '-' = short dash (minus, "en dash");
- *
- * Results:
- * None.
- *
- * Side effects:
- * New item is added to platform menu
- *
- *----------------------------------------------------------------------
- */
-
-static char
-FindMarkCharacter(
- TkMenuEntry *mePtr) /* The entry we are finding the character
- * for. */
-{
- char markChar;
- Tk_Font tkfont;
-
- tkfont = Tk_GetFontFromObj(mePtr->menuPtr->tkwin,
- (mePtr->fontPtr == NULL) ? mePtr->menuPtr->fontPtr
- : mePtr->fontPtr);
-
- if (!TkMacIsCharacterMissing(tkfont, '\022')) {
- markChar = '\022'; /* Check mark */
- } else if (!TkMacIsCharacterMissing(tkfont, '\245')) {
- markChar = '\245'; /* Bullet */
- } else if (!TkMacIsCharacterMissing(tkfont, '\023')) {
- markChar = '\023'; /* Filled Diamond */
- } else if (!TkMacIsCharacterMissing(tkfont, '\327')) {
- markChar = '\327'; /* Hollow Diamond */
- } else if (!TkMacIsCharacterMissing(tkfont, '\321')) {
- markChar = '\321'; /* Long Dash */
- } else if (!TkMacIsCharacterMissing(tkfont, '-')) {
- markChar = '-'; /* Short Dash */
- } else {
- markChar = '\022'; /* Check mark */
- }
- return markChar;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SetMenuIndicator --
- *
- * Sets the Macintosh mark character based on the font of the
- * item.
- *
- * Results:
- * None.
- *
- * Side effects:
- * New item is added to platform menu
- *
- *----------------------------------------------------------------------
- */
-
-static void
-SetMenuIndicator(
- TkMenuEntry *mePtr) /* The entry we are setting */
-{
- TkMenu *menuPtr = mePtr->menuPtr;
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
- char markChar;
-
- /*
- * There can be no indicators on menus that are not checkbuttons
- * or radiobuttons. However, we should go ahead and set them
- * so that menus look right when they are displayed. We should
- * not set cascade entries, however, as the mark character
- * means something different for cascade items on the Mac.
- * Also, we do reflect the tearOff menu items in the Mac menu
- * handle, so we ignore them.
- */
-
- if (mePtr->type == CASCADE_ENTRY) {
- return;
- }
-
- 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);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SetMenuTitle --
- *
- * Sets title of menu so that the text displays correctly in menubar.
- * This code directly manipulates menu handle data. This code
- * was originally part of an ancient Apple Developer Response mail.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menu handle will change size depending on the length of the
- * title
- *
- *----------------------------------------------------------------------
- */
-
-static void
-SetMenuTitle(
- MenuHandle menuHdl, /* The menu we are setting the title of. */
- 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;
-
- if (strncmp(title, menuDataPtr + 1, menuDataPtr[0]) != 0) {
- newLength = strlen(title) + 1;
- oldLength = menuDataPtr[0] + 1;
- oldHandleSize = GetHandleSize((Handle) menuHdl);
- dataLength = oldHandleSize - (sizeof(MenuInfo) - sizeof(Str255))
- - oldLength;
- if (newLength > oldLength) {
- SetHandleSize((Handle) menuHdl, oldHandleSize + (newLength
- - oldLength));
- menuDataPtr = (Ptr) (*menuHdl)->menuData;
- }
-
- BlockMove(menuDataPtr + oldLength, menuDataPtr + newLength,
- dataLength);
- BlockMove(title, menuDataPtr + 1, newLength - 1);
- menuDataPtr[0] = newLength - 1;
-
- if (newLength < oldLength) {
- SetHandleSize((Handle) menuHdl, oldHandleSize + (newLength
- - oldLength));
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpConfigureMenuEntry --
- *
- * Processes configurations for menu entries.
- *
- * Results:
- * Returns standard TCL result. If TCL_ERROR is returned, then
- * the interp's result contains an error message.
- *
- * Side effects:
- * Configuration information get set for mePtr; old resources
- * get freed, if any need it.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpConfigureMenuEntry(
- register TkMenuEntry *mePtr) /* Information about menu entry; may
- * or may not already have values for
- * some fields. */
-{
- TkMenu *menuPtr = mePtr->menuPtr;
- int index = mePtr->index;
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
- MenuHandle helpMenuHdl = NULL;
-
- /*
- * Cascade menus have to have menu IDs of less than 256. So
- * we need to change the child menu if this has been configured
- * for a cascade item.
- */
-
- if (mePtr->type == CASCADE_ENTRY) {
- if ((mePtr->childMenuRefPtr != NULL)
- && (mePtr->childMenuRefPtr->menuPtr != NULL)) {
- MenuHandle childMenuHdl = ((MacMenu *) mePtr
- ->childMenuRefPtr->menuPtr->platformData)->menuHdl;
-
- if (childMenuHdl != NULL) {
- int error = SetMenuCascade(mePtr->childMenuRefPtr->menuPtr);
-
- if (error != TCL_OK) {
- return error;
- }
-
- if (menuPtr->menuType == MENUBAR) {
- SetMenuTitle(childMenuHdl, mePtr->labelPtr);
- }
- }
- }
- }
-
- /*
- * We need to parse the accelerator string. If it has the strings
- * for Command, Control, Shift or Option, we need to flag it
- * so we can draw the symbols for it. We also need to precalcuate
- * the position of the first real character we are drawing.
- */
-
- if (0 == mePtr->accelLength) {
- ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart = -1;
- } else {
- char *accelString = (mePtr->accelPtr == NULL) ? ""
- : Tcl_GetStringFromObj(mePtr->accelPtr, NULL);
- char *accel = accelString;
- mePtr->entryFlags |= ~ENTRY_ACCEL_MASK;
-
- while (1) {
- if ((0 == strncasecmp("Control", accelString, 6))
- && (('-' == accelString[6]) || ('+' == accelString[6]))) {
- mePtr->entryFlags |= ENTRY_CONTROL_ACCEL;
- accelString += 7;
- } else if ((0 == strncasecmp("Ctrl", accelString, 4))
- && (('-' == accelString[4]) || ('+' == accelString[4]))) {
- mePtr->entryFlags |= ENTRY_CONTROL_ACCEL;
- accelString += 5;
- } else if ((0 == strncasecmp("Shift", accelString, 5))
- && (('-' == accelString[5]) || ('+' == accelString[5]))) {
- mePtr->entryFlags |= ENTRY_SHIFT_ACCEL;
- accelString += 6;
- } else if ((0 == strncasecmp("Option", accelString, 6))
- && (('-' == accelString[6]) || ('+' == accelString[6]))) {
- mePtr->entryFlags |= ENTRY_OPTION_ACCEL;
- accelString += 7;
- } else if ((0 == strncasecmp("Opt", accelString, 3))
- && (('-' == accelString[3]) || ('+' == accelString[3]))) {
- mePtr->entryFlags |= ENTRY_OPTION_ACCEL;
- accelString += 4;
- } else if ((0 == strncasecmp("Command", accelString, 7))
- && (('-' == accelString[7]) || ('+' == accelString[7]))) {
- mePtr->entryFlags |= ENTRY_COMMAND_ACCEL;
- accelString += 8;
- } else if ((0 == strncasecmp("Cmd", accelString, 3))
- && (('-' == accelString[3]) || ('+' == accelString[3]))) {
- mePtr->entryFlags |= ENTRY_COMMAND_ACCEL;
- accelString += 4;
- } else if ((0 == strncasecmp("Alt", accelString, 3))
- && (('-' == accelString[3]) || ('+' == accelString[3]))) {
- mePtr->entryFlags |= ENTRY_OPTION_ACCEL;
- accelString += 4;
- } else if ((0 == strncasecmp("Meta", accelString, 4))
- && (('-' == accelString[4]) || ('+' == accelString[4]))) {
- mePtr->entryFlags |= ENTRY_COMMAND_ACCEL;
- accelString += 5;
- } else {
- break;
- }
- }
-
- ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart
- = ((long) accelString - (long) accel);
- }
-
- if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
- menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- }
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ReconfigureIndividualMenu --
- *
- * This routine redoes the guts of the menu. It works from
- * a base item and offset, so that a regular menu will
- * just have all of its items added, but the help menu will
- * have all of its items appended after the apple-defined
- * items.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The Macintosh menu handle is updated
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ReconfigureIndividualMenu(
- TkMenu *menuPtr, /* The menu we are affecting. */
- MenuHandle macMenuHdl, /* The macintosh menu we are affecting.
- * Will not necessarily be
- * menuPtr->platformData because this could
- * be the help menu. */
- int base) /* The last index that we do not want
- * touched. 0 for normal menus;
- * helpMenuItemCount for help menus. */
-{
- int count;
- int index;
- TkMenuEntry *mePtr;
- Str255 itemText;
- int parentDisabled = 0;
-
- for (mePtr = menuPtr->menuRefPtr->parentEntryPtr; mePtr != NULL;
- mePtr = mePtr->nextCascadePtr) {
- 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;
- }
- }
-
- /*
- * First, we get rid of all of the old items.
- */
-
- count = CountMItems(macMenuHdl);
- for (index = base; index < count; index++) {
- DeleteMenuItem(macMenuHdl, base + 1);
- }
-
- count = menuPtr->numEntries;
-
- for (index = 1; index <= count; index++) {
- mePtr = menuPtr->entries[index - 1];
-
- /*
- * We have to do separators separately because SetMenuItemText
- * does not parse meta-characters.
- */
-
- if (mePtr->type == SEPARATOR_ENTRY) {
- AppendMenu(macMenuHdl, SEPARATOR_TEXT);
- } else {
- 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 == ENTRY_DISABLED)) {
- DisableItem(macMenuHdl, base + index);
- } else {
- EnableItem(macMenuHdl, base + index);
- }
-
- /*
- * Set the check mark for check entries and radio entries.
- */
-
- SetItemMark(macMenuHdl, base + index, 0);
- if ((mePtr->type == CHECK_BUTTON_ENTRY)
- || (mePtr->type == RADIO_BUTTON_ENTRY)) {
- CheckItem(macMenuHdl, base + index, (mePtr->entryFlags
- & ENTRY_SELECTED) && mePtr->indicatorOn);
- if (mePtr->indicatorOn
- && (mePtr->entryFlags & ENTRY_SELECTED)) {
- SetItemMark(macMenuHdl, base + index,
- FindMarkCharacter(mePtr));
- }
- }
-
- if (mePtr->type == CASCADE_ENTRY) {
- if ((mePtr->childMenuRefPtr != NULL)
- && (mePtr->childMenuRefPtr->menuPtr != NULL)) {
- MenuHandle childMenuHdl =
- ((MacMenu *) mePtr->childMenuRefPtr
- ->menuPtr->platformData)->menuHdl;
-
- if (childMenuHdl == NULL) {
- childMenuHdl = ((MacMenu *) mePtr->childMenuRefPtr
- ->menuPtr->platformData)->menuHdl;
- }
- if (childMenuHdl != NULL) {
- if (TkMacHaveAppearance() > 1) {
- SetMenuItemHierarchicalID(macMenuHdl, base + index,
- (*childMenuHdl)->menuID);
- } else {
- SetItemMark(macMenuHdl, base + index,
- (*childMenuHdl)->menuID);
- SetItemCmd(macMenuHdl, base + index, CASCADE_CMD);
- }
- }
- /*
- * If we changed the highligthing of this menu, its
- * children all have to be reconfigured so that
- * their state will be reflected in the menubar.
- */
-
- if (!(mePtr->childMenuRefPtr->menuPtr->menuFlags
- & MENU_RECONFIGURE_PENDING)) {
- mePtr->childMenuRefPtr->menuPtr->menuFlags
- |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) mePtr->childMenuRefPtr->menuPtr);
- }
- }
- }
-
- if ((mePtr->type != CASCADE_ENTRY)
- && (ENTRY_COMMAND_ACCEL
- == (mePtr->entryFlags & ENTRY_ACCEL_MASK))) {
- char *accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL);
- SetItemCmd(macMenuHdl, base + index, accel[((EntryGeometry *)
- mePtr->platformEntryData)->accelTextStart]);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ReconfigureMacintoshMenu --
- *
- * Rebuilds the Macintosh MenuHandle items from the menu. Called
- * usually as an idle handler, but can be called synchronously
- * if the menu is about to be posted.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Configuration information get set for mePtr; old resources
- * get freed, if any need it.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ReconfigureMacintoshMenu(
- ClientData clientData) /* Information about menu entry; may
- * or may not already have values for
- * some fields. */
-{
- TkMenu *menuPtr = (TkMenu *) clientData;
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
- MenuHandle helpMenuHdl = NULL;
-
- menuPtr->menuFlags &= ~MENU_RECONFIGURE_PENDING;
-
- if (NULL == macMenuHdl) {
- return;
- }
-
- ReconfigureIndividualMenu(menuPtr, macMenuHdl, 0);
-
- if (menuPtr->menuFlags & MENU_APPLE_MENU) {
- AppendResMenu(macMenuHdl, 'DRVR');
- }
-
- if ((*macMenuHdl)->menuID == currentHelpMenuID) {
- HMGetHelpMenuHandle(&helpMenuHdl);
- if (helpMenuHdl != NULL) {
- ReconfigureIndividualMenu(menuPtr, helpMenuHdl, helpItemCount);
- }
- }
-
- if (menuPtr->menuType == MENUBAR) {
- if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * CompleteIdlers --
- *
- * Completes all idle handling so that the menus are in sync when
- * the user invokes them with the mouse.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The Macintosh menu handles are flushed out.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-CompleteIdlers(
- TkMenu *menuPtr) /* The menu we are completing. */
-{
- int i;
-
- if (menuPtr->menuFlags & MENU_RECONFIGURE_PENDING) {
- Tcl_CancelIdleCall(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- ReconfigureMacintoshMenu((ClientData) menuPtr);
- }
-
- for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- CompleteIdlers(menuPtr->entries[i]->childMenuRefPtr
- ->menuPtr);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpPostMenu --
- *
- * Posts a menu on the screen
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menu is posted and handled.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpPostMenu(
- Tcl_Interp *interp, /* The interpreter this menu lives in */
- TkMenu *menuPtr, /* The menu we are posting */
- int x, /* The global x-coordinate of the top, left-
- * hand corner of where the menu is supposed
- * to be posted. */
- int y) /* The global y-coordinate */
-{
- MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
- long popUpResult;
- int result;
- int oldMode;
-
- if (inPostMenu) {
- Tcl_AppendResult(interp,
- "Cannot call post menu while already posting menu",
- (char *) NULL);
- result = TCL_ERROR;
- } else {
- Window dummyWin;
- unsigned int state;
- int dummy, mouseX, mouseY;
- short menuID;
- Window window;
- int oldWidth = menuPtr->totalWidth;
- Tk_Window parentWindow = Tk_Parent(menuPtr->tkwin);
-
- inPostMenu++;
-
- result = TkPreprocessMenu(menuPtr);
- if (result != TCL_OK) {
- inPostMenu--;
- return result;
- }
-
- /*
- * The post commands could have deleted the menu, which means
- * we are dead and should go away.
- */
-
- if (menuPtr->tkwin == NULL) {
- inPostMenu--;
- return TCL_OK;
- }
-
- CompleteIdlers(menuPtr);
- if (menuBarFlags & MENUBAR_REDRAW_PENDING) {
- Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL);
- DrawMenuBarWhenIdle((ClientData *) NULL);
- }
-
- if (NULL == parentWindow) {
- tearoffStruct.excludeRect.top = tearoffStruct.excludeRect.left
- = tearoffStruct.excludeRect.bottom
- = tearoffStruct.excludeRect.right = SHRT_MAX;
- } else {
- int left, top;
-
- Tk_GetRootCoords(parentWindow, &left, &top);
- tearoffStruct.excludeRect.left = left;
- tearoffStruct.excludeRect.top = top;
- tearoffStruct.excludeRect.right = left + Tk_Width(parentWindow);
- tearoffStruct.excludeRect.bottom = top + Tk_Height(parentWindow);
- if (Tk_Class(parentWindow) == Tk_GetUid("Menubutton")) {
- TkWindow *parentWinPtr = (TkWindow *) parentWindow;
- TkMenuButton *mbPtr =
- (TkMenuButton *) parentWinPtr->instanceData;
- int menuButtonWidth = Tk_Width(parentWindow)
- - 2 * (mbPtr->highlightWidth + mbPtr->borderWidth + 1);
- menuPtr->totalWidth = menuButtonWidth > menuPtr->totalWidth
- ? menuButtonWidth : menuPtr->totalWidth;
- }
- }
-
- InsertMenu(macMenuHdl, -1);
- RecursivelyInsertMenu(menuPtr);
- CountMItems(macMenuHdl);
-
- FixMDEF();
- oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
- popUpResult = PopUpMenuSelect(macMenuHdl, y, x, menuPtr->active);
- Tcl_SetServiceMode(oldMode);
-
- menuPtr->totalWidth = oldWidth;
- RecursivelyDeleteMenu(menuPtr);
- DeleteMenu((*macMenuHdl)->menuID);
-
- /*
- * Simulate the mouse up.
- */
-
- XQueryPointer(NULL, None, &dummyWin, &dummyWin, &mouseX,
- &mouseY, &dummy, &dummy, &state);
- window = Tk_WindowId(menuPtr->tkwin);
- TkGenerateButtonEvent(mouseX, mouseY, window, state);
-
- /*
- * Dispatch the command.
- */
-
- menuID = HiWord(popUpResult);
- if (menuID != 0) {
- result = TkMacDispatchMenuEvent(menuID, LoWord(popUpResult));
- } else {
- TkMacHandleTearoffMenu();
- result = TCL_OK;
- }
- InvalidateMDEFRgns();
- RecursivelyClearActiveMenu(menuPtr);
-
- inPostMenu--;
- }
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMenuNewEntry --
- *
- * Adds a pointer to a new menu entry structure with the platform-
- * specific fields filled in. The Macintosh uses the
- * platformEntryData field of the TkMenuEntry record to store
- * geometry information.
- *
- * Results:
- * Standard TCL error.
- *
- * Side effects:
- * Storage gets allocated. New menu entry data is put into the
- * platformEntryData field of the mePtr.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpMenuNewEntry(
- TkMenuEntry *mePtr) /* The menu we are adding an entry to */
-{
- EntryGeometry *geometryPtr =
- (EntryGeometry *) ckalloc(sizeof(EntryGeometry));
- TkMenu *menuPtr = mePtr->menuPtr;
-
- geometryPtr->accelTextStart = 0;
- geometryPtr->accelTextWidth = 0;
- geometryPtr->nonAccelMargin = 0;
- geometryPtr->modifierWidth = 0;
- mePtr->platformEntryData = (TkMenuPlatformEntryData) geometryPtr;
- if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
- menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- *
- * Tk_MacTurnOffMenus --
- *
- * Turns off all the menu drawing code. This is more than just disabling
- * the "menu" command, this means that Tk will NEVER touch the menubar.
- * It is needed in the Plugin, where Tk does not own the menubar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A flag is set which will disable all menu drawing.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_MacTurnOffMenus()
-{
- gNoTkMenus = 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- *
- * DrawMenuBarWhenIdle --
- *
- * Update the menu bar next time there is an idle event.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Menu bar is redrawn.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuBarWhenIdle(
- ClientData clientData) /* ignored here */
-{
- TkMenuReferences *menuRefPtr;
- TkMenu *appleMenuPtr, *helpMenuPtr;
- MenuHandle macMenuHdl;
- Tcl_HashEntry *hashEntryPtr;
-
- /*
- * If we have been turned off, exit.
- */
-
- if (gNoTkMenus) {
- return;
- }
-
- /*
- * We need to clear the apple and help menus of any extra items.
- */
-
- if (currentAppleMenuID != 0) {
- hashEntryPtr = Tcl_FindHashEntry(&commandTable,
- (char *) currentAppleMenuID);
- appleMenuPtr = (TkMenu *) Tcl_GetHashValue(hashEntryPtr);
- TkpDestroyMenu(appleMenuPtr);
- TkpNewMenu(appleMenuPtr);
- appleMenuPtr->menuFlags &= ~MENU_APPLE_MENU;
- appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) appleMenuPtr);
- }
-
- if (currentHelpMenuID != 0) {
- hashEntryPtr = Tcl_FindHashEntry(&commandTable,
- (char *) currentHelpMenuID);
- helpMenuPtr = (TkMenu *) Tcl_GetHashValue(hashEntryPtr);
- TkpDestroyMenu(helpMenuPtr);
- TkpNewMenu(helpMenuPtr);
- helpMenuPtr->menuFlags &= ~MENU_HELP_MENU;
- helpMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) helpMenuPtr);
- }
-
- /*
- * We need to find the clone of this menu that is the menubar.
- * Once we do that, for every cascade in the menu, we need to
- * insert the Mac menu in the Mac menubar. Finally, we need
- * to redraw the menubar.
- */
-
- menuRefPtr = NULL;
- if (currentMenuBarName != NULL) {
- menuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- }
- if (menuRefPtr != NULL) {
- TkMenu *menuPtr, *menuBarPtr;
- TkMenu *cascadeMenuPtr;
- char *appleMenuName, *helpMenuName;
- int appleIndex = -1, helpIndex = -1;
- int i;
-
- menuPtr = menuRefPtr->menuPtr;
- if (menuPtr != NULL) {
- TkMenuReferences *specialMenuRefPtr;
- TkMenuEntry *specialEntryPtr;
-
- appleMenuName = ckalloc(strlen(currentMenuBarName)
- + 1 + strlen(".apple") + 1);
- sprintf(appleMenuName, "%s.apple",
- Tk_PathName(menuPtr->tkwin));
- specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- appleMenuName);
- if ((specialMenuRefPtr != NULL)
- && (specialMenuRefPtr->menuPtr != NULL)) {
- for (specialEntryPtr
- = specialMenuRefPtr->parentEntryPtr;
- specialEntryPtr != NULL;
- specialEntryPtr
- = specialEntryPtr->nextCascadePtr) {
- if (specialEntryPtr->menuPtr == menuPtr) {
- appleIndex = specialEntryPtr->index;
- break;
- }
- }
- }
- ckfree(appleMenuName);
-
- helpMenuName = ckalloc(strlen(currentMenuBarName)
- + 1 + strlen(".help") + 1);
- sprintf(helpMenuName, "%s.help",
- Tk_PathName(menuPtr->tkwin));
- specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- helpMenuName);
- if ((specialMenuRefPtr != NULL)
- && (specialMenuRefPtr->menuPtr != NULL)) {
- for (specialEntryPtr
- = specialMenuRefPtr->parentEntryPtr;
- specialEntryPtr != NULL;
- specialEntryPtr
- = specialEntryPtr->nextCascadePtr) {
- if (specialEntryPtr->menuPtr == menuPtr) {
- helpIndex = specialEntryPtr->index;
- break;
- }
- }
- }
- ckfree(helpMenuName);
-
- }
-
- for (menuBarPtr = menuPtr;
- (menuBarPtr != NULL)
- && (menuBarPtr->menuType != MENUBAR);
- menuBarPtr = menuBarPtr->nextInstancePtr) {
-
- /*
- * Null loop body.
- */
-
- }
-
- if (menuBarPtr == NULL) {
- SetDefaultMenubar();
- } else {
- if (menuBarPtr->tearoff != menuPtr->tearoff) {
- if (menuBarPtr->tearoff) {
- appleIndex = (-1 == appleIndex) ? appleIndex
- : appleIndex + 1;
- helpIndex = (-1 == helpIndex) ? helpIndex
- : helpIndex + 1;
- } else {
- appleIndex = (-1 == appleIndex) ? appleIndex
- : appleIndex - 1;
- helpIndex = (-1 == helpIndex) ? helpIndex
- : helpIndex - 1;
- }
- }
- ClearMenuBar();
-
- if (appleIndex == -1) {
- InsertMenu(tkAppleMenu, 0);
- currentAppleMenuID = 0;
- } else {
- short appleID;
- appleMenuPtr = menuBarPtr->entries[appleIndex]
- ->childMenuRefPtr->menuPtr;
- TkpDestroyMenu(appleMenuPtr);
- GetNewID(appleMenuPtr->interp, appleMenuPtr, 0,
- &appleID);
- macMenuHdl = NewMenu(appleID, "\p\024");
- appleMenuPtr->platformData =
- (TkMenuPlatformData) ckalloc(sizeof(MacMenu));
- ((MacMenu *)appleMenuPtr->platformData)->menuHdl
- = macMenuHdl;
- SetRect(&((MacMenu *) appleMenuPtr->platformData)->menuRect,
- 0, 0, 0, 0);
- appleMenuPtr->menuFlags |= MENU_APPLE_MENU;
- if (!(appleMenuPtr->menuFlags
- & MENU_RECONFIGURE_PENDING)) {
- appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) appleMenuPtr);
- }
- InsertMenu(macMenuHdl, 0);
- RecursivelyInsertMenu(appleMenuPtr);
- currentAppleMenuID = appleID;
- }
- if (helpIndex == -1) {
- currentHelpMenuID = 0;
- }
-
- for (i = 0; i < menuBarPtr->numEntries; i++) {
- if (i == appleIndex) {
- if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
- DisableItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- } else {
- EnableItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- }
- continue;
- } else if (i == helpIndex) {
- TkMenu *helpMenuPtr = menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr;
- MenuHandle helpMenuHdl = NULL;
-
- if (helpMenuPtr == NULL) {
- continue;
- }
- helpMenuPtr->menuFlags |= MENU_HELP_MENU;
- if (!(helpMenuPtr->menuFlags
- & MENU_RECONFIGURE_PENDING)) {
- helpMenuPtr->menuFlags
- |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) helpMenuPtr);
- }
- macMenuHdl =
- ((MacMenu *) helpMenuPtr->platformData)->menuHdl;
- currentHelpMenuID = (*macMenuHdl)->menuID;
- } else if (menuBarPtr->entries[i]->type
- == CASCADE_ENTRY) {
- if ((menuBarPtr->entries[i]->childMenuRefPtr != NULL)
- && menuBarPtr->entries[i]->childMenuRefPtr
- ->menuPtr != NULL) {
- cascadeMenuPtr = menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr;
- macMenuHdl = ((MacMenu *) cascadeMenuPtr
- ->platformData)->menuHdl;
- DeleteMenu((*macMenuHdl)->menuID);
- InsertMenu(macMenuHdl, 0);
- RecursivelyInsertMenu(cascadeMenuPtr);
- if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
- DisableItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- } else {
- EnableItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- }
- }
- }
- }
- }
- } else {
- SetDefaultMenubar();
- }
- DrawMenuBar();
- menuBarFlags &= ~MENUBAR_REDRAW_PENDING;
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * RecursivelyInsertMenu --
- *
- * Puts all of the cascades of this menu in the Mac hierarchical list.
- *
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menubar is changed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-RecursivelyInsertMenu(
- TkMenu *menuPtr) /* All of the cascade items in this menu
- * will be inserted into the mac menubar. */
-{
- int i;
- TkMenu *cascadeMenuPtr;
- MenuHandle macMenuHdl;
-
- for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
- macMenuHdl =
- ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
- InsertMenu(macMenuHdl, -1);
- RecursivelyInsertMenu(cascadeMenuPtr);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RecursivelyDeleteMenu --
- *
- * Takes all of the cascades of this menu out of the Mac hierarchical
- * list.
- *
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menubar is changed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-RecursivelyDeleteMenu(
- TkMenu *menuPtr) /* All of the cascade items in this menu
- * will be inserted into the mac menubar. */
-{
- int i;
- TkMenu *cascadeMenuPtr;
- MenuHandle macMenuHdl;
-
- for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
- macMenuHdl =
- ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
- DeleteMenu((*macMenuHdl)->menuID);
- RecursivelyInsertMenu(cascadeMenuPtr);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SetDefaultMenubar --
- *
- * Puts the Apple, File and Edit menus into the Macintosh menubar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menubar is changed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-SetDefaultMenubar()
-{
- if (currentMenuBarName != NULL) {
- ckfree(currentMenuBarName);
- currentMenuBarName = NULL;
- }
- currentMenuBarOwner = NULL;
- ClearMenuBar();
- InsertMenu(tkAppleMenu, 0);
- InsertMenu(tkFileMenu, 0);
- InsertMenu(tkEditMenu, 0);
- if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpSetMainMenubar --
- *
- * Puts the menu associated with a window into the menubar. Should
- * only be called when the window is in front.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menubar is changed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpSetMainMenubar(
- Tcl_Interp *interp, /* The interpreter of the application */
- Tk_Window tkwin, /* The frame we are setting up */
- char *menuName) /* The name of the menu to put in front.
- * If NULL, use the default menu bar.
- */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- WindowRef macWindowPtr = (WindowRef) TkMacGetDrawablePort(winPtr->window);
- WindowRef frontNonFloating;
-
- if (TkMacHaveAppearance() >= 0x110) {
- frontNonFloating = FrontNonFloatingWindow();
- } else {
- frontNonFloating = FrontWindow();
- }
-
- if ((macWindowPtr == NULL) || (macWindowPtr != frontNonFloating)) {
- return;
- }
-
- if ((currentMenuBarInterp != interp)
- || (currentMenuBarOwner != tkwin)
- || (currentMenuBarName == NULL)
- || (menuName == NULL)
- || (strcmp(menuName, currentMenuBarName) != 0)) {
- Tk_Window searchWindow;
- TopLevelMenubarList *listPtr;
-
- if (currentMenuBarName != NULL) {
- ckfree(currentMenuBarName);
- }
-
- if (menuName == NULL) {
- searchWindow = tkwin;
- if (strcmp(Tk_Class(searchWindow), "Menu") == 0) {
- TkMenuReferences *menuRefPtr;
-
- menuRefPtr = TkFindMenuReferences(interp, Tk_PathName(tkwin));
- if (menuRefPtr != NULL) {
- TkMenu *menuPtr = menuRefPtr->menuPtr;
- if (menuPtr != NULL) {
- menuPtr = menuPtr->masterMenuPtr;
- searchWindow = menuPtr->tkwin;
- }
- }
- }
- for (; searchWindow != NULL;
- searchWindow = Tk_Parent(searchWindow)) {
-
- for (listPtr = windowListPtr; listPtr != NULL;
- listPtr = listPtr->nextPtr) {
- if (listPtr->tkwin == searchWindow) {
- break;
- }
- }
- if (listPtr != NULL) {
- menuName = Tk_PathName(listPtr->menuPtr->masterMenuPtr
- ->tkwin);
- break;
- }
- }
- }
-
- if (menuName == NULL) {
- currentMenuBarName = NULL;
- } else {
- currentMenuBarName = ckalloc(strlen(menuName) + 1);
- strcpy(currentMenuBarName, menuName);
- }
- currentMenuBarOwner = tkwin;
- currentMenuBarInterp = interp;
- }
- if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpSetWindowMenuBar --
- *
- * Associates a given menu with a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * On Windows and UNIX, associates the platform menu with the
- * platform window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpSetWindowMenuBar(
- Tk_Window tkwin, /* The window we are setting the menu in */
- TkMenu *menuPtr) /* The menu we are setting */
-{
- TopLevelMenubarList *listPtr, *prevPtr;
-
- /*
- * Remove any existing reference to this window.
- */
-
- for (prevPtr = NULL, listPtr = windowListPtr;
- listPtr != NULL;
- prevPtr = listPtr, listPtr = listPtr->nextPtr) {
- if (listPtr->tkwin == tkwin) {
- break;
- }
- }
-
- if (listPtr != NULL) {
- if (prevPtr != NULL) {
- prevPtr->nextPtr = listPtr->nextPtr;
- } else {
- windowListPtr = listPtr->nextPtr;
- }
- ckfree((char *) listPtr);
- }
-
- if (menuPtr != NULL) {
- listPtr = (TopLevelMenubarList *) ckalloc(sizeof(TopLevelMenubarList));
- listPtr->nextPtr = windowListPtr;
- windowListPtr = listPtr;
- listPtr->tkwin = tkwin;
- listPtr->menuPtr = menuPtr;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacDispatchMenuEvent --
- *
- * Given a menu id and an item, dispatches the command associated
- * with it.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands get executed.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacDispatchMenuEvent(
- int menuID, /* The menu id of the menu we are invoking */
- int index) /* The one-based index of the item that was
- * selected. */
-{
- int result = TCL_OK;
- if (menuID != 0) {
- if (menuID == kHMHelpMenuID) {
- if (currentMenuBarOwner != NULL) {
- TkMenuReferences *helpMenuRef;
- char *helpMenuName = ckalloc(strlen(currentMenuBarName)
- + strlen(".help") + 1);
- sprintf(helpMenuName, "%s.help", currentMenuBarName);
- helpMenuRef = TkFindMenuReferences(currentMenuBarInterp,
- helpMenuName);
- ckfree(helpMenuName);
- if ((helpMenuRef != NULL) && (helpMenuRef->menuPtr != NULL)) {
- int newIndex = index - helpItemCount - 1;
- result = TkInvokeMenu(currentMenuBarInterp,
- helpMenuRef->menuPtr, newIndex);
- }
- }
- } else {
- Tcl_HashEntry *commandEntryPtr =
- Tcl_FindHashEntry(&commandTable, (char *) menuID);
- TkMenu *menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
- if ((currentAppleMenuID == menuID)
- && (index > menuPtr->numEntries + 1)) {
- Str255 itemText;
-
- GetMenuItemText(GetMenuHandle(menuID), index, itemText);
- OpenDeskAcc(itemText);
- result = TCL_OK;
- } else {
- result = TkInvokeMenu(menuPtr->interp, menuPtr, index - 1);
- }
- }
- }
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetMenuIndicatorGeometry --
- *
- * Gets the width and height of the indicator area of a menu.
- *
- * Results:
- * widthPtr and heightPtr are set.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetMenuIndicatorGeometry (
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* Precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* Precalculated font metrics */
- int *widthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
-{
- char markChar;
-
- *heightPtr = fmPtr->linespace;
-
- markChar = (char) FindMarkCharacter(mePtr);
- *widthPtr = Tk_TextWidth(tkfont, &markChar, 1) + 4;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetMenuAccelGeometry --
- *
- * Gets the width and height of the accelerator area of a menu.
- *
- * Results:
- * widthPtr and heightPtr are set.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetMenuAccelGeometry (
- TkMenu *menuPtr, /* The menu we are measuring */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int *modWidthPtr, /* The width of all of the key
- * modifier symbols. */
- int *textWidthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
-{
- *heightPtr = fmPtr->linespace;
- *modWidthPtr = 0;
- if (mePtr->type == CASCADE_ENTRY) {
- *textWidthPtr = SICN_HEIGHT;
- *modWidthPtr = Tk_TextWidth(tkfont, "W", 1);
- } 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, accel, mePtr->accelLength);
- } else {
- int emWidth = Tk_TextWidth(tkfont, "W", 1) + 1;
- if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) {
- int width = Tk_TextWidth(tkfont, accel, mePtr->accelLength);
- *textWidthPtr = emWidth;
- if (width < emWidth) {
- *modWidthPtr = 0;
- } else {
- *modWidthPtr = width - emWidth;
- }
- } else {
- int length = ((EntryGeometry *)mePtr->platformEntryData)
- ->accelTextStart;
- if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) {
- *modWidthPtr += CONTROL_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) {
- *modWidthPtr += SHIFT_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
- *modWidthPtr += OPTION_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
- *modWidthPtr += COMMAND_ICON_WIDTH;
- }
- if (1 == (mePtr->accelLength - length)) {
- *textWidthPtr = emWidth;
- } else {
- *textWidthPtr += Tk_TextWidth(tkfont, accel
- + length, mePtr->accelLength - length);
- }
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetTearoffEntryGeometry --
- *
- * Gets the width and height of of a tearoff entry.
- *
- * Results:
- * widthPtr and heightPtr are set.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetTearoffEntryGeometry (
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int *widthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
-{
- if ((GetResource('MDEF', 591) == NULL) &&
- (menuPtr->menuType == MASTER_MENU)) {
- *heightPtr = fmPtr->linespace;
- *widthPtr = 0;
- } else {
- *widthPtr = *heightPtr = 0;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetMenuSeparatorGeometry --
- *
- * Gets the width and height of menu separator.
- *
- * Results:
- * widthPtr and heightPtr are set.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetMenuSeparatorGeometry(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalcualted font metrics */
- int *widthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
-{
- if (TkMacHaveAppearance() > 1) {
- SInt16 outHeight;
-
- GetThemeMenuSeparatorHeight(&outHeight);
- *widthPtr = 0;
- *heightPtr = outHeight;
- } else {
- *widthPtr = 0;
- *heightPtr = fmPtr->linespace;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuEntryIndicator --
- *
- * This procedure draws the indicator part of a menu.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuEntryIndicator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing */
- GC gc, /* The GC we are drawing with */
- GC indicatorGC, /* The GC to use for the indicator */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* topleft hand corner of entry */
- int y, /* topleft hand corner of entry */
- int width, /* width of entry */
- int height) /* height of entry */
-{
- 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) {
- 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);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuBackground --
- *
- * If Appearance is present, draws the Appearance background
- *
- * Results:
- * Nothing
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-static void
-DrawMenuBackground(
- Rect *menuRectPtr, /* The menu rect */
- Drawable d, /* What we are drawing into */
- ThemeMenuType type /* Type of menu */
- )
-{
- if (!TkMacHaveAppearance()) {
- return;
- } else {
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(d);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(d);
- DrawThemeMenuBackground (menuRectPtr, type);
- SetGWorld(saveWorld, saveDevice);
- return;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawSICN --
- *
- * Given a resource id and an index, loads the appropriate SICN
- * and draws it into a given drawable using the given gc.
- *
- * Results:
- * Returns 1 if the SICN was found, 0 if not found.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-static int
-DrawSICN(
- int resourceID, /* The resource # of the SICN table */
- int index, /* The index into the SICN table of the
- * icon we want. */
- Drawable d, /* What we are drawing into */
- GC gc, /* The GC to draw with */
- int x, /* The left hand coord of the SICN */
- int y) /* The top coord of the SICN */
-{
- Handle sicnHandle = (Handle) GetResource('SICN', SICN_RESOURCE_NUMBER);
-
- if (NULL == sicnHandle) {
- return 0;
- } else {
- BitMap sicnBitmap;
- Rect destRect;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- BitMapPtr destBitMap;
- RGBColor origForeColor, origBackColor, foreColor, backColor;
-
- HLock(sicnHandle);
- destPort = TkMacGetDrawablePort(d);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(d);
- TkMacSetUpGraphicsPort(gc);
- GetForeColor(&origForeColor);
- GetBackColor(&origBackColor);
-
- if (TkSetMacColor(gc->foreground, &foreColor)) {
- RGBForeColor(&foreColor);
- }
-
- if (TkSetMacColor(gc->background, &backColor)) {
- RGBBackColor(&backColor);
- }
-
- SetRect(&destRect, x, y, x + SICN_HEIGHT, y + SICN_HEIGHT);
- sicnBitmap.baseAddr = (Ptr) (*sicnHandle) + index * SICN_HEIGHT
- * SICN_ROWS;
- sicnBitmap.rowBytes = SICN_ROWS;
- SetRect(&sicnBitmap.bounds, 0, 0, 16, 16);
- destBitMap = &((GrafPtr) destPort)->portBits;
- CopyBits(&sicnBitmap, destBitMap, &sicnBitmap.bounds, &destRect,
- destPort->txMode, NULL);
- HUnlock(sicnHandle);
- RGBForeColor(&origForeColor);
- RGBBackColor(&origBackColor);
- SetGWorld(saveWorld, saveDevice);
- return 1;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuEntryAccelerator --
- *
- * This procedure draws the accelerator part of a menu. We
- * need to decide what to draw here. Should we replace strings
- * like "Control", "Command", etc?
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuEntryAccelerator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing in */
- GC gc, /* The gc to draw into */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- Tk_3DBorder activeBorder, /* border for menu background */
- int x, /* The left side of the entry */
- int y, /* The top of the entry */
- int width, /* The width of the entry */
- 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
- */
-
- if (!TkMacHaveAppearance()) {
- if (0 == DrawSICN(SICN_RESOURCE_NUMBER, CASCADE_ARROW, d, gc,
- x + width - SICN_HEIGHT, (y + (height / 2))
- - (SICN_HEIGHT / 2))) {
- XPoint points[3];
- Tk_Window tkwin = menuPtr->tkwin;
-
- if (mePtr->type == CASCADE_ENTRY) {
- 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;
- points[1].y = points[0].y + CASCADE_ARROW_HEIGHT;
- points[2].x = points[0].x + CASCADE_ARROW_WIDTH;
- points[2].y = points[0].y + CASCADE_ARROW_HEIGHT/2;
- Tk_Fill3DPolygon(menuPtr->tkwin, d, activeBorder, points,
- 3, DECORATION_BORDER_WIDTH, TK_RELIEF_FLAT);
- }
- }
- }
- } 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, accel,
- mePtr->accelLength, leftEdge, baseline);
- } else {
- EntryGeometry *geometryPtr =
- (EntryGeometry *) mePtr->platformEntryData;
- int length = mePtr->accelLength - geometryPtr->accelTextStart;
-
- leftEdge -= geometryPtr->accelTextWidth;
- if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) {
- leftEdge -= geometryPtr->modifierWidth;
- }
-
- Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel
- + geometryPtr->accelTextStart, length, leftEdge, baseline);
-
- if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
- leftEdge -= COMMAND_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, COMMAND_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
- }
-
- if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
- leftEdge -= OPTION_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, OPTION_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
- }
-
- if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) {
- leftEdge -= SHIFT_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, SHIFT_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
- }
-
- if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) {
- leftEdge -= CONTROL_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, CONTROL_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuSeparator --
- *
- * The menu separator is drawn.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuSeparator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing into */
- GC gc, /* The gc we are drawing with */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* left coordinate of entry */
- int y, /* top coordinate of entry */
- int width, /* width of entry */
- int height) /* height of entry */
-{
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(d);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(d);
- if (TkMacHaveAppearance() > 1) {
- Rect r;
- r.top = y;
- r.left = x;
- r.bottom = y + height;
- r.right = x + width;
-
- DrawThemeMenuSeparator(&r);
- } else {
- /*
- * We don't want to use the text GC for drawing the separator. It
- * needs to be the same color as disabled items.
- */
-
- TkMacSetUpGraphicsPort(mePtr->disabledGC != None ? mePtr->disabledGC
- : menuPtr->disabledGC);
-
- MoveTo(x, y + (height / 2));
- Line(width, 0);
-
- SetGWorld(saveWorld, saveDevice);
-}
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MenuDefProc --
- *
- * This routine is the MDEF handler for Tk. It receives all messages
- * for the menu and dispatches them.
- *
- * Results:
- * None.
- *
- * Side effects:
- * This routine causes menus to be drawn and will certainly allocate
- * memory as a result. Also, the menu can scroll up and down, and
- * various other interface actions can take place.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-MenuDefProc(
- short message, /* What action are we taking? */
- MenuHandle menu, /* The menu we are working with */
- Rect *menuRectPtr, /* A pointer to the rect for the
- * whole menu. */
- Point hitPt, /* Where the mouse was clicked for
- * the appropriate messages. */
- short *whichItem, /* Output result. Which item was
- * hit by the user? */
- TkMenuLowMemGlobals *globalsPtr) /* The low mem globals we have
- * to change */
-{
-#define SCREEN_MARGIN 5
- TkMenu *menuPtr;
- TkMenuEntry *parentEntryPtr;
- Tcl_HashEntry *commandEntryPtr;
- GrafPtr windowMgrPort;
- Tk_Font tkfont, menuFont;
- Tk_FontMetrics fontMetrics, entryMetrics;
- Tk_FontMetrics *fmPtr;
- TkMenuEntry *mePtr;
- int i;
- int maxMenuHeight;
- int oldItem;
- int newItem = -1;
- GDHandle device;
- Rect itemRect;
- short windowPart;
- WindowRef whichWindow;
- RGBColor bgColor;
- RGBColor fgColor;
- RGBColor origFgColor;
- PenState origPenState;
- Rect dragRect;
- Rect scratchRect = {-32768, -32768, 32767, 32767};
- RgnHandle oldClipRgn;
- TkMenuReferences *menuRefPtr;
- TkMenu *searchMenuPtr;
- Rect menuClipRect;
-
- HLock((Handle) menu);
- commandEntryPtr = Tcl_FindHashEntry(&commandTable,
- (char *) (*menu)->menuID);
- HUnlock((Handle) menu);
- menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
-
- switch (message) {
- case mSizeMsg:
- GetWMgrPort(&windowMgrPort);
- maxMenuHeight = windowMgrPort->portRect.bottom
- - windowMgrPort->portRect.top
- - GetMBarHeight() - SCREEN_MARGIN;
- (*menu)->menuWidth = menuPtr->totalWidth;
- (*menu)->menuHeight = maxMenuHeight < menuPtr->totalHeight ?
- maxMenuHeight : menuPtr->totalHeight;
- break;
-
- case mDrawMsg:
-
- /*
- * Store away the menu rectangle so we can keep track of the
- * different regions that the menu obscures.
- */
-
- ((MacMenu *) menuPtr->platformData)->menuRect = *menuRectPtr;
- if (tkMenuCascadeRgn == NULL) {
- tkMenuCascadeRgn = NewRgn();
- }
- if (utilRgn == NULL) {
- utilRgn = NewRgn();
- }
- if (totalMenuRgn == NULL) {
- totalMenuRgn = NewRgn();
- }
- SetEmptyRgn(tkMenuCascadeRgn);
- for (searchMenuPtr = menuPtr; searchMenuPtr != NULL; ) {
- RectRgn(utilRgn,
- &((MacMenu *) searchMenuPtr->platformData)->menuRect);
- InsetRgn(utilRgn, -1, -1);
- UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
- OffsetRgn(utilRgn, 1, 1);
- UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
-
- if (searchMenuPtr->menuRefPtr->parentEntryPtr != NULL) {
- searchMenuPtr = searchMenuPtr->menuRefPtr
- ->parentEntryPtr->menuPtr;
- } else {
- break;
- }
- if (searchMenuPtr->menuType == MENUBAR) {
- break;
- }
- }
- UnionRgn(totalMenuRgn, tkMenuCascadeRgn, totalMenuRgn);
- SetEmptyRgn(utilRgn);
-
- /*
- * Now draw the background if Appearance is present...
- */
-
- GetGWorld(&macMDEFDrawable.portPtr, &device);
- if (TkMacHaveAppearance() > 1) {
- ThemeMenuType menuType;
-
- if (menuPtr->menuRefPtr->topLevelListPtr != NULL) {
- menuType = kThemeMenuTypePullDown;
- } else if (menuPtr->menuRefPtr->parentEntryPtr != NULL) {
- menuType = kThemeMenuTypeHierarchical;
- } else {
- menuType = kThemeMenuTypePopUp;
- }
-
- DrawMenuBackground(menuRectPtr, (Drawable) &macMDEFDrawable,
- menuType);
- }
-
- /*
- * Next, figure out scrolling information.
- */
-
- menuClipRect = *menuRectPtr;
- if ((menuClipRect.bottom - menuClipRect.top)
- < menuPtr->totalHeight) {
- if (globalsPtr->menuTop < menuRectPtr->top) {
- DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC,
- menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->top);
- menuClipRect.top += SICN_HEIGHT;
- }
- if ((globalsPtr->menuTop + menuPtr->totalHeight)
- > menuRectPtr->bottom) {
- DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC,
- menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->bottom - SICN_HEIGHT);
- menuClipRect.bottom -= SICN_HEIGHT;
- }
- GetClip(utilRgn);
- }
-
- /*
- * Now, actually draw the menu. Don't draw entries that
- * are higher than the top arrow, and don't draw entries
- * that are lower than the bottom.
- */
-
- 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
- < menuClipRect.top) {
- continue;
- } else if (globalsPtr->menuTop + mePtr->y
- > menuClipRect.bottom) {
- continue;
- }
- /* ClipRect(&menuClipRect); */
- if (mePtr->fontPtr == NULL) {
- fmPtr = &fontMetrics;
- tkfont = menuFont;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr,
- (Drawable) &macMDEFDrawable, fmPtr, tkfont,
- menuRectPtr->left + mePtr->x,
- globalsPtr->menuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- menuPtr->entries[i]->height);
- }
- globalsPtr->menuBottom = globalsPtr->menuTop
- + menuPtr->totalHeight;
- if (!EmptyRgn(utilRgn)) {
- SetClip(utilRgn);
- SetEmptyRgn(utilRgn);
- }
- MDEFScrollFlag = 1;
- break;
-
- case mChooseMsg: {
- int hasTopScroll, hasBottomScroll;
- enum {
- DONT_SCROLL, DOWN_SCROLL, UP_SCROLL
- } scrollDirection;
- Rect updateRect;
- short scrollAmt;
- RGBColor origForeColor, origBackColor, foreColor, backColor;
-
- GetGWorld(&macMDEFDrawable.portPtr, &device);
- GetForeColor(&origForeColor);
- GetBackColor(&origBackColor);
-
- if (TkSetMacColor(menuPtr->textGC->foreground,
- &foreColor)) {
- /* if (!TkMacHaveAppearance()) { */
- RGBForeColor(&foreColor);
- /* } */
- }
- if (TkSetMacColor(menuPtr->textGC->background,
- &backColor)) {
- /* if (!TkMacHaveAppearance()) { */
- RGBBackColor(&backColor);
- /* } */
- }
-
- /*
- * Find out which item was hit. If it is the same as the old item,
- * we don't need to do anything.
- */
-
- oldItem = *whichItem - 1;
-
- if (PtInRect(hitPt, menuRectPtr)) {
- for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- itemRect.left = menuRectPtr->left + mePtr->x;
- itemRect.top = globalsPtr->menuTop + mePtr->y;
- if (mePtr->entryFlags & ENTRY_LAST_COLUMN) {
- itemRect.right = itemRect.left + menuPtr->totalWidth
- - mePtr->x;
- } else {
- itemRect.right = itemRect.left + mePtr->width;
- }
- itemRect.bottom = itemRect.top
- + menuPtr->entries[i]->height;
- if (PtInRect(hitPt, &itemRect)) {
- if ((mePtr->type == SEPARATOR_ENTRY)
- || (mePtr->state == ENTRY_DISABLED)) {
- newItem = -1;
- } else {
- TkMenuEntry *cascadeEntryPtr;
- int parentDisabled = 0;
-
- for (cascadeEntryPtr
- = menuPtr->menuRefPtr->parentEntryPtr;
- cascadeEntryPtr != NULL;
- cascadeEntryPtr
- = cascadeEntryPtr->nextCascadePtr) {
- char *name;
-
- name = Tcl_GetStringFromObj(
- cascadeEntryPtr->namePtr, NULL);
- if (strcmp(name, Tk_PathName(menuPtr->tkwin))
- == 0) {
- if (cascadeEntryPtr->state == ENTRY_DISABLED) {
- parentDisabled = 1;
- }
- break;
- }
- }
- if (parentDisabled) {
- newItem = -1;
- } else {
- newItem = i;
- if ((mePtr->type == CASCADE_ENTRY)
- && (oldItem != newItem)) {
- globalsPtr->itemRect = itemRect;
- }
- }
- }
- break;
- }
- }
- }
-
- /*
- * Now we need to take care of scrolling the menu.
- */
-
- hasTopScroll = globalsPtr->menuTop < menuRectPtr->top;
- hasBottomScroll = globalsPtr->menuBottom > menuRectPtr->bottom;
- scrollDirection = DONT_SCROLL;
- if (hasTopScroll
- && (hitPt.v < menuRectPtr->top + SICN_HEIGHT)) {
- newItem = -1;
- scrollDirection = DOWN_SCROLL;
- } else if (hasBottomScroll
- && (hitPt.v > menuRectPtr->bottom - SICN_HEIGHT)) {
- newItem = -1;
- scrollDirection = UP_SCROLL;
- }
- menuClipRect = *menuRectPtr;
- if (hasTopScroll) {
- menuClipRect.top += SICN_HEIGHT;
- }
- if (hasBottomScroll) {
- menuClipRect.bottom -= SICN_HEIGHT;
- }
- if (MDEFScrollFlag) {
- scrollDirection = DONT_SCROLL;
- MDEFScrollFlag = 0;
- }
- GetClip(utilRgn);
- ClipRect(&menuClipRect);
-
- if (oldItem != newItem) {
- if (oldItem >= 0) {
- mePtr = menuPtr->entries[oldItem];
- 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,
- menuRectPtr->left + mePtr->x,
- globalsPtr->menuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- mePtr->height);
- }
- if (newItem != -1) {
- int oldActiveItem = menuPtr->active;
-
- mePtr = menuPtr->entries[newItem];
- if (mePtr->state != ENTRY_DISABLED) {
- TkActivateMenuEntry(menuPtr, newItem);
- }
- 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,
- menuRectPtr->left + mePtr->x,
- globalsPtr->menuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- mePtr->height);
- }
-
- tkUseMenuCascadeRgn = 1;
- MenuSelectEvent(menuPtr);
- Tcl_ServiceAll();
- tkUseMenuCascadeRgn = 0;
- if (mePtr->state != ENTRY_DISABLED) {
- TkActivateMenuEntry(menuPtr, -1);
- }
- *whichItem = newItem + 1;
- }
- globalsPtr->menuDisable = ((*menu)->menuID << 16) | (newItem + 1);
-
- if (scrollDirection == UP_SCROLL) {
- scrollAmt = menuClipRect.bottom - hitPt.v;
- if (scrollAmt < menuRectPtr->bottom
- - globalsPtr->menuBottom) {
- scrollAmt = menuRectPtr->bottom - globalsPtr->menuBottom;
- }
- if (!hasTopScroll && ((globalsPtr->menuTop + scrollAmt)
- < menuRectPtr->top)) {
- SetRect(&updateRect, menuRectPtr->left,
- globalsPtr->menuTop, menuRectPtr->right,
- globalsPtr->menuTop + SICN_HEIGHT);
- EraseRect(&updateRect);
- DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC, menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->top);
- menuClipRect.top += SICN_HEIGHT;
- }
- } else if (scrollDirection == DOWN_SCROLL) {
- scrollAmt = menuClipRect.top - hitPt.v;
- if (scrollAmt > menuRectPtr->top - globalsPtr->menuTop) {
- scrollAmt = menuRectPtr->top - globalsPtr->menuTop;
- }
- if (!hasBottomScroll && ((globalsPtr->menuBottom + scrollAmt)
- > menuRectPtr->bottom)) {
- SetRect(&updateRect, menuRectPtr->left,
- globalsPtr->menuBottom - SICN_HEIGHT,
- menuRectPtr->right, globalsPtr->menuBottom);
- EraseRect(&updateRect);
- DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC, menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->bottom - SICN_HEIGHT);
- menuClipRect.bottom -= SICN_HEIGHT;
- }
- }
- if (scrollDirection != DONT_SCROLL) {
- Tk_Font menuFont;
- RgnHandle updateRgn = NewRgn();
- ScrollRect(&menuClipRect, 0, scrollAmt, updateRgn);
- updateRect = (*updateRgn)->rgnBBox;
- DisposeRgn(updateRgn);
- globalsPtr->menuTop += scrollAmt;
- globalsPtr->menuBottom += scrollAmt;
- if (globalsPtr->menuTop == menuRectPtr->top) {
- updateRect.top -= SICN_HEIGHT;
- }
- if (globalsPtr->menuBottom == menuRectPtr->bottom) {
- updateRect.bottom += SICN_HEIGHT;
- }
- ClipRect(&updateRect);
- EraseRect(&updateRect);
- 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
- < updateRect.top) {
- continue;
- } else if (globalsPtr->menuTop + mePtr->y
- > updateRect.bottom) {
- continue;
- }
- if (mePtr->fontPtr == NULL) {
- fmPtr = &fontMetrics;
- tkfont = menuFont;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin,
- mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, globalsPtr,
- (Drawable) &macMDEFDrawable, fmPtr, tkfont,
- menuRectPtr->left + mePtr->x,
- globalsPtr->menuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- menuPtr->entries[i]->height);
- }
- }
-
- SetClip(utilRgn);
- SetEmptyRgn(utilRgn);
- RGBForeColor(&origForeColor);
- RGBBackColor(&origBackColor);
-
- /*
- * If the menu is a tearoff, and the mouse is outside the menu,
- * we need to draw the drag rectangle.
- *
- * In order for tearoffs to work properly, we need to set
- * the active member of the containing menubar.
- */
-
- menuRefPtr = TkFindMenuReferences(menuPtr->interp,
- Tk_PathName(menuPtr->tkwin));
- if ((menuRefPtr != NULL) && (menuRefPtr->parentEntryPtr != NULL)) {
- char *name;
- for (parentEntryPtr = menuRefPtr->parentEntryPtr;
- 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);
- }
- }
-
- if (menuPtr->tearoff) {
- scratchRect = *menuRectPtr;
- if (tearoffStruct.menuPtr == NULL) {
- scratchRect.top -= 10;
- scratchRect.bottom += 10;
- scratchRect.left -= 10;
- scratchRect.right += 10;
- }
-
- windowPart = FindWindow(hitPt, &whichWindow);
- if ((windowPart != inMenuBar) && (newItem == -1)
- && (hitPt.v != 0) && (hitPt.h != 0)
- && (!PtInRect(hitPt, &scratchRect))
- && (!PtInRect(hitPt, &tearoffStruct.excludeRect))) {
-/*
- * This is the second argument to the Toolbox Delay function. It changed
- * from long to unsigned long between Universal Headers 2.0 & 3.0
- */
-#if !defined(UNIVERSAL_INTERFACES_VERSION) || (UNIVERSAL_INTERFACES_VERSION < 0x0300)
- long dummy;
-#else
- unsigned long dummy;
-#endif
- oldClipRgn = NewRgn();
- GetClip(oldClipRgn);
- GetForeColor(&origFgColor);
- GetPenState(&origPenState);
- GetForeColor(&fgColor);
- GetBackColor(&bgColor);
- GetGray(device, &bgColor, &fgColor);
- RGBForeColor(&fgColor);
- SetRect(&scratchRect, -32768, -32768, 32767, 32767);
- ClipRect(&scratchRect);
-
- dragRect = *menuRectPtr;
- tearoffStruct.menuPtr = menuPtr;
-
- PenMode(srcXor);
- dragRect = *menuRectPtr;
- OffsetRect(&dragRect, -dragRect.left, -dragRect.top);
- OffsetRect(&dragRect, tearoffStruct.point.h,
- tearoffStruct.point.v);
- if ((dragRect.top != 0) && (dragRect.left != 0)) {
- FrameRect(&dragRect);
- Delay(1, &dummy);
- FrameRect(&dragRect);
- }
- tearoffStruct.point = hitPt;
-
- SetClip(oldClipRgn);
- DisposeRgn(oldClipRgn);
- RGBForeColor(&origFgColor);
- SetPenState(&origPenState);
- } else {
- tearoffStruct.menuPtr = NULL;
- tearoffStruct.point.h = tearoffStruct.point.v = 0;
- }
- } else {
- tearoffStruct.menuPtr = NULL;
- tearoffStruct.point.h = tearoffStruct.point.v = 0;
- }
-
- break;
- }
-
- case mPopUpMsg:
-
- /*
- * Note that for some oddball reason, h and v are reversed in the
- * point given to us by the MDEF.
- */
-
- oldItem = *whichItem;
- if (oldItem >= menuPtr->numEntries) {
- oldItem = -1;
- }
- GetWMgrPort(&windowMgrPort);
- maxMenuHeight = windowMgrPort->portRect.bottom
- - windowMgrPort->portRect.top
- - GetMBarHeight() - SCREEN_MARGIN;
- if (menuPtr->totalHeight > maxMenuHeight) {
- menuRectPtr->top = GetMBarHeight();
- } else {
- int delta;
- menuRectPtr->top = hitPt.h;
- if (oldItem >= 0) {
- menuRectPtr->top -= menuPtr->entries[oldItem]->y;
- }
-
- if (menuRectPtr->top < GetMBarHeight()) {
- /* Displace downward if the menu would stick off the
- * top of the screen.
- */
-
- menuRectPtr->top = GetMBarHeight() + SCREEN_MARGIN;
- } else {
- /*
- * Or upward if the menu sticks off the
- * bottom end...
- */
-
- delta = menuRectPtr->top + menuPtr->totalHeight
- - maxMenuHeight;
- if (delta > 0) {
- menuRectPtr->top -= delta;
- }
- }
- }
- menuRectPtr->left = hitPt.v;
- menuRectPtr->right = menuRectPtr->left + menuPtr->totalWidth;
- menuRectPtr->bottom = menuRectPtr->top +
- ((maxMenuHeight < menuPtr->totalHeight)
- ? maxMenuHeight : menuPtr->totalHeight);
- if (menuRectPtr->top == GetMBarHeight()) {
- *whichItem = hitPt.h;
- } else {
- *whichItem = menuRectPtr->top;
- }
- globalsPtr->menuTop = *whichItem;
- globalsPtr->menuBottom = menuRectPtr->bottom;
- break;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * AppearanceEntryDrawWrapper --
- *
- * This routine wraps the TkpDrawMenuEntry function. Under Appearance,
- * it routes to the Appearance Managers DrawThemeEntry, otherwise it
- * just goes straight to TkpDrawMenuEntry.
- *
- * Results:
- * A menu entry is drawn
- *
- * Side effects:
- * None
- *
- *----------------------------------------------------------------------
- */
-static void
-AppearanceEntryDrawWrapper(
- TkMenuEntry *mePtr,
- Rect *menuRectPtr,
- TkMenuLowMemGlobals *globalsPtr,
- Drawable d,
- Tk_FontMetrics *fmPtr,
- Tk_Font tkfont,
- int x,
- int y,
- int width,
- int height)
-{
- if (TkMacHaveAppearance() > 1) {
- MenuEntryUserData meData;
- Rect itemRect;
- ThemeMenuState theState;
- ThemeMenuItemType theType;
-
- meData.mePtr = mePtr;
- meData.mdefDrawable = d;
- meData.fmPtr = fmPtr;
- meData.tkfont = tkfont;
-
- itemRect.top = y;
- itemRect.left = x;
- itemRect.bottom = itemRect.top + height;
- itemRect.right = itemRect.left + width;
-
- if (mePtr->state == ENTRY_ACTIVE) {
- theState = kThemeMenuSelected;
- } else if (mePtr->state == ENTRY_DISABLED) {
- theState = kThemeMenuDisabled;
- } else {
- theState = kThemeMenuActive;
- }
-
- if (mePtr->type == CASCADE_ENTRY) {
- theType = kThemeMenuItemHierarchical;
- } else {
- theType = kThemeMenuItemPlain;
- }
-
- DrawThemeMenuItem (menuRectPtr, &itemRect,
- globalsPtr->menuTop, globalsPtr->menuBottom, theState,
- theType, tkThemeMenuItemDrawingUPP,
- (unsigned long) &meData);
-
- } else {
- TkpDrawMenuEntry(mePtr, d, tkfont, fmPtr,
- x, y, width, height, 0, 1);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * tkThemeMenuItemDrawingProc --
- *
- * This routine is called from the Appearance DrawThemeMenuEntry
- *
- * Results:
- * A menu entry is drawn
- *
- * Side effects:
- * None
- *
- *----------------------------------------------------------------------
- */
-pascal void
-tkThemeMenuItemDrawingProc (
- const Rect *inBounds,
- SInt16 inDepth,
- Boolean inIsColorDevice,
- SInt32 inUserData)
-{
- MenuEntryUserData *meData = (MenuEntryUserData *) inUserData;
-
- TkpDrawMenuEntry(meData->mePtr, meData->mdefDrawable,
- meData->tkfont, meData->fmPtr, inBounds->left,
- inBounds->top, inBounds->right - inBounds->left,
- inBounds->bottom - inBounds->top, 0, 1);
-
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacHandleTearoffMenu() --
- *
- * This routine sees if the MDEF has set a menu and a mouse position
- * for tearing off and makes a tearoff menu if it has.
- *
- * Results:
- * menuPtr->interp will have the result of the tearoff command.
- *
- * Side effects:
- * A new tearoff menu is created if it is supposed to be.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacHandleTearoffMenu(void)
-{
- if (tearoffStruct.menuPtr != NULL) {
- Tcl_DString tearoffCmdStr;
- char intString[TCL_INTEGER_SPACE];
- short windowPart;
- WindowRef whichWindow;
-
- windowPart = FindWindow(tearoffStruct.point, &whichWindow);
-
- if (windowPart != inMenuBar) {
- Tcl_DStringInit(&tearoffCmdStr);
- Tcl_DStringAppendElement(&tearoffCmdStr, "tk::TearOffMenu");
- Tcl_DStringAppendElement(&tearoffCmdStr,
- Tk_PathName(tearoffStruct.menuPtr->tkwin));
- sprintf(intString, "%d", tearoffStruct.point.h);
- Tcl_DStringAppendElement(&tearoffCmdStr, intString);
- sprintf(intString, "%d", tearoffStruct.point.v);
- Tcl_DStringAppendElement(&tearoffCmdStr, intString);
- Tcl_Eval(tearoffStruct.menuPtr->interp,
- Tcl_DStringValue(&tearoffCmdStr));
- Tcl_DStringFree(&tearoffCmdStr);
- tearoffStruct.menuPtr = NULL;
- }
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpInitializeMenuBindings --
- *
- * For every interp, initializes the bindings for Windows
- * menus. Does nothing on Mac or XWindows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * C-level bindings are setup for the interp which will
- * handle Alt-key sequences for menus without beeping
- * or interfering with user-defined Alt-key bindings.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkpInitializeMenuBindings(interp, bindingTable)
- Tcl_Interp *interp; /* The interpreter to set. */
- Tk_BindingTable bindingTable; /* The table to add to. */
-{
- /*
- * Nothing to do.
- */
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpComputeMenubarGeometry --
- *
- * This procedure is invoked to recompute the size and
- * layout of a menu that is a menubar clone.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Fields of menu entries are changed to reflect their
- * current positions, and the size of the menu window
- * itself may be changed.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkpComputeMenubarGeometry(menuPtr)
- TkMenu *menuPtr; /* Structure describing menu. */
-{
- TkpComputeStandardMenuGeometry(menuPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawTearoffEntry --
- *
- * This procedure draws the background part of a menu.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-void
-DrawTearoffEntry(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing into */
- GC gc, /* The gc we are drawing with */
- Tk_Font tkfont, /* The font we are drawing with */
- CONST Tk_FontMetrics *fmPtr, /* The metrics we are drawing with */
- int x, /* Left edge of entry. */
- int y, /* Top edge of entry. */
- int width, /* Width of entry. */
- int height) /* Height of entry. */
-{
- XPoint points[2];
- int margin, segmentWidth, maxX;
- Tk_3DBorder border;
-
- if ((menuPtr->menuType != MASTER_MENU) || (FixMDEF() != NULL)) {
- return;
- }
-
- margin = (fmPtr->ascent + fmPtr->descent)/2;
- points[0].x = x;
- points[0].y = y + height/2;
- 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, border, points, 2, 1,
- TK_RELIEF_RAISED);
- points[0].x += 2*segmentWidth;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacSetHelpMenuItemCount --
- *
- * Has to be called after the first call to InsertMenu. Sets
- * up the global variable for the number of items in the
- * unmodified help menu.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Sets the global helpItemCount.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacSetHelpMenuItemCount()
-{
- MenuHandle helpMenuHandle;
-
- if ((HMGetHelpMenuHandle(&helpMenuHandle) != noErr)
- || (helpMenuHandle == NULL)) {
- helpItemCount = -1;
- } else {
- helpItemCount = CountMItems(helpMenuHandle);
- DeleteMenuItem(helpMenuHandle, helpItemCount);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacMenuClick --
- *
- * Prepares a menubar for MenuSelect or MenuKey.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Any pending configurations of the menubar are completed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacMenuClick()
-{
- TkMenu *menuPtr;
- TkMenuReferences *menuRefPtr;
-
- if ((currentMenuBarInterp != NULL) && (currentMenuBarName != NULL)) {
- menuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- for (menuPtr = menuRefPtr->menuPtr->masterMenuPtr;
- menuPtr != NULL; menuPtr = menuPtr->nextInstancePtr) {
- if (menuPtr->menuType == MENUBAR) {
- CompleteIdlers(menuPtr);
- break;
- }
- }
- }
-
- if (menuBarFlags & MENUBAR_REDRAW_PENDING) {
- Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL);
- DrawMenuBarWhenIdle((ClientData *) NULL);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDrawMenuEntry --
- *
- * Draws the given menu entry at the given coordinates with the
- * given attributes.
- *
- * Results:
- * None.
- *
- * Side effects:
- * X Server commands are executed to display the menu entry.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDrawMenuEntry(
- TkMenuEntry *mePtr, /* The entry to draw */
- Drawable d, /* What to draw into */
- Tk_Font tkfont, /* Precalculated font for menu */
- CONST Tk_FontMetrics *menuMetricsPtr,
- /* Precalculated metrics for menu */
- int x, /* X-coordinate of topleft of entry */
- int y, /* Y-coordinate of topleft of entry */
- int width, /* Width of the entry rectangle */
- int height, /* Height of the current rectangle */
- int strictMotif, /* Boolean flag */
- int drawArrow) /* Whether or not to draw the cascade
- * arrow for cascade items. Only applies
- * to Windows. */
-{
- GC gc;
- TkMenu *menuPtr = mePtr->menuPtr;
- int padY = (menuPtr->menuType == MENUBAR) ? 3 : 0;
- GC indicatorGC;
- Tk_3DBorder bgBorder, activeBorder;
- const Tk_FontMetrics *fmPtr;
- Tk_FontMetrics entryMetrics;
- int adjustedY = y + padY;
- int adjustedHeight = height - 2 * padY;
-
- /*
- * Choose the gc for drawing the foreground part of the entry.
- * Under Appearance, we pass a null (appearanceGC) to tell
- * ourselves not to change whatever color the appearance manager has set.
- */
-
- if ((mePtr->state == ENTRY_ACTIVE) && !strictMotif) {
- gc = mePtr->activeGC;
- if (gc == NULL) {
- gc = menuPtr->activeGC;
- }
- } else {
- TkMenuEntry *cascadeEntryPtr;
- int parentDisabled = 0;
-
- for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr;
- cascadeEntryPtr != NULL;
- cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) {
- 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 == ENTRY_DISABLED)))
- && (menuPtr->disabledFgPtr != NULL)) {
- gc = mePtr->disabledGC;
- if (gc == NULL) {
- gc = menuPtr->disabledGC;
- }
- } else {
- gc = mePtr->textGC;
- if (gc == NULL) {
- gc = menuPtr->textGC;
- }
- }
- }
-
- indicatorGC = mePtr->indicatorGC;
- if (indicatorGC == NULL) {
- indicatorGC = menuPtr->indicatorGC;
- }
-
- bgBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin,
- (mePtr->borderPtr == NULL)
- ? menuPtr->borderPtr : mePtr->borderPtr);
- if (strictMotif) {
- activeBorder = bgBorder;
- } else {
- activeBorder = Tk_Get3DBorderFromObj(menuPtr->tkwin,
- (mePtr->activeBorderPtr == NULL)
- ? menuPtr->activeBorderPtr : mePtr->activeBorderPtr);
- }
-
- if (mePtr->fontPtr == NULL) {
- fmPtr = menuMetricsPtr;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
-
- /*
- * Need to draw the entire background, including padding. On Unix,
- * for menubars, we have to draw the rest of the entry taking
- * into account the padding.
- */
-
- DrawMenuEntryBackground(menuPtr, mePtr, d, activeBorder,
- bgBorder, x, y, width, height);
-
- if (mePtr->type == SEPARATOR_ENTRY) {
- DrawMenuSeparator(menuPtr, mePtr, d, gc, tkfont,
- fmPtr, x, adjustedY, width, adjustedHeight);
- } else if (mePtr->type == TEAROFF_ENTRY) {
- DrawTearoffEntry(menuPtr, mePtr, d, gc, tkfont, fmPtr, x, adjustedY,
- width, adjustedHeight);
- } else {
- DrawMenuEntryLabel(menuPtr, mePtr, d, gc, tkfont, fmPtr, x,
- adjustedY, width, adjustedHeight);
- DrawMenuEntryAccelerator(menuPtr, mePtr, d, gc, tkfont, fmPtr,
- activeBorder, x, adjustedY, width, adjustedHeight, drawArrow);
- if (!mePtr->hideMargin) {
- DrawMenuEntryIndicator(menuPtr, mePtr, d, gc, indicatorGC, tkfont,
- fmPtr, x, adjustedY, width, adjustedHeight);
- }
-
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpComputeStandardMenuGeometry --
- *
- * This procedure is invoked to recompute the size and
- * layout of a menu that is not a menubar clone.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Fields of menu entries are changed to reflect their
- * current positions, and the size of the menu window
- * itself may be changed.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkpComputeStandardMenuGeometry(
- TkMenu *menuPtr) /* Structure describing menu. */
-{
- 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, borderWidth, activeBorderWidth;
- TkMenuEntry *mePtr, *columnEntryPtr;
- EntryGeometry *geometryPtr;
-
- if (menuPtr->tkwin == NULL) {
- return;
- }
-
- 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;
- maxEntryWithAccelWidth = maxEntryWithoutAccelWidth = 0;
- maxIndicatorSpace = 0;
-
- /*
- * On the Mac especially, getting font metrics can be quite slow,
- * so we want to do it intelligently. We are going to precalculate
- * them and pass them down to all of the measuring and drawing
- * routines. We will measure the font metrics of the menu once.
- * If an entry does not have its own font set, then we give
- * the geometry/drawing routines the menu's font and metrics.
- * If an entry has its own font, we will measure that font and
- * give all of the geometry/drawing the entry's font and metrics.
- */
-
- menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
- Tk_GetFontMetrics(menuFont, &menuMetrics);
-
- for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- if (mePtr->fontPtr == NULL) {
- tkfont = menuFont;
- fmPtr = &menuMetrics;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
-
- if ((i > 0) && mePtr->columnBreak) {
- if (maxIndicatorSpace != 0) {
- maxIndicatorSpace += 2;
- }
- for (j = lastColumnBreak; j < i; j++) {
- columnEntryPtr = menuPtr->entries[j];
- geometryPtr =
- (EntryGeometry *) columnEntryPtr->platformEntryData;
-
- columnEntryPtr->indicatorSpace = maxIndicatorSpace;
- columnEntryPtr->width = maxIndicatorSpace + maxWidth
- + 2 * activeBorderWidth;
- geometryPtr->accelTextWidth = maxAccelTextWidth;
- geometryPtr->modifierWidth = maxModifierWidth;
- columnEntryPtr->x = x;
- columnEntryPtr->entryFlags &= ~ENTRY_LAST_COLUMN;
- if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) {
- geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth
- - maxEntryWithAccelWidth;
- if (geometryPtr->nonAccelMargin > maxNonAccelMargin) {
- geometryPtr->nonAccelMargin = maxNonAccelMargin;
- }
- } else {
- geometryPtr->nonAccelMargin = 0;
- }
- }
- x += maxIndicatorSpace + maxWidth + 2 * borderWidth;
- windowWidth = x;
- maxWidth = maxIndicatorSpace = maxAccelTextWidth = 0;
- maxModifierWidth = maxNonAccelMargin = maxEntryWithAccelWidth = 0;
- maxEntryWithoutAccelWidth = 0;
- lastColumnBreak = i;
- y = borderWidth;
- }
-
- if (mePtr->type == SEPARATOR_ENTRY) {
- GetMenuSeparatorGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &entryWidth, &height);
- mePtr->height = height;
- } else if (mePtr->type == TEAROFF_ENTRY) {
- GetTearoffEntryGeometry(menuPtr, mePtr, tkfont,
- 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
- * label, the width to allow for an indicator to be displayed
- * to the left of the label (if any), and the width of the
- * accelerator to be displayed to the right of the label
- * (if any). These sizes depend, of course, on the type
- * of the entry.
- */
-
- GetMenuLabelGeometry(mePtr, tkfont, fmPtr, &labelWidth,
- &height);
- mePtr->height = height;
-
- if (mePtr->type == CASCADE_ENTRY) {
- GetMenuAccelGeometry(menuPtr, mePtr, tkfont, fmPtr,
- &modifierWidth, &accelWidth, &height);
- nonAccelMargin = 0;
- } else if (mePtr->accelLength == 0) {
- nonAccelMargin = mePtr->hideMargin ? 0
- : Tk_TextWidth(tkfont, "m", 1);
- accelWidth = modifierWidth = 0;
- } else {
- labelWidth += Tk_TextWidth(tkfont, "m", 1);
- GetMenuAccelGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &modifierWidth, &accelWidth, &height);
- if (height > mePtr->height) {
- mePtr->height = height;
- }
- nonAccelMargin = 0;
- }
-
- if (!(mePtr->hideMargin)) {
- GetMenuIndicatorGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &indicatorSpace, &height);
- if (height > mePtr->height) {
- mePtr->height = height;
- }
- } else {
- indicatorSpace = 0;
- }
-
- if (nonAccelMargin > maxNonAccelMargin) {
- maxNonAccelMargin = nonAccelMargin;
- }
- if (accelWidth > maxAccelTextWidth) {
- maxAccelTextWidth = accelWidth;
- }
- if (modifierWidth > maxModifierWidth) {
- maxModifierWidth = modifierWidth;
- }
- if (indicatorSpace > maxIndicatorSpace) {
- maxIndicatorSpace = indicatorSpace;
- }
-
- entryWidth = labelWidth + modifierWidth + accelWidth
- + nonAccelMargin;
-
- if (entryWidth > maxWidth) {
- maxWidth = entryWidth;
- }
-
- if (mePtr->accelLength > 0) {
- if (entryWidth > maxEntryWithAccelWidth) {
- maxEntryWithAccelWidth = entryWidth;
- }
- } else {
- if (entryWidth > maxEntryWithoutAccelWidth) {
- maxEntryWithoutAccelWidth = entryWidth;
- }
- }
-
- mePtr->height += 2 * activeBorderWidth;
- }
- mePtr->y = y;
- y += menuPtr->entries[i]->height + borderWidth;
- if (y > windowHeight) {
- windowHeight = y;
- }
- }
-
- for (j = lastColumnBreak; j < menuPtr->numEntries; j++) {
- columnEntryPtr = menuPtr->entries[j];
- geometryPtr = (EntryGeometry *) columnEntryPtr->platformEntryData;
-
- columnEntryPtr->indicatorSpace = maxIndicatorSpace;
- columnEntryPtr->width = maxIndicatorSpace + maxWidth
- + 2 * activeBorderWidth;
- geometryPtr->accelTextWidth = maxAccelTextWidth;
- geometryPtr->modifierWidth = maxModifierWidth;
- columnEntryPtr->x = x;
- columnEntryPtr->entryFlags |= ENTRY_LAST_COLUMN;
- if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) {
- geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth
- - maxEntryWithAccelWidth;
- if (geometryPtr->nonAccelMargin > maxNonAccelMargin) {
- geometryPtr->nonAccelMargin = maxNonAccelMargin;
- }
- } else {
- geometryPtr->nonAccelMargin = 0;
- }
- }
- windowWidth = x + maxIndicatorSpace + maxWidth
- + 2 * activeBorderWidth + borderWidth;
- windowHeight += borderWidth;
-
- /*
- * The X server doesn't like zero dimensions, so round up to at least
- * 1 (a zero-sized menu should never really occur, anyway).
- */
-
- if (windowWidth <= 0) {
- windowWidth = 1;
- }
- if (windowHeight <= 0) {
- windowHeight = 1;
- }
- menuPtr->totalWidth = windowWidth;
- menuPtr->totalHeight = windowHeight;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuEntryLabel --
- *
- * This procedure draws the label part of a menu.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuEntryLabel(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* What we are drawing into */
- GC gc, /* The gc we are drawing into */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* left edge */
- int y, /* right edge */
- int width, /* width of entry */
- int height) /* height of entry */
-{
- int indicatorSpace = mePtr->indicatorSpace;
- int leftEdge = x + indicatorSpace;
- int imageHeight, imageWidth;
- int textHeight, textWidth;
- int haveImage = 0, haveText = 0;
- int imageXOffset = 0, imageYOffset = 0;
- int textXOffset = 0, textYOffset = 0;
-
- /*
- * Work out what we will need to draw first.
- */
-
- if (mePtr->image != NULL) {
- Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight);
- haveImage = 1;
- } else if (mePtr->bitmapPtr != NULL) {
- Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
- Tk_SizeOfBitmap(menuPtr->display, bitmap, &imageWidth, &imageHeight);
- haveImage = 1;
- }
- if (!haveImage || (mePtr->compound != COMPOUND_NONE)) {
- if (mePtr->labelLength > 0) {
- Tcl_DString itemTextDString;
- textHeight = fmPtr->linespace;
- GetEntryText(mePtr, &itemTextDString);
- textWidth = Tk_TextWidth(tkfont,
- Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString));
- Tcl_DStringFree(&itemTextDString);
- haveText = 1;
- }
- }
-
- /*
- * Now work out what the relative positions are.
- */
-
- if (haveImage && haveText) {
- int fullWidth = (imageWidth > textWidth ? imageWidth : textWidth);
- switch ((enum compound) mePtr->compound) {
- case COMPOUND_TOP: {
- textXOffset = (fullWidth - textWidth)/2;
- textYOffset = imageHeight/2 + 2;
- imageXOffset = (fullWidth - imageWidth)/2;
- imageYOffset = -textHeight/2;
- break;
- }
- case COMPOUND_BOTTOM: {
- textXOffset = (fullWidth - textWidth)/2;
- textYOffset = -imageHeight/2;
- imageXOffset = (fullWidth - imageWidth)/2;
- imageYOffset = textHeight/2 + 2;
- break;
- }
- case COMPOUND_LEFT: {
- textXOffset = imageWidth + 2;
- textYOffset = 0;
- imageXOffset = 0;
- imageYOffset = 0;
- break;
- }
- case COMPOUND_RIGHT: {
- textXOffset = 0;
- textYOffset = 0;
- imageXOffset = textWidth + 2;
- imageYOffset = 0;
- break;
- }
- case COMPOUND_CENTER: {
- textXOffset = (fullWidth - textWidth)/2;
- textYOffset = 0;
- imageXOffset = (fullWidth - imageWidth)/2;
- imageYOffset = 0;
- break;
- }
- case COMPOUND_NONE: {break;}
- }
- } else {
- textXOffset = 0;
- textYOffset = 0;
- imageXOffset = 0;
- imageYOffset = 0;
- }
-
- /*
- * Draw label and/or bitmap or image for entry.
- */
-
- if (mePtr->image != NULL) {
- Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight);
- if ((mePtr->selectImage != NULL)
- && (mePtr->entryFlags & ENTRY_SELECTED)) {
- Tk_RedrawImage(mePtr->selectImage, 0, 0,
- imageWidth, imageHeight, d, leftEdge + imageXOffset,
- (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset));
- } else {
- Tk_RedrawImage(mePtr->image, 0, 0, imageWidth,
- imageHeight, d, leftEdge + imageXOffset,
- (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset));
- }
- } else if (mePtr->bitmapPtr != NULL) {
- Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
- XCopyPlane(menuPtr->display, bitmap, d, gc, 0, 0,
- (unsigned) imageWidth, (unsigned) imageHeight,
- leftEdge + imageXOffset,
- (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset), 1);
- }
- if ((mePtr->compound != COMPOUND_NONE) || !haveImage) {
- if (mePtr->labelLength > 0) {
- Tcl_DString itemTextDString, convertedTextDString;
- int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
-
- GetEntryText(mePtr, &itemTextDString);
-
- /* Somehow DrawChars is changing the colors, it is odd, since
- it works for the Apple Platinum Appearance, but not for
- some Kaleidoscope Themes... Untill I can figure out what
- exactly is going on, this will have to do: */
-
- TkMacSetUpGraphicsPort(gc);
- MoveTo((short) leftEdge + textXOffset,
- (short) baseline + textYOffset);
- Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString), &convertedTextDString);
- DrawText(Tcl_DStringValue(&convertedTextDString), 0,
- Tcl_DStringLength(&convertedTextDString));
-
- /* Tk_DrawChars(menuPtr->display, d, gc,
- tkfont, Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString),
- leftEdge, baseline); */
-
- Tcl_DStringFree(&itemTextDString);
- }
- }
-
- if (mePtr->state == ENTRY_DISABLED) {
- if (menuPtr->disabledFgPtr == NULL) {
- if (!TkMacHaveAppearance()) {
- XFillRectangle(menuPtr->display, d, menuPtr->disabledGC, x, y,
- (unsigned) width, (unsigned) height);
- }
- } else if ((mePtr->image != NULL)
- && (menuPtr->disabledImageGC != None)) {
- XFillRectangle(menuPtr->display, d, menuPtr->disabledImageGC,
- leftEdge + imageXOffset,
- (int) (y + (mePtr->height - imageHeight)/2 + imageYOffset),
- (unsigned) imageWidth, (unsigned) imageHeight);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DrawMenuEntryBackground --
- *
- * This procedure draws the background part of a menu entry.
- * Under Appearance, we only draw the background if the entry's
- * border is set, we DO NOT inherit it from the menu...
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-DrawMenuEntryBackground(
- TkMenu *menuPtr, /* The menu we are drawing. */
- TkMenuEntry *mePtr, /* The entry we are drawing. */
- Drawable d, /* What we are drawing into */
- Tk_3DBorder activeBorder, /* Border for active items */
- Tk_3DBorder bgBorder, /* Border for the background */
- int x, /* left edge */
- int y, /* top edge */
- int width, /* width of rectangle to draw */
- int height) /* height of rectangle to draw */
-{
- if (!TkMacHaveAppearance()
- || (menuPtr->menuType == TEAROFF_MENU)
- || ((mePtr->state == ENTRY_ACTIVE)
- && (mePtr->activeBorderPtr != None))
- || ((mePtr->state != ENTRY_ACTIVE) && (mePtr->borderPtr != None))) {
- if (mePtr->state == ENTRY_ACTIVE) {
- bgBorder = activeBorder;
- }
- Tk_Fill3DRectangle(menuPtr->tkwin, d, bgBorder,
- x, y, width, height, 0, TK_RELIEF_FLAT);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GetMenuLabelGeometry --
- *
- * Figures out the size of the label portion of a menu item.
- *
- * Results:
- * widthPtr and heightPtr are filled in with the correct geometry
- * information.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GetMenuLabelGeometry(
- TkMenuEntry *mePtr, /* The entry we are computing */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated metrics */
- int *widthPtr, /* The resulting width of the label
- * portion */
- int *heightPtr) /* The resulting height of the label
- * portion */
-{
- TkMenu *menuPtr = mePtr->menuPtr;
- int haveImage = 0, haveText = 0;
-
- if (mePtr->image != NULL) {
- Tk_SizeOfImage(mePtr->image, widthPtr, heightPtr);
- haveImage = 1;
- } else if (mePtr->bitmapPtr != NULL) {
- Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
- Tk_SizeOfBitmap(menuPtr->display, bitmap, widthPtr, heightPtr);
- haveImage = 1;
- } else {
- *heightPtr = 0;
- *widthPtr = 0;
- }
-
- if (haveImage && (mePtr->compound == COMPOUND_NONE)) {
- /* We don't care about the text in this case */
- } else {
- /* Either it is compound or we don't have an image */
- if (mePtr->labelPtr != NULL) {
- Tcl_DString itemTextDString;
- int textWidth;
- GetEntryText(mePtr, &itemTextDString);
- textWidth = Tk_TextWidth(tkfont,
- Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString));
- Tcl_DStringFree(&itemTextDString);
-
- if ((mePtr->compound != COMPOUND_NONE) && haveImage) {
- switch ((enum compound) mePtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- if (textWidth > *widthPtr) {
- *widthPtr = textWidth;
- }
- /* Add text and padding */
- *heightPtr += fmPtr->linespace + 2;
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- if (fmPtr->linespace > *heightPtr) {
- *heightPtr = fmPtr->linespace;
- }
- /* Add text and padding */
- *widthPtr += textWidth + 2;
- break;
- }
- case COMPOUND_CENTER: {
- if (fmPtr->linespace > *heightPtr) {
- *heightPtr = fmPtr->linespace;
- }
- if (textWidth > *widthPtr) {
- *widthPtr = textWidth;
- }
- break;
- }
- case COMPOUND_NONE: {break;}
- }
- } else {
- /* We don't have an image or we're not compound */
- *heightPtr = fmPtr->linespace;
- *widthPtr = textWidth;
- }
- } else {
- /* An empty entry still has this height */
- *heightPtr = fmPtr->linespace;
- }
- }
- *heightPtr += 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MenuSelectEvent --
- *
- * Generates a "MenuSelect" virtual event. This can be used to
- * do context-sensitive menu help.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Places a virtual event on the event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-MenuSelectEvent(
- TkMenu *menuPtr) /* the menu we have selected. */
-{
- XVirtualEvent event;
- Point where;
-
- event.type = VirtualEvent;
- event.serial = menuPtr->display->request;
- event.send_event = false;
- event.display = menuPtr->display;
- Tk_MakeWindowExist(menuPtr->tkwin);
- event.event = Tk_WindowId(menuPtr->tkwin);
- event.root = XRootWindow(menuPtr->display, 0);
- event.subwindow = None;
- event.time = TkpGetMS();
-
- GetMouse(&where);
- event.x_root = where.h;
- event.y_root = where.v;
- event.state = TkMacButtonKeyState();
- event.same_screen = true;
- event.name = Tk_GetUid("MenuSelect");
- Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RecursivelyClearActiveMenu --
- *
- * Recursively clears the active entry in the menu's cascade hierarchy.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Generates <<MenuSelect>> virtual events.
- *
- *----------------------------------------------------------------------
- */
-
-void
-RecursivelyClearActiveMenu(
- TkMenu *menuPtr) /* The menu to reset. */
-{
- int i;
- TkMenuEntry *mePtr;
-
- TkActivateMenuEntry(menuPtr, -1);
- MenuSelectEvent(menuPtr);
- for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- if (mePtr->type == CASCADE_ENTRY) {
- if ((mePtr->childMenuRefPtr != NULL)
- && (mePtr->childMenuRefPtr->menuPtr != NULL)) {
- RecursivelyClearActiveMenu(mePtr->childMenuRefPtr->menuPtr);
- }
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * InvalidateMDEFRgns --
- *
- * Invalidates the regions covered by menus that did redrawing and
- * might be damaged.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Generates Mac update events for affected windows.
- *
- *----------------------------------------------------------------------
- */
-
-void
-InvalidateMDEFRgns(void)
-{
- GDHandle saveDevice;
- GWorldPtr saveWorld, destPort;
- Point scratch;
- MacDrawable *macDraw;
- TkMacWindowList *listPtr;
-
- if (totalMenuRgn == NULL) {
- return;
- }
-
- GetGWorld(&saveWorld, &saveDevice);
- for (listPtr = tkMacWindowListPtr ; listPtr != NULL;
- listPtr = listPtr->nextPtr) {
- macDraw = (MacDrawable *) Tk_WindowId(listPtr->winPtr);
- if (macDraw->flags & TK_DRAWN_UNDER_MENU) {
- destPort = TkMacGetDrawablePort(Tk_WindowId(listPtr->winPtr));
- SetGWorld(destPort, NULL);
- scratch.h = scratch.v = 0;
- GlobalToLocal(&scratch);
- OffsetRgn(totalMenuRgn, scratch.v, scratch.h);
- InvalRgn(totalMenuRgn);
- OffsetRgn(totalMenuRgn, -scratch.v, -scratch.h);
- macDraw->flags &= ~TK_DRAWN_UNDER_MENU;
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
- SetEmptyRgn(totalMenuRgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacClearMenubarActive --
- *
- * Recursively clears the active entry in the current menubar hierarchy.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Generates <<MenuSelect>> virtual events.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacClearMenubarActive(void)
-{
- TkMenuReferences *menuBarRefPtr;
-
- if (currentMenuBarName != NULL) {
- menuBarRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- if ((menuBarRefPtr != NULL) && (menuBarRefPtr->menuPtr != NULL)) {
- TkMenu *menuPtr;
-
- for (menuPtr = menuBarRefPtr->menuPtr->masterMenuPtr; menuPtr != NULL;
- menuPtr = menuPtr->nextInstancePtr) {
- if (menuPtr->menuType == MENUBAR) {
- RecursivelyClearActiveMenu(menuPtr);
- }
- }
- }
- }
- InvalidateMDEFRgns();
- FixMDEF();
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMenuNotifyToplevelCreate --
- *
- * This routine reconfigures the menu and the clones indicated by
- * menuName becuase a toplevel has been created and any system
- * menus need to be created. Only applicable to Windows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * An idle handler is set up to do the reconfiguration.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpMenuNotifyToplevelCreate(
- Tcl_Interp *interp, /* The interp the menu lives in. */
- char *menuName) /* The name of the menu to
- * reconfigure. */
-{
- /*
- * Nothing to do.
- */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * FixMDEF --
- *
- * Loads the MDEF and blasts our routine descriptor into it.
- * We have to set up the MDEF. This is pretty slimy. The real MDEF
- * resource is 68K code. All this code does is call another procedure.
- * When the application in launched, a dummy value for the procedure
- * is compiled into the MDEF. We are going to replace that dummy
- * value with a routine descriptor. When the routine descriptor
- * is invoked, the globals and everything will be setup, and we
- * can do what we need. This will not work from 68K or CFM 68k
- * currently, so we will conditional compile this until we
- * figure it out.
- *
- * Results:
- * Returns the MDEF handle.
- *
- * Side effects:
- * The MDEF is read in and massaged.
- *
- *----------------------------------------------------------------------
- */
-
-#if __MWERKS__ != 0x2400
-#define MDEF_PROC_OFFSET 0x24
-#else
-#define MDEF_PROC_OFFSET 0x20
-#endif
-
-static Handle
-FixMDEF(void)
-{
-#if GENERATINGCFM
- Handle MDEFHandle = GetResource('MDEF', 591);
- Handle SICNHandle = GetResource('SICN', SICN_RESOURCE_NUMBER);
- if ((MDEFHandle != NULL) && (SICNHandle != NULL)) {
- HLock(MDEFHandle);
- HLock(SICNHandle);
- if (menuDefProc == NULL) {
- menuDefProc = TkNewMenuDefProc(MenuDefProc);
- }
- memmove((void *) (((long) (*MDEFHandle)) + MDEF_PROC_OFFSET), &menuDefProc, 4);
- return MDEFHandle;
- } else {
- return NULL;
- }
-#else
- return NULL;
-#endif
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMenuInit --
- *
- * Initializes Mac-specific menu data.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Allocates a hash table.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpMenuInit(void)
-{
- lastMenuID = 256;
- Tcl_InitHashTable(&commandTable, TCL_ONE_WORD_KEYS);
- currentMenuBarOwner = NULL;
- tearoffStruct.menuPtr = NULL;
- currentAppleMenuID = 0;
- currentHelpMenuID = 0;
- currentMenuBarInterp = NULL;
- currentMenuBarName = NULL;
- windowListPtr = NULL;
-
- /*
- * Get the GC that we will use as the sign to the font
- * routines that they should not muck with the foreground color...
- */
-
- if (TkMacHaveAppearance() > 1) {
- XGCValues tmpValues;
- TkColor *tmpColorPtr;
-
- tmpColorPtr = TkpGetColor(NULL, "systemAppearanceColor");
- tmpValues.foreground = tmpColorPtr->color.pixel;
- tmpValues.background = tmpColorPtr->color.pixel;
- ckfree((char *) tmpColorPtr);
-
- tkThemeMenuItemDrawingUPP = NewMenuItemDrawingProc(tkThemeMenuItemDrawingProc);
- }
- FixMDEF();
-
- Tcl_ExternalToUtf(NULL, NULL, "\311", /* Š */
- -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.
- */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpPreprocessMacMenu --
- *
- * Handle preprocessing of menubar if it exists.
- *
- * Results:
- * None.
- *
- * Side effects:
- * All post commands for the current menubar get executed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacPreprocessMenu()
-{
- TkMenuReferences *mbRefPtr;
- int code;
-
- if ((currentMenuBarName != NULL) && (currentMenuBarInterp != NULL)) {
- mbRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- if ((mbRefPtr != NULL) && (mbRefPtr->menuPtr != NULL)) {
- Tcl_Preserve((ClientData)currentMenuBarInterp);
- code = TkPreprocessMenu(mbRefPtr->menuPtr->masterMenuPtr);
- if ((code != TCL_OK) && (code != TCL_CONTINUE)
- && (code != TCL_BREAK)) {
- Tcl_AddErrorInfo(currentMenuBarInterp,
- "\n (menu preprocess)");
- Tcl_BackgroundError(currentMenuBarInterp);
- }
- Tcl_Release((ClientData)currentMenuBarInterp);
- }
- }
-}
diff --git a/mac/tkMacMenu.r b/mac/tkMacMenu.r
deleted file mode 100644
index 835112b..0000000
--- a/mac/tkMacMenu.r
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * tkMacMenu.r --
- *
- * Resources needed by menus.
- *
- * This file also contains the icons 'SICN' used by the menu code
- * in menu items.
- *
- * Copyright (c) 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.
- */
-
-#include <Types.r>
-
-/*
- * Icons used in menu items.
- */
-
-resource 'SICN' (128, preload, locked) {
- { /* array: 7 elements */
- /* [1] */
- $"0000 0000 8000 C000 E000 F000 F800 FC00"
- $"F800 F000 E000 C000 80",
- /* [2] */
- $"0000 0000 0000 0800 1400 2200 4100 8080"
- $"E380 2200 2200 2200 3E",
- /* [3] */
- $"0000 0000 0000 0000 0000 F8F0 C4F0 F270"
- $"0900 0480 0270 0130 00F0",
- /* [4] */
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 E4E0 CE60 1B00 3180",
- /* [5] */
- $"0000 0000 0000 0000 6300 9480 9480 7F00"
- $"1400 7F00 9480 9480 63",
- /* [6] */
- $"0000 0000 0000 0000 0000 3FF8 1FF0 0FE0"
- $"07C0 0380 01",
- /* [7] */
- $"0000 0000 0000 0000 0000 0100 0380 07C0"
- $"0FE0 1FF0 3FF8"
- }
-};
diff --git a/mac/tkMacMenubutton.c b/mac/tkMacMenubutton.c
deleted file mode 100644
index b6a830b..0000000
--- a/mac/tkMacMenubutton.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * tkMacMenubutton.c --
- *
- * This file implements the Macintosh specific portion of the
- * menubutton widget.
- *
- * Copyright (c) 1996 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.
- */
-
-#include "tkMenubutton.h"
-#include "tkMacInt.h"
-#include <Controls.h>
-
-#define kShadowOffset (3) /* amount to offset shadow from frame */
-#define kTriangleWidth (11) /* width of the triangle */
-#define kTriangleHeight (6) /* height of the triangle */
-#define kTriangleMargin (5) /* margin around triangle */
-
-/*
- * Declaration of Unix specific button structure.
- */
-
-typedef struct MacMenuButton {
- TkMenuButton info; /* Generic button info. */
-} MacMenuButton;
-
-/*
- * The structure below defines menubutton class behavior by means of
- * procedures that can be invoked from generic window code.
- */
-
-Tk_ClassProcs tkpMenubuttonClass = {
- sizeof(Tk_ClassProcs), /* size */
- TkMenuButtonWorldChanged, /* worldChangedProc */
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCreateMenuButton --
- *
- * Allocate a new TkMenuButton structure.
- *
- * Results:
- * Returns a newly allocated TkMenuButton structure.
- *
- * Side effects:
- * Registers an event handler for the widget.
- *
- *----------------------------------------------------------------------
- */
-
-TkMenuButton *
-TkpCreateMenuButton(
- Tk_Window tkwin)
-{
- MacMenuButton *butPtr = (MacMenuButton *)ckalloc(sizeof(MacMenuButton));
-
- return (TkMenuButton *) butPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDisplayMenuButton --
- *
- * This procedure is invoked to display a menubutton widget.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Commands are output to X to display the menubutton in its
- * current mode.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDisplayMenuButton(
- ClientData clientData) /* Information about widget. */
-{
- TkMenuButton *mbPtr = (TkMenuButton *) clientData;
- GC gc;
- Tk_3DBorder border;
- int x = 0; /* Initialization needed only to stop
- * compiler warning. */
- int y;
- Tk_Window tkwin = mbPtr->tkwin;
- int width, height, fullWidth, fullHeight;
- int imageWidth, imageHeight;
- int imageXOffset, imageYOffset, textXOffset, textYOffset;
- int haveImage = 0, haveText = 0;
- MacMenuButton * macMBPtr = (MacMenuButton *) mbPtr;
- GWorldPtr destPort;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- MacDrawable *macDraw;
-
- mbPtr->flags &= ~REDRAW_PENDING;
- if ((mbPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
- return;
- }
-
- GetGWorld(&saveWorld, &saveDevice);
- destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin));
- SetGWorld(destPort, NULL);
- macDraw = (MacDrawable *) Tk_WindowId(tkwin);
-
- if ((mbPtr->state == STATE_DISABLED) && (mbPtr->disabledFg != NULL)) {
- gc = mbPtr->disabledGC;
- } else if ((mbPtr->state == STATE_ACTIVE)
- && !Tk_StrictMotif(mbPtr->tkwin)) {
- gc = mbPtr->activeTextGC;
- } else {
- gc = mbPtr->normalTextGC;
- }
- border = mbPtr->normalBorder;
-
- if (mbPtr->image != None) {
- Tk_SizeOfImage(mbPtr->image, &width, &height);
- haveImage = 1;
- } else if (mbPtr->bitmap != None) {
- Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height);
- haveImage = 1;
- }
- imageWidth = width;
- imageHeight = height;
-
- haveText = (mbPtr->textWidth != 0 && mbPtr->textHeight != 0);
-
- /*
- * In order to avoid screen flashes, this procedure redraws
- * the menu button in a pixmap, then copies the pixmap to the
- * screen in a single operation. This means that there's no
- * point in time where the on-sreen image has been cleared.
- */
-
- Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), border, 0, 0,
- Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
-
- imageXOffset = 0;
- imageYOffset = 0;
- textXOffset = 0;
- textYOffset = 0;
- fullWidth = 0;
- fullHeight = 0;
-
- if (mbPtr->compound != COMPOUND_NONE && haveImage && haveText) {
- switch ((enum compound) mbPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- /* Image is above or below text */
- if (mbPtr->compound == COMPOUND_TOP) {
- textYOffset = height + mbPtr->padY;
- } else {
- imageYOffset = mbPtr->textHeight + mbPtr->padY;
- }
- fullHeight = height + mbPtr->textHeight + mbPtr->padY;
- fullWidth = (width > mbPtr->textWidth ? width :
- mbPtr->textWidth);
- textXOffset = (fullWidth - mbPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- /* Image is left or right of text */
- if (mbPtr->compound == COMPOUND_LEFT) {
- textXOffset = width + mbPtr->padX;
- } else {
- imageXOffset = mbPtr->textWidth + mbPtr->padX;
- }
- fullWidth = mbPtr->textWidth + mbPtr->padX + width;
- fullHeight = (height > mbPtr->textHeight ? height :
- mbPtr->textHeight);
- textYOffset = (fullHeight - mbPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_CENTER: {
- /* Image and text are superimposed */
- fullWidth = (width > mbPtr->textWidth ? width :
- mbPtr->textWidth);
- fullHeight = (height > mbPtr->textHeight ? height :
- mbPtr->textHeight);
- textXOffset = (fullWidth - mbPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- textYOffset = (fullHeight - mbPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_NONE: {break;}
- }
-
-
- TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0,
- mbPtr->indicatorWidth + fullWidth, fullHeight,
- &x, &y);
-
- imageXOffset += x;
- imageYOffset += y;
- if (mbPtr->image != NULL) {
- Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin),
- imageXOffset, imageYOffset);
- } else if (mbPtr->bitmap != None) {
- XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin),
- gc, 0, 0, (unsigned) width, (unsigned) height,
- imageXOffset, imageYOffset, 1);
- }
-
- Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc,
- mbPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1);
- Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc,
- mbPtr->textLayout, x + textXOffset, y + textYOffset,
- mbPtr->underline);
- } else if (haveImage) {
- TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0,
- width + mbPtr->indicatorWidth, height, &x, &y);
- imageXOffset += x;
- imageYOffset += y;
- if (mbPtr->image != NULL) {
- Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin),
- imageXOffset, imageYOffset);
- } else if (mbPtr->bitmap != None) {
- XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin),
- gc, 0, 0, (unsigned) width, (unsigned) height,
- x, y, 1);
- }
- } else {
- TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY,
- mbPtr->textWidth + mbPtr->indicatorWidth,
- mbPtr->textHeight, &x, &y);
- Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc,
- mbPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1);
- Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc,
- mbPtr->textLayout, x + textXOffset, y + textYOffset,
- mbPtr->underline);
- }
-
-#if 0 /* this is the original code */
- /*
- * Display image or bitmap or text for button.
- */
-
- if (mbPtr->image != None) {
- Tk_SizeOfImage(mbPtr->image, &width, &height);
-
- imageOrBitmap:
- TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0,
- width + mbPtr->indicatorWidth, height, &x, &y);
- if (mbPtr->image != NULL) {
- Tk_RedrawImage(mbPtr->image, 0, 0, width, height,
- Tk_WindowId(tkwin), x, y);
- } else {
- XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin),
- gc, 0, 0, (unsigned) width, (unsigned) height, x, y, 1);
- }
- } else if (mbPtr->bitmap != None) {
- Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height);
- goto imageOrBitmap;
- } else {
- TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY,
- mbPtr->textWidth + mbPtr->indicatorWidth, mbPtr->textHeight,
- &x, &y);
- Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc,
- mbPtr->textLayout, x, y, 0, -1);
- }
-#endif
-
- /*
- * If the menu button is disabled with a stipple rather than a special
- * foreground color, generate the stippled effect.
- */
-
- if ((mbPtr->state == STATE_DISABLED)
- && ((mbPtr->disabledFg != NULL) || (mbPtr->image != NULL))) {
- /*
- * Stipple the whole button if no disabledFg was specified,
- * otherwise restrict stippling only to displayed image
- */
- if (mbPtr->disabledFg == NULL) {
- XFillRectangle(mbPtr->display, Tk_WindowId(tkwin),
- mbPtr->stippleGC, mbPtr->inset, mbPtr->inset,
- (unsigned) (Tk_Width(tkwin) - 2*mbPtr->inset),
- (unsigned) (Tk_Height(tkwin) - 2*mbPtr->inset));
- } else {
- XFillRectangle(mbPtr->display, Tk_WindowId(tkwin),
- mbPtr->stippleGC, imageXOffset, imageYOffset,
- (unsigned) imageWidth, (unsigned) imageHeight);
- }
- }
-
- /*
- * Draw the cascade indicator for the menu button on the
- * right side of the window, if desired.
- */
-
- if (mbPtr->indicatorOn) {
- int w, h, i;
- Rect r;
-
- r.left = macDraw->xOff + Tk_Width(tkwin) - mbPtr->inset
- - mbPtr->indicatorWidth;
- r.top = macDraw->yOff + Tk_Height(tkwin)/2
- - mbPtr->indicatorHeight/2;
- r.right = macDraw->xOff + Tk_Width(tkwin) - mbPtr->inset
- - kTriangleMargin;
- r.bottom = macDraw->yOff + Tk_Height(tkwin)/2
- + mbPtr->indicatorHeight/2;
-
- h = mbPtr->indicatorHeight;
- w = mbPtr->indicatorWidth - 1 - kTriangleMargin;
- for (i = 0; i < h; i++) {
- MoveTo(r.left + i, r.top + i);
- LineTo(r.left + i + w, r.top + i);
- w -= 2;
- }
- }
-
- /*
- * Draw the border and traversal highlight last. This way, if the
- * menu button's contents overflow onto the border they'll be covered
- * up by the border.
- */
-
- TkMacSetUpClippingRgn(Tk_WindowId(tkwin));
- if (mbPtr->borderWidth > 0) {
- Rect r;
-
- r.left = macDraw->xOff + mbPtr->highlightWidth + mbPtr->borderWidth;
- r.top = macDraw->yOff + mbPtr->highlightWidth + mbPtr->borderWidth;
- r.right = macDraw->xOff + Tk_Width(tkwin) - mbPtr->highlightWidth
- - mbPtr->borderWidth;
- r.bottom = macDraw->yOff + Tk_Height(tkwin) - mbPtr->highlightWidth
- - mbPtr->borderWidth;
- FrameRect(&r);
-
- PenSize(mbPtr->borderWidth - 1, mbPtr->borderWidth - 1);
- MoveTo(r.right, r.top + kShadowOffset);
- LineTo(r.right, r.bottom);
- LineTo(r.left + kShadowOffset, r.bottom);
- }
-
- if (mbPtr->highlightWidth != 0) {
- GC fgGC, bgGC;
-
- bgGC = Tk_GCForColor(mbPtr->highlightBgColorPtr, Tk_WindowId(tkwin));
- if (mbPtr->flags & GOT_FOCUS) {
- fgGC = Tk_GCForColor(mbPtr->highlightColorPtr, Tk_WindowId(tkwin));
- TkpDrawHighlightBorder(tkwin, fgGC, bgGC, mbPtr->highlightWidth,
- Tk_WindowId(tkwin));
- } else {
- TkpDrawHighlightBorder(tkwin, bgGC, bgGC, mbPtr->highlightWidth,
- Tk_WindowId(tkwin));
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyMenuButton --
- *
- * Free data structures associated with the menubutton control.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Restores the default control state.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyMenuButton(
- TkMenuButton *mbPtr)
-{
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpComputeMenuButtonGeometry --
- *
- * After changes in a menu button's text or bitmap, this procedure
- * recomputes the menu button's geometry and passes this information
- * along to the geometry manager for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The menu button's window may change size.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpComputeMenuButtonGeometry(mbPtr)
- register TkMenuButton *mbPtr; /* Widget record for menu button. */
-{
- int width=0, height=0, textwidth=0, textheight=0, mm, pixels, noimage=0;
-
- mbPtr->inset = mbPtr->highlightWidth + mbPtr->borderWidth;
- if (mbPtr->image != None) {
- Tk_SizeOfImage(mbPtr->image, &width, &height);
- if (mbPtr->width > 0) {
- width = mbPtr->width;
- }
- if (mbPtr->height > 0) {
- height = mbPtr->height;
- }
- } else if (mbPtr->bitmap != None) {
- Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height);
- if (mbPtr->width > 0) {
- width = mbPtr->width;
- }
- if (mbPtr->height > 0) {
- height = mbPtr->height;
- }
- } else {
- noimage=1;
- }
-
- if ( noimage || mbPtr->compound != COMPOUND_NONE ) {
- Tk_FreeTextLayout(mbPtr->textLayout);
- mbPtr->textLayout = Tk_ComputeTextLayout(mbPtr->tkfont, mbPtr->text,
- -1, mbPtr->wrapLength, mbPtr->justify, 0, &mbPtr->textWidth,
- &mbPtr->textHeight);
- textwidth = mbPtr->textWidth;
- textheight = mbPtr->textHeight;
- if (mbPtr->width > 0) {
- textwidth = mbPtr->width * Tk_TextWidth(mbPtr->tkfont, "0", 1);
- }
- if (mbPtr->height > 0) {
- Tk_FontMetrics fm;
-
- Tk_GetFontMetrics(mbPtr->tkfont, &fm);
- textheight = mbPtr->height * fm.linespace;
- }
- textwidth += 2*mbPtr->padX;
- textheight += 2*mbPtr->padY;
- }
-
- switch ((enum compound) mbPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- height += textheight + mbPtr->padY;
- width = (width > textwidth ? width : textwidth);
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- height = (height > textheight ? height : textheight);
- width += textwidth + mbPtr->padX;
- break;
- }
- case COMPOUND_CENTER: {
- height = (height > textheight ? height : textheight);
- width = (width > textwidth ? width : textwidth);
- break;
- }
- case COMPOUND_NONE: {
- if (noimage) {
- height = textheight;
- width = textwidth;
- }
- break;
- }
- }
-
- if (mbPtr->indicatorOn) {
- mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin));
- pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin));
- mbPtr->indicatorHeight= kTriangleHeight;
- mbPtr->indicatorWidth = kTriangleWidth + kTriangleMargin;
- width += mbPtr->indicatorWidth;
- } else {
- mbPtr->indicatorHeight = 0;
- mbPtr->indicatorWidth = 0;
- }
-
- Tk_GeometryRequest(mbPtr->tkwin, (int) (width + 2*mbPtr->inset),
- (int) (height + 2*mbPtr->inset));
- Tk_SetInternalBorder(mbPtr->tkwin, mbPtr->inset);
-}
diff --git a/mac/tkMacMenus.c b/mac/tkMacMenus.c
deleted file mode 100644
index dfb40dd..0000000
--- a/mac/tkMacMenus.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * tkMacMenus.c --
- *
- * These calls set up and manage the menubar for the
- * Macintosh version of Tk.
- *
- * Copyright (c) 1995-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include "tcl.h"
-#include "tclMacInt.h" /* Needed for FSpLocationFromPath */
-#include "tk.h"
-#include "tkInt.h"
-#include "tkMacInt.h"
-
-/*
- * The define Status defined by Xlib.h conflicts with the function Status
- * defined by Devices.h. We undefine it here to compile.
- */
-#undef Status
-#include <Devices.h>
-#include <Menus.h>
-#include <Memory.h>
-#include <SegLoad.h>
-#include <StandardFile.h>
-#include <ToolUtils.h>
-#include <Balloons.h>
-
-#define kAppleMenu 256
-#define kAppleAboutItem 1
-#define kFileMenu 2
-#define kEditMenu 3
-
-#define kSourceItem 1
-#define kCloseItem 2
-#define kQuitItem 4
-
-#define EDIT_CUT 1
-#define EDIT_COPY 2
-#define EDIT_PASTE 3
-#define EDIT_CLEAR 4
-
-MenuHandle tkAppleMenu;
-MenuHandle tkFileMenu;
-MenuHandle tkEditMenu;
-
-static Tcl_Interp * gInterp; /* Interpreter for this application. */
-
-static void GenerateEditEvent _ANSI_ARGS_((int flag));
-static void SourceDialog _ANSI_ARGS_((void));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacHandleMenuSelect --
- *
- * Handles events that occur in the Menu bar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacHandleMenuSelect(
- long mResult,
- int optionKeyPressed)
-{
- short theItem = LoWord(mResult);
- short theMenu = HiWord(mResult);
- Str255 name;
- Tk_Window tkwin;
- Window window;
- TkDisplay *dispPtr;
-
- if (mResult == 0) {
- TkMacHandleTearoffMenu();
- TkMacClearMenubarActive();
- return;
- }
-
- switch (theMenu) {
-
- case kAppleMenu:
- switch (theItem) {
- case kAppleAboutItem:
- {
- Tcl_CmdInfo dummy;
-
- if (optionKeyPressed || gInterp == NULL ||
- Tcl_GetCommandInfo(gInterp,
- "tkAboutDialog", &dummy) == 0) {
- TkAboutDlg();
- } else {
- Tcl_Eval(gInterp, "tkAboutDialog");
- }
- break;
- }
- default:
- GetMenuItemText(tkAppleMenu, theItem, name);
- HiliteMenu(0);
- OpenDeskAcc(name);
- return;
- }
- break;
- case kFileMenu:
- switch (theItem) {
- case kSourceItem:
- /* TODO: source script */
- SourceDialog();
- break;
- case kCloseItem:
- /* Send close event */
- if (TkMacHaveAppearance() >= 0x110) {
- window = TkMacGetXWindow(FrontNonFloatingWindow());
- } else {
- window = TkMacGetXWindow(FrontWindow());
- }
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- TkGenWMDestroyEvent(tkwin);
- break;
- case kQuitItem:
- /* Exit */
- if (optionKeyPressed || gInterp == NULL) {
- Tcl_Exit(0);
- } else {
- Tcl_Eval(gInterp, "exit");
- }
- break;
- }
- break;
- case kEditMenu:
- /*
- * This implementation just send keysyms
- * the Tk thinks are associated with function keys that
- * do Cut, Copy & Paste on a Sun keyboard.
- */
- GenerateEditEvent(theItem);
- break;
- default:
- TkMacDispatchMenuEvent(theMenu, theItem);
- TkMacClearMenubarActive();
- break;
- }
-
- /*
- * Finally we unhighlight the menu.
- */
- HiliteMenu(0);
-} /* TkMacHandleMenuSelect */
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacInitMenus --
- *
- * This procedure initializes the Macintosh menu bar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacInitMenus(
- Tcl_Interp *interp)
-{
- gInterp = interp;
-
- /*
- * At this point, InitMenus() should have already been called.
- */
-
- if (TkMacUseMenuID(256) != TCL_OK) {
- panic("Menu ID 256 is already in use!");
- }
- tkAppleMenu = NewMenu(256, "\p\024");
- if (tkAppleMenu == NULL) {
- panic("memory - menus");
- }
- InsertMenu(tkAppleMenu, 0);
- AppendMenu(tkAppleMenu, "\pAbout Tcl & TkŠ");
- AppendMenu(tkAppleMenu, "\p(-");
- AppendResMenu(tkAppleMenu, 'DRVR');
-
- if (TkMacUseMenuID(kFileMenu) != TCL_OK) {
- panic("Menu ID %d is already in use!", kFileMenu);
- }
- tkFileMenu = NewMenu(kFileMenu, "\pFile");
- if (tkFileMenu == NULL) {
- panic("memory - menus");
- }
- InsertMenu(tkFileMenu, 0);
- AppendMenu(tkFileMenu, "\pSourceŠ");
- AppendMenu(tkFileMenu, "\pClose/W");
- AppendMenu(tkFileMenu, "\p(-");
- AppendMenu(tkFileMenu, "\pQuit/Q");
-
- if (TkMacUseMenuID(kEditMenu) != TCL_OK) {
- panic("Menu ID %d is already in use!", kEditMenu);
- }
- tkEditMenu = NewMenu(kEditMenu, "\pEdit");
- if (tkEditMenu == NULL) {
- panic("memory - menus");
- }
- InsertMenu(tkEditMenu, 0);
- AppendMenu(tkEditMenu, "\pCut/X");
- AppendMenu(tkEditMenu, "\pCopy/C");
- AppendMenu(tkEditMenu, "\pPaste/V");
- AppendMenu(tkEditMenu, "\pClear");
- if (TkMacUseMenuID(kHMHelpMenuID) != TCL_OK) {
- panic("Help menu ID %s is already in use!", kHMHelpMenuID);
- }
-
- DrawMenuBar();
- TkMacSetHelpMenuItemCount();
-
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateEditEvent --
- *
- * Takes an edit menu item and posts the corasponding a virtual
- * event to Tk's event queue.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May place events of queue.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GenerateEditEvent(
- int flag)
-{
- XVirtualEvent event;
- Point where;
- Tk_Window tkwin;
- Window window;
- TkDisplay *dispPtr;
-
- if (TkMacHaveAppearance() >= 0x110) {
- window = TkMacGetXWindow(FrontNonFloatingWindow());
- } else {
- window = TkMacGetXWindow(FrontWindow());
- }
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr;
- if (tkwin == NULL) {
- return;
- }
-
- event.type = VirtualEvent;
- event.serial = Tk_Display(tkwin)->request;
- event.send_event = false;
- event.display = Tk_Display(tkwin);
- event.event = Tk_WindowId(tkwin);
- event.root = XRootWindow(Tk_Display(tkwin), 0);
- event.subwindow = None;
- event.time = TkpGetMS();
-
- GetMouse(&where);
- tkwin = Tk_TopCoordsToWindow(tkwin, where.h, where.v,
- &event.x, &event.y);
- LocalToGlobal(&where);
- event.x_root = where.h;
- event.y_root = where.v;
- event.state = TkMacButtonKeyState();
- event.same_screen = true;
-
- switch (flag) {
- case EDIT_CUT:
- event.name = Tk_GetUid("Cut");
- break;
-
- case EDIT_COPY:
- event.name = Tk_GetUid("Copy");
- break;
-
- case EDIT_PASTE:
- event.name = Tk_GetUid("Paste");
- break;
-
- case EDIT_CLEAR:
- event.name = Tk_GetUid("Clear");
- break;
- }
- Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * SourceDialog --
- *
- * Presents a dialog to the user for selecting a Tcl file. The
- * selected file will be sourced into the main interpreter.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-SourceDialog()
-{
- int result;
- CONST char *path;
- char openCmd[] = "tk_getOpenFile -filetypes {\
- {{TCL Scripts} {.tcl} TEXT} {{Text Files} {} TEXT}}";
-
- if (gInterp == NULL) {
- return;
- }
-
- if (Tcl_Eval(gInterp, openCmd) != TCL_OK) {
- return;
- }
-
- path = Tcl_GetStringResult(gInterp);
-
- if (strlen(path) == 0) {
- return;
- }
-
- result = Tcl_EvalFile(gInterp, path);
- if (result == TCL_ERROR) {
- Tcl_BackgroundError(gInterp);
- }
-}
diff --git a/mac/tkMacPort.h b/mac/tkMacPort.h
deleted file mode 100644
index 41e0615..0000000
--- a/mac/tkMacPort.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * tkMacPort.h --
- *
- * This file is included by all of the Tk C files. It contains
- * information that may be configuration-dependent, such as
- * #includes for system include files and a few other things.
- *
- * Copyright (c) 1994-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#ifndef _TKMACPORT
-#define _TKMACPORT
-
-/*
- * Macro to use instead of "void" for arguments that must have
- * type "void *" in ANSI C; maps them to type "char *" in
- * non-ANSI systems. This macro may be used in some of the include
- * files below, which is why it is defined here.
- */
-
-#ifndef VOID
-# ifdef __STDC__
-# define VOID void
-# else
-# define VOID char
-# endif
-#endif
-
-#ifndef _TCL
-# include <tcl.h>
-#endif
-
-#include <time.h>
-#include <stdlib.h>
-#include <string.h>
-#include "tclMath.h"
-#include <ctype.h>
-#include <limits.h>
-
-#include <Xlib.h>
-#include <cursorfont.h>
-#include <keysym.h>
-#include <Xatom.h>
-#include <Xfuncproto.h>
-#include <Xutil.h>
-#include "tkIntXlibDecls.h"
-
-/*
- * Not all systems declare the errno variable in errno.h. so this
- * file does it explicitly.
- */
-
-extern int errno;
-
-/*
- * Define "NBBY" (number of bits per byte) if it's not already defined.
- */
-
-#ifndef NBBY
-# define NBBY 8
-#endif
-
-/*
- * Declarations for various library procedures that may not be declared
- * in any other header file.
- */
-
-#ifndef panic /* In a stubs-aware setting, this could confuse the #define */
-EXTERN void panic _ANSI_ARGS_(TCL_VARARGS(char *, string));
-#endif
-#ifndef strcasecmp
-EXTERN int strcasecmp _ANSI_ARGS_((CONST char *s1,
- CONST char *s2));
-#endif
-#ifndef strncasecmp
-EXTERN int strncasecmp _ANSI_ARGS_((CONST char *s1,
- CONST char *s2, size_t n));
-#endif
-/*
- * Defines for X functions that are used by Tk but are treated as
- * no-op functions on the Macintosh.
- */
-
-#define XFlush(display)
-#define XFree(data) {if ((data) != NULL) ckfree((char *) (data));}
-#define XGrabServer(display)
-#define XNoOp(display) {display->request++;}
-#define XUngrabServer(display)
-#define XSynchronize(display, bool) {display->request++;}
-#define XSync(display, bool) {display->request++;}
-#define XVisualIDFromVisual(visual) (visual->visualid)
-
-/*
- * 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) {}
-#define TkpSync(display)
-
-/*
- * The following macro returns the pixel value that corresponds to the
- * RGB values in the given XColor structure.
- */
-
-#define PIXEL_MAGIC ((unsigned char) 0x69)
-#define TkpGetPixel(p) ((((((PIXEL_MAGIC << 8) \
- | (((p)->red >> 8) & 0xff)) << 8) \
- | (((p)->green >> 8) & 0xff)) << 8) \
- | (((p)->blue >> 8) & 0xff))
-
-/*
- * This macro stores a representation of the window handle in a string.
- * This should perhaps use the real size of an XID.
- */
-
-#define TkpPrintWindowId(buf,w) \
- sprintf((buf), "0x%x", (unsigned int) (w))
-
-/*
- * TkpScanWindowId is just an alias for Tcl_GetInt on Unix.
- */
-
-#define TkpScanWindowId(i,s,wp) \
- Tcl_GetInt((i),(s),(int *)(wp))
-
-/*
- * Magic pixel values for dynamic (or active) colors.
- */
-
-#define HIGHLIGHT_PIXEL 31
-#define HIGHLIGHT_TEXT_PIXEL 33
-#define CONTROL_TEXT_PIXEL 35
-#define CONTROL_BODY_PIXEL 37
-#define CONTROL_FRAME_PIXEL 39
-#define WINDOW_BODY_PIXEL 41
-#define MENU_ACTIVE_PIXEL 43
-#define MENU_ACTIVE_TEXT_PIXEL 45
-#define MENU_BACKGROUND_PIXEL 47
-#define MENU_DISABLED_PIXEL 49
-#define MENU_TEXT_PIXEL 51
-#define APPEARANCE_PIXEL 52
-
-/*
- * The following declaration is used to get access to a private Tcl interface
- * that is needed for portability reasons.
- */
-
-#ifndef _TCLINT
-#include <tclInt.h>
-#endif
-
-#endif /* _TKMACPORT */
diff --git a/mac/tkMacProjects.sea.hqx b/mac/tkMacProjects.sea.hqx
deleted file mode 100644
index a4dbd68..0000000
--- a/mac/tkMacProjects.sea.hqx
+++ /dev/null
@@ -1,3718 +0,0 @@
-(This file must be converted with BinHex 4.0)
-:%A4V6@&M8(*[DQ9MG(-ZFf9K!%&38%aKGA0d)!!!!5F$!!'6Y5MI8h4eCQC*G#!
-SBbNa16Nh,6%j16JJ3@aKC'4TEL"6HA0dC@ec,#"*EQ-Z,#"SG(4`1Lm[Gj!$,Q&
-XB@4ND@jcHA-ZBfpY,e0dG@CQ5A3[$3SD!!83!!%R!`#3!h)!!3#3!h+H#JfPT9*
-PFf9bGQ9NTD8!TC!%!3!!23"%YeSN#ER+0Li!N!d0(p)!N!26!#TU"`!"*M!!!R4
-V6@&M8(*[DQ9MG(-!!'l0!*N"63*m!cX"`2q3"!)HrrMrm-Y!!!#!!*!%!5i,TC!
-%!3!!1!"%Y[&1mlEa6e`!N!0b!!%Pk!#3!h)!#*j@!!!",`!UD#%!!55j!!)Y2L"
-#G@PXC!!!NqF!G`!$!B8#)`(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!e!%5d(A&
-cZFSb"`#3!p-!!564!*!$d`!&k(!!!!')!#TQ1`!")dN!"Ldq)(4V!!"4'J"p!"!
-"f3(k!F$rN!3#([rirr$,3!!!J!#3"k@3"!%!!$S!J,5Kk8#h64Vb!!!",`!!$PJ
-!!!%[!!UlRJ!!USS!!!ab!*!%$`"8Dep04%9',Xq!!!"!XNe08(*$9dP&!3$rN!3
-!N!U!F!#3"N,"e+m!ShpY8pbfEdh,f+P*HUj[2"9e3-k!SAj`@SQ0BeALjCD&G!e
-H`rE%$YFh)m2m'P9a'jDKMm&p[l*Xd1VSUmTrp(-,R(0)+CX8h*8DCEbQZY)G!kS
-N[r'lPccY[hF&9FRKCmd,$#"8KX[+8!XYfbABbfMpe20%lmFrX))lpZ5*6q#mV9I
-L'2lL%8KQKr,Q(j0XLC@iL1V'6NSI9$b,LTc%c1D-R4Pc!djpZIi`RM[hS'D06Z4
-c"NfU8YM8f%Dr!q$CHfc6kkfR"3)S0d"D0&E#AiLm)bk!a"8!*cN5CTHI'6kb[$b
-C6e61M9YPAJk#cM[I-PGRjf685IAJ$c&JBFmiTk-AN5bNFHUDrS(cU!CH9mjDcFR
-mA-%#)DkJ&$rGfU%UCI#Pe*K,%cIf@Zfkc((03"b9[S2U51T+-aB"%AQ'EmfNUrb
-2k@1jQ`pFQKr14ID16DLfC#QkqLlNr9RRMNiB$GlZ"31ZGBJNk3XCI-l-%,5NdP,
-LEhdPX*VG[iQaI"IV93pi83#21F0pM5p$#104XQl+)ZmcV5**rR!DIijDZa"rehZ
-YqGEKK@lMp&d*la-a%*AGZ9kT6A6`H"PQ3kLAmljV,S3B+29-SqMV`i,*1$33FfV
-#8K-TRbfMY*FX'HM'P9-3k9LIi3ajNadfimF%"r&8`Seh@UA$$)iI64YkrcP3,R`
-%6"mG3VhP)i'ReraXSG4QJY21T2i,2m"eQi%ifNlPhY0+k--LF383V,+k,&@@VKl
-a[pMFeFRMkj4",5HjV4XKqBi1dAFe!BPBBS)F#f%ZX)"@TC'b@V-E3ZJ1XZ9RZNd
-p9eqRhF&PS+f6(XaCKHaSiH+4Te6bbA4,4C0VIjbHQMJfi)@(VQD!k&%VA4LpmP)
-D!KP#TZ1iK6V*(#FJ961AKXY[)lGXI(+FdN6kPl#!++9J-%$-Q+%mZje$A*)k`Li
-ZQ[4j"XQV&@BDPSME[*+DQJYaU0Qqi(fmf1R&FajY,PQCPA1Z#bPLej!!V,5J+6N
-A(V(SF3C"![9P5dfXMiX3@ZeS#b"ZebaZ2"+&SEC*c6qL!A3$l`S-k0XY&#`BJGd
-EfJh*ka9`C"+U3Hcq6H"Lc1'#QmIFCaI3Lq`&ShcY,fcl)B8PJT3aq5mLJ*lRfpH
-5KJ0!LS,UeJm#hC!!&RM[+&M*DKEr9GdcTK+j`bhQ#"Gl&@U0q2PK'GX%eMLSf5@
-G![S@M!5Gq+l`rHrH1S!6p%GRLGLUcDhTFc,6X'b,L3+He01fZXNck090))[[38+
-e&d4A4-KXbGTKIJFUN["NB('MN@LjdZP"ZJY4m,Yl&S'FPIEE(jh!kPB0+dY8h##
-,'5IlRh8L1%0E1l)XphLM$Kq$(NdrLHH2!ePKfA$cbY)8kR1TDq$DpRkXFDq*i%S
-lEG2a0"8A-%XkkMqlI#5,[qC"Y&eM[DVR!)J,1,XrRA`B,"DcPPl1fEp)Td*-E0N
-C"J$le2LE$[S)cYh'+Nk,D*BFT""VT$)GQ6r!GfQ*$8YhN!$h-jY5Kk,E%lmpZdj
-@DG0B+jTXP%3*1cJA@c,I&%JCNBBU[0hU&eMBKK'Z-23pNbhljm*3Jd+N(l[ZB@-
-kG8YJXM`fDX8GMCU*`pT%5Gf8QJd+l,*hG4*j-2&`PbHjNS88A`hPL4Xj)p&!$d(
-!3dS%@Lk,IS'%56,Da[rFJdj0dd9X1#*fQeApGIdPDkL!f&`K!+1h0!CA*,6Kq0E
-`qR@!Dc!('Vc6h9lFS*LB%j&b["N9!DLhfflMD5T6h"C+0b@"c+%qP3r"1,4q9)U
-kBik('`qmb&4iR8VPEK!@6I()Vp!2#6PHh"%NFRfYX009lZSM3LLcViD2@)9DH#6
-1S65C*p4SZk@Qm%%BYAp(U6AjLiS3HE4G0$S'RCe*[CD[5Mq%,E*&)02iHR6jDPp
-08C%[93G-$R*L[Ll&[Y#pIrY8%(d,+2I`C%L2ji$Sdel4#GT-c[3*X*RD52maR[8
-kIiK#h&NCFIN(cfp8ei5I+5['Bh5P[99)jc+Lim2mCRp24`54e-S$FI2UbrR&Eca
-3-G+X50#kaMkI[''4304P)8'C5#M1!VDd1@I+Ie1K5lhFHQKJiIRb'`!Fqk0#!5p
-#0Iakl@+55#YR"MEm[JTe09L-AHrIiRETS!f8E2pV3*[0fD$ih$$@-qm$+`eA[93
-h8pPa66!H#@a%I%aZ#R226eC-)8J[%I`,-6KDBPdjETaDPmhZVA1HK$hH2S+EibV
-'',rLDL(qL@,44j)b8SHF[P[b!Vd#LlVLVNq*dfbhU'*S,K3$QE20DN1V6D5Md!M
-cf#!Q*C!!jTN+ai*!Y,j6+31ZY45GiZ[-%N5#Dr`ba4CI-fMYAbPi-NNbG`b&PBL
-p1b#6qRZGVXMj3UF'%Fd(R'R5SJ4F'*M-jPL"Mb+A4(H6B+3BL#3Y)%Cl&ddA#I,
-bpAhrp'Y+9(k8k8@5UJ#Y8(h(HDP8dPTlPmTkNP'3!,m6EYQbN!!(eUIp0id`103
-5a10GZlJ5EMNhb6!pS1+rU-EZd+pApdSEc`JJQH5JeiZ5h80F"Kep)$P)k+J(TTr
-S+H*)PmCCIIVJ*'l6QG#T(H(QaKH26'FI3I0XL-c"T`4dMDqHDKf#DekIV&)@X*!
-!$R'#UQIJeK8bR)XSiS9F-pbQ5H`QQ*S$BeDjpT5LA+0A"@Sp1E'[d2)UXi$BAkd
-UrjE4G5G$rA!LFJpThmaVdXLrI)qq19rr1G#1d5L&qi%'*K%8&B8P*fC)e)lbBC!
-!&l@81Aj1V6LK0IXd6R[G*%*1FR4`3kMaT'*keMlXU0RXr-&lP-''Zd1N4P5Q5(D
-[lDDJr5"Tc!Q4VR@iKFU6Bm!3h%qC50UZELG2fX(%0YLEc[fmr%F6r@K!i`!RV'#
-+'S-SK`l*4%D+A[48S4k6@,D)LBDp"'RFrQLqKIhm"MT(L+Z,C4im'&Zk4VN#2*P
-U1kM'5qF9R@Xk$&IqQDNMM((&5p5*Zf&eE!hM*h,@2j!!Qa1lL2DC#Qp*N@krY$-
-+&qfV&*LV26!f3Xj4"X4#-b(1BFL$61!mSRdqJ#%bhEbj+L`RmYUqi4PL@9TH+a'
-M!hIm+A6c4jmd@Z"+-0be2Z"YVK9K-L"mq!0#2%i8@Ehi6&@HD9IZDLj*'EN8USj
-3a,pBPP6*cI1Mcpi)b2fJN4jB4!fQ2rFM2KIKJN84X)#EBlAdjP$jp`[Dm[p(ke1
-IK-Va)M+E5j8NK@F[4aQQN`"L(dUQh!0#DDmL+0TQC%lal[54p[)jKeUQ9HHr`c$
-@fcP%QDDS&cZamHhTDT,@T(Xc$6K*"!`F4"2Dq+RpADF15cjb(0BmC``8iTSqFcI
-N'(qm-L$GBLGE+YDbA[EK4U[V*#+(SMaXmC,'&I2PKVrEMrb&@*iK2d,2@9SNADh
-1f2bYbjkXNVZ#CA@ah8e#L&T1IQU0h#ae9bCXr"pj9%qBPFM3fVUrZp!k(iSe'ek
-Uq8$LcY['KRE"CJF+eLRB)`f[9hDAK"Cm1$U#J5Qh3qPS3*JFD9pCVK`&IH&[2#A
-%eFMU40@AM&9H[mNL$#Xj$Jqq`T*Yc1kSFb+VVAjj*'C-G#mYS#i)Ib+Nf#Li*"Y
-E@U,C*`mQS,05kcR20V[Hd'MqhX,j-5jc#(%iKY[TXAb[S$AfH0U,0`U$V@'*X8p
-cRQYT$mUc"lEZ0ddpLp-,TmU3!2aN#LISXU2!&MEaHH!$0eHqNP$2k(JfCVR!9f)
-M5XTLDU%Ym3@-3MNh@i@b(l&Njp,k"'fLplMbc&KUa1d,9UUh`8T`JG,!HAqqc#&
-E'ia@J-!MZ*rZ2fmk59F&`jU2l!EkpX31q1(40!DLcZE9E[S@KYTq*@[2cq&A501
-mXP6P1N%iiFS#*50PI%i%01ZQhKmZSKPV2`XmLT59iYfG56Librm$M*`'El'$dqc
-VDS68!'PVJ&V52Idd+V1a&R690+YYSBUV3I!klJZ5pc'G#M&pV1TH6jS(9KrbQlQ
-JD(VfqC&p*lU4HLX32r5Jrq(+Mf8cad+DS$Y*)D'SABY!Sjad52M5Qc,'i3Fbd#Y
-a31X-GbPdiP)US8m`8p5ilGb9[E9r9YN-hNX+fjRRR*RJQ34KaEK!))aKJiC'"`"
-YBjr"pP,@9cJCM(DM-ZPeA!rReSrjalTQNc+@X@4-5G5LjD@!VNC8'YIGkFrS#VC
-%LMpKUXe4R+4@pabL9V)j`dF1+d93rFCc'!EiR+qCr$*9@-*AB[T*3Xm12S31(IX
-heIFq4D8dUc%UX,[rCMSH9L30,0LC2fNZV$Yq01GL'G8%!!#PN!3"!!!q!"#i)p`
-(Z#2F"`!!!BJ!!"i(!!!",`!1Km`!!2"0!!!263#3"!m!9'YI684&4Ll2J#jiE@`
-!!(2"9%9B9%0A588"!2q3"!#3#S!!N!G#`G6T*BNSlI8[DSa1RMMR#l)FH([BdN#
-briKlm@-Y"[+C#`LF@90GbfA@VaFECBeY#K%'X$!1d3le`b4Z$Qr"QDkbeI8T0CM
-@H+&Ij16B8hX$T(RZPka18bIBiHYa2iTmq9mbYaK#M91Ei#94k[5LUi5%I'5q'#!
-@k@415brdY(L9fN4`YQXE$)!DB21jk#IKGVeLkL!jelXf!ZDAC!@pqLUbHBhVSK5
-'paDEPa[+QDP@mYjfXqj!c86ql#Eq!1ji)$)EbjVc#Fdp4C'f)aX0F)JKDa6fCr)
--"PUD!92&Y+$ahYSBTPpSMh)GS+2Vj0$[Ba8dH3R8FPKlKD5#aaHKb8+BCRC[H$5
-#CPXKHELB(Lrhc!$c`dFrMCH@Bakf4RC+E!#MK9cDFcS56)&I8XFp`jiJqV)ZjC(
-fR"b&r*e0XHrZdRlG+8JK1'a*l#pY%*QEN!"F),P(`A2CQaHYjG#6AQfL$e55K*r
-S'ShVHcPdMl#I6T!!V,-'ip#h$*QfFNMerC`NdiZ$X,J6%AF'2rLl8G5,*0pqeN"
-8T'a`e6%hQTS&f*UlH"a&Q$J!LXB%!df!6'0VS1al3Xd38U$r*-9cVBBHJcjPek*
-mR@Db&!hIeSLN5-GSNp+5G-ACLp@CdYD*lF6CapV[TcBlVEQkfXKJ`FI6XTD,Zr3
-P2Y)-5J*PJZmkfB-6I%IJeNiR5UDTkcq"Q[De53USpqpjS5VDehV82Q34r[crB`e
-j-i1-XPHN2#%%ljre6"['-h@4(56YcqMZRMNc8@MpFRS&"2Zq$ZA0%1!I3Uep4#P
--2FD"5G3[A!dB2X9KLk98DF$2M!jUGRD0qbkUFT!!%VV-ASjVZ*S*NqI,'LM8ZiU
-2NcSh#$EjfYMX8M@(cX!AC'cY#3ZUZ(Q&KNbS,*'LD9`b6N@MH)fJ$PEY+eH&VcP
-EXd!%f4,A1ZJ)0L3)Al+*bIA963GcR8RMhI6)+Dp1a%Z(Q-fjbNPqRYfmFYi4DeE
-VF!FZhS3EQ@2ql'hT04$dPj*k'@QaDji85L(N&0@J2Fb-SFVCieV12UL5FYPeIKQ
-KK(LML$(Yd#H(4*Ub&*ZA522%0T@SS4[e8XIfZD[Pd8"dZ"94CTCGKS,0*6LidrY
-XbmQT&AD,b@3%SDf"36$SiC!!LiH$q$AdaHd#,,CB2j8S+a3daLX*&c,$9-kPDHK
-Qmhkcfk6e*dG1BSS'pB'L*Sbd)"J'DP9NB2eRqr$*,aV&G9L[48!Hm6$Kbk+"M'J
-&H'eRFKe0Zc+kDi`*54q-9NJJ0X"G1e0pi`+0ar+Lfc-Idp,d(`(TTL9ih@H-9&F
-h"$rY)HG5dKGHFB8hT6qa$fM+08r@X)TDSZNVVDcT%RkKjMX&@ldqYP'hE*Y%Cj!
-!&Y'ZP+%Pc2(UlP1AC+H14,K6kS+)G",bmmkQ4!&`J2S+iAUe(*JKRq3Vk*8!h$#
-a"ATKKCi(2C+TXH`4DjbAJ-%%CPBp9(5J4J''ihKbC+emrG&JA42E(%Kqb,jk`Fd
-QBPJ[0&5AGM"UP(c5SeP[(mK486IHTDV%@0'MNfY5D0'&!'PbJJIq6KQNNjd5-T[
-K64$VX%+*@Zb#@FR*GjfSY312a2N%`U2JD+%l(Z*EjHH1SbJ6UdTd"CT2l'q'qIG
-FYPf4R2KD58DX#V0jc)KhbX,E9"r)JKDq8B@ZE4!B$Z"IYMrQ6lj"2UI6p+D3!&q
-Z1iL#"lCpjqim@)UeR4dkX`YNJ"l6iVY9NkHX(Bd4`CQ6&R35TJcL*G9TDhAGUTN
-aZp"QDN!RQ!5#bH&H@0j-3!A,$CV&qAK0kG-65b$hDdmV46kHkq$2F8[1'al"L52
-U-HIBk0P[2R,h,@)NYJdSDm"3"LN6mm"cidkqf[(6+f9UVHqS[eVKpm"TL#((EH6
-BU2+kP9L3!2[ZX#d06([X)HU(qHJZ"KCB,PZ,pe5SMRE0hX$6qZ@eliriaD39I#N
-)L*LCI9mJl8%'3q$'Lq6GqE`hRp@2*J-GTC3$P,&Ba55B0K8TfBbmDN*SQZJrcjb
-9q+H1X'EaQ[T3PG+2%U*,3)HZmf*jQce+MYa'rB9FU-YVdL+k)59XJ+NV'K"["Pk
-J`f3!)0U"UL`Sqlf2d001NhfJDacJ``$1D'`X#(kc0TebHrBcAASH#cD`PfRXRrb
-PY[92RI9$8DF*Qa&FBLL$rVB#%*jRa(J2jcUpc3pXPkiq@Jje-6UBEQ4)`5342Jk
-##8%dT6,LDlRY-Je-mA$&H3m3blk`"CVYK'+%rDrLljm*K1)B@j!!V5NR-$$ZTa#
-3!)dE%1jjc1I"EG,[(`@Fm%NiPQ40M$SDPbHTiI$9L0Sl113hVH05GQf8$8SH+ed
-4&1*reI[$Vcil&ACGa"`4b0j-5X5#,C8-*ih+eKK'HcABf0q--hNJF"KH2P)bX$c
-Z5mSTCVE,['Dh)&#*PdafP)rNAY30)2CJacc3,i`@-V)@812PUYV`%U)hS$3Q'D&
-rBKDb)!*mDi8adecKQm#'[12l*l*dqI0Ea6+8K3ZKMhA'AG5aiMi88h$AZZP#X+H
-%)#kaG[f,,(Kp!`R8#ca(DFMrCQPLc,&Z63lD'j1S81"!aXq4M'5J,$[mm`kT"!j
-amMS4PeN%bAAP5jm))&mF)-k`cY[dHcTTZPFYEQ#2!UrDElCVIdfji0GNd2&BK-8
-XM[d`!*&ApfF"P'3iD62ZQlMX6r2kZSa8VGDGr8ecL$a1!CaESqPhr-0K8q('X"Y
-$[)q+8h0-ih*R!Z-pPmIY2)3,Q,cB0b5*Q&'ZZ+8DS8f@%Hf2q2)JmEZF"`*YMF3
-)%'LqX8ZT@0@0`-`d0B4DPlH0TPHUZ)bU45p#2&1"qYZqT&%I6R'3!-HHaXEacji
-p[PEpb"F@[hB&fERE'LAd(%1URq-@kBrp'dbLjXFb"Z1!INcljEG1"%[RAqD&V+[
-3'LBeA$bISB0[EB1mA-6[X2bjScddEHR5F"k-G#BTD4fYmNL3!2`Zf#m*K,dPBLJ
-22-51(5lrL8qiUijfCQZF8RqpPAUhrVX*rKPD6FY5Y5YeV-dR`c$qiP$"ebS*l[b
-[`Dq`YF4kfN1f@fC"UG#ka&*6AmVjGcqPLGJ29Y-12rTfl%(Hqd(SpZ+mrcR5'38
-A01LM"$fKr)m%D2c@-i`mJ(bf8%IhJA)k-C-h*j'HH$6RNbV%U8AlKm6L[fe@AM1
-PjIK0'm5-@(U3!#N[lI$PDF@Peq+LM@,NSmX#6``Q6cX)m5lF2"hcHT-ihN-KU5Q
-i62C#*$fmphfL12fma9[!'(*9E-'pdZAmPG!EE1K6S9k3!*YRFG*KN!"AES##&50
-`lSRq9[-5b+iZXjG&f$G"3N-E`h8fp6Gr-XH"l!ZK9fL22(6R5Da,`0ap'rS1V0[
-(@G-9+Tm`E,5$fF'V552E2"&NL`'T%V,D)523[M5'LL8kSR`"lC)jf*45rA0C@`&
-E0V!9M&-3Eq'&hNEHS,r#b32EDIQ5&dT!kTiFArY"CL*`qhA)pD)m+!UI**-2-J6
-8(b!eCJ%0f'J["U&&CpGYh0Di!X8k+PS'lSECAaXL+&!*r[rH8kA&Rrkr,'I@FH5
-TIL"6Vf!bDTCHjf@NAV9-kAUiRZBm9'cFfVB2388[l+e8Elc"qHf&#h+4cSd1YBi
-M$+B#L6T"pccf,)d5,AFHN!"ammYdGGC#'C!!Ib1[@YTk,ejj#EbUj&q-T[i4UYm
-@PdE42fGA,C!!6F"cj4)UEr-'[J(4J,pQCJ0("iFeNq3j[S!B(&SrLciDr%2$jXQ
-UDMjTIjT(qT4IS(V#A@SdHb9C5"lbXQGh[e,RkTeXEZ`aRXCh*!Cc!jXTI6,a5D&
-(RjG(@aVj4pbkR(c)1P"U&I,IC5G6hZYDcHUK99P&FE`!G2BrXD"Sj1H4Q`S(%!-
-m[Br2L8!,&e(38jppRmDU(f[F4&!rTLehC4RHKXA)5CAHP`Sq2Yb3!!X+c5B)PF,
-l0[!i$B``Q(,+CikL5D#L8C6Nh#B1K+5a#ck%*PrIPj`)lll4-,LpVpdb-LY99)'
-V-6S*,d(e930*#Zj+V(YG'&8)8"!G2LXM[pqIDHYh!%N'a4XlbaX@##1km#!UHiE
-Q#d)+Q#N%Q0Q5NA+`SL5Jb5-)i4T2-U,VVp0V`,He(F[jJP8Z38`DlG-b`IYD%i[
-eV4Y@`QHU[mDJ"5q#pA%2Yq(!,$@T"Zb*Lf5mkePD6T@GqbT$aZXS`fbeLrc",8)
-MBEB#Ydm3YAhDlFAE-NTleD5&G$b#P,5Nd3$-HMl%&G(H3qd%A2T0Q8K*$-G@G#)
-*"mM[dqde!8Rkp2&bZG21KimM06%02&E3qXIjdm$Tf24h+9*c!K93E8X6%b6%A0Y
--Xef[X3%L$pPe&RT*!B(Z3i0I&!eJQ!KJFCC(U2MHH`VcaFdK0D94(fH##FTUBfG
-@ZmH&28L,#DKHe969aSliX#&%l1010+8bSh'R[F4+58LdN5XaePMEiMZN$@9UAB0
-(,8#"1AkY#*`'5Ra0"E33a5SE)*[Bc1`Rkj1Zqm4$j&abq2@`HZ)V6l6lCq(aYbN
-KI5Y9pma%VANU%J(EQMi-T2c+lFHq4dpRHbCG6%@aF$!,ri1DF3Z8TDB#m@JVXLX
-cr',mF4cUM*F@kk[3j,(ikYL06@'Q!XST6q$CKCDY,p%CDfZRih@mZ[`9eiIPSH(
-eSQIKX!-'&"Ice"Ml)rLA2p`e)U+T"+VSZf%%rH,QT2PlIqB8Lc%V+*r*+Ulbe2J
-P(DkKGJpfh,[U2+f@&CLI95'GQNX10!Xr9Ra&9-,8`jSXG`dd0[*k,`i*mFX6@"c
-b9JX0lNkE&K+YFfcB"3-+pCm81QPr"%4#1Pf%fKP**h`i@fVKD(1%'P%iPp)[p`+
-AMr(b@0d)cK$%*M3d,l,Mm2m!BYN8UcJPN@Q-ZRIiYFXfEk#RKf2fqJh)2lPmSe,
-IdXe*X`[1GCSdQ$'2`"$CT8qQdXbBfeTJAT!!ie`mCSZYNaPVH41SX#+mZ#d`N!"
-eFelhdYX0UPk!0Aa1Vbb&5TK1REK$Y3K(B!jZHY#$rmV%41qqPpPYB0bLmeZdQ@!
-p+[@deR&j8cNFL&5$9(6AXQE-N!#h[k5a(!$T%Y1QrPZ#-L#2*"XTi0%BDV,I`Xj
-+X"6!'F`E+LYp9TCd[mTS5eGriQRP2f%,,IE5'1r!RbBJ"4KUfRGN`)i$iqlfm`4
-plE0e,ES%2mGBc*CM&DU0Y116qhd+EN$4T@a"N!!NMPHCXX3+*&P`$S3CB-pq%J8
-a0f'Lk@*8$qj@1[a)KHTES1XAjqPlSf'2i`#PN!3"!!!q!)#dSHR'ZFE#'!!!$PJ
-!!(CB!!!",`!1)I`!"kpM!!"Al`#3"!m!9'Y-D@*bBA*TCA-Zci!!!%#b68e3FN0
-A588"!2q3"!#3#S"`!*!'3X(9%)Lf[k"9Nii4G-`J5jTGUp)0N!"U+fi$e2kMVXU
-#k-'XAS')A18f2@"E%B&4BfPe!3Z3!%-Lp(jR3+[C9$dhlk[qd$HL3fQX)k*,&lQ
-jA&MDFVLQ"kpS&BraKa8e$eZI95j8!8P58)J09EQF+)48"-DbCHR#Adie[!q21S5
-&TPckKX($#$86i2N"q6F9rE!BS6DU861NKbLqdR,b61J,R0Q+6*I""hi'C5r!lS+
-YNrYQqP[TcTi-CHKY@8)r,U,"V*&$X2&iZ)"eE%$S#2HPBDS*)'a3`*!!##KG-XY
-HX[+DaYNXBmJeS``Rai25"CGY8"h(XmV&IXHTq4q&@3,S'-38#Bc(R,l@bfG[(RF
-M)NEaJZ$ie5b'3dK8&dUiSHF9d0ImqHI3"UL(&QAfLP"#S8,BaXZc-IhKBEp0eP&
-3SC4BBbp3(9`dkqBHpF90b"GIeTN9*ZF*0A+(r[9"20ErA9p5`*PC[9D$Af0"Ce5
-@a[mhp)R-@fdqiRQH)(CVrAe0l(3IT4JidPDFk'r-''d9-eG,l3iD2(R@-@[84!E
-mbCaDMYq2c-l5)VT9J*J&Uj'qCPjP3lV583dd0QlLDL`qr16IRC!!4[KJr#h51#A
-NbNljNU2a2RX3GYK0rDdbClhVQk)$U!NHS"5kDilp'+5!#bKQ(3A$T'$e-)Qh5LX
-KaP)M&R3'fN"@J5h8C+'*iE(0-Bd'@-PlAV[I92A$Eb3CTD2jXe*d&$+LeEGmA3l
-LFD)8+-VHa@'T3)`*I#E-AqS&k[A4FF@`pCH'@kDTM8@(8`5r$Tf0`"SN&0%"r8q
-a-IVrLkA*@rH'*$#klCr(-K8Lppl'[cRB',3,GUq8Hk&@raI3cGd2c@ZaHXG#LRE
-PCL+A4UiLGAUF3-LVdKNRT$1B335dKM@hU5@j,cL)[f'KUKblK+9(MXqe!!Ccp"(
-'*jX$HK-FXS0CU`Jq`'&a'MiZdhjmc"c"aQlUh%UcT-$'#I2DiL*Ec@l8jYY0*qV
-PYGb"YHqhf48Kr'QSb"*c1NbhGTCT%NeM8iLZE[CJF80J946aiXBUj+SU'UU"("8
-p%e1ZBi$3NEZh)IYM0&++9B,jaq3(Jr3(RF'TSmX46*(-)0rrlb0'RYdca%Z"!YL
-akhcVhel*SQ&2hG61i)e1#4MACb(UC,SApf*D#QdYekC,MPICAJjM2!lKG185+DM
-M2YSS+G$&iXqS`KV[3B+bpq-Fb[Qi-BQ5NeH8Bd#)mLk-hiF5h8G8AR`PA0[6Tem
-9%C@T8%aSpBFF'q(k3X+(Pc!4ETKf!lLS4$`6FY5'!9bllJ9`m8VPS+rS4pakr(F
-pT&6bCHN9585'+bjQ99![F$Q+CfjVi@AHV-JY&m-9jqY[e2+YdZh,l*!!)Ai`6mF
-eQaa#+*-C8"'0Y#bGbV$9Rb6D$d)BT,[$hq@pibQJc9R'f3cS$Mbh#!5Uclm-I()
-qEE9Z,r"Y`Xr`i4Cq0L"5b*2i[VEAT1(!h[Vhefk4Jb[@4'm0cplGcGKM-el8Sp@
-XdY[cD0aIf5TjBVbP$G!QJ*!!pke$,JI(Pp*0!D(54JVhhdFmC'8B"SGHK'@fZAi
-59Md,-hjSDVQp6P6*eQSqAcY6G(2I4r!lB3EY0clY-h[TILA![%3`hXN(5Cj+D2T
-K"l&08maXri5&qKXN6K0U6PF*I!j5PYah9&j#2M5l8JMT0"D"1XlVddGh5p),%bU
-ISMAjmDj@ChUh$YRA1QpFckp9k9-YmC3lc6'qCKkhd,S!p`0-D8%US"#1DNi3YiA
-)iXpb'"5S-lZV'TlX((HF43Z##UNb,lHIbYD6VKpUa'Yf@mB'k6kI#%2YDfmLf0m
-TdERP*GUN(R!eQJS"9RIY1A#+VR'Mh-VVZN$+IV,UH,h#+%P-SpAd6S5"qjGV,aC
-UeXqa*QM#ShN3h&9SMCC,ie"T)(iU6i'23Mlqe0E+BU,l+Zrb+)F5'R'Y-1FZmY'
-Aa0leS'Tej8!Vi[iZ1UHhh`FSBH["@,SB2jLE@)`338XlN@C2UPjDVSB5Cj!$@df
-((J8fa0biP4dc$KEkJ412mTk&q9691EI$jck(&a,SHjBbN!#MbI"$qjK1*'&G3&i
-N2Gdm*TGQ34P0PVMp5#PT`PjefpLqj1BK+2iX9lCc,NpSSYaim-DNbC8!i@A3l[a
-6[*l3hdFEa3)-R$!QN4@`pC%#Ua'!M0Md!8Ta'T)kQ@DH$%f11-DX8#Ai5m--6ZC
-*e2ImZ60'NiBp8'PNZM!SSjqZfS&)3#8-X,T)[MQVGdV!2G6Y8)mS%"rX*[&Jd8H
-3!#m)(h2A`QX,E3LSMB,@fJ0JSKh%64[iIaqf)5GG"5LRRXG8(3Vi!-'fXDEi)P9
-Nm5h89b8'@*@U6!9cCCX$r1dSGJ66pA'MG0$8lK8jNehmR[5eRBMI8eJ2fb24MmB
-chB&qP+bS[#l)-H"5jaH2(Gmd'qV0#Kf!X6Q@i'Nm*S(UXX8'*$5fHlB#dk@02-G
-jVmEZU2hmqj8)VK8rUME48EH!NFV0IGrErB#VZ&@N"jeY[,XZD@[(JVqTI0Xq[[I
-@P@4dC"9`+3H(hX93aj`3@hI2(ABjK3"crecjBQY`K)3K1)T!1"TQ1l%eX$q3!'E
-`TqR@TDfYkS"&EQIAiG4Q(!K@S,I(TD8mAMXE&)jLk%3Z4MZkk%KkI+YD*0rERU$
-0Ki`q"[8"XjDiF3*H&N4fGiSGGli1BFFp[A2NBFAeS-9Bhb)@A69R#kU[l4XfFTE
-Q"ZV(8Hm'd41HLPf*MQ4GFY8jZR`)P$(#b&NV0JRZMbL%PMlj+mQIZ-j(YPQK!I#
-TTH'jN!$MC1mKDNVN&D--fMb8Ill1AYj2cV[)(U2%!mBjfq9'QX0eah-kl!aVMlA
-NLXc'RCZDmFqj'Hj92DXK"JqjeZQJ-HJ4mYYPqFr55Y%Ib-k%RljLN!!AJcPIMLL
-))aq6YC'd1SMdiEGTCaQb&4jGF!qUVSadZKdYmT,be$T3#'8jpHRa9Dm4#2Zd(QA
-6#*3mmK,P@N)9AKRbN!$T4HBdI)qL0&ei8PIUa!h0HKL3!%qK!Lad'pAkaQ#(AYj
-V&(rVHJ&@389hIl5(G$pB1*(!,!@eml-NDd3Y3@NCB,Rm@*M6S###[J'IXh1qUNC
-p(`HXpQ(")TK#4$%8DAG40!q&2JUe+)ar*iXNTPJVj-JUe[-$!F1R!e$BCGKjKV3
-!(Pdb"p!1jdF6iY#eD),#%!0$EJa@hfXqP!+-ZRIhGV#XiZ@NAk62k`j0C'$%Fm+
-2jYG$Cp0$a5PQ9C6-`l,eM#ImA"dl"9&G5D)Z044NN!$Sc+cLBAE-@bUmUj+1Jj(
-*P(Q0mR#VDQQkc#,61q&)eRV)3ElqE@GEI8Ql*`"$G`96CrIY1Cd4r-Q'$X4,1e$
-hr3ZACN#2"0flm0"kk`l,E-'Vhf#JB!h5'bFjT`VIEqHS+FATeD#&DrjUB2'9$$P
-)XJG2SiJIPNae9m!,k3lk8(qJ1Ka0851PTd@JXZ$4j!9kG*PS,lN&82F[XHJRlK)
-b"T2diM@P8PMiKRXkI)bNNR56AcTPAMV$EdT2D,H4EL-FV#EEk)Kip)c19B("Af`
-lFMpSbilIpE2rj`c,16jQIJ(Jk3L0B3BA-5((0E+VG6L&TSj)63c66D*bVG%*XTF
-DRS1[ZPX%@LM)8A!A'DbfHkhLlHYFj6"2f2ph"X(5,C9ke*P0"DZC@C3j)N$M&I0
-cC2d"k"#h54KRQZ$X[J!6DFLLalIh&"D0U-l4cR2[,B1X9@[Hbi8AhekLC,&CPfm
-eLFU%qi0'Pd#ph%NV-6fSZ2*Ch1FP"HM%P`qK+aXRLj1qpE5mVQLI0,[R(mimN!"
-aFRf5lUNSSk-p!4*E5Y[@r1P*dF)Tc9Br3mQp*&e$#l(hL*()"@qd'KLTeR@BHl%
-@6VHUT51A0MK*q4SfB!)(qU#58[-3H(eKLPI[rU$F08A"a@i""P4bbJTa4Daj1qI
-lMlP%@TF,8IY261CY055p1V&HQ&8FGXXdk8@Q!"+G!$lQ-a*ImX9(@-T4'pGkpd&
-fKp@,j&'p31S(`ZUCePY2+BIm#CGGJ`V9NdR(NEr@YQ#SqSEha-+*MQr3BmDlESX
-*JfCdT1edM4*+P#1b"(("0IH#a90rK`QAaB%UcNp-&d,m&B1%6"BFjj)a(XVMqi6
-R'4IS5aX&%H982PPZfpb#5`6K0(p!EN8IbBiFmm+-2F%4S5DqrQVmNT3AMVaRiRk
-q3i+Z'Rb*i5(p-JjA%4rNb(cE!+SCZN'5AD,6+M0lK''AMh90-kHjbX(RB"GllIC
-LiXRL$"j$A+[ebA%R!LcMci-kc+E!1Ef8mNieId%2[r`9LdHZLaia-'SaGI-)2Er
-`[Q5UGXl[%rXh&9ibQ$ER0KpB*`6J)6PRC)[(MHjAS'e)JNS!lVYiq5b2T)([AE9
--hUf,VE`e!kC+mL'J,m-qUqTBhd+V$HCh@Ye-E*2Pp%Z#2rQI3h05i6"aLa30QYE
-&hMD1@&1U9X4rSbR,df,i4UB)ZdR-U2YU03X8[)YjedTB`Kf8%4eq)Y24a9qP(&B
-l'TH$2)aYBl)l2k(STDCUCADlYbP[2[am2`KiHZe6)[kZHYdMe9YUkf4EPICG@9a
-hm*mdpd(!S8dc!h@,##4$fl$8"P$XRpqm'ArBQ6cdC&Ab8N,V'19"TL9DL&YqVP)
-`jjp8##*Ua%1jcL"iF(MG&$@%fK'Pc6K3fpjr`i92Kh-qHcP92)`AC0[Z-f(%ab!
-c4AB4)m6+d)SAJ*!!`#JQ'lXK,UpRRT,!j`cm$(&Urka@$1'B32ljDq41p*bVYXT
-jqf@GYj+*@1XJ'bhL`Za4ASUJ1T-K`&KqpI2NaN%k#E5i1lAh"$ZYU)PIR&q(#lc
-3TmP39lN!'2Z2rCR'TS1+R0+flR#Z4FU0X6Qm11emrTAd5dRqLclqaU0X!a,$p"f
-)`3(JeV2HGCNZ+(,YkIf@IbmCFFfh#c6LDN&edRB[a"QSB&*6iIe#FckpTkkQi[[
-*E%miZI0`AiT"RP,NQ6al@adi#l&A)bmD4Za6XIE1BcJ3&"I6%VP0`Ha2B2CrH,,
-m(N9JNJh@bk(pq!1,N!"`MJElqCKR-GDdTCTGI159D(,J2480A42J@U`(qfcJ5p$
-ZMDUK09EM6!X!`Y*I!#F+$(Zb+Y1-Fj@EY1&X-59MF,c2lN''Y2'pi+Ap*aVX&hT
-Cc"9NlqG%m)BCl#DB,3X,PXA-!m'VI4m#ip3JL&+MCE(HX!F0f+KAkHlIR3AabC8
-+CGHS*CETFGH`GSkVF+GSNlN(mMG13I3afN$Hr"qKTHNcJA(eXHrZ5(2(!U-j-Tp
-AkE1D&R5f)eNe1!4K)-`,fMfEpcV&BNb50M2TqdQN[GA@T3Ch+rZLS"a$qZ$0G*U
-KeR&F+T+BEJCLaIeRpY+9f&c*ikZq$dXP*HYPk*-)21Z([i'pc+lFD(5Sa1mdKib
-BT221DU*JYjB!KP$9$m90QR!NZL#X[Ir,jC!!YfmUUJZ!XmG0ULRk[4#hYkfBc$L
-9+m2&J5CaAhL5(ifL&8-9Ed6[6","al'XM`05rF`hLCiKM2fbZhXFZ'UpN8RX&*L
-Z2jZh9X%p#S0"H&F8ZVB-QJH'Bd,9BAC9+bXKVX9+idZHB%dpkeCF8Y-+&i#F4&`
-@#Ui+[%RP"NANpjA)e8B3cr'm)8LcKTR(#m1+a!QQR(I2a6Dm1Xlmj`i&pIQ,Mf@
-"@4#0G#`)GH2Bb-q@"IH3!+"d16'Sm'$GU$61S'3DGE+DkjF3@eY`I0a1#-5*,ec
-I@3K9S[#$cpPA2MSYE[!(86GkG[G@LZ#9@`r`(84$9mfCMKQ+iNe[pFrN,irP+mN
-[00U#cVlb%"MQQ0%"cEl-RSfhj18*8PaJ-CIBV6bja`',!3RLXA36FiQeU[6`GSV
-TH23!G5Ipd#'SbUPS@9d@jR#I8YGf'TJE,'HNIVTj[$F5U9b@Kq'`PT41SVBH*Xf
-e8FEedR-0Qj0SaV@XN!!V-'f,Qkair#+)m2p@DCFj$YGVe*4Im4+%h3RCMQA4IS$
-Scd9q@"j$&SK4l@`XEqXF&mZT$D3r[0Qjh2d42bPlDb3kRX9+3Qb9(mbZPb8G[Rd
-h#UBB+6ZN@$Y*#Z%LHm6'4($l1I$GfLiqA8""rdbTF(fTie9,F&qNJ*m8hp$(CLR
-Pld`AkE[TeR%%3S0rYc&&X`VCX2lh0KekQ!K434ZqSKKI"#X1fm6ADqZVM[TfK`l
-Q1be,Jrdjmk15%AJNCP18!"QA"pQU,fc@j!cjUJ&F"qJpr#m9L%mirh$U--c65Kp
-MRjh!@bf3!$Q(Db-LCT[[EG6iBjI#aLM%0+RB`25%GY20N@q*-Nck9IDM9#2e`lH
-%`[l@YQ2Y+T%fhJRfT&9["'a"ZAcIDNE*@c`TeV8&dk9B21Hd%Jr8K!,%'V+`XK'
-M@pXadlPDG@XmGDBbf2ZH!TR(f4f'-L,Spc8UCeC[IH,G)@r3R@8hR[$)(LiL"Te
-[l6&#206$!rfflUKcML%)3H"ZNb0j4"A49VhrSLh86rEXp*6AGSl&,mcrUp@pF(U
-dh[YKJ-1+4AXXP`0MU)*U4c#48Ue$RHf&!VQF1RDcKHK%"GCB'HkPAMjJJri9,Y+
-N$r9"+IJ,X0r2,A'm,02fTkU$56L)T4!12Y(,68)Km@8"PKh%%qAaHd@QZAUL[S$
-!*B#$!le*D2bXL*ej"M0rH1R@'h-KbP'Xa!&EX+ZDS0+q,$,)a,bfkVD8'-1ZQ*6
-VfmZK!E`lM0c49l0Zj8X3C[Q%[%[J,YaZa'S(d)928*PbYQJ1GhrN-2RG2D!,mV(
-1IPRTlf9#q,Q8%("qHNM#dI8BiYAfU2"jL3-S808jhJaAN`%k%Ki*li!P%"&-Uqj
-NTQU&ZR@pkiUFjP+jYF)9'06$a`F6ilC$NBa9ZrIXAXdLF+rH@fJN(q-@(!fhf6e
-*pb&mRZMDM&4jUbNVJXphSl9IMFTq2S6chqdllR"Q`,G-dV1$4Qa$0plmD(GhpRF
-DL8[5Z[4Ei+XLm62Z-KIPGFCKZSal+,"%NA6qG86,H1@"$"-8Y)KM*bVq559-bip
-'%$UjV!d8$J`-Sj'R*-bJC0iCKVMX[-f)Sq[$4r)jhk*M+cdR4+$cd%Z#9$4C#ke
-2TUkQLh%ckfFim**bF@mXVp4FYMh@QhHYV&0!%"U)IMj`9@De0b'1P929ZdXRmj[
-6@44eEpH"bf1jYZ,V4V-3cbYLEU[Ikj*LI2Km@$i1B`,(-X-d0eD9DDCa1hS5am"
-$Ih8"VA4Sj(aE[&mP(E2S"E,)2ee-)p%9-`J&Krj!md,jG5dZ'HVHaqS)0Cq+kDC
-K+*jpUGNK2@i0P`d8)4CIZ''bD[Y@ULbMf8MHH13RpRGD%bN-j%*ZCYr4`b+B6dE
-d[*3dD&"Tri48N`jk`+hmF`ZX#H$m`jaP43RZXPfa$XN8dfV+A8l)R39cjB4G`5i
-(b8YBU9[f4!8`Z$4fJjj'LK(-a(LX'2TF$Ami&DcdQdFKUaBDf+j1BQ&(BV1X`rL
-p6DP$AG2K$%#D"F3F48rl!6r8Uj()3Gje`'2)lJIZBHU&YqecB(PhP!8AVSRc)d+
-&GH)#)@Y9+VLd66'##L3XN!$UJF40!!CB@9XcQ1VHAEm`Q+FV3Ek*[8XmbTl8()e
-@Y*4K)8Ka"V,FC,V-E2"FUr[RGSqb20"Dr(aM+d,V5ShPZA!)D$Y@f`flS%HqK4K
-cqrRNhJefYLh-UfM9@!KrT&pf#YUD*!deJAEmPCkDR%$HG@P)ED"VF6-jde)-VL$
-mCI43Bb'6i6FEZk&Pb)Jhh+XpAD-qMM`F"&EH+-2BL@r84'HREa+i3Eb#2!(N#L,
-1cYdmZ'SH!Dh!Kik4*f'5QlZMC@Ie-Ua[N!!me'qLa1VC#%iCSA,*a-b0h`S*BZ!
-hD3%,Zm"V!-1XLUm054dc&"mpTLNXj'K8EGULY4L1JV6N&TLR4F,d4c""R@25iP4
-1&-$1fVQE*23`(1PRfl*Qr[#Iq$L$$i[TMp$R'4ZGB5eP48"3pNb!,B!p))b2ZeX
-X@4%JVU5Z,UhL&k'd,-$'4#$1QC4R"He4E$TiH(1IGf$M1*Z!DRD@*5PGc5+V*2'
-6p648Q1#[m5)31)l&6hfr@5kb)6b&Lhki14&B,Q&Ie90bq0`JiYQrj3JUFQ"&iaa
-a@1U(l1*ar@XZ6,FGIZkX#Z*`jYk`XF+2Gam$'E%U3#0f1bc5%#TDMf%cAckjGe*
-H,[L4qC4lHm$6mM-Q2PXYf33r`VlEjlIhc`,1GQ(l#fUiA9!TGGalmi1X2E(ED1R
-"HHr"6VaT%rL"#)#'6`0b5Xal@Ta[4#,42ab14qiIZLT4eDa1+4PVFQI,,UN"0+V
-a(fHl$,**k'#e($Eli)lE,B"`%XN9lL[*CMk69K&cR5@ajFp#i(h1+0(jTT2&-kG
-UCh3hjbC9(BkDL@9H1*Zj3rFT1X*K*2qbP02&L4UTAl%5AHaKLl3m(kcK,VTEFY`
-2@0fCIe,B4h5(qZ&DAifrp9VlKA(Nh$H&3qp+pY4DU,rGU8TRcLA[`q-$)p!($6e
-Q6GMChmkY5jkf-ZLCU-GSc2hUrQ`SLhG%U$c$LZULFZRl85XR9*!!09[f$TDEZM!
-2+%ZL2RMpc#KIqX#qNTNQk'mEBFJ!!fkK4-TU4[rS(VcXN4,U2'F1kk1,BJek&K*
-3AIbj,Pl$P9'iK#8T'IHI3GJ+J"(!94IAq!r,2p9`Q92EXM[,TRfGXMiT%irUMLe
-6SVR2#fm234NQ'Z3@@DLE9(p%2+Cd'`fj8*RY,ckblhP),kiRe402p@YRF5'QP,F
-,T!0Scr995pC[#j!!+0[N9Ii10PJ@KAjhReepKLVDc4*$'("mrpZMb9YDNBpC(+S
-2M3IaIY*bA-LY@`e4NV'"BX0!J5FI%8h-1"C2jr34VBkfF`J2NJ1RFT&!MR*XADm
-KUTHTTD8Ck-GQ$3#5"i99V4%`UVf)2G**"3djq&40kmLAMEY044"6%e$9p%`&N4@
-q%XTY(``!*$92&MB,+@H&SR%qBq2r1J-6Jm0h4TV1i(!%T4PbaApDq4aMULNXj+R
-9TB64%FbB-bfZQT105HP6kq-b8D(J`&D@,elr,X[c*HL9+!&1J9V%[60Q%8BEAF6
-0krSN,XrUi(-NDpeL8&SaR6D)ca+jS)PiH1fI$'Ym5S[1QPQ-K9T*c$9KZYbP4F$
-3$+L%![4keaJacP8#PMdfjME&!))qC6IS3)*JUT2P@D*F[a,00KaU5NZbDmUAA%c
-d609+@KH9LSNDpPaCVDb`VaXcmLK)B9N0Erd@Y5M#mI!(p%FK0CM916LImDLL`BG
-3pX3R#*+fiSGrKIa&dK''C$R,['"+T-pidG3&3FH5@4fRTH(r5@kGjV8i(X5AN['
-"99-2$)(YMJbIk8e$Nk#N[Tp'qj!!Qm)+pk(&mkq*2fdK"PDM')Y(rKr!jKRJc'U
-X#rI8UdeI6PrpfTE-GB*khYf2ja-fU!hE&f('Bcpj0+$,8ZBr$HS5TAMf!@$G3qf
-eq6,cMe2&M!LK'ri#3TE3dI4Mlb8J(jX9q5NH'JI#db"fP[hNlZaJ5eY5%lYhD%K
-'dAlICp,I+'@eN8+XF2ZE8G!IZE9lrE`1MF0fQk8q$m@'G"K&CGaK'5,0Z(%Dbl$
-D&5,BRq#,LKRC"0@%!F6YURMeYEmdajq%Gh!2aBSSD91r4[J*Ih8`fX"d4rep!Ra
-I18kr2rDJ1G5DY(YjT0A+#'QCSd"jEr!UH`cQXqMq1rjeEXH15dK`[r1ACjFjIZ0
-YkAdXMS%BHU+@bh8UIrKM9k3c4"BAMa%p#[i)4aDb8dplhSm`E0e`%SLIAUEZr9A
-MT"AJJm"Ncc)Zr39Z39#qShSBr`+bZm'&6E2dS0rbRjR6VPDA[@$6T9aIeiShKq)
-Hc,&qPiVZpCUSqm"D@i%C[@0$fd%lGHRCYCF,T%'22m5Gfq`$*d'*56Fh1H2cNb#
--DMS!e+55`+G[86k[&8%,P)QR`1SZKkfHYa`VcQH*C0Jh%c(KDNQHD0kI-Y*QpU8
-@m$dhh5SM8%1(4jrh`@LlrUdq2$GN4Hj+m9E*N6!IZ,EMIKLrSm-Z2T2Ejk9SY!6
-B)1-eeIF+Nd1YYKT"rB[Jl6H$hYj#Eqf[H6ih4V!e#S#2-6E8HY8-rIa*3+P&pfA
-)KKp+i-He$rdq#KX[HmUAceGD&2'Yh3*BN!"b+eRYa98[j,)KKD1+[DiEjHeJr0a
-GN6ZVS,03(5X#k1fTpBi#a*GA6adS#8f4#!TFR)e"kpdJ9k[e@l)f2d&aplXfbmp
-1SH&3Q"Sc1D1kB4-G"LA6RQ&acUhET%U(la$2c$cQZA4[dfGP`T!!a*-%#E)`hGG
-Y!Y(e%HCXR,-28Mh0G5IpiF(I%VH#BSUTL,XCYH`a9['UCX6kh!j%r@@l26*LVTP
-H0M0BAB+"#MeH$YMRPV!e!LEG6qNXA8IeXG!fGG2H$DdDqe%p6L#ai3a#FbpdUUr
-%9j%%66PYjI6PL&lDH%BkT$&Da,DdqXQe2D5aK0&,!UYrrhC-&C@@RJNG'[HjdVX
-QkI$PZr5[0Q-6eK3SBrqf8DQN-4d!1a2Q0Y2AIi`1EQ[eYLl*@4FkKf95@BDMc(5
--NYD3!%!iMTmm!%a1PF'afP+46V`*1l#bfF"Je'-H&)V$eI2`Ki"N[U6Be#kA[cP
-pT8IJf1r3JK5G,JXA"M2#TVr8pTZ+Y+"dCYQZHXMi#d8q&6$FS&IkNRf84jHJj1K
-h@hVd`fGH-M8D9(3U)ccGk#[XcqX`pp6dp+I3I(`qlSaiVeE%J[HJ)3`(XG,MdKf
-f(%V&Mb`jd!D"UZ[2ek[%YHJPplb)h2'mf#Cclpi-KS6re!mZD1Zk#V6!Dd,$mNh
-Z46M@*Si"JU#e[Y`i'b2*Lq90cPdC*iKhj&F2*%*+cl@kNf*1e3J1VYEFI8"0d0+
-J"q9&,5eibLpJDd`l!(aAZE,MZ)B1pEX94eJJ,R4Qhrp0#XdcpU4&h*A@dT)c1p*
-,VBe1CPNR*EKKT&a5$D`[RVP,c05V`a9(eq[am@ed#,3cb!a,XQ48@`C@%0b2r&`
-2FZf%#Ye`d5,i-feV+DN,Ef6N3!13!(,FL#d[cV-(-*iMLZ!6#F6eAM3(V,T#GfJ
-2A!eC%TH++j6*h0"2"Jk3!-"Xa!4ZjmFdfKc`*0Fc5@V[+%Am#l9rd8N&LUT3C0S
-PYTPQH5F)iP``l'kpQc+pCIde'X4EUIY$l[*,DkhU'BV+6YcP%jZqVd'qfc93VZT
-YQbPZK-UrVXPJ13jh-N9j91!Chj%BhD8i5k%iI,0U335V5D$US(+li6GlTReH&R,
-QC2C+6Lj`JZ0#mAq%a-lNTD,P`X'hiaGJV3U&MhQ6UJlLYX,BDGXlR6pG`)*HfhE
-+A(+94Jq#'dT@A6&qJ*YeE"fUAEXVE%*'1`Sq[Mf()-Bm2%0$[M8I+6j*2K58c#8
-ST)GUHhVlT69D`-BX3Hq'5UJrHc&X1P!-6MrL9c#'#hka$&3CA2`"0C1$Hri&k"(
-Cc(Nh!04i!l@rZreQ$HM$P54bBkDJl*UC'SC[-*SIqah(Th3UG%2rTk'CdNAI1',
-A94+Mb%lRSF,LceflSGHd#r3#b5r&F$RCC4afpVpEmh'U#'X9Kq[Vk)[l#&T,(jG
-%lRC6D9'G9[C*1r[4M"Fj*FG-1NCUMG2PqNTq#Uca*Uj8P,9QFJdINNLcK!6*-CJ
-YfdUDT1ZTGR%DNj1V"2XEi0"LT1b`eLHG0-99rQiJ!lCj`5pL44!&m(6XlJGkD*)
-HKBXMhPY)-h(qLf)$SDdJ#pVqdHK@Qd,p&6,K&jfHS%ea4aJTd!B8AUQQ$Sm'NP-
-9i`*mrZJQD"2mA+k0eBjDEqi&*EcB6FYP52ILfh@`4pcqi[kY#`lP89H6qldIp+4
-#S0r(&8RQmXKk'4RdB4MmSPXbI,aR(fP4ZcJJT8FKeIcYTcZ)35[%e%Tp*[2hBBN
-89h(l0qbdj80Hj8X#@iF6`pH''S%TXaHTS!fU'S0E03*K%9Gl5dGMee26S5f[CU$
-T[f&JJa)AflbZ'2Ch9'E@f'dM9Zl'!#'-'4%)44Pq*B[1)+l)QUC8d*LJ+``GZBV
-"kCLiK6Y9I`F8H5Kh!!B8k'mBMRRCa-)R*!@AC#%B@5FPLjq06[JUclH@GSrN5N`
-Q"JBX*f85kC-20%0C2V@hFHeD@B3ZLG[(NbLl68hU0JLc&U&j6'3$hZbbP[4mbM9
-8TRfZ[Y4r5p1%jU%E8m*9rh+QI9!Kp#FB`qkaCdXHKbe$#e*@BciA+p04H05S2QS
-hiJP&"+##01GqSI9!bmTjPGIr@[0qA+'QNkC!"qVZ'Y%2G9Cpp8i`X'26h(j+!f-
-+PEdlPF(L6T`[i'CkV0[R!F6ca%ADG'L-V!8(2RdY,h%,MY!K!9r3UEa4[ArbkHI
-VUM#DXr0H34p+SLPl-`[$6bGm9`2CE`d8MhLLc2-23mdqmLUA##(rq`Xiej1q$k2
-,9'*Tkj*4UPTee8kf0!-eR8Nf1pPQ2B9!mrP6&4!(%VD*8)PYjAfZ9C)VP#j@-A1
-[,IK9$9!(8BK6kjZK*XRX[1QT5icbd%[[JY#00rI$Gi3Gd6mi@EkSAlQcl+XKGpB
-X)aE5+$jB1RI(JfpEZ`(BVLTlJ6Le+eJrKIq3!2VqI"iLH%rc2Nb#NH"b0L8@-Y%
-KNXG4aBcQ")Xm6Qkb#V+8&`%3Y4rqL)HaQNG-EU29Ul1!KH9E#3+'deM4H&pi*'E
-APcCrm@h13R&K2KhqbJeT5"ed)hNcKbdY!Ere@IAEl@eMpNGkHZ*-T"drS8k!YeD
-0le691$U'EF5Dl1ZSMV%UDeE3RT5G$THIlbbh$RRZ+,miD(kKaQbb`kLlVEENR-8
-b[0H6KeHJ"HSj*A0QkZZ$YY35cKHfQT(%mEPSP-6#P-F`r6Df`1ZKQe$DMSb0Ab9
-&NYp#+Pff1(pqI+VDU#NhaV!M5f2pTcX*VYRDKB@*AC(i0L%+a0j+YqFSAKNH)62
-q*LA*U25jT5D&qr$$hE1GBqTC9r9I@SL'-f@k"SIS&rc!aP)qZDC#%'ACr259d"0
-DR[Jr+ZiC`4EdaNCGLY'+'UT%fJ)cd*P5jfbPKMU*Y&*6U@(DbN[TcT!!kR53!0#
-ZmP)pD84EN8"f)0hR,ZS1kZS85LHd!!5ji$rEfM&%fNV#HDQRl(f@l%c"L"qQ'`G
-#QKpX*B%9,`NqA-XRBXNdQDe@DqN#!aNIF+1lKTb-Qa32Q+p)A#*p`(K9Tc,DZq0
-09@4((5k6GKT[Ta81(fkdBB'a-e(CPI&T`[a@l!LT&cjEdpZj#Hi`kAGh#&1@V#c
-J2"FIF`)4lR9Ej#'e-Q+VREG!"d@kaRbB5X"(ZmQmj!cmEaf!re0@B%S&ZJbC+"Q
-#NL!MPIM,ZX([jQ3SH$Q)3(rPF0EAA&1jqU!&!h&fr@TNMCNCMIbUjHK,$&0m*6-
-hr#A#E%)$&HCHbVYJ0%FN@0I'ZTA-8GF"aL#CXLV'mm0aUiNA`EE6ZU4CFc+)++h
-+T3pd+Za)QkAqd`0VGY%rjHa#i3(YAPl)hQA'DC@Y1cdZ2F*!,bpcl&2Y4C9JqpL
-h1EqAXehc9HI6rSp@+%HQ-T-"Ue!N!P86D1%cj6XVl5mpmDkS-C2P")2*`@eqJfP
-XlI5p25rZE*YIGH9+bVRrPEc%2Xb3!+cl-%*0`h,hYfG(mV$,-H56N!!FG3B`hU`
-QL#2MPEd9GbNkLHV6IcHR)88X)!86%r+!8r4hr[b(8e`c1%*#%e9R0EI)KfNeCH*
-RPEV!r+B(#JMjmJMjX9H,V*J)dV'r`Xl3Xe6)"3d2KM1a5H!Z5QYEN!$#l%@aIP*
-K-'TCGFMlNk"1rSmh@8#122k+`a-Le8RlKS9Maa!ch[hHI606Zp1N0)Y%V3+ifqL
-bUirpJ8eq-GS8+#I&aS%2mIFZP'20kNeVZTeKC'Cr&0EhRXCB,YfefRPZB#2Raa"
-86TYFV9"4ma[@[1H(Q)XY[#PAcXRPpG-RN6a5HcjZ@(@E$@bDL5(b(-U8TQDRK1%
-Pfe2L9Z@,fcY(0E'pkc%J'er"q!d1$Pf*f#'$&mJbGR,Z'DAfaZi,VU)QZl2h+8i
-V*rZLHKe#6"1LZ2cIjIe2P%kiqdFHp-J`30VpJ,0h1IH,j&YSE)Uf,M&F0j2&,Kk
-hV'T&Z[0!fU#,,1dl*1"&55',M[-6!hl,kUJm+Qq)9jY[Rk55A[pZ50pLeHa[`fK
-&jUJFEfAA#1F$*0YY588##LlM0&FGLjCp%Hd3YGSMNMkX5#m6%*iH8k(`Y3*RTTl
-*8XREN!",pCF(qPq(qGU9fZb@-%bT0SN@k)0JqUFl%AfM"*C3)P#!TfDIZI++[5c
-F02ecTmq(Q2HT2@p#VN-B)hL*9j2Gr9I4RmT5TcN-T,h1Tar3aA"T!faUDHVG9p-
-$3Ir#Y4eUpAdK@+B"&$Vh4K4bjkVqpM8lHKGGKHQ0T[8E)6cNAaY&$(DqLA',9fN
-M+,aP#X0a@V0,m&q0CU956KZp"qQ2+eDD3@HEJ)jEFbr6S$pYHHAI+8S0)HAD)AH
-AGQX*pSh'k'SdTi!b''TA2BIcHE#pXMN[r$Pbipd4*!jBm@56'mP2$-Bl[`E#*B%
-l)Jq'pNTEmFG`D8DaU3NZ@Ni9kT`+@r@JJNS4CfKDdp$)3SVSYb$&'&*YU#1kZ([
-j%PFBCF!k'"4KDSr*P$1i@E!hN!#+cBjHVdQkB#iP'iqXi[l9$`)4Za0CNHaf@Ja
-8l!TFmT9l+fAGVlqlcD922q-6D#9U5'Aem6U@b'Qp$p$,M[mJpG"!mR&aXHT+b9q
-a"%ch3"bT'DB6,b0L%b4"f5`HKID2AbL$"V!r'hALhLN05VVc0413!(#fT%d63,A
-GXDQNEqjQrLPDfeST%)-DR,ql&&1Z#9Ap'ldJR1Z[p"Ni5D1"0a[&a!T-N!"%TpU
-R)r5Gm2L@F6E!&mpb'!qj11QNNrXCe-GmH$eVR[Aj"(8GiQkAHmd13YmC*#a!EG1
-TQ)1RjlK(YY8I,I")$mNHT[rKLMA"6UVCEXQqB`Y0-[hCl!+8(QFF3--S+-SU8#H
-F)S%m*2)T'3jp[HYCA5h`,VMa@+f0KfhQhK'8Z4TldrIZQKN"PRCV*&a$E%'AUhR
-rP!GVGI*e!1V6leb&%SQQ@p#SJJ*hmk3V*cIZjj'YdhI@jAT[6P8S#4&*[@E*I--
-L1HPilZZ)LN-R&ZKa%!SJ35$46N*M5%M-#$VeUF4%D!mV2Ice+cI-45c0T&#fQI!
-q$Er%GTUX1A1Z"RNK5FhN%LdU"2p5'LN4hVb(3IUD5U6"CVKKSY"qMmrUKAI-H0r
-L'CaIiSh*JeS+FK#SI-!R69c5@#AXC*3KK-N2``hADI(5X*QaHdr-RC%Jf38kh4T
-EqAP,2E2jkF`'m6+eKKIY9JIf6*HFS%0RARLqcZb3!*5q"Sb'QZ2#$@[fjL2b433
-P-mr$qr`31&QYq,-8`fQHh#&'(CH3!*UAd19APFI6ZHUU6BDmAp%JrH&d0(&0f9l
-G65f6AX4(A'm1hNaiJ41DeZbSJEReGqS!GjPpmKSG9Mhqr2"BIFELm"$"CicU#MS
-Xp)Qb(HHl)qK&(e$PieZ1B2hJ'6D@L$-S8X#'B"8VHKf)bI90f0HKSP@@ihHL"0k
-6ae%r13LNl-l*GhFKV-'m0[-lD[N9c8G1el1JH)6c$HaC)NQS$1mjP"T(%mr-NiV
-9*K20'E1(8e`cE2'V*AFlpQPp*CX)f#mLi25FjblV*ihJEG8IN[S"Z-[Yp(CPM)X
-5dkLi[6qZDAYR38F%Dd4(#KM)bT5!-1jpQlPbAM+F1P"Zm*YkU)9hT#lcU2V6(54
-f@,KT1#jpa#cfE92L$9BhDIEQjGq"",`5(P!3Pbpfa`JUPSR,8rm5cbC`SZ-D&f(
-X22dV5TdA@VX6H'eAr[CLXUE1I-kV5Q&la#*HRlhGl*Ue9@,FdIe%kaiXHJ,TX#j
-0A44%'QmLPPG%eiUp@,1#Mk*5ULjjD[J"0Rb4m*0f(*Uh*kl0TC+fGUC)NFU`Q+#
-prKPGeUZq@X24US$FK9T13[lqS,cZ5f)H0GU,0rS''A[+QBeT(5*)*'iP(%"j@@Q
-ZB4VrpN2ecKe0ZMdc!L3'hiij0IfCKea'9Echq(R@8F%1hXjT[Q9e")*)VeQ+qCj
-hMbZ(KU8E(2EJN9F'PDhK0VJeMNml9T08(*iaA98i+8+KB'QGaEVK,KV'HZ2IMXV
-N'R(#*I0%Hff(@NNr5E&U0!*EM+NU,cBIDGKESdab542T+3Gjfq[Yed8*1+k3!""
-PYe05ZcCeM*9fK6a'MCKDQ!H-[+j#DF[RhVUDcR`YE2$DG4LLLrb2&,Hh5G%rZ9(
-B-%2#%Y$bPP#+$8p694Q)cC!!PXL+'$&2XIA`6Q(F[3"e+G[&'V9G9Ym-BIlrC!B
-Yd9"1I#dbP,Q3!1HIUC(aITi(H#j)9H@,8rXDKlSXPQ8LIdL-m@fJ+q@%F,cFX6i
-qGS8Gfd0D)AVc1#LpNh1RPHYJM6$d34+%44%6[V*1hjZ`EbSUKlHVF'CIKlliQ$'
-HI5be+4IP&QfVY)eE"T,ffl`lU%mH3abH5SE1-CP-'()U3hY[(Q9P,4CBBGT%GGF
-NaFF$RVGYM(a5Y1+4d-!*6*j6%D,qFLl33a#e&Fjr&HafGDR2CFQ1*lbcXcdk&V`
-QPQ)Y)ZkMr`V24Uh,VYr+p-'"SC%$Gb4qXSNrY,UDYGGD!H%k#0(Xb,KEJ,!QCal
-6a#rPf%@-0rC6l!R$(ed9IGiYQZ!-k5Z@VP%KJU$D*GI[&KL%04H[eCR&E)m+apT
-0HB*I&b2Ja%Dl[GqN$DM30+Y"qaH$SY+%48bCA0J44(m)B15U8frH4E!AS$5'([J
-DB$pURIJ'j*P+R"FHi-Vl10$XLEj@`EP#[#!8mIP0Jdkd13,QC,!hC4m)jK$"QYY
-lT9H,aE1r'N@2Bf6`dRe[qBELmr)ha'NBa%5c8"@`fj!!3HPlr+2$*0)*K90QHb&
-KA#R`IJVVQrYVX'NmX(jb"G`6pV(+Y+e3kKpFTk`CZBlb83Cb@3Y0$1q#PAcCLd9
-VcPULUL1l`4icQ6H5#b606@U,*QR+eNqJ@jp3$+9N!$e#cpEBEFG&qKUmljVVh5X
-Kj'08EjUc`0%0q2'G#rL0`Cj-dSV-E1mMh1@'Sj!!$&B1ECXiNjk*TLG3,b@+(Z2
-pY3j&-8MqhX#!`Hm49BVF+XRA)R",9jQrdUZ[!ZhDLDcTm"CD$d-eIe5!,GL[Tp%
-&S@#VHdXA`l%p3LT9#%0B!hAD,$RD"$85Gi8lVD23R11Y-&2L$F)-D`F94D`D6r!
-ERrrClLX+Tp#GPK!,!*dEE+lkr,$LZU5e"RpQFf'*8XZNY,IR6`M,ST%p&*c9af!
-bDj*@ACb"(jh9*T)cj,9jMD!UHkR--l'iA%ciAdfeejk[I#9!04)f`RUFHVI4C3`
-14h463KS!JZUTA['-liT$bi68Nb!'!l'R%@#L"eecBX8(0%N'Zj2,p3GZmT'2PKc
-0kc)T1E2&K"p@r1TNC$6k48i6b[r8!INc058GGBC$Lp#6H3kf%#q,0650VF-YX)r
-Cd[$d"NF(e1I5!0BU4#8B4NG-'l#6+!I@FRl3jdEr3b@CNF*M!U"ESAcR'DCVNiF
-31e4-3T!!XCJhGR(LV`MQ"X[&,5(eVmXSDMlBb*,d(-VXF(UlR*[VlYap4+e!J8m
-pISAd*%,b95fc%'',[cBLZi&DLA%aApTa[lmdTk9,)$VZ1afShkF3'8d)rm5+QS8
-DJ!GAM@H[F(5Aml()$A&3H)PF*Z+['UejahX9,B4r4LbBqSlU9iqR26*I2CdiTKX
-%G@RHLKcN9cJiZ[BkbeFmfI+!*DUhDD'L2l9)@2Jpqa2Yc)Ye5q'C"Di#9NqcCVA
-dr@1dZ$Yr)MGccII,ZLS31TII!+D$)NKfDcDi'B2pR(1c#2'+pE)ZIhNb8U8fbS6
-""HKiCPZCDe)Q#63(G$Y6FJ"jHR%!f5A*44`TKdhJ-U!RjUX3`h0p'4f[Be)@3K$
-G0HM5hcc%HGlfkIlfSX#Jb%p)+0SV`l"3Ti6HI&Aj@#FqU2`-M84Mr%e4Ecmec0!
-B1'jHp#N"%CUdGJR6F5)PB5YA"225K@04"&1NlCA+AjZcNMjblf6-2bZjEHC+*l6
-ClkqBKVQh)Q,4@3$%Pf"qdC[pF-41IHIYJq$HF"!q&-RXaCKJ'h6((4XM6Vl&Q%!
-DZqf'(jD-&hJp!GdYMGiH&9&&m&-%lQ9le22BTEj)*"i,pdIRCJJ`M1M8br*`mLP
-%S(5HmTYNE2@D@c2qq%Ch4JZjVdqaZem3iI"TB8,@!@EBCe8,9ZIMmC&,aj8[K&@
-B9590%EEfq45Cadi6Q,rAI@NEb-A`cQcjC'9i#Y2+1Nl+CB(I`+13!1CrZ[eYVJI
-[9%[p*mT,%ik,[X8iG+Rq+Ecb5i`ic@J(qSXBX4Z205BIS1aY&E(b$j!!fSrh6[j
-KkNAbS*2"`DDN@[+(!UDQkHP`R)mITP(D#*)Vdc8cl9UYDD6m6X12ZlFVbZ6[jXk
-"Z@41fCLQhd5V)pX05I#r0rAAKF)(*8MZq$$eNUM+,PCdUbACAU0rbNiqpLhmAhi
-5S#RRqF(J+8#p#ffP5lb`"k@Y(Mki*pBb$MdhFYXRYB$B8ReCF*!!Uhj*qSSQT[9
-T(hR0ra&McaEQ[d,B)1"`fmcXPB3V-)R,R+*QI9115'6'e"R3))@N[a"[Rp9PYIP
-F6eliYNrh4K6m,L,h4&A9%4SRQZAM0ePNe,cJ#@i1!k,a6k'N,iPCfL8PXR5Z5NU
-rN!!BmPiIR(M31DmY81NCq2$Db2*DfBR[ke*1QI(44cKV5GY)$pdmT,6A'6CSFGG
-f-hBclCaSi"C+ffkcfZh'j'F64'Z3!%!-SpDLZ%JlUfE%`L2Hcr%`EGbrh3iVHG6
-J35ZZ@(*i'eG$4!GrV,5#G6HcQ2a[9N9a%Uhl`TYcEh4Ie-*@eXj(l3IAY4$,`fK
-Lm)ma1(A6N8$3$qR[d-U$Ejbi3MV8%XhLKbC0+M)G1XPL)T08dI2r(PS2Si)-ZJM
-0p`jf*U@f!ceR9VJea!D&DmaN8,bam#0DQmE`JPmL!kU'cKScNi'@fe3`#e,aETZ
-MKSX5QBR*A4lRV0AmUFNfidE0F!pmm8$`*BjjT@L3!,,lbYq+8jlSr45%haaY*N$
-lm&52haK2AHUcF)[E343**HIeHZHA44UJEY0Nhr9%$F!eG[8CCmiK@$PPK%prL`e
-1(PbB0qD&cl[AIVLPc%0f",+(dG(jZq6NZrmqp[)ZDd5Gp5TRGc6LjBaC0dfD$[c
-SXaqiF`-!3a68$01(8JS+#8K+NJePFdaZc8M@QjR[Bf+QP@[Ih1X93U$f6DB66mj
-0fj)4,H4@b@-Y'q@%TQQP'C55Hccr8!JGM[Qf-[V'6T(33QKRT1Yf[I$jVTNhT1C
-&R5Q26!2"Q$B0*3-5j%I#bG!(S%HYd[Jd2cBKU))%!Pk-JLS@VjjY@B@5pDk'1#%
-H30M4`DFDMXNF9pTrdLM359lU`2QGer35$KJ"jkfHUF3SAI1AK@*1'bNHb9jhSUf
-SMJ-D[H4l9rkTR+N%qqh'GTcbB-f#B#jKi$C4RQLX!%$qhDQqfPG)hk-d2#DalX6
-,IZElpPDUJb[VY9$F"4G-&%5TQH*VK6IqFC!!Lbi#S1#`0-N*G1Q`+q"VZ9%,`5M
-NDS0MJFE6kL[01jJ$M"B+j!J"IrRVk9SIkp%)4d3)G$Kbja+ZRYZ),)E*c-h!S2p
-(AXLpThjHDij[i[Ibk'fVef(-qbTIP3cMTd8MI0C2MeKr@f(2`*'appcYdrB0&,b
-IXA0"E3#RhES(*Lb"a&'3!"9Q9NaL8eIPGU9EZC3S4Re4,1665(UG8-q[Ed`2rI#
-X0F2Ud#L`))&eNhe&RdYfY3Y&2X8$pBY&&Lr-P4ml1!PGeIk9B*IU54J56NV,R9U
-DP1"-c$a8B1$1l2aGhYDakjVh-G5'M0SqP%)JSTpZ`jZU$ZV5M,4VZEUVJ)hljca
--mi$p0!f*NXhFGb`'0l2daQj8FPQdP`J2@BeaYNJ69Dc$14I@TI&eCi!-JbG$f(a
-Il!&YAU)I)1VP0Cb!AkM[&@S%ql)SZd5SE1,*bLVM6EM3UKD$j)hiZ3mDN@CH-Y'
-E(V#8[3l[!5SMaH8ZcY+"5rZXANY8aSET$L*ka%F`djYN`4UirB6lBeid9DV'(1E
-d-2PcjU@"0iMIM@1+ad!@!P#e6(djD6JhEQ$#Pj(1m)5il)[bL*aZ4jQ9fZQ83kJ
-C&KmI`H,ccBk4qrTXaclG!HFAC,Z0[eI`-28Q&"p1M,3(9HXCB+L1E4&MpX#lalP
-BIp&pq,[mR5cAhElcNeqeY8"*FU5G%p"#`"*dVqIFb4L3!)ZBIG[NNUlRB5*$dKl
-IF)m%fP%%Hb(bV-m&R59(%QeF-`!d33&&m@ei1iTM#ar)'Fid*dk1THNBrh(2fK#
-mNi6'pcJEIJ2D#MRJ'8D["G@@MX3jcH1*f)r3*TN&$EN(SDMk8[FbjeLfYd"S2Ap
-#IAhpEF"''Vh0fpPDr2e%mAUEVXEGpr(,0UTGq'8EDH`*0RkIE#3RBkZ2*8ZG5Z!
-ZjiL&%i-TZB4#b2BlG[65(BbB*E+XdDdaBcNmU,'2A!#I`+q9k@)XSXMDC2F-6Rm
-P6B@0NCq(ir5MQ'$)`m!M`3r-,K-ZCkQede1ZXdN(K@11VfPLi1(c(BA"4GDc5a$
-G9"F@CAY&h#$#H!UF*!4icY6H!9,k)Q8*%8b,Mci-RUHma-Uh3X89dSGZ1akV'e`
-+`*pDB+P[2Z5dB8h8h)[('SFIjSFXc2Ekm%i-N9Sip2Y9'b4%Y"2*VB-eU[aepN5
-0XX5BbXZiCHqaTh8r3DiiAm!!ice(+ZpiFUF08*ET@E(jkPaJi"+01PE%+8pM8Ef
-!QkqXc61S`8Y+m3-cI$jDq6fYMI3jeKZ+&X""CATZ9rAUbSTj-KXRp5K(pGl8N!"
-4e$k,Ck#5rUfflK"Gf+PcYBlJ6&DK[kj,)Mdb2[-b$pm&l"!ZX"qV)E$`4IcIV!%
-qh#i8mXdEp84Pe`R(fXG*`pTF$q"pVp&5aiV4Bk"I*9&"0&r*k3"*kb"iiZF)fDP
-T"5)r4&ZQ#f%2CLPr`!0)92`-i8'Rk@bh&FpGd@B"(+2P$9EVS@E,%BjDXD!-8p'
-R%m%6)e%!B[YY-$X5ia1,p)k'A3$mI1["$YhJHiYG5p(c!HeTX6b%*(K6Iqre@a`
-I5TKRkLd"RC!!@64U'K"[Qk'2GXaFfACMEieA1GacY53F"hY[J4Tii8cQ1qSVGA@
-mXf(Fl3dm&LL-HLr2HB,j!6A,)Q*mH2+-M8#bNQ&3)lmk2a1%fYE*Td9)$H-&S!Q
-1R`M6GMc&kKfCXp@[5bcd%))28US0rGaT2q&hJjlD8J2T$h-23d'R4R94q(b&4Ld
-"rK)XqmImh&HH%UPVeEF!IiQk*BI)(di$MpI5&S!,hV,N6#"0#N'e)[$M#[0RQi%
--&P!*PNZD'QhKV$jqki'9FHEJP-6F@$eJ&T%A%VC(-1T'-JXB5T1l3PNm5JK*U5V
-Qa@PdF515Ya9l+90MLaJm-p$ai'UH-$fCX6G4afId2QiUij1mj'h(LeJiYZeJF"2
-GiF-Z)elk3*+Ia8RY6AqeX,l"lmqfAqSFE3&AmX)AXh%(J&jX9p+pKK3H$V[0A6q
-&ZYYq5YEaH-FccphN"*h4K!ka8E0eZSjbH-N1M+ZG![H4Ja@i0i"flV[c03e2plc
-MC@jS*X0F1f-,C2E,mcDDTK*@3*ISB'9MpBFlQbii-dP9aidZlGYqE4SR,F9H1G3
-i3$[+b-DeQfjZTR)@Q2S`-[,$h#d+qFTbGH!)400@&C*GVVF''8)jG'r*D&BfC(d
-1")"i8K$6NP3ieX8dc)-9U0HTrf9E3KC!%S,@H&[PK&Vlr$$)qHCV%PZ&m0&h&UI
-AHN,CF8`DUEiK9ckBSJejGf*`9K2*cSMd4VL)`A!f$,-p6+Gj6$31!B)`c[i@*6D
-&f%IF'%FcVN#jU`HUT90TeH4eZAGKr2jGp$bedJVM,Yl9N8ZUdQ9P2rUSpXe-q@F
-5U85ANNlS0,cqS[l,Jm2pAbPT#F'iSV)GMqA`GjN$YMTkiC3KEMEV2QajQm,cBpN
-)VC3+bH)X9F@d5a%"Qm-mQ&LKDJ`dlT'ad&jl&jr!km6#9%A"[-lD*ChGVRSc(qY
-RLUh2!Ij`d-(8`b-AEq%%VaP[XM48#8dI,a*1eYCGX%r&"p@FABM++N20Sk8K1,h
-)mQVDJcPMl`Q,Rh6@3B6Z)cNfqjKdQ+ECp2`&BF"%)3ZNb50cki8f)KbEb,ZAejl
-2c,(9)`XHR*r9Y(A9CUTHc$Qefc5p+J5-SeRGbaQ&fHRGFN04SR[9cDl23CaJq-V
-BX"G"1S'cA[2HXTpQXNPrLd[@I8HaX+@Qa9B!SjQTS!'Y8lUcB8iJ5q+d[ZLQ5Zr
-kCNpRTMGBYfh(T`bQ*KAm['`4(LrSJ-jR[1Q3!&jp[G`)Y*Z`(d*Bq+Bd[%@HRD8
-I*)bNLX1FYcZ!pEBb&223VkHS(LTD6X'r#MTk9#`SYV2d!p+-b&f@*9D6&ZJr#P6
-GP-Mc(H"MU$-P)mckjC!!IhFQ&18bq(eKD34DG@(MY)YR'm39m*`H5iDia10*RGJ
-*T'f'CjR"T*m%mVNebc9#(GZMk[c4e(+,-T[MMP8C3,aR3fST+X*5d&$$F3h#al"
-ca!2&H%,1alqfDZCRFEqeA18Y$IDe#G*SQ3RF9K"hafRhk1e4!jGb4R22YVVl4iN
-)k0S+Q1+p#Kd)*a%LU6@3!)UIJTi9FP15M89UpQ-l#X3P3`c)J#iCAf02rEl2l`8
-Jb[J9&N6*GYqPlK2DH8J"*f31(-D@4Y8*1$S1)IQH`hTLjaTe-9Lh*hcKa)08m0D
-,E3[c*PpKRdK*FAK0SKH`4RJmkVPJB)[BE1p)`mM6I$cQAl0lN3'm%fI*p8!54V1
-"ZSr#Gm88+T)Q!1)E&QTkMldAk4&ZdpFiqNmBJU8-0NEdhNNbe`frABZmG4*XPfc
-ff8""lfcCmKfML3'H[+ePQMm80B[2`AjDEJe-X(Q$d"pI`[-*Z`H2GK#b+eNbSXc
-Y-!9`qR6"(GpZapah60NI@V9fjTQ#3rQKB(Rl&2Vp*r90-&P+[qBb2&,&0D+,6G@
-3!&UrH9ieHK$-(AS'k9!V[EF'2&Me6&mfUj42SMkJaHc5*[iT65JGJd$9*Te++YX
-6kJ9H*RN-lA&#SCKNel(aY+L$eR+kkJ2)8iEGG+PPE,EeIAGCKj+J,0T+Y"hNAU-
-rA,G4E+SjC@-dJHU9jb2&&aG+XMU4G%AhX-SRb-CapcQVK`JcTA@4!,+B'#U9(4d
-PSeh,MA)9U[2bKaYXV3@U&RGceJ,9BjXZdE[eSCP#1fMFrrJDTl[RrSkc@LiIf@r
-Dr[3JAH!dfTj5%+['&`Hih,9dAk8"RlL9064DYC[&-6(2qiPq*E-QeKX+-PA51Cd
-rSG416e1cLM'!GEqc!T)Va`j43'mKBFrDplYA"6d[GF+r,'KBLLar#LUMY2mDXE8
-D@6VI+eD#cF$dNS(DMmDZ`FVP)%&9CR56CK0Hbe)SNY4j)@#24C6mK&0([*c+b1(
-dMmUrbPJ(dHGG&q@S5aYGYSULDhP-$"+G"R(Le%0(K-P%M3iVM'1`U!q(#J%&HJe
-G-!d[*+F`0%XCE849''GNaKb8Nbr+XTNQlqVb)#3`IK8S5$8+UaD[-'H[pm03*TM
--T-+Jf1(HfJ-2fD%$1eXPbG2iR5Ulh+br3ZU4m,QI-Xi3dA1LYk06dpJ3R98LCH8
-12"6$`TEN+(BS&VJ"rfUfCZ"GCd5(52%iMrYAV"ZpK6Ta@`M*"LU1$FiK0J,G6'`
-f"Ne[b#ISfqjI218kU1D*FcIfXkmaqTUHDG$F3NfaJ0eReF3D)PH*mHZiZf-ciB#
-H5D0!`%lT*LJ9r`TI6I`r&pYj5dIT'ddi+9U`NPN*'FKUIL(A*6*cTcNrSCdQAA)
-`QFL#bJ33)!ZJFMP!rir63G)!@9jidf-N6`B,I)5eH1DeX2mSXmm$*3EjUL9mBVP
-9X"3!4$'Z'8G5&H0TA*k#fE,QC8I[md&2VpN,qZlT6jdl(`YEIX(a+1(Pi0$KbXk
-k0VD$hD@qr3fH6c5Ff0rUAED`kCM010F28DbpUiGf#Tc")#2j-HTUecH[Kaj65A(
-Y4`CHUq-1hMlHDB#L1!#'C"01S6E#Q1$S`$q#RY+F6RSHh3@C!ldH4%e6e'eM4C(
-K20PSJDNebe*bZF)ri$H8kEQ[D#QRpX"LbapM8)#9(SEb(TZUTi"6-UNaQ8'JUSH
-HYQNe&VYbIaRK#6NpN!"8q+%c`&j-PVPAB-,%,00R9[mLDQ6K4XZDM,ajD"@@kNA
-qD)SE&T!!Y,4FI%h9''l118Lhf0jd$'`*SN5`VrIkqe53!)&P@lUVB(N%Rr0RZZ8
-V*@Q4YE8ad[)5`a8"38aHR#pU$dC$QD,d)CD*Q%&qb!$#(0$+1pj$C'6$$pl*H*G
-iB1i9ZQ&M%"+epQ`KCG!QFCJH&Th[CRRUp-L8eYT+i,eRcX"DqUi#GrP1i6rhCiV
-[$)&1jJY(FC5QllB)ID1HPJM+eAAFKiJRBGDdHUjR8p5mlpJp$leVPbBkU)8Ec1a
-iC4(i%05Mc82M[Q,DS@aT9lQSdUKk3"[0,@X3*R-C"28rJ0RX+-@&J)YXhZR8U6i
-EM-D*N!"8fRP%#`0$aAKrhB[[L9L(rB'+ZIP$PrJa*aj5&Q1QAfhG6pmF!pr64$I
-lq4GV)6JXq&@(6,!-bLikL@'A8-M9L,S*jVrXiUAXY3cr`3$D*GZ'cm5T63PC-Kk
-CJ["e0iq4hXd+eJE"ImL9VLVEaDQ25D0i@j&%9lF98!ji%%a*S"j*E%Zedm6(i3!
-kP(VF9Cdhr%jD@'JBS[#*P[R[l9jb$erq))JQSG1V,G2hpK[XfdI46,F'j"U2V8k
-YY-k1M(ZDd+&NmIZ"H8B+5ff*iVj-#ViCFUNlJTJ['eRJAi`KbNPRq,1(F4lpAfZ
-PXQ[Q#UqMa+[RQc#9Mkq+S5QqmdlBNH3$2dTKBp,A5k0C5$bFK&f3!(8JAm#9*Bh
-++JcHGB1BZ"R12(lI1C5E%VX8Y@DR6&FBIT9$l8SAVi+Xf#!8qEiN!&"a(Xc%)K@
-DipqLHjf%pIeSRNdk62LGe`YrkL`h4kB3H&r&KE(8qi6CcMk*@rmQkfmS`%c1SSb
-hPT90Z+J+4([hUea$V0`K6$B4)'2[6T,Q!Mh'e4mNp@A86hjqber4,@)J6Iej[Sa
-)m#GGT6aGe"Xl"hkmkGGf'mAUEcGp$ip2a`Xk,jj0&m5M+(R+'GT%664AL*4FA+Q
-l0p+bLTUNiIYI+'1j--)3iVkqqGQI6p(AQ%cGHA2@%,ZXD3rBeY6c$9Z+#j!!XP%
-Bc0Fb@!HKh1f'p!4T+Xrbd(bf-SXPSI``cX0kl&E*G[aYLAH&QD,aa&ESK"4`ZBm
-`kH`cY`4+4G&LACFRX+''rj!!,3*rZGHF@KKIPjBf"DaKC8p&HhbAm(T)9m$KYZ4
-la)jQ#a%6[`jqMBhD6%D-b3f'N!$TRI%h`Y*caieIc,`8qLDA-5FYdiaIcY+(f"8
-&NdRD3Zkq3DVq)pErD',U%dDjcV"rVjL3!)pkb2S5P&@ddBcBbK8G"-mhZPj4Q)H
-'NUVhEf`U+"(#"cMh4$&dc90G2K4F0mci+iTj,4*J4DrE`*L40MR-Rd9J3Xdr,cV
-H$'&CZXYSS5mT$TG9AkD68jH#fX)r1b('(rdUH3Jc1Z0[1-a(#miBrlh&09V*iSS
-Rf`qq*@-,LAHhpf6!C0@`6'm`5`B*$Rk''FZ28D6pL`rr-RIKih4fjLq4VVeVdcj
-I[R%3*$fZjbP5GU5IN33Gjr%&cem8aSaUq4MD#V'm&f!3kUlYXaAe8Y,IU`ZSN6F
-)&5V"mfQ8N!"JTKhXD2G%Y*cC!BV9Q(&0NG[C`A6kIilGXb-3GF!kp[0ThNKIUEI
-(Y"`T(bImAI@mcBhm)G,E,XqB"$"[ZK1DUH$QXhIV&dFHh0C[qEi9qTRTeUR[209
-[A'5B*5ULm+6%jZ-'Raf*l4Eh6lb6Gq%&m1I0RN#TF1$S`#VH"-ah03,XL*1eX4(
-$5q'H3i1ke530mNjehXpLE-l%2`2k!+!2dUf1Lhrk"pX4+FQR%k[d2r9J13Q(Umi
-Z+4!aK[FlL2-U0SS,J0)[fI9BJ!-f+$#YB`9!(%+b@A8iZ9J'bh41l@h,9B[HYL9
-`!"*iJei#R,P8[L$63ql))6Q*F2LE(C&%Pr&fAD35&SAbBp@)ebBcP[KRHJei#VI
-U@5h+)E212@`XpJhRHTMEAAcSedL3!'rL#QHP"eX[p-(Pq'2CZSQV"10!PQkiY&I
-S60f9&%R(25`a[bh+NVP#)U'$$6`%kR0G`NLGUXpfMq-9*CILZi!faR@21,+S','
-240#BDGG)aP8lVFjb&EIEh'qaf!M6Up#4dhK-`FU#S@AeLKVLrDkq-ZdXA#KC9ka
-91MS@iN[&B[V-8IYfHDpqUBiEA[D@-@4M%Xc4+(X5GSi[1qTN6q09%U@l&3i2qFf
-mcjUIj2j5S1m&FflDf015G*IZRp@JUd(@lkCG!!P8X6k!F-q[1M`VqQhNMhH[)AM
-"BShY#eLT,4,%0IHbR80NE$)$2UL4Hrpr90"3&3E%9hRkGM2-I))Y2eBlQI(R"KZ
-!HiB#M6qHrp'Xi&,m+%@5TV9a[kdUQ1Ca1e$S""$G2!iF29!P"'V1b0fpK#meDIB
-51[`YY+"%(jR#*ZR(-hIGc4Kb0BENq)Dr%6'IpDkV'p5fKlY)DP'KaiTeIYHXI16
-!Q1cV0"5-e0SMMEIPf`@Qa(JeMNi@p#4E*1ZA@LbNQhAS(6Q6UXdkEPK2d&K[E3,
-BP)*0Emf0"H*FGhJ)@4+bY&SEpqcFl#KSFbC3MD#Fm9hE3j(ST5TS2'eMfjDLX$r
-6Fb&8fP@@EUVfk40)UHVK4P&Z+ZeE$pj&rU-d6#*3p*ZN'V5T&KfMNP)Tj4QV!M5
-+cppBT8q)jf`*GNL@r)DSbiE[%##$MH(``T(4#E[LQ9edIe[U*dI[V6Q[Q#LD1@a
--T0[!D5[C`!)+58SDSH+Z8rfIMl@QQIpdBB-"DhIVHqUqc#fJ@pNIP'S'#5b,D*!
-!Zpc,[8$,HT[L-J9`Sf!FqjD(-RY(T-L@NR2e39MlGpAURAY0-)DajffVpr4UM23
-dCh"*GfdkX!Y)B4V(3VmF1TqL2dQhXqB9D&A5i3[9T'dBi1r0jEaE2([MaF%BTU9
-`Q'*6b``6j`#3!&C!TLeBjM40pPpjT5Jie,Jae5EP6Jjc0d8jc'Cid5k8E%L2b))
-64ER[FEYHk&Rq&p`&10f8E-iZQVH`&+RFRIdc1QC-Z2lcm)FF3j%GE`+H8mJbmDQ
-EY[#LH5,LB!$"")!a-1k@`&p6[bj,qKM,T1I5!p#3!#-l*4YU(+XI5BXF)ABX'qd
-f"38('"+3!'Vi'i$#G)EB6(5!ar5e,D816S2f5%jZ*Uc(F'K$JefTk!30"pAC6k@
-hBJAfJD[T[&ABbrrUTTQRk1CD1r2[qdZL-alT!Iq%K,N$h@&lI"GQ2cIAVF5-fYA
-aCL2F+4"a#k8XR*0Mmprj#D4DEP0JqHpJMH&U[Z(#H+HZ2UG-`Rp`MYYpJ)-XGEG
-&(G5*U00iqGGAkkE`f%c@'%Kf&iFUdNIqQaq@2![,P9[Qp&6-5X#0Jj,X#3a0FK!
-!PaU*[P6qqEGUhU5qS4rX"6J1,ZP"4T!!'"p"6a&98LK'F2QjQ-j8I*GKUTp#,1"
-4UBqm2&!S5C,d3I[KD4`B0&NPSIUKC[m+QF22dSaU))k3!"q)0d#d"RbhMC5f6Xm
-IdrhprZ[Jmk5X,BKD"Zl*4B2'%5"QrA+ej*c`3V0G0%i5'pcaV6lM2p0(a1"G[FP
-,*6F!Y-MC6cbX5lPJK8e@9l[b04[@MUPRcIC$XPSQj$m0JVj6A`[*CE4aq1KcV[C
-lXjV5XJm#)2I1JR+&*ABE5mUHHSTY(l24$Hd4&&r@JCl&J*PXfhURqm%b!SFmi%V
-,GK#kZRhJ20J!k@#F[f0jN9ZISX$pcF'@G$@T2N)U2lDR5I$Z-2"*$CV28ZJ*QI$
-r!-2TF#pKjcRP2'@Am*,5F2BXf2UAq'L3!*0kf*pXPIV,IA%j8Lp'KJUV++'!Ei(
-@H%TE3dD[XT!!TJ2Xld%KSh++BeBr1!5(im!Md*'[@Gbd&BJX0iC@*+5ML"UJ1ec
-`Y1`H!+%j6"FYSD6bHaYJr$UE8PY3,9DA+kbSG)M%1'Bp$,Jk&Ufh8!XTE`6LS4F
-0!48#Da%fQ$3PN3XFfD$RlmMCGCE55p2AD,fd)B#5Je$(LU&cLmqJGk#2Y'Xd-)$
-bEH$Vcj93HMTB28PCfaM*$*5F3(JAXp+I0q-(B(H9SmCpeFUhl9XAl,QY9)%SIE*
-5-!RN9*DUUXjS'IcjEce`bVf[6"jr')6TpE99%M$%VIiSH4[A0#N@[M524*I+GP"
-l1C[V1-C-Y0%1[G+N%'IfqlA!%FlpNecUC()V2kX3GDB92@+i)iKcRN04rqbA`)$
-2mYFH+YD`BJNHFT1NUfBE%(H`0CHG`UCN`TeVe"6!BB*Bdp[aB&-iE'5#MLYXN!#
-+"Tc[AB,MXR,%p[0hr'VpEb1H*RXirI&2R2F#T(0`b-22cBM$VYF!&rG9(Mj`)!d
-NrLp)aiSmU5mJ%2M`F6)+5@+&f8Z'4iaF6cp&@)IQ!ZV#QbaPGZi`D`[GjcF4MU0
-lCfiMcX+h!BB#IF'd!TeN%XbqNjQ3!(+e(PmFQB-!FmCdp5BYVAaljI)Kd"jfE5Y
-*(X[4VS@8f&M3DZ8hiDYN"Qq68D@j+F#)r`ZB0E$"jcL$(JMELIeVe,lm`8c+M9,
-'c6%m2E#[LVU"T$JA@Xh%06$bEm%Ul090l"!8ABJRM!%B!9!CKQ@"P$T2QJd$H)4
-Q-p5m31h)lk&B#-QH-,"-G#K0h8-*if!i&k$&[BDepKAI9K&h@hd),3dr`DBr#5[
-iDQ(f,Q9b#j9jIm"ZX4IQ2"Z`62Qa5FZ[UId4!Ia@TC+l1VaGV#DmI-E%UeYH[Be
-[1%PZ3q-NkmQh(`A8D,!JM'@(b)j%CNJm)`D2S)B,m%lNPNehZY`96pdY)3&B9h,
-U!mi@ZENp0b!Xl[QBZb$,+PZ$JJA,Mdm!K'ajjGj`8BEG3b"$d9HAlYdMd*!!kX$
-e"Z,de93Vl#R4b(4RFG)E,dj1ebjr3$9lM#$-fS'5Tb6(V)dX8crTC2)6eGTcA$8
-B8P,b3mjHACDEH0N$Fd+I)X0@d5UcAFhD2*!!2[E*!Q*UK-9hJ4LGkQRrRS99Apk
-%9E5#X$@*R3jprEHpLMBZ#f2B``B[XJABCM1H-f+HX&j*mPpX)G9%ijpUTIVdFck
-2-389MN'XY)C4#XS4Y@X@ajD&60%Z2#j9E4((Y19+hp,XLd"ai-``bU3jqpUCp`I
-%1XKRPMKE-N`YGh"r9,2cMNm018FF0%#lAErrD9'$,J!LVS61Se`3SeL'2,'-5YG
-,K!"aiRil5*-Lffj"1C8k(6aa5*RXBcEe+59'HEJM9F'4RHCDqCS'A'XkR0SlZiK
-&9r+qX'M6%Lce*A#*Q%EJ[D0b[K"ha`Q,0i0RdQ'+3mfAG"5S@SUE8RD8!@$@k&k
-1BYV,I00r$Z1V8XE+SiU8#3%a9YRR'ArURITSMfp3*mLRlSKkq&N$5$2L*f-E'Y4
-)LdPZaD`L+HPm&+(#e1G*T,Ec"F8dI!pE*5V95RCbam`4Mr6**f4d&'AiGK'2Uc*
-$1!Y[LRR'j8rC(JRLP`T-bqAXC09GXU3Ti[85I)9IeF4Rj'QkkZ*+pfBe)!"2qq(
-IRiXhpISj"#M`&EF"`@Mp8,J[&1dkSG*DFjJ@$SI6d46Ya`d'H!V18J)UXNY(He"
-2AG8ae#Hl88[)SlUdVL1[M2Y4NrkBC`ffLK0Rf)E4k$'MYPG2eml[&`5d03-[0Tr
-$[86cHH[A[GThP4$ad(@2C-XeaB4YiL"3aAmDbA1SfB9k(i%Xf4EbLB(IrkDVPSU
-(dG'mVP93$R!er03CHehDIb8cb`UP8r-D3IUS`dI9"K,(L$A'jkf3!2-3LK*YSTA
-Jpq-IbN&!5d(PX%Qd5T&0UMKI#[kD(l@&FZlC%Z(jTc958,%YbH0drKQB%`qZjYP
-YqJA!,YmJ$%2l4jFaMpq#Xap)B[-!iBVa5`,(#Q5q*)rHp)&4V0H'4iYfXQ)+iKN
-(,X*Glm%p9HE4hYFUEF+*%fAq#6RklPZCE-811QFMe5G[P"r[+"f[mX+&3,B%U%[
-RMQr%F83!TC!%!3!!3J!3Z#2F!,R'`UB!!"i(!!#`3J!!!5m!%R'B!!kNH`!!13d
-!N!32!&4V6'PLFQ&bD@9c,Xq!,RKYE!!"m)Y849K83eG*43%!rj!%!*!+J!#3#3'
-D!*!$D3#3"!m!3X(8LR6XRV2cd)#%E942VNJ1jkhchrY)K0bPlVlVi(1%rZlb0-M
-5JEZEqhHlaPFlmrDjdKl,LX4c&HT!J"dKS'YRe3$6d&B*kL1GLLpqbp%86Ti1D-V
-`#L5MjV-&Z&Ue8DEB1M8Y&XGJ3X(9!lZbb6dXY"hc4NPYMidK3cN%q*9YD%+eJ%S
-j6r#)fGiFdFpl4QbMaLV5R+*qdJPK(Kp6XL'*34T496pH',-l50cBXZUC!HF!*#5
-VfII`)c#64P[2k0D1a!df)"@`)k$55RR#,eP,`dc"A6r5#P"`3B(ZZLT`D@LNZq@
-bRJ6Af-NbajIF+%Q'SFq8l6L400Dra*53!+16UF*)U0blbc[@HT`Da"JZK`qM!e*
-I`)CRF,e#J*Cd[6d8c$`j22@Ab`4`X`PCh+BAKL'k+D#+ULS6!fk$9E*,2L1QqE2
-Ip9IX883))G0kRKqA`9XIa,qhS*Y9dD-Kc+dZ6m4Hf,pTeS6Dr&i-GkLcm59K+-d
-d$0ZDli$@e8@VI*iH,'fh5$kbC0B`"23c%93MDp1DSN[DVY+iYP`@CBUeUZEZb*!
-!1NYZ1Y[r"m'K2eh)H8c*h8H+(KdD`22j9YjTipf02(e!FU6'k@IT*ML"%2(j&)9
-34bIYbf2hD61eKQjS@R,Q`Y[NZhrEM8F3K4eQ,BkX(Lb#`l%IZaZ2DK8Am8XrK54
-bB5J-$pL[9!EH3+CcjfmVi'(fR"&k)2!AI+'h0,F,4MN$XlG`aTMJ8$cm`Gl3L+)
-bh@2L#La9K6&iq$Pkif%cT2P0!A%G&6'ZiDDrK(-d54Vf8+!C'E-e8!6Vc@UNZZb
-pB0XX"A@eI86qdL%p!iG+[&N@3`+8@XdpR[lM[4A0k#30UVRB$NG$$9Ii)e1QJ@L
-kqD2b'feB8"q,Y,[%UTdCI@,9N@b66M`45I0M,VJ89*a+iM($""P"+fSiH8CE@4b
-B&#98ja"&ab2YXkhm8R`T`9U2Hfm4e%(KHY"'%-5XhMQVeYmKIIVkC+A`LVX&ha)
-%Q#"MDU@R*C*fH%LE$`YFMFA(B(`(afre-8DY@8*)9!P(rXq9%@!NP&$!a'AjbDj
-F'"`Uck@b[MMFTABEK#pGDl#*@AGUD@*Ga0p8#l$#i%GS4q+8DJii8b35mlDq-5U
-&58#'Z(q$jRa,0S2SVTTpRm+iq3R9Y&"iA$+!eL&BF*hU35M2m4f6[6Dh3iBXDFJ
-85!TJb$6&V34%j5,`@SbH!RQ1(eEVP`2f[aXSK$Z8bBG#m0J"6[Y1k&FT(j8UJfQ
-,1$2TImqhGKP3r4jL-3Ummi$a`pVlRKqZKaemI%G"+#'f5mC#Jm*#&BX09LP#b%9
-,0SNX4DV)JXeq84QZ!q-4C%()&AZIIaSZU!V,6bc&IbI6cdCIS@6lN!#+HUaiaa#
-)F-ESU@"!"@h8S3mUS*!!'FR8$qiN$3TBe!LZ+`&1'!qhle`fi-P1CDmKrNL5Rkf
-+N!"PJ)G[b0#9ZUimhSDIXMMl5)#8*-I18'a-rRN,Vr-XiSG&Le-NIlh"rrAkd(`
-+Z'"G8N!p+@9P*,+H",0d%Lcd8IbVDJE-lV@C`VYM1'FQ&p#*QUeiCP6!ikh0UP+
-1P`h)YQA!40Ef#8`H`Pf1ImfJF6@cRGf4X,j!bq)(ki"bU*VJE[40FjlVYSi8I0*
-TX5CT!E3cH@BXdqajSDbVp$!2E`3f5a(*RmQ"c0Vm+(j6fPlBVjDM4,UKDj`a#hX
-%M'2Q,Vdh'V(f%faA3V`pAPB%*qU$Rr1CQ%-,"0XaLaBYCM92k1$h(Q9Tpl9ZQr!
-j8@"L$elACeV++VFmcDUeMDmr-3H+(1&h8L,L*pIbCRbBT++6jadHrQ4Ib0FrE3e
-blT*[mkM,06GEXET[$f$$iR!9+ZN"D$RRZFV$rScX@6BTNYj8dFLSY95)4Y9DYYC
-Fib$hfZ!Pb42!QPIF8RR'YZp0l$aNK(l*!iq2fNe4-!V4UB,cr[(8BHGSMlZ@1)c
-RH8i+6f*RqX*qJY+TQXVZV!"f"c+hCkG!IG@EdZPeD%eY5!cHbQ+BTiNd4"9a%RS
-+K65V&(cT9Vr4e$#RK#d4Gc6DcVMRKJEX$e$pkMUC&r`TmK#6Z*cQdRK%EF3DEQ+
-+"MDQVXKT-G,16X`2fNQPYh,#[A5G"Z`L"Z(FrU3"cM5kEKS&11jD*r$lHM&HGrU
-mLd@$$3(J[h13!%U,CpmY"9XK0C5*pG[S#U#G1J*LQQC!*Z`Q0%UH%'dj"Em5C[8
-!b,*k3XBP25kd(T2XaYd``cEClXHYT[Y9!p14bqibY4Z`"X)8qJeQN!!`)RX`pLD
-2*YTcNE,jM8KVc@3%1lYCai`)&pLZR[A`ai1@(1ma*T-A3#qidem&KC*"UeqBVKe
-MD4('e,aF5(3'A15SFBRS%94q)'#)h@0rNPT1h$HJB,644iIUR@-8J5Y[5IiES!#
-I&2RE24Q)@Rd#q-RV(L9H$"J3B4E@9pSMNHRQfQc$j4+2(Dm"*UhMFp2&`3*pme!
-a5(3Q[U3B-E@L(HVDcbN4SN5e[+X+AlNHjT!!"XeJ%PR!jMFP[&r,"PDHciiUTZ1
-56TJfD[8Fb!(ii!$hfd'NbIL"a%"FSmLGmIKK$,C$30H,$Z3)T9km"*(%`GN*3@6
-VAD[RHcLbS-a*cb'1rD04)piTG9FRICKbN5c0`PS0&)4rc)fq6kIPm'-&ISJ+[IN
-(@#UYDQiJDNhe&b@1VA!SQ)-UcXq%+$J4ZIB!iGRTBP04A(X*bXqU5AVpCD893IH
-JpHEb!flr@TcM%pqJQHlaemRJhjk[4-jaqRNZjTV0,8I&*Jd"U$J1i@3,!RYACZ6
-&(h0h3lN9$GK5ZZqdY(c0F,1!+A%!Dj2hk,P-Z4kN%VV5)ELf1[-N8MG@6p9cYm*
-XN!!0HY`3kUI"'pk9'TUX`AXYX!(X53(j0qph6NP@6hea+GF&P3L1*q34@6`1UcK
-DRr3!J@T&!4#&EHBLj,NL#'0ClXNJd,IT"VkDaYl1fkPfb,%,f6!G('E9e)i4ddd
-ehV9&chmV0pUDE,%*i6"D6-CH%2!P&dbBQjCl1Bmcaa8TR1*cT!fqrJNPH1+lk(#
-E,NaTlJcdlJhj33ATYarYiCLFZi1d,,A8!a0Ab9N*MQeIFI"frSR'Vki1Dj,[NXl
-@3THQrTmAQIa0*fe$K+JIDZ9X*d,qKi-ECj%4D$'*XXeXd($R,S4P6NNaMG[2(8N
-r9),AFki80kMCHIBr6VrhK1NPH`@cdiN#[,p"b&,c-34XkI`!EY1Kl4XA+a*$X"!
-bkkNj%&9q#iDNSe+#cB013qk25$VZddL[KB5MZDGj!Y23plP09UPV9PlaFDa[&d-
-#TU#KEFi4+jVScj18'$HDEJT"lDm3,`%PfdlXqe3krK06fjkGiNd#$(2%k&EIh2E
-El1ppZJbSB3q`YfYVbpZ1df%T+Xr#qiAfp'3fQdm`UL&0mlaB!hN-DGIcC9kU@Mp
-C&0Jp*!8d!+4PZN,45S9+9KhSbqF8r%8+[-T3H@1@9MhHX#flX$Th4EHSciL-Pj+
-JaQH$XdhIfb81$M6A4*95L+5b&V3%qK!"6GUC(DlMqrKAAEA([RaRC[QlVrPDABl
-jh0MAKV6[XP#FKGBjj`PX(*i#$')&j1T2#L82P44EP,XdKE@F!Gk80L9cCYG0,I2
-X@M1[TE%j4QYd&TcZlJ'0A%F4I$`0`+!"q,50`-I)j#,9PB`$A8G8jcaHI@@+FKl
-V-2-`!ZQ1H0[2hSkc)#d,3k-JZVBSPedEJ&ZGdYY&F'KbbbX@C,Q)FF&UHaPqAce
-$apP6QGlFBHY,-AXpe%c@#X63!&K4&#G)6h849rYlUUVGJBA-cVkb,lEQdq#NHb(
-`G[,&%V2MT9`T9c[JE,D$r*Y)AG(NT*GL5k61TIQR%YMY,4pL85EiBaNYDd9(#[V
-d2ffMd,HZPRF,MNF),)iZp%8Qr!2!08h99d&PB(Vp!P[ZA!"HkY!#Se6+JcAiUhp
-@bS-&JS1Q+h4iEXR*3YQ1U)CV&U$2#Z@V&da"[R-H3r9"ia'0Bj%m,kjBX3cF9'i
-K%6@0!$'6P-ZP`$BR"mT9TEU6-ir!HZblmTICLT8ZJS4d4&#q`S13!$,J&jfbEBf
-4Z"l#FclcTlZ@[KdXE*(L[Q-*0VD%1$Y0I4AJ[AP3T3A5B!i,E*hlSE8,@Q,#KE#
-qV%0,QFck*cR'fkeYBm8J&elJ1,CV*`*Ie"T8j6TffZ%2dQ&BVXLh,*X&TRXh$VH
-QEK$ANh5!G(Bp*$,-c065!#3eRa1h9l#3!$T9cZT!`a#9!kmFclI0Vh2EGMJCeP*
-&FT+"9fYGS)r3hTeBKRSIaSY5N@L2)rqrbJMTX4ZCYTmY834H9HB@[*Ne6r@c4MV
-%frBY`jC4K0K1qTqb5#pYZmEZIe3@8H+DJD%GECR,%S(V1kR4TA$+p@#ZHTBHND!
-HE1CfSSl$PVKGrjkX5QiI)R(1@T,FZSGm60iIF5@Q+6D&cJcq*ZbI29CP4QcSh3&
-+bL0D(Ce%q&B)SN#LY,CdZ8'53[GmVc($f`H62V+b!SP'EN'eX%!5q'ek&0)+e+-
-DlYlDTC@$@X(%$FL'SdQBX*FCc$Bb@3p)jS6A(QFhr*lM&!Vm#[`a-l-LYq,+8#Q
-4+V)UReab$@P$MI1bLARYq%-62C%M[D8cDL+$bFI#qE8T,icriAURi%h`h'Z)rNM
-G)QN81G!hSe%Piq,QFXRml++(!LG,&fS5*`ld"BVIjJLTi`3e45`fBI#rKXVM(5A
-aK)FCSi&*GVh4JHR%1&E3Q$XiT19'T%PciDrbUI6DJJC4cd-5kpUN@IqcL8'#4VP
-FNFVM&1Xr(r`Tf(XbT!m3mlQCj)''S"&bTFdZ%%)FU1%54J!6ZS3ICYK*$(C*IYc
-jp6)@AYI!T5*XD9JN9!hG@-PI!h-Fm-rjcN81fUlU@"hB*M++XDGlIjDP6DIZF4S
-RTS!X2TM8ZFK`30!kLUT!@Bk%jmjkk5k[m3h",`aYYi-$Ff[FZNKGKPG+[Hb#FVq
-kmKq4r5[ATA8IN8RNk"Krd-YT6lPL(p36Smlj&Q!%EPVc'r!V5"IC"+JPDVf%p4L
-Z,h3JfTd-S0L`YQJmK'ULq-IlUSMq-Ukl8T@j!$[5jQiQI92RE8Qp5kU0)ebY5DE
-c"Qr*J@6bZBUeeeTd(Jj3DreJ$ENR'*k!Y"C(q)C(HNfGKY0QY4T4j4!-HVINMQZ
-3!"AEC3kfcEdQ!MNKIhLHPa-Xbc8BAk$FKmP,(6A19lfQ,445FkEA#l@RD%d!HVK
-mm@FM#r8cK2aZPT!!h0N%[4@)@*NKNm8L-f#pB@$66a1A(HQ64kI2A4Yi0I#J$S[
-aa+C1TE9Fl9'1JQbCECb&-$2%Di+"EfPCd3`8I96J44l4kHHp-J9TP4!kr`d[S")
-bJ+U1L8fETli*e#mHl8%hBB2S+,Uf%3q-Yc@dhIhC"lTJ@@SXlLNR-JRJbSTj0G0
-L8LA%pc3(a!-eD3X8eLbKhJQ9"mFE6Q0MJV30a4dBI!LJlPJh+2044,XlLLX0*N(
-pSFm(djPR"TBb,I3jNG3CrM"Sar!E1KSDHeZ'TGe5UlK8!A25-@(L*lQ,ZqXC00Z
-8+h,0ql&Q(r[Z3CI1V'30J'lIQX#r44(SlA#X-&IhU'$M`$V'13kN["B,APXAPfV
-a4%)21R+mj4m@D-kMbJ-,Z%j*Z$&CLDRrXe003YNZpq%%rd@&+4+h4rd`T!!m'hQ
-q3Z+,$P$6lH`I3h'9iP3'jN)LP"Qa,4PK)ELp5bY#-1k(VBfefY29XUVR@h-L[[2
-!Al`F6e(bKR`[GS#)"`EF-0G6N!#H$kb$bUa&-(M9DTqk*6-FKS!(Pfc`c+,CSKP
-i8$RrVldDh9UML)l'YXFQ1%P)FN!p0@B[Lk-k4@@Z1#r0l)$eI-ET!PD3!0VUrfC
-%R(LV)N$IQjE(jPi6E,C8A,,V+DiLYVPbTqN6mM#RJ6+q[*5k&Y0T2)E@GHeHF'B
-T'V(%IB@MY"P4q%'CYC-B3b"0(i6I@j)$bl2I0cV`P%TS'8f**+HkILT0ae!AJ[Y
-`AmRcrjdQLP,+4rcF$mSmSi"4D"bR[bpRC0)b$HDK#LRTL0c&dL6bJY#lp)fT8IC
-0Cr&`m3Z(0)EaVC@8pM)@0!(@1D6A,kV!XP'P`NQ4r6,E,[rEGP*rFeP-kL&kVDe
-XcZZTZ,VI2(Ueqe2'D-eMH&&a-II,[9G$V(AICZE!AA[Zb0l%U''B#UdPGU,q`(I
-"L$6VJ'YYH@T)`65eGQT"lR-[,Z*dYKaFIjN2HqF8)FYLDYlR*#q)!8irTIR[jX)
-"N!$YdcRVJ*cYh(G8MiI,9c8(F(ZALhIXeT,"@(DN"[G@,brcVP3XKY-Y'r4l4+,
-@4dRUCZK,XN3KIa@f4XeX0(*Y(%hCVccUbX'JT,%GeZKUDX!f1'j`k[3dP,&[D4[
-R0kdDq!ApK2c9XTJ,a8RKck'AVq'[Kd2b(Fec`2'%E`FM0jhG"U`+eiQam40Q*'*
-ca-CDmHTQNQT5jaJ4"PK2J36T21k2Z#q3!!kU)lNU!TlTM!9S9%L@!JQ3!,PMSdF
-X@*2,15Gb+64S0aF3!c3raQr[$p9Ii"p340q"l0MEdGdJD5B-'U9-hfQd`6!8p+h
-+#lDFIZC6fkF1Fm169YI91aK(-"@dT6MmC"*IqUll`&fQcceFaXaRLUZV+HF,Jl0
-rIlQNZY(E6`j1`(cE`Rq!60m*APYi(JAVjMbq*HR+rq4qk3MMIiTLmR#0XGckC86
-6AE*b*[h0)dfKiUQ%L"ap`EH3!#lc-p1p%-HhMU*Aa@f%a0QT[&"Z"--IXj!!-$j
-Y4QpZX9eZ9aV+6B6NJA-p#NTkN!#GjmJlN!"60IqL*X9[q&Xb*8'c(2J9S0l-C3&
-6d$hjq"kNdfM6THFcTP8[YjD[IPpQ*Y(EHcG&hcimiAQ[Dml!#T-YklUcpFK4Gbc
-NMaKF1lEPG"mBUi1VJIYJS0BSAkT*X`RL2(2,,QX!N!!9NLUpN!!*,aj!LpS,#4C
-V%9EBhS8rqP`YcJeFL5GNl*E#Ge#hH`L0'i-K&L@8'8kXGXM6VPa-MG3FdB9f`rX
-1p6'J[)PMMB81#hN+!P3*9C)A6fTIbjJ,XLkK3rN55b5UpdIe2+04Qa$jI`1I`dN
-$fFDeT0V)Li(8(%Fi9X5QiC,YCN#lK+3A0AqZV-3S)Cm(Kp61!Nk(c0+5"2M"'e(
-S8[[R[X`E#MqSlpB9MBqJmU9r66)m'#eifBIQ59$$J[qFdUQMeF9ClXH3!),)(jU
-A`ZKS!'(KY!SV%8rrbT*pjj2qMN+4*C0d(QAR,LHKi5,EF2KrL5ab#3UKdp[e&c9
-$UbrkRZGVM+,GADPqi!I@8R**REfk#8$%EZSiHIja(QG,[cP*BIA60G$`i('PaCe
-[ICKZL*L#cXPqh'CH01ahc3Npl&"@hL,#c$Rpb"hc-ID688R$KGf'C+50U6Gd3+k
--[eRDXmFV%2[(mpJ)JFiq98hRA)0LTrZ)%NXIHf[*$mVJ6HM%H#r1,J8399$a+"F
-T3LQUAZ5Q,RmCYQh29Z6l,2P$`#dpDQllF',UP[[F)LJ$E0#*D&@0UZ`)D8-f$LH
-%@e$,61kSCdeE)TH6Mr(G4Uf*K2Ch%-5c%@+NC!RASEYqYd&9+S@cP(k+6'64(L'
-iYjZCrlIXePNBKj!!!jA+2QJiJQUKP#rHk@JPlbFj,HU"d'C2mMIiQ-F&&B+I4M6
-j5CXZ&)J)XV%fPrKSN!#YlT,%Y5&`+![dTUj6C)b%A%hBUCHF0I9%J)LR*a8Serm
-`5kdDPT!!529B2h2PH,-hZ%5b&Y$)1pcSIp4(4a+-`l0`)$aDefECQk4+@"TDQDr
-phhJ85(UU)mIlqDqG2pfR(Y,AC$(Y0Rb"TmDUjaVI1+kSF43"4c+#h2ZdN!$fh!%
-"hrX4@DiBpIL9E98MjmHQB%69"d'%hpE)2*4#eXk9f0iQ1e(lqbcpC@l5(fMR'ak
-0+PaBC*palBSQkLp!-+Ym$0a0DRTJM#0GT-Y,RE2(f($$[TDR0bAS'"Nm1eY`0&V
-Ca)h1C0IhAK$ITim##i6RF`*9CK@%#%P6&3d(I[QZ88!Dj92%P5d0LL!1V&!&!BT
-QeZcI*@1*F1GP$I62Eh(QQ#XF+3CD,[1`AQi@3ESA52BF6)AiT$G%hMl*[DrqMc*
-b[+k$k"U,b%'[@0rS"Q@F'39q!l8HqF&ZdT&Xf[q6M)TT(XrVMLZal6e6f#-eD'N
-jcJZbRl%i(XieMV4jA[B[6L4AQ8ikEQEhPlI'3Nb05U"h*+Fq")MH9A-kKI!TkUJ
-DLkcb(Ve"X!VVFc29m,kJ(Fq6eJ#FSTiGjLP"Y)mIf,!LmQRZD%Gd2*khULeZf@5
-#qQ1*'NC80!&fp%FBSlm#KTlTVe!hFh'EY%J+%6NE6'rFrS5q-d(H5XQLX(kq"9T
-XliR4V$QrT,c,+Q+S"h2,k1ZjHZYG"@QeqTQT[L#(iQ5H#MEJpZL+,G0K`V1Pjai
-Emh[ZYHJ#dbQh-mjIV1i*dRZ[*q,#'Jp$5&GimbaKlX`Rm&HkYKIFD0@CHiM(3H!
-8k,SZ)GUrR,06Yj3*prJdqUpINAbE$j03,MM'-&8!ID#FkY6YV8I2lb9V`H''(hi
-UTKPC`e60IjdBZVDXdETQfR1ik3,EibSK'b98d11ZS"1a&TlkNdEe@cI0NM,e[a3
-lAfFNhcqq8(hA*6)`E1fmqe,d,irFS(QjhPl'U#B(p)'"G#je8cXQGSAVar[6GJ$
-fRB9CJ&eGeGcK(p0J*H6,TdS'6HMp1#9)*[EPN94[0P4R!e-d3pfN&'p[qVDA"JM
-c1%@,1j!!"0CReMYkFNlN1(@,eZ[0-)pFl9N)N!")aE6XC,UfDr)VVk%5pR8-J19
-NUE"d294HfaqYH'[Rc$11I102NN@'NV&rbpZDlQecYe-9G9DEMEX$CD#XRYELfDb
-HEdG%VZ5,U+IhbXD8R8YER&J+CeMKM-c#Ah-T!L!j"QF9XYJjSPXL6i@j51ABrYU
-qRU(Qk+mSHE)p,q[MfEpepqZXr`lHjPA[Ead1HFe$r14e6cSQRMl*HSKhKZcj@,1
-XeXL"f`FG+)!Z68jmdBeEBBMRaaQVc1%[(e[FjK0`[l*rm6)eL2aE*#MYF(!cUK6
-Ri8b`P0C#e2$h`r69C5Gf`fSdLC36HaVX!eF$1Z0!P,Ci"NdXPf`MqNc#68C-$0[
-B+93T,jrTmd#B#@#QIb(jQmb-8"q))PpqkZqmB1M8i"p[TM+cm'0CASSd&2$ebUj
-3f,9HaS*@RI26E8H&)3GE2FPH9B4'Gj!!RmLHe(VDP0AeBpU#QH&*jaBKf!m0Y8h
-8jFK""0Y8M2d[YmKH2HZX*`JVJr,VTYP+A@VJK'LMU[8["-aQ#UFp`JTc9h)e$Nb
-`K+H'h0A53F*YR[i6UBa[*QaSb"l[m#J%i#[aC8mA@bKIQ$NBI1TBI3"pJ2mpdmT
-S!FREh8@9&NFP9K3,1k4`qK2A-"4L'Q#$[Z)jXr-e'U-X$mp')3VA$D)-#Y$dMY$
-bKbA*p9NdQm+e2Z*4K22,"EB!qfeImh+rd8!LZkdKcpqIc0DlKHb8iETE,SCb-df
-Mp"8bC@@QR$br'c0L+6*[VLBErkk[j"ler#m8q@DmPZ[3i*,2k!Lhj`qdHC&T(UU
-DhiJGBdbHXEqQ4Fm65[2Z-[$B!G(Qak%@c[MCa!qdLJFmQ",VB1M)FE2PBie!lQ#
-'-AI+J#4j64bpNl988Cp25TJZa$A"Nm1,8!DJDdm-JaKirM9X[B3@GXYMRR(p4YG
-a[Be'hlp5B5&V`Gc+m5+4C'*)S+Zbe2P5%GS8%1TJB32Y*64M`F#!(6XdHZk58CB
-hmJ&2Nr`GD60NZU*qRqB+@HQ5#feYP1K%,GfiTj'5EA*35UY-kPX!pXF6mapXp&j
-*eG8`peY26!l8Zi[c+8mk(Q3-ip$3A5j+"NJGA@DaLmDH*%J4Tf($R+P+mI",&de
-dFR-1$KlZ*eU@8lH'JPCRdk6DRZ@0L+FJ+95P4e`Ar@-X"F%A[JS(V+)K5[Jm$GA
-8R)iABA-'eKadHSZ3!,aT'8!SCR(D!15#'iUc[$6rX*VXZIhANI4C3J6[fP8*r&'
-I,Ube+mP,X(b&CJ0kCZ('cbX@N!#6(fM-4$&5BNe0T(ljdIpdBR(TQlH29jri*ha
-#%N!daV4U9U5IYEQ6`-`ri,I12@3q`mK0%*MT0@I%ICD@hcX3-B)pIp#rIplri0D
-GEdKBdrZepXRDjUV@EeQ-,Nba@9,FDEL[1FAdBiGXp6q$`UF3Me1&FEbF+Mb@Yf"
-i&a,m[$*m!Sk43e55frpJ9h!RE-hb44Fp$ZdR*`KRqB4LNIC4B$$lIpTpZ&0i5Ck
-iraU,K5J,GjD[U`V8!*jdY%U,mCi'M6XBRJr5h*!!!Y*8EajiHjCM&HaAKm31Cp)
-HQU3`!QNUJ3'5pU!$[dYk*2[ArM8TkEMr4cJF9PBp3I1FZ'0Re8k@@D6-85lF"DT
-lph2mfFmM89hbZ+3mj([KA39J*$Yf,rR!EX`jG+,-`pG4M(9bM5[40R8Q(Vf'5#Q
-Ri$24hZc4U@'SdC1pVSHN1i$@1DXj2,BcDSkNY"`ZP4DYJmSaG#*1%@BDAjX`MV'
-mNm&PZC!!%%D-Ki4Ba!i-rlh(HZ4d2[Tp+rIAAjMr@ifXBC!!8F0qN!"&Q-IdAiU
-*dr@(pmiAEK2H[ehY%'Z,XS0pF((,(h5V+8SUJ!8Ar"5N!GT"h2J&#eQBEK-e%9f
-9XK4eYTPM@191p6*a"6c`&mKDKheV)pC@DHpZ(j!!&b0kiqC"iVM,-Jic3$L"jqM
-HhR,XB3Dm2KF8h-V&$XhiP)lJQEeXHPC!0J00ei(,GGE5@MU!0mmT"NQ--V9B1RF
-MfiQUH)CBlNNUZ`8#PjmGCFTFFJDUS`kd,MB3[I*L4*&,H0Dai6!4b)R`1PM0`pj
-l[Sc"pZ--T+!TLrQ9rXdlrpKX8e6acEZh(k[DGe*!!"FZdbCdMQ2V(Ipqr)bL+FF
-3Z[FX9L5)#1Nq4!rPjaS2kDYiTriq*ia*eh+QIjQL[%C%-M@lj#E*81#TCa#BLHa
-V401DpkbX6S+@Fm($Q'Mj[r5cG`[bF8G)6*de41R1FaKV!HQ+2V&B@mS#BF'-,I%
-'ReB,FAJ,iKcdU@U%&c5!JEQJe2-6a2cMhr)IdDM%R9-j29mTMPTFce#H8"53!)p
-@Z+lX$cFfd,i'AjBe45a6m&BXS'G!IL@4)RjSGlT-#a)f,l1mc)8N4k%9EJ)8b*%
-U4Y#GfT2[m6+-c&e13`erElPf[Dk[aA[)#6F"!FQUQlFp2SUrYHB+"[`9VIUUTb'
-L%dBIdP(S*be`$0`DVqK958,)3Q6M,9"6$FS#S%p&221%5c4(MQkjf[h)#H,lCUC
-PcYVbhkl2XM*dH0GqYQ*pZ6%Z0r0GNcZY'jmE4YAPVKYc94j)NQ-e'3,ikRPT*m`
-5m3(PcUVfN3mBdFC!lEpRFj9S3QD!U+K+(T(ZE'L9dHE"cGK8Zm@r)2Il%`5MEJD
-%1@RKLTaNhL'i"pe3dqI+BQN@FHh5NCIKpr84Tjqr3Hl%HiJPRdpG*!9j#c(9Zcj
-`ZmI53LVd)&1e+)[3GmU$SkCMbm`cJHmrdiEc2KN!AJK@NF`2",Fq5AYF8#U-Kr9
-aU6qX[h-HQJkZN4G0`D[Hc,i1&2Dcr8%eHA-+c+m$)$Ml8A9XSmN``VaV23N0,1%
-+aCQ5A(DXa@C)HC,b'Dfr[EH#A[lNKdS2jdAeBjmG"ri+Ch*Ud9B9+AP-c*12[r5
-b42ILaUrBSjG8Y@dqEj9rG05pJ$qY`2@K6F2,Zh2H0-Mp*M55'ljFN@N@#['%e'E
-hDfk5I-)G%XTF99aG%VkfN!$(@5Q9qBf-2cL#cEP,3Y!Ll6MVTh84V)24bMRS54M
-QZKKmbBDkD"51262MV+@,$(0FTD-1D9!2,U(2RX+9-Mh3Kr*HEYj9#F[4@jRZR$c
-Tr@rD"b)+Em8P@'DcAIG,2D&'aVFf-'lKl!JcELhi`j,V4Ik8p0F)"@E4IjN03qT
-hVBUC(P"NF,R#F4DN5'rS6I2S1r30RIC9*kpleN+J&iCSj&24AL8A-4S'VGmr*V#
-`P6rM)4kd,(#*(+$''QP"qhE!fMQ-e(clF%$2&#)rJfESm3Lk#ZZ2RP@4Cr*0E)+
-Jea*e4q`*Q85NMSacR2d-LIF9h@E+laHm!r`VlehUT2#,4LmU8SV'+fda@d1)`T`
-Y6MPiq8X&&&&Sje9V9[mhT&UZ3kih*BXqN!!BKhX5UTh%!CdV(NQS`0TbH1Z,cmS
-+H3,J&GEeSG(&,Jp@U4K#TYV-m9G-c6B5J+368Uie5!+3!,@&p!DV$8RaQmq[b)c
-hh3G442b3!$f9R(baG@XR-"FGAiEVbKLklU&#TqX'j!Y3Vk5CSGE0cI("GJ([qpC
-&qG-pYiQ&fM'9EM`NAEJ$H-V`+'KFYmQPKdAaQ2p0)V)01"A'DUZQP"'*5kda$+&
-Gi5j"fFXq[2PrMAICAR9#GR)#[JapDMRUbmdB+h@KSkNDJFhP$DTTTp[BD4%`@R+
-@DbjAH@#PF6RU3fhIa9$(jl%e%1'C&,Ek12@cbMN2Yd[c%h49J))"rRVdQR'hEfC
-`If*`DV*`lVe()kN8j$Q9@R10S4NaHYY-X`dRZ)%Rc-pefd"rK+l!Na@4KNFFqaL
-*'e*6+ZY*AP&FKR[4LS%"T'i0RAbTEh`NP9b''Dd@9Y*r(jiN@4e4q&4,RY(iq)k
-1ELAA!b%X0NYf+iYlQ,ZHFfiFEZRYdL8pD--p8K'e5eAjR0YLfQBpTU8(AH*pMc2
-4ET4qmd&jNXN0'Zmip8EHPBhd['"4B1ArSi+FG03i-MM"$RC`9k+rklicBF`JpM'
-EJQI#(rTa$BHV)4aMX')SbiPHXM22D)NJLpDb2Qe*d'dlR0cEINRGqUS@Uhe1hFj
-)c9cYP'R5+)lAe"c#+h,1jkNP$2+%cZ`$Ad+jUM!Kmrf8TU)""e2@(+SADI,b#S#
-FC`!E`9RXJirj,4bEp"mUZD965qlLr!'fbLYFGMX%EZfTCEA$XH(`[RCNlraaN6B
-*Te%*X%A[F25a[SM5AeN&T0NqkFNTLq%P1"8fpKHUT'(Tk&$$P-M@CT4r6c%)aD8
-128SJ8KSU*%3FG9PKlCl3LUhlk"`GQTBL@'*p,MrDa,bZE31Uh4#`,3$+2k6dpXV
-[0U6$EHe`1M%fK*ea'+T-MSbB%llTBd44`bd-2pj'1*+`'a[eGP!HH%M"K6UG*Zk
-1$*dM1LZ&S#-aJC%G*9YDDHCF!JT4!S&haric+++EIjLp+1dHpR+C!#L(AeAjU*'
-4DH)(f#9!',$I%dLPK%k4r!kY,BqqMQ9$(a)GF@!`c,adc,BRhe)C&R3iaT!!c5U
-bL%G*j"[N0r8TH"ak3e8Yk[5jG+[DqfC%Y#FPH[k2!QF@JkapFmKNTfD%%hb%Z1f
-B-hH`mI)"9pF880a)8!*A%%'dc8[QI['%4$`3Ua9ed%Lp6B(69-LM%PUGq#-#B24
-iFE8%#6hf+eeL3)6A`9$EhV'9L8iZ8l)!$-9[QjV,Hj-1Spl'Y#)J5fP)SCTq'UZ
-kZSVpbe`dZ"3Q*k!22Y*2(B09SkYfLpU*KlGNXJqc6qGaM#$`q&CaLS[)$C4hK6A
-2Fhcq[83XLpDXT0KljTY(dJDr&Pec#Z,iPk[)%X*lb,#L"HqlQY-+qdaLbLcD0Yr
-R#DDbi0jSG'h+DeN[bfCf-@6jH64G)6Z%0-Xa"["VVp`pi,K&2bF16d@d3VSY[Aa
-'"-,9jdY(Ij5&hJ(Q8b*#p!CSaXar&ETlk8aHU`@#@A[Q5#@H&(rcTL4%"ceG*05
-F6m5Ke'F8RKEp%KGI4lbPl8qAK"hh'jJ'T6ZIrVJ'0!)A)5EQf2#L`)#,$Cfh!2D
-R5*kaXR@F%KJYTZP8!D&8D&rNVq'VV6b&`rJEm2h)JIVIQ2ZP02aP68"S1qaGYSp
-JB-UZPZ5akGpd!0%"0aaMbkq!HqPD"JG)akGXb6k#5Y-8TaP-P"+%c1FRq!CVb+#
-$&0QHDjrj"#'m!3rKCZISG1$#5qpUT8VDDkPL#,Y#j`&Xf&"E+P2I*QUR%Nd9B!m
-ZbdCQUJAUFS`1*EN)[[Ve1-KF1ILV%BAVG%`R"U8B6-iZF'keShpP[RAA@(XDrp,
-a(PdXTE#iJfRJMIKqf5$F@$)ccC5r'UAKU-5'j#De6!YY%YI2a!kldJGl#VUKRqk
-Aar'S8,LC#6e9Ea,Xi$UmC-C4jP1e)iG9chBZIj*8F,m*MMYSZ@h(&N3r%1Flpjj
-pFC!!kK"TXSKL%2fZU+"Yq6FAmkCr-%Mp`ffiA,%YUHjPKYNVIDSH)#FbeF%+f&e
-C8&*RKm%I@CkRP8FH2+TPkaHA6U9V3S02jU0iRE-T20TC3Yc4fD"c"E)"`'!PAql
-dh2aFRPBB$fImX%iVfB4KiYP(*Ck[aDGQSG$-$RDbdkbXL!"@#UMCaKS[JX-XUaL
-(40R(Jj0i&I,[JJ'k6FTYa%a5#5C[[,c"Hpe39`%q4"4%$)hT2d(cQ"d6)bU[QCB
-K`0G$Ik-9&D,e(m$bJbliD@5fFU8pN!$IcfUMDRi)68R2`f0q3a5@F6r`LD`(&cK
-!U4SI!G5NpTR#0!YhmSa&m,,6[B5+@p[qBmeM2LZD*eZB&q)r#5qZ@`Q8REP`N`U
-!1LGM)U!9FZURIk2*$0q[aTTTFmF-GraqA9!!CUI6iI&S"*Td&,N)2Hb-"AqSY5A
-Kh@Kj+kE'RGTeGAX@JL0&J2Z!aLGc83(q01Var`3I,h!D$@+)@r44!l99B4SHk,T
-'C!5Z%[I"ccG,9eq$`A)%[M6AfEBq0[Cd'edQX`c,YZcGG&jK`UH,-m&ph5dhE,G
-%USe'&$a5(6f3!!(CpZ8f2!VqZ,'kG-EK#-k)fj%ZJNL,!'1jp&j,qQ,CXPL#5$4
-4eTPja%@kbC!!"i`4IP#+"CafA8KkK423MV8EBkLkZ'djaXepbBJDprF43ccH'2,
-m!4RLX*Zj0jcFIXMGJSSm(@b2[FVQ9r,*GB0`&+'dPeEENp%!p!Urbr%AYFGXT'C
-mmDh"6f-mEh9q$a-Cekq1hk[R5Se6Y5'J&,GDL))KC!SIa)-Z'Tj+&l*bB-C2PG'
-#+*3MjA4Jc2T4qRdf!b2*95aQ[b&(l54+$K,Sl5!P$i9#A0G1-##@-!'@"a`%ejF
-c`Ar843!X9r(IeZGBXBkGP"bcZ3j96Z+Q($&DJ6A-AL[G#BAh'ETl#*UYM[H"8+@
-02QNPfjFiCYBp&5&hS[AU$$XAIm'p9mjSe#r!C25*JP)1EZm#ljM4-1rfj64GBhc
-4)GVe1"GhZ'IBaMcqVE0-)-l-k8Z#N3l-`$'E"GG1fc#iZPmD1V06!hXQXRr[@[l
-e(Y35-jNm6)BI`H1HKdHXM3P-PLjRiFT8X(h&(8q!i4M6)MEC5h[$#2!+81Q!,kd
-2PQCjAURF#[m(aXjT8rB`L8X6"a59q%9"#R-MB[ia6IcEcXSUi2M6*80b-I,BEbI
-*V&*r6)!0q3TUEJ2G&4T+NT2N9!$TVhDT!!!k!3Qa@qT9T8c**&r'HY4jY0qa3Y8
--E'c)FBEiJG@Nd!&R'IpK0j%Q0'L,@XZ-IhKVfpX`FYU&)IIA03`CVhHkXp$eFj@
--M1"E!Va!mJBVm$S!M[RLJkGEmdkX3T@2h$AM@Ub)P5Y"$DhHhA*h(6,V!1hmR''
-a4(0lJj3F`BMSN!"h"clIkIbep5kHd`R&QjrX-,d(,ma@$+rYZ`a6AcN9pAdAf6*
-P$$e4-%B+LcjjkbJHQr)J(,$m`$bpcKKGR#Pi)lkM0[4V8$*A9lf0ffX8-m9T)U-
-jcAM43*8&q`l(`#lQ$NUST0qJbFUcATKEb6Aj$-c0,'1D3,EDE)Y2!940XX+eTeA
-[p@XT%(Vh53kTcAU%LL"*$IpDC0VC(jC!9FmmLQER+'CK)RQN3DSA%appa0Y$eiC
-LGkjRSP4q[ZL"Kq4jc!+fB#GK@qRqTEZN2be+`F&(lfNDSRb#1GYMbE#m!+BV4GP
-SP'5qf#MM1"`dL*f#P6"K%f0kKI+%LaCmlc!hfq!P46Y$fkQaS(EADi6X81#a"JT
-(8kK0a,Gp`2S-E0k"GBPRRdbadZS,@bQR`Qh*`)fX*U)p3"eGQX2"2$'0i8,SU*f
-NR0HA`LHC&FdRi-0EKF#&$!6PceINpVC,AL8*0a)(QaSBAE`Qr#6fKkcjT"XJmZL
-KU@!SQ*fjE%iUC@mI[(ZX95QmrkK9lFakD[6EID#4fPd)i9aI4B--84r'bT(RD&p
-4mI(RI$-h*pT$R!Sp(SMAA$T4X4Jhq4lSZI`MQPFj2)KDPbSb[*Ff%*,S(JaX"j&
-ETeL9Mc4$QZkqCD59Z(raG-2eb`U$$edIL4#&[USD3ErJA[8CQG-PC"[RfDJqc'k
-QcI#(L8EP"QQ20M1!lT6ihhDQEd6ceXQ&+LcG$iabe-9Y3IBFE(Q!bfXi)'U(9lr
-lE''bhdR&3A&"N!"E`qlp%V2Nhi@bbMDT!HmM$"JaT#8!$3H8jpbJD4JQIC(!%Ki
-2MU69"A$mI$TRhF,JckTPrKC*frU`2Z5'"iYJ4mdr(ad-8(rIqjZLSRkSrhTk*eX
-TXh'j0)l,bFqqD2MPpR1a%1Y3X*B5d`Lf!QBiXD,IAkk(JV`#Y8[[NL!ICqVX&CQ
-Dq3JE(J'9TUP3AKp)r!B"ArTj(,ef(R!T5V9mA-cRQ-I"JQ@NP$Nr&+2[P+DhUIB
-D"Sm(XDqdejKS'B#H*j@-lVHDa6A#p5,NE6[GX0)G2URUEQe!b*2CU1K['H493Vh
-9@)Kp(DrZmUK[rejKK,m*(!NA3Q'(VRU@"d6l!Lf91mjqPlYDI62DF*eeA2-XeS&
-ZB+-)+`+`TaF,`Bm5cai`@Kra@Y3EeT))`@)S2kqjXPJ4cCTIK5kP46$beU'QYal
-pb4KbMK[m[kNlQMhTU3GQVB&c9Rq2!E[-8S'B*DNMQ4B0DlUr0!eX[XA(Q1YIXie
-IbX5kRNI1rJka%eFrNLiD-m*)pNGccQ5@`YDYZ5A9+"!q21(%bEci@bGR4(b0,&R
-6&i8QraHpf(AG$R%b%XR48L,F"6RE"B[C)1TiJHcE5G"cdVG*GR!,P6aUmfVBFD1
-9j@KMQ#D8+Il8U96cEVmC5$jfR@CD"3%eT2PVh,(&ZG+XU9%4V3ImqC0K&ANE2Ue
-UM%,rL[i3kAfLc@pk"dA48-i(@k'Bp3NepB$Gp!p"9`H'!!QF,'%&fjEaHBH+iKB
-dN!$5#QXfmS$@LpGqjc2J)@lr04f6-,$))UQrXT5HqkqZ#af0C("IIXhUX@-RPK*
-Ri$"@RNU)E0E9"!G5eLq'LipVVM2'1lIM[0-d"k&Cjk9Q*pTM639"Vk,0Yp4[0Ec
-0#YXK"SX*lBbN3l)kVlj'j#Y6'Sl-kYl,Y6)!YK3%)FRVT)r!NSY0HbB0%U%&pVP
-T[eh2!kYeEd+QEVD"FcjQ5`EV3$jIr9!+c1#5F,0DHY44jcJ$5rZ2l!Mq'bM0L2#
-%#YC8qade(5(X0jeEJ'H$59DcLBN0MeGJN[mUS*Ie(GZlRE*e"-YfUI[dj*KVQji
-5L)(1lE%-Ir)bkq8C5i*j@plVl@FriVRbNJp0N!$N0%LEkp!lB1f,,N*bN9D#*N&
-QjP@4@A9&"ZcCDE5EbPLCLjNQ($&Y&Ud4VB@b)MBFrV*`d%5rNea`%U8YiD`!ITI
-YB,*5!)N(r*GY$3d@ZjHFrh(i)l1kFJXk)Fj3VGkMP!k!@'djZ[AMkV0M59q%Hd0
-0@)NcMYmBKM$SA1IRLQeR(@SBacRLiYbP-[[-3AeKk+Ac+Jb58VD@&V&aT(#MKB6
-T['d4Qb(NETj*J)Ci8@%5%+,Glr)Qi5HKC9K-Ti0phaM$G*!!8M#6+qE"LY4dNJh
-!15F93Q%8BmA$QIV[9kP,`8K"f"PlBHCPNJrXASa!K1TM(iJpHAmJhkYjM%mN&2b
-#XXlI&,LKXeU1er`e3Fm9rG$rA@*+i5VA914biMB6+,9X'HDa2YeJ,-Q(3X9HmET
-53TCCC0qPP)(jmBZ#YE6,DHEBq$KCm@f#d3HhUH&NQCMZV(Gd-l22bEX801@E,-N
-ETj51A1'km%IQ+Z8S1TAN96VB'r4CV+$-[G%mih%P,Vq*9i(T8Hfq+"!NXfLKja+
-$a4DdcEhlUM)ILA-,%QS[,Fd[I[arQUSa8JZFTlXKLRhh(!dJ)DK[!,9ch&PDSY,
-(KHcq[$!`bp@N9mlk26M#[f1419lajA2(,4B+%mXf&[Z8[J-fQp"TDR)RlJJETV[
-K0p!HJ49kb*6TPSRErqjb@Q2`I'r*rei*[SlGi[!4ce2kDBa,#,&)$VrQd)Z-bST
-Pp16EKU[YHTfSi3@NeDEMXL'#b3*+0pmakBRC*$23jXc1qM33XS%qc+VaehijpTN
-#A2lR5*UTNMKLp10`rFpaHIJd!403kPpSf,T`Vm9jRp@ZmqUG1SiUXIQTmSBA1mf
-&,50GINpED)&@CfD2V6Tp&$R3Tj9jM@Z-!a2)ihF9*-A)rIIq2j[JXjNFMb#$Q[3
-dEKT&AR9j54C9+QTL'N,(CUD'LkZ*#+SXCVf-c%E'FTmiRDm"31eQb&&mNIT+%r3
-1G-Bf5Y@6XJU)cV-Q%#251@0A9ZD4AdfJ1L(@60m-eL1drCSa0iRUL2&4Zr-Lb-K
-1*AVE-6Bi3e!Rhb6ipQ@CrLedGT6S+56UrFl)NEX'jCI82e38bdSJ,BUfG4[5jef
-EY`rmq2idTe6dH%Ue-c(LXUiHE$##@a[hlD!ciT'(Z'R#QkFE`c-c#)(1NLFA(%P
-(Q+F4f6LdIa$bbYDGE%,lRPC3XUpHYq@b%`6(9J'D"kT8M*Fi-DiS[K#eBeF2J`k
-2m&AkI4"U1VKB!NP1CAf&QP,,HPR5LeF&%BT&iiXXS*Ja1lpK`df&LKZif38HpIm
-c@0mLI!lC,X(Ii%@Bf9)d91r(AZUj!ppiappr9L13!+Q%-R@1Q,!'),q4fqX2#`!
-`mKG3PXm1ZpU!hd1d4cXKFBC2&-`@KS3I``d!X4V""cqmCkbhYjfJ01$JKadEFY'
-j2QAEA(,lPRLZi!X8)ZI`N66b%RLB6l[YHCh!cm9`%($bE4+$STB6RJc9ZAU!iKk
-J#%9-c,"kM)Qa4crY2Uid[Tqmm#r4`Pd*qK%a*mSdeEZ*fpkU&N%qpVD0bL#PacX
-HD93hIlmCc9TUjiK8&Sd[!QQT"`hJI##d[@-F&9l#'5UlBD"BH%JPC%EYTT+c#!H
-(iZjU2656M4Jk3ITQ8)m![[DfdrD5l1(DUG@#aYqSX)lN'U2jerP#[Rk&iXqNDS+
-[cPKYi0Z)@%D#dCH*ZU)&+1mL&4!m#a36G)S-VY`NYDl!%$1RGD"RZL!T)`4lYjJ
-,2D8$`,X*Gk,HhC@1@dEpR1*mI&riJCKMfI&'3-Je$QmPjKS$%DYH4jGYV)%*R)-
-@Imlm,!Y@U2+%aK"T8TKDfZ'X29,mU@Z3!)*D%LI64G68Yf(JEQ9JVNcd`+q0lkY
-j3[GhYbY#kA13!-6pPAr@PQ@i8`qXXR,!`N#p8jHG5dcIc8BRLm@Ye"#f'#Z+$KD
-TU0q9402lZ0)rX+LD3YYM9&pM*V"!h+KMS!N029IcV+Q(81HM81Q*,4bl`-M'Vr-
-T+eQ(Er,kFdHL%@aB6AXB**'&q@0bV6CcNPda4fkpk3iILBRf&-9jTNk8jMEbUj@
-T8CIS*E#Db4h3Q%'JVQDF+9"'l8MI+eJE41G1593Z,1@-RV-IdLercIa(hZ")a5G
-+Bk-+3ac*k!(XEG1*D&M$lf(8N!$ANLDI3Y6ALYl+Hi2!C!Ubp[11!!#PN!3"!!!
-l!)#dSNd[Yl'dI`!!GPJ!!3)8!!!",`!,'$B!"mFk!!"4F`#3"!m!9'Y6D'9XE(-
-Zci!!!%#b68e3FN0A588"!2q3"!#3#S"`!*!'3X(8L#ff)S$m6EUH,rkT-ZKZ*0G
-%`0YV,P+pT-#I)P*H3NY--N(I,I(SC*Zi$a[liHG4iD!a'X*,R&ecKS8SK,i9(qJ
-QbK&CPI$M!C9B,f$l0M8(RKbAI(M1BMhIBUS6B9PJF8r`10BMC6XErj[-YTEHm$f
-MLP++4m6Z6GN4ZQGl8+hflZl1,6D@ac@le1K3'X0XXSq(@1,cQ-)0,YiMP2JfB5A
-,%MaH9T!!c-D+H-8IpcmKLN++UDLQGH#*eSJc)VpEFXG-AHcZ)!h(6Zm2QQ%X+M0
-i&CR"NAdm&Z-rIeQ'Ih$ZQkr+6j+Qq[UH6RU4A@cQbp1426MJJS`($E"&BfJa9Z'
-a,!k2dJ6VL,T*1"qeH#NE'X-hE,*02JRl80ff%l",VcEbKAKGUf&K0-L89YC!8i0
-'SNkZ34)J(l2'JSb#9GJK4a1bUfCB8P3#"[Mj[2YdjdFlVA$@'Ccl4+(9j@R43Qh
-BTAm*V2($Uq,T!DSXVclq'@E))EG&&SHQ61H)cGEC*ENl&SYqiAU!0&INZh#E-E6
-QJ5m*@6fLAH,AK"F#CrX*f#PPECm)b4HAIPfFG-1P1q,J98I*-BJQFC&DDeiNF)&
-G!+p0lXhr#MSH%BBr65),"@Ik[fdL,,)jIK0VfMZY8m3I"l0aXV+CYM30Hl%hVCQ
-A'a'JX6+G9V6eUcmj%$68FBj(k"B,R,YHXGIXKebE"LeCI%bX$UYH",'5cd#$-CH
-&a+i"4DU1(lf@@kMCIHHI541f3cZTC[#,lQBFT"C9GZiA!4J@F+i[I-6rm+$m"E'
-6aLqF5+6F['2eeB"#(A8MY3-YKbI3hM`aLPrIJ58"'+hl"5!1TfPl@SY&&N&6U!)
-@1jrELT!!lLqD+`9ACfGl8%VddBIPeESq8TQ1rJ8KI*m9#m(5mM3l)32+N!#,IRG
-a,2m&L*[LcJ$EkPqqFp9e1&2jZhV3THISZ,B(1,f`8Bqd@1JIVcN$XYeRi$dhBBp
-K'E)hVJ$@&"1f5Rjh+bT%"")ILCT0bG*q9F3!%X-(Sli-#9m23SQYPF%YJR!8*6P
-AA)9q9REY6)Ue"TT9Y8CZefNbZ0E*C@pcTrUY[l'%r#mjrp[F%)0P!f-pPp-"HMD
-d8fPb#4+6dZVXL!KRT%8`#kfGh5l&q8*mUQk($03TVc'CGR3PGjL@!k""F3mi!4J
-0Z"*rc!HLYi,X&`cRS5c[mUJaIdBQaA4,pb&c`5fFX@HQI#-CK#'T`D%9M*mbGqN
-rrCe`"QVrMVL4((((+iUG*8"TH,Ybjc`lBC9Icf"UT+2K4SF!ZI@4Lpl02"8j*CS
-`2d!R'XN-@2U"ReEYN!!,ipjdR[)Z5YQB,c6P0Mj'N!$D&+6`a#k*pr,Z$rkU$3T
-HpS*+2KK%LHbJe+-Er[Tb@b-V'(#r+Q$$9k[rT4a"piq@hAiZHeSP1,X8[#%ImH(
-iG6,Nh6KK3RYG,E(j@+Lh)*i@K0q[!ileX$5D%JiKME4AIQKDLjL#[6DX95LcUhN
-0heKdib4e$F(BaeaA#5%I6LDV`2rC,l(V-UC3ehQP*Sm-9DYC!SN"@l%6iai@J$k
-DchSK*kid$mAeD)SNjL*+b2hN[kr8%N-(2b#3!)&H%"M2iD)1Z$(6!aII[`!,U2!
-(p1BLiUj6e!E0ChN2P,P51Ik5@+iRHEYL),-@Z[qK8Mqkk[f9J'R`(+$C-XY,Xf1
-JEqQc(jBjdJ8bKXNTm$2G#pRAGYGSqmm(-TI-KXS&$T%ha&alm2Gi4M6MceJ9UH[
-a!GrVBKk25CfGfh36aALIYb5r*djAZ)hFEfcQlrjh%Xl3YST@Y-!938'm'A)a%#m
-TVJllK$dc`5UIeRNb9HNF['`lBp&K*RH8$&H(&,L))r%e3*r+NHdfb%SDFqJXIEb
-k%+eH5dH,IlB#D&9Q)b$Yp60Ql+825AMfU(iIPDE+'bF`"VNrBjAD!SAAMd5N6T'
-dS'Hr-8'Q4cGI#`6V+aNa+(['k,L'fN2P,(fY)j'CVhAGUPlLKH3LJ3Fr+hVILLm
-m'IY$'D6bKB5e4dLTrfIr6#$kf-[dB6UR&+&#Id!h"S14)i4%"&Ffh@K`IDql'R`
-Dj0X@UQ38[IlM3H"-`LKHG$KlJY1fDm1F+#Uj+8`aL!#TH1P(a6m8eC6cj!JrVV)
-TiC6ClE1mIpf#LJY$!HL'15JbM3!1Ujkr[*YhC$V2lQ8&9*A[a"Uk&1!SpfMRH8p
-0ZL5Xk%8(Q3Rca(I1Ep[PjZ1`RmCN#ZYkEVJ2QMITj%!iIdda[1qYX44NR,r,GDK
-SGB`jL$C[)C[@VbLU5kH2B)%b*Rli)kYplCT`"2fR5URJ0(Lj50qqJ#A`[!$VpS(
-8$R*8(P)&Aa6'm1ND%1lb+NS6MAI`Bp!)beCc#b@$3h)ai`2!NQrr0JJ684$,)E%
--X1YhRHj+U"feJ3(R!IV9,fRf1,rFA0BkKFmGSI,ABfVX'a3G0aa#`k@iVV%FpVe
-X5EE"X%R%5m[j61GBD!6r8b9BQM%qrP#eBNiH-SErJbT"hXqHF*E["@G2qb)qNpU
-ij-,Z`GRdc*aShr*q6q)$iN6GTHR0hdmp0BJdp6e&[N"6!XFMk!2RHf(lXBL3!,I
-S4PHIJ"RR,,M9KTrCl+h3)+-N'N+K2Jc$'5F9"*S*3#PKC)pPCMRF9D2q#2cj*EM
-YpKdD*mXheBh"+%D2kNq5@@JRJ"E+UT!!jq@H3b@IUZ6A'8Pqe)TB`G$r#1Y[+(V
-I"'#Hc[#de&[@8jf#Jiim[kUJ@[06MG'$Y*kqpm`l+GqkKV!9-6C9bjmTK-Dl8G9
-Xf"'cJhBUIY4QhSS+c2-bP[Nd'KQF*'4DpBbVP+'4DL%arZ`lVr&+V"&b+62-eXG
-F-Z5"RdD5(+cEc"1*!63,-0#P"(@XjYS3[!PU(a4%BF,qYqq0e-jqVjYlBG$1$S*
-9IeE,i(3qf#$CRiH@+B66aFpXG0QT81,'JpNdrl5KBi)lM3#BLR`!k0I*KK*jF*B
-&dZFZFpcCJUVS)jJ8KkRQKH8Qc"YIqk`I0J2dU%dkYNk'VZ!%"V[D5YRjI,BM)MT
-ce@mE$*)D,TS6bJFGLpafbI(dQT'&jPq!B1"eS5#3!+CDS*'J*E04P-f'VGr2-$V
-$`("b4QJaE@JLhk`kHJDq*iGX0GN*rK!&YB'@"Q(4ASH$C"'p$bGLRl2'fEf*2Kf
-e*ZNPE3YLdQ'Q-J(bN4@rYV,hFPEajp#qXZ*YM)*hAmZLN602VZ,cT%&9B9+fc$p
-VpL8XA@5JrSDrJAZ#fQi4hGq`+-iUlMcr%4M&EiU,j-AE)F%CQ2EL@rcr%"H$jYe
-"'+QCq["'hfk2+31*fqNRhr,!TXjcphc)fI`qb"LaZmm(Y$f(r"4,5F2AI8LQAZm
-d3[p,p!$qLXH'dqK9BYNmA#`K26)`Ge,6!A+l(!K,jSk`6rp"qadJ6J`+1-bp)jk
-Df%MF'l"`[Tm-em+"J3%6XS2`+Z(U5TADb'Ef-9L'ZfJ(40'5Kp'a%P*89P2$J&4
-eY[JL'F!l1fKkK2S2r+f,G8cPc'Rer&K[$-T6Y#PYjp2H@M)'mSCLR9LdhYZmUXM
-bS8qJDYALE@m%G`IFeHcY@mD3!"CR'!!!KQ&1#NTR5-Lm+eaH5)@PT3RGrq8S$HV
-kUJKpeM$Pm`%B(+%Ec*+'hC69KadJRF)I@CJY3FALBpP%KQRBeSCmPTpV#bLf6VK
-!M&X8"d5e1"9+Y5q3!2VZ$Acj9j4Y*)QA4Y)A4!1ijbZSaB)ZeX(d25r"JVqm6kB
-"5dLr&IefYQhJlXUa3f61b-S9F@6R6d(&mX@HkRiI6RbYbPj4HPUqB0&-6bL&dAb
-hXf-+dS(e&U9*bk-8r2C*Rc4mckKqK+#0P*+9`81hUI4`pG[-GHkVhd#9#2"+-eT
-S#cH[U&[FHIFFGbrYScDG9'FF)`rldV3D4bBRP,AibUXBVXcmTS,V,a*kD#-D04P
-I8!l(rMRaNb303&0LH-CqX5+%JNjd`piA+c3[b--AA9"BGFBpHpGK3qdGrHQ@l*!
-$D+U2L$m0)&CV"N1Y5qP8fHXbi#IE5I(+-G*FkNF&1149m*cd#cTlP20Hb,G))I(
-j%hiT%SV`JbHFTFqd*8Br[M8A)l-rHI6RY-Ahiadc09q3!,EZp5+`HVKQd2r3(Nj
-mr*f+RkK%4dRh)QXYfZriXkN,)B&0mJM82Eb-jIjV4[QEPM1")Gc&3@D0i5#&SEi
-r#)-HLpmbLBqI[Jk'$$&md4(SqiEb+9BJHpFD0@0jr@CkX@5LMD2-NF("`jKCS0m
-F45DSrjD-BLYq38QMiX+ZL(Y9RT!!id&%)'AlS),CX0Mrr!kPSRLA!&Er*R(""S3
-9XM0V*1Tr-&h%*6G&51@TG-9kP592,c[MPE8UpXjJJ*h-B$K#Mm$S2d,q+IJ#T2V
-2&%J9TEH8Bc3qK9&ZHH#'1lCB2Lkf6SG*&eUbXqF$SIaPa@#Ib#HPMY)6QXF`[0F
-[El5k&'$FdNQ($+D$CT+rFqH`[,)!R1Y$@#*Q0I6dMUlJ5-%NC!*(M#UE'MF5G6+
-$4l29aG-dr,EZfNUCK8HdB"*!bYpP+*eQ3qjeUrmfD+,#c!JEYph)U`,V)$H+$I6
-$TbZSp!i9V''&ZL%HKT8L"a['lfUSN!18V0(1&l965!kk"mHm+9KE%!TfAV##$,9
-G9[Cl4i#DU$Q0l*P+hl@L)jAheQ"Bem,B3XGZQAGA6'"U!@1%hEeZVLc)C4L"cDa
-11@e$(B#5bjS[lrd`-fc,I24ch3*U9re(SD'q'lCSG$Aej'Ge3b''aADjr#N0lf+
-E2XD#Z@c$9rm)0Vi)P&-#rPKq3S(12P0Tq$8`$IhL6fAI[LXKi55ijb12Llqf0BX
-Fj`Kj#c8dUE5f0R$hSjfbSPUi@6*L6NXh!-0Emj6-ZfD"UAd([!f(`TZeHM`P)JI
-e*%X"N!"9U*,6*j3GHA'h'"i-f9i(UCdrV(!SE0#5""Gmma2@ILhNb'bDrBq&6L8
-[EK-Hd'K4mTDlYeh#C2h()XXf60R-)FahVVe--XfBKB`h)dbVGfd9kQqBHqPMjSQ
-6KS1@XhFiA*E)-kLPEI+)-FeAq)P$,"L`BP'XhAf3!2bKe-QC$4"8)1C24R$5KDj
-0"Jl"bPGH!6$[4[AYRdbA@d0-q+A55d#J+l!@qT!!,"'Um'I%m92h6Jb%Gfk2d()
-b(1c9eY#($K'@Y*(4p-C3&H#Z"*,*lLi8*J)Cf(DmP*iBS@@"#SAT*S[qY4F3rqU
-$!miA2Xa*A%hYbE(U!0MZ`00`h8%GM%V5bFcSPEX"4X"bf,i1[YPkN!$`Cq"fSfH
-"MV"(Eqq0jYm$ApV!A(kQ6S#U5GV,NL%ff4dG-Y)*F-"Z!@iHKbXJ1d8R8k&0ZBA
-6jB*5`CqFS(DCSIRVZ"MbM$RSeZ*Xf9NdKbAMHGD'leqe2iCKSl`)cf&dTj1XAU1
-C`[KB,Fqfk,J"jf!G&[IM-K'*G!**9UCSm@PcpMI,Z"$"C)*hd3+lQVYE3X`ZE+M
-D9m8TH)'MpkJEbDX[CaK3$-EJlDQ*BU1862l0eQV"h#a2QfT#,lHC%4230MV'[!'
-4Z%'NHUc4eBr&F,`+$+Kq[MhESCJ+ilm$2Ui8aI!"Fk6c`)JTDb2V84*8b!lNJ%h
-9@(KRcp5cFU2kapcB&K2jXqik)P![I4`TiUm@UVCFm`(XP8C5l+Y&d"R4Hd%5j6m
-p`p+8)J&a%lpJ2q9,fk(LfeGMSqKk[A5`0UJ6eDNm%%"UV@0Th8,Xc0qB1N2TANE
-)'R`P%ar0V'SZelAe'YlKf4YpYUkHS!rei0eaPSAI*$kb#(c4iLA`U,Y%lH-@SF9
-@-2Q-BhLl%A"PijRjrhNZDP%``CNCjA"1rIB(rfDk3[QCDlEAa`#m'K!3Caf&iL$
-"*DCX%3@-kPr,ZH34,qUK6(FY#f''FaKA+2`+6d(E"F@TH(6HUAfq*@Rai)U5[0L
-@C1r5ZAbLIT%8EJf+hVm@(!6%`@hJ90'e,X56S%RCbD3#dbcicV2bD-l!0ij5BAp
-8hGee"Iq[V--'#!D91CVIR#&`@eNLFFTKA(`KZ4kQh&pCVkbpRP@#$j0CTa934E$
-Y3r+l`9&)GlS*,U!N&L'!9QQ05Qc(,DjHA%(LhkVrM1NR#XKH0#fGIF4akq%ipSG
-V(r-qM%qii#4PFI`G4m#YmRAkP05j(S2N`NApm[A5JVMGI8SX*DBKZYDk$qk(&9-
-rBeC-j0fXiPm'-"B%'$q"P8dGiLMRVDJjEPXS*qT4qA@+c#Q4e0UABR##AqBDAS-
-)%acQia!mMd2EZ*8dI`DdJ'Nd-61FAdH*!A4Hc"5-@8KV2,Z&q+3bmm8*lXi`K,1
-&X+kTqrK#&XJAY(X1ETQJj@33R8,'mK$U)S4e(R#Z8QV81r1LLmD`I3KQ)SGrC@d
-dR#+D"eR9GJL,a%6Cq4d&D1#rkRZGZ"ZRi2`clFX6F[#!%SP5C`Kb'j'Lh#%`59,
-Hr9lRJ13*IRZ)H%lYje6Ab&XJC)[1$A-ENraX$mV&*CBMLMbTmL"P4Vc@3cHK26T
-iCYebJQN(0398e*&Y"VT'#q+XAMPE3`K#abC``*+[0(9A1HFhQr,b)[1Xj-TbZh5
-J$,mbP[VcAljmGB3'&Z-pJ)m'RKPY$"Afj4&Z2(NHU2P[Z&NM(dA$!kC622H3!)Z
-rmi6'Z64E-LTVmaS`Rk,YQmP#0d1YMBYLXmCp`B19@rG3$NhGf41#E!+e@[6+mi[
-PI2b#S111VDdJB$T9ZQ*TDI&h`I`XN!$"3Ia53LmqNfId3`5eSFm0%F-`%B&BQd'
-Tc@IN%MkKIGb4+Kl#NT1qi-ZkCE0-c6C,MX+$fC&VVN(-%I[*9N&+*EGRX[&iBcl
-`*6VVp0DiZGA++rRhikUBpL#YY,rc9eREk8YR#cf,QT3KG4G+C4$aLKPRVUIi--J
-&98pfrhDRp5hPB@jNkj2YE8IGU,3JXdJA[aNE@D@ik+%cj&lL%qPN#&X)2UFYThG
-Fci*Rl!MAAa$'$EPM'%*qAdGM@q&AN!#`F&pbXiT!di9SZ2UhjBJP5GNM#EPL@AT
-P&h%"&d31iZ(HmC+VP&&VEm1l5q[c+Aj3l(6PJ8jM16U$G"'6Q9TPcRP6c6jHa,(
-r+V')cLh(AZcNAJD1P&2h&%-85Yh,@2MCSLA3J5mY*J[T1-jIc#U988KG8eAch5G
-0Id#2Y0`i*S@a6Y!SJSUUT,"'VfSE,A5(i@[!JGP6%9K25!N'l$a58kr%$NlAFFE
-9EGi!m6X9hT)lL(!,,3LTZR2+FImam3kd"h5&4h@2R,lcfJZ,GGaXQb$8L`QbQEM
-eRFM1M[h-&L'T0X98EZ2-p6DCS$p2kd)mjQi@m$)N)m0[XRiK,&1%"L#mqlNSTp#
-UQT6#(GXaR'FYib[S-X&NY*f(lFA*2DI3r@f6fS@iSNaaL)hpp-M$h3h+804QMaI
-6@UK%%BF#*&QQMl#V`H1j[fA6aL%T(,SCkR%RQLD(kUVQ"U$L*4Lm1ERRr#VpUh[
-8VBAh)+T8VeKqemIL@rD+VKbIDQaGijCr'rPicCYTR[P#C0VXb-LPKUe%-DB3[A9
-MC[S1-CUX+"Q[L2m[IqZ0e2i&ZEYdCBl1h@C[f*qe4I%fRG#S%8`[DIh6CF!aG`R
-Z8D)d%)QpE,@G*"834aTHhFH&0[N@@%FeCNlaNUA+,ERfh'@(a9[SeNB*%%'bI&0
-,"IZMb0""BF5%5KVre,C#G4dLdH&2mTQfm(((d)KUBEK,r'0p+8YE@&DMl-1j6#,
-HH(,iP`*hEe&DVV@#jpKqpJS[6i`Y#)'6[0C+0UXT9%%5TS[4Y#h+,K1GF@m4qhk
-+!EYqa3#[ZQFKqakF!ml*6m0@Ge[XMR%i0&6U85T&dlVlG5V(3r@0T@ZU1"pd$#f
-`ak'ERE86(@IQV&DQb6Y%FV6mD@`kZ4Y!a2"cD&PHY)!`"pD@d5"AA`'DmFZ9%D(
-V19C[p4R6JjRGEQJA,j!!VRkhKQ4-ADHiAFSEqAK2V4r)I,'A"9cDRcqVMl3T$Ak
-LTA"5SdZX+ITL5['9#JjQi$($6K(Cpm@)EQh'j9I#h(#f*HKNAXIA0Dfq"Gi`I&1
-3!('U`TmVq+raUpc,+,,1"SDICkKfCL0R&6Sii6EV("MLbe@#Sq5fMkRFB*Q$PBm
-K0&p`3D9E`3A3f$Ckl"j1386Zqe03AIMST$D'5%Q5@ZMcUYb19pTi'6IQKf,hb1a
-3RQ9rk(de3ZSL84C5+6@kU3mfJfTdk,NJP-cef64QLqIGNCd'BYl54h%T'c5F-3L
-PEHGe4dHl8'NV#8P%Nf`AN!!T',3YAKEq9h*bRHYTl%aYC(E)-DK2)V'-J-`a9[(
-`bi4Mk'RDL+B1"'b0iUQ#KSpae[ARIDI@e9pQSJ5$aVcjCS#S%@bS'@EJd9dUSG8
-+hMEQ+Gm$#5VUYIm4X0b9f-3XNJNmq%(#0B9-,0UT$L,eVpbIVFhGcZYHmb%8@l4
-Y))BfR"p-HG&f&*!!IH)8FmU`bD*56C5I4mEEX$h'dZ@LLPbZR!abjrIeSJ0-2d%
-N@8-jd-E3#($"HLRPScfcMX-FT%#hVK5kD813!(14eB4lpY@b5Vc%rJNX'2"6$,V
-*IS`)@cBmAD$90$[#4NqVh9`IR'$1,YqlfJ'5PD1#*C3EQ[,*CcbYb0-c-35rdbf
-Eflj5ZR%H3bGL0m+pPpMZ(Zmi4+5YXZcUKDMGqTA*b"-64A890rGeq[ARNdU0KiR
-2TZhJ9G)!CR5a`jM8CiSaKf'Ldm"Qb1*k4AFC+,8kIDAJDXC1$d@&F2P*+kmG5`H
-fM"'jhf+$eB@G1T9+QdEFK82MEl)JL@rLNj3c"AEj(Tf)EQqqA#mhZjSpGJ84lUM
--+cQm1+QYi-f3!$56+RaEHYiUcjKj50JNr$E$8k&q)R-H*PSN,4kB@)&2e063(D0
-`DXcc8#BP&T!!PUi!@,%DT!R`(j@%0m8cj5Zi3c*llFr[!EP'5[cD`QRPdKa-'H)
-`'6C1pe,haqMjZ0IMV-f4NeaKkp68e668H+h2+QCRFm6"BUY643#j(CHkmUBe,H6
-pV21J3Bhd&0FQEkE-1imqEY`,34"R*ChBp'LKhhJp+6Em9PZ&R3K*FLQieIB3FjL
-@GA)ALEhB8U2bRXbbM,bNIU4@Q-(aR&X!(1+,kCREfClCP!HFDSAapG4i@11a'm*
-#BeS@PDK#2P#3!"pHHAZPj[*Xp3K%MaV*J+&Mhr#RSP`8UF6kEYM%K#IqfPi4('p
--h)-qd,3ch'RTe[U4SZE%Qp[Zj#&Uhe(Jb0q[+`,,3U9J%H"[iai3C,`b#4bKZ(T
-Je*9#ApH"eXfr!+Qf568U2(%2&EJiAc*-lkE*Kk9LLK`-02Za0eSTk)a0iJISVRC
-5hUaH6DafGC9fBbN!r*31b1@@9e'ARiVr8K3)pIVVI4(IURc$6+TAaGL1"U95Hji
-[q'e@[VL0FPQAMfaV2kXFUrB8Xeq1lkj+NM5L)ck1q5BfCbfpl"JV1kVK%pPFLIr
-8@@aLi-SXNDNITRF+eHj4#mm@1Fp#+2#%Lcp(MRM4AJ`i$lakKmcPelb[h696%jk
-%pp@R*J4pbl`'ILdb24f(E980,$-AKhfGf@ikqS1l-e&9`bE0L0HYDV0,fHDF1+M
-6Njh5piKk['MD0JQ2RML2"pqI[NMclqfhM6XaV-S[TR`'ijF9Vi,dZK&iR(@ZRA*
-(cf&,i,!*Z*!!SKj)V"Qimhh8)kBNmCP[VQZBKk!i(!2(i[cGdRir,b[J3pVHfAF
-l9afj0$ar(3-Eq+8*KS)&kMX$4X-d@EPldD6"'41kQXY&'pNT&d'(eGRlZ*Q"h-!
-'9EXc4qi((PZ`(lpFE)L+5j2B2a&1`YqGAF4iNBK&@m&3"1)838)cPeSQF,VQH1E
-JY0r99QPafaF3-,#TdkAY&mHN`YHK'#P)%S@aMUqeerf#%D!Yck,h33Qea4f8@FA
-bDM6M#+#1hB&kGUMk59c,33F(@(-QN8S2R2EeL*J`#49"MQiY0jdkq0CmjkVUD4D
-VU9,Q3)0Ee')0PUK1,rFmJB(P4*BVCFYPQiL#UP@Y$5V9d*jfS"cCA6SL)T%d43)
-#Z5GB([BQeFYfrQb&eGSU0kZ#GP(C*jUf+5NV2h3EQ6+M3N@+Cb0&3RhD#hF,4e+
-1h-ERJA"U6A22(qR[hAZD@f&j@PRhcJemDpMHjdH"4RZ"ArY6FI9%3eQ0,c,Dq"9
-V!T[ar6)J8TLYc3(S3N+i1S(hb4J"di"K[idYYY-lbB13!(A9192,cVp5dhBKbFV
-)rP"%5R)"QmB$jVNH*,d0"+4MMQBbk)9MGr65H"V"2PfLm98FD'(#8SB8fRYVfPp
-&TqHN!9+QCLfVpV(8QT@5Xbk@%%&@cZ2b@,815#Q-`!lT6c13!,YQ0pMpf%Y&Ti!
-H2R()%AGFfp#QkF-m+6`8m1![NjBXaN10VTIdIc,&jGL$0mVFrjPRf+jT5af@cJX
--Hp+@[TTc#-aRVBjVM3IkB!4)3Y6&a@4dKqb!U09k4jdM#KeXZl98")G*BAa#)FD
-d$EJIlI3(YZadY6$mZ(mM#!k+A2f%$Vaa$F'3!%PJ)Q0@Y"!mA![a0F)'imAU&Bp
-"UmliLR(AS"S#Jf#J+-rID-VUJM!AN9@DlYM&SSIT"X+ZhYjSl$b*LjSAi*PqPaV
-m1)$RPN6h23h[953-@YBB&fINpX"%L[%D6M)29ZV8Ab5P2XGZCTN!'$Aq1-%HfP3
-R*qafH')p2+r!$C6r0"(0'"5L5`XH&BJ3`pY(m*SBJAV$XfI4[)eM$$6[C#Xe2T3
-rZU#e9A%&RmS2i*,56rG%")G6,mBC[NdUbaJccN*bLa*ZTFQjDffLF)d5eI["b-&
-e4dc)l@SQlI@aaDa"m[EeT'IXpBH@)GZmmJr*-%BVc$X8pXiIXBJL(Gp$LmNm`VZ
-)TGr#hPAe5[&8lh#kj5CMGXrq61"JLdM9cpAk8Af9`Ed&*f5UcT4[p(fXT%rrmZh
-KYF$*iZ+d)ENJ,M&lX9L,(cSf26SJ6ddqH)(N@Dpf#BSqAUpV%E&6TDMf"RV`43Y
-S(45B41X9*6)TP"KE)M1')C5(aVAMTJkhLl'e+f2(Dcb!ic5"Yl8DHE3*XPl"m@)
-4cB$Hh[%4YcFH3c,aeh5Q@,F&iIp3bL,"fq&IN6)HAf1[hGC9B+48AH#FBB3!%j6
-(MPcF[DXHfE-Rjir86e$l*f@&TfN%HP`J&ei(Jpp6aA*p2NVRZBD8Y5LZBa4QNH[
-SD@&U*5p,Y[r&RCi8TKI(-T9FSk#L%@T6'%8Ji,&3PjFmLqe%$$$DMj+"YA%pm@9
-,qB9k#S[j#"UiBPD$([m+YZJT4r#4!E120eSf%USKV`er8NX8Vb#%KSjR6'b8&RS
-l)*'`4L5S#IBMD-F!Sja`lIE1-0"Y9E&AHC+Q&9Q%6B3$1cG%i(Ti5Ue`d@8)J5b
-Uf9CE1dRIbr,@"-%[%0[JDYGrQ9dVIHRa+kBjG1Z2!i@-McS-ThJD+5-KblL#F8d
--iFI#cQBp'VHb1S0NTqjpbCkF)E)q$2bM"e3-"aNqEa%9PT3844q'iRHb-R#K5,M
-MM[GlP`C2$TNbJY&Z*IdMk)ke'3LD(QJcF-pY0-P8-,6Ip`$*6fZ2e61%qPacC9B
-UrMZ6(Z2hHpX(Aa'I0X5EQ4rea-`EarES0#SaM%,8F[jdHAKVM,$&p5YPDK5I0)!
-i"B34KD`fK-b-+A8iU,UVqM&`kqL`Jl-`#&QkV41GU8#(9*!!ZTBISfm[6`E8C-N
-i)$N*D)3dN!$b-EdI'Nad`RCH&1P*M4pk'XadR9S90r+)pITh+6K'4Y6'[FdpPlq
-+-5FPRIQ4Gj5-U-aXPXS-QVr-1D)pE+CAA"ZkES8H`RU$QMGVR-*4@14GjXCI"$L
--"hNkeFd*q9rR3XPDch5PEp4iqX'!Xb9C$ABST8ZErihbi2"@"IAiK)f-l-mTS-U
-A-1'!idD!kplJ84[81rSB)j%&hJar+V1'KT[0bVlq*9MEjKlIAJ1lPlPCcDS#C'i
-P2CD8#G*AT*j+5",ZU`U,h%J`NN-,L9RrTe9@[B@X6(h0'TTq&Q2b4V&-fEL3!#0
-PH))`S2S2B3!#AaN2cba4XkNEmf"-p%A#kjKpl*A&%Db"3a@jbNBdZUSK+dKiJA8
-I$*6-CEq,0d`Qm43fQAYV&6P6[YD(!*-(XmV'i%bG8riL'180M!FRPdEVQLqkMfR
-)5+[Y4iQ004b-2*cK$$!"%0)mV`DcC9qifqiTNB31`%&KQ`r9dpaKIFCaecH8"1[
-46$2RjCA05r9"j(if(-PXj'c#4KkL)&ZeNlHRT'18bDK9$"N6-j9Ljr+U%2I3BAf
-E'902T`L$`FTAI["J6G+lU)D6SE3`UIK0(jfYPamr4"R9Djj'f@hfR*!!+`MDB)!
-!Bcc')QEA4PeCi$9RbA#aG9VQ1qjYQ4jeN@K08r#ee%U8"'J)i))eR@3+hkBDaTF
-Uh5!d,)$XFQ@9Nr`$-ie%Q!hE)dM@riSKNl3'QjqYY+I,l"#ZMJY9XSQfSaJ)Q9P
-T'(#QUP62)ejj@9efGAa%Z,U[#U@DI*iJ9GSpV)(XNEhTfbh%K4h$b348lL!c-YM
-e9X(BbTPGp3*V3Mk$0G)j2P&4aIU"$VSR`d%rJD[bd$e'$5$6+PJD'*F1d3TR`k$
-I',A8P1DCM8VrPCL#+I"@@L@4Rc6S+IIkK#8&MUr0i4%@U["ZFGc6T5N+eqYR!*R
-NG4BA-PYjG[F9QUr0'a`8["+Aq(`(8,`@Hlb8YI%jYC3AqBL2'(-SZ3"&3P#QjkY
-9afe2iVE%XpiaQYqIrjePGUNYG$&c0AS3P*!!-h9JAYmMPj[@`[$4S5'Vm1X&-[J
-XJ(GP0hB3lUMjX)Rc"[bQd*2'dZM#H#Y,1[3!&%F3f*R6NQ&&6YR63hmk[S9QdGr
-fdbMB12'rrH1(iHCr08e@Sbi-%9[e*G[ArF1M6+5iVMm8QK"%C),DbmZDIeN%BR9
-,rmMb@,leJ[&&1Zk9,kld'jQPaeBej)AVR'[ArATJP2')ST8KaMX6-*pR2Ej3P'&
-2C!&KkCm$R*%4!m%MpJSAiUh)2a[YmJUPIqkQPPHRBN+beZ&5QKa%FXUV&Z10[mj
-ZE3-A@`$rEJ'-6dHX8+)mIlkL@Ab)F0K[6fKZMj)UXj3#JU5V@#Ph[c9V@bDEIVN
-*kGXT*6pLH)(12GbJ9-SJ+r2*#MG[!*D-RTC-G8LBCMpm9Y[T1!-(6d1CfVa`p4H
-1!YH`BYD`e4`1YhCc0jTHJVZ[plLPXp1P)*fKqYEfcZ1MM*)([V*`#eEPMSdQ9-"
-Aq4h!QICJdm#Y)p&p6A-MakA8(V85ERl6bSTE8@Yc'2T@rcIqij5l$'f!I0Ferab
-"PJ0"`S,)j&TlGEPeZ+X-!(%a@0bMJ9!C,(1NQE2d[iC)JBmTQ0CbVBd+KmDX1l1
-(XMF'HH!4@HH82@Q8DCIEYdUNZ3JAN!"1KMlQ-kPUi@RY[pAqm9k5Tdf1[[d)A1I
-$R0d5MZ&cPi"Y26@prAaC%ZfQch)UVQr#@8KH$R*lCA!R@GGQG@R%k"PS3$m,NXH
-92d*'bNb'b)BNkHZpTbFVh`D)@h*T(cC,DhVRqPl11E821%QRlU-ABfiVC,F-i9@
-3!'a#P5F#R--m4T[!SRVX-a*LfbpMePm+1IrLX+X,52rp&k!3!hD$r+ejFm26ELi
-1i2aPYfjBZ'U[V3k[2PAhZDqCh$8)de*XqS3AM51ZiVhLJQh8&i'QG5al*Y)'`G@
-22$08jUqVM9'pebR"j129#Q@r4MH[IV8aUkKSF8ecN5Bfl3Xa+'PNa1B3BURlCCG
-""T%l+l&l"3$m`Y)H0qeFC@"JK')13`6MQVpCH04-qmJP6m5UiLfFBFCR)Gfr54@
-`kb#J1MmVMJ6PE!'9eQ*8+hN*,9#)&pGlAaRkN!#'0iYq$lc$Tl1Sh"Xf`M5a0BX
-ma$9,9ZfDBGfFqk!@)FlE"a@UBJ$(Nij'EKmMGHjP)If,0hX0-AG!3UCjMlI%3r+
-)Mj-lji5$LP,reRH3!-N(-CXVje1XD6B2Yj38*MdrG`C!pYTh+r*HBJB8pSMM$TH
-&*CUSSrXV(kfqZ"jPQ9ZN9U(9&T&b4f6N)PLh`lCEZpK*[a(FDHS9J(eElGRhLUS
-UHmHVf5*hrj'6j-@,@2c#jqm1TjUF0(B25BS6fkmFCF(@F!AEIcpll)Q)N!$@CR$
-SF+fFZG1C"hSNi[,$,8c1c@Q'Z(iQfIp*lS&+,`I&`506$5a+[SHDP#kK4N*E2)6
-1Z!1HBpf$kLXGeSP@1Y[#p1R8H@*q$Q5)`f%%GqrarqA$S!p52`e-`1bNl!UHkpa
-lSUF%rq[HpeJ!Yd+cLKSkVR-Tajea%S5(I%FpYe#jQKQKRIe$)E9H1kqFMSUZ9!b
-!cBC2UmKa,`*[bj!!VdPNUNNmj#)&eIJXc4-K#d'6mFQfML,k%"b'$EZRH`MHrA,
-S94'R40m(mkkj0H&Vb6UP9h&eb'GM3!*DJeB1fambb4eHrUbMper+UqV4!Umc%30
-kjV#YTAUIl+rfC'096--N&U(G8SbYXhJll5jMYJ,Zl@VSPhDBIM94+GcGKGZpKpC
-b+(N6-l6p$dSQm*L`BPrBaD"XHaE%QUL[1B"1SXXf4Z4iIc$34A*N'Td0A,h9D3f
-6*5jM$,*Ba*Q)Nm3,(abY-pk6+"a6-1"0a&5IQrPll`XrR&iql(#P[f*P'AEYlb'
-0H3cfD@Y`4TYbBlNr4CSRf&M2L'K9*XEa(8"HdPLD5l$`kFT[QS[4BGKlh"D%fZL
-HHQ(MZRfVBVY-R*r!k(Mk`q%4eIi,hlGRh*QmUM6hQ%qQ2Kj"*f1-K'Y!qL@6mBA
-0@[hT'$m!NK5*GdEaEFLQm[%ZJT8IDqY#qd43L)-U%JXMN!#-0"JVrq'l%p5JeE+
-pN!#JTa5'eN-"GQf'!fj'+GkG#9r@Zb*&2F`bF!UUP`BTJXm,kl,H!eeY!%X!fGk
-#4KF$TR@S%C*E@#rBZY'+XICKV8M[3ES8eY`3@bhi2D#1pleLlIl2HCjM)04#cKK
-bIQ(S`%i#TJ%86Ga$ej1T`&bkkk1j+!Gd3(LqbZXcV#QLY&Kd5dRQP8[T34#XGQR
-#Kl8(Pj-S4-I`&`fY!%I@rmhFBlcRp-)59V'pRY[5VEQ6U-h%IV[IK$N9(Z#dUMj
-EMJl'm55)'1YJFVHI5'T`Bb2CG"F9@N%dD`[B@",,[DD#b%qhmr3Hq#kL+d3rUJ2
-LI!#1al'fTQi[+"Mi-jC&00I`K*R$CmNVZ,CHX8A#-fT0qL&2h2)+E#@SlQY)b%q
-XlKPYdMGbbV--XX8CZm$E4lj#)32ic3Ej@)mPN[)&d`Se)9VrM5&XSk[BqM88[,j
-XbVY+!jlJ+GK9'fZEBh%VKaMbfZQdUE3[JF,YpJmbF2eI-Y5FKEl"9L64YARNLaL
-qHMfFGJfFpR$VUP3KajJE8SP[$5-#qNm#T8a-GXDkbN)8hFFd(dk@C"`q)J6URS*
-2bQ"!N!!0@@i0,hMVDk1qX0!"IRGJ#@Z!qh&)f$lkJarIKDi3r$`ISc[Q9fQFD"V
-'e816lF$2$5RX*ULe18m9CV1fHLYFL8qI+a62'V`9I@`@!p+*qkHD+MH@`p)f8p[
-dE%KC`!G1`hSU`klE21$VSK5Jdch4%IL1dX*#VTiq@b9HiHV`0D6UVjdNYB9a(U%
-HjXY$QZf`KkG!9(`DhXrJ0XriP[hB'U"imGMHdlN%aAG%&$rq((*plP-qhc1rMM$
-a*'JJdAJ+NE8#-lU&*P[d&,e%2@kNmPDh1JaqS0mI+1bN68i,CT1"8FlGLjI14cV
-3F&#c),4c9lrRU68LY(0K9XlB"q0Db$4KcSF3-HmaZ(AUU@U+ar3)8a%jfB4fB'f
-ai("jNpB80LH[UPF6laE[MmBrqIrcV[m"cQ%DJYr5S2&aQQ1NS-IP`DXUU50hUbT
-Gq"@)&D&UkTQKhpR1bX`SifQLhb)&K+le1(S#!Nl"e%pK0[[[eV63BEAbU8$X5iM
-H+rS4#!l0@$"PrZ*,4BEB3h$Y5j8I+,cGjY6h(d%m'IYZ,#hGMdHGhqrPejF2[%6
-'q!BXrpV#@Re'KKQ%[kKN"KCI6mRS5J[TraB[f@&ca-cZ@e8IPhCMN6A1!P)[PL2
-aIr"dqS",P#LMkH"d0@d@MRm[YL'a%fJX+`kYk4cmXTM@QrEHlV!Qf-FHlC&bZPX
-+a&h1-$pSf!H0&D3AI`fE`KplUY`Th+A%ec'r),"fc[KrTe,4A%jQY&*I8'4ppCq
-"l9)$qaNCG,(FHbGPEE0*i%0rSZM5Xh+S([bYAQ!IRGqk#@&Jm0N6@*1hd,-fb#C
-J&NDDS30pcpN4S9lH!YH&CA'$3SEV+J9KD$6'q&[-!$d`J+VZaNA`G*0Gh6rp-Vl
-1da+RQi8NL&9-Tb!U#pmDH3Q$'b!ZAT0U%6A0!8r2@&d8Xa4FP0lEUED8Cd(-8[I
-9EFFp5)PGD6qb&+H@q#'lUTel+1!LZ8r4XKNLV"IkHG!,Aiia'2Cb'QS81kG@YT5
-c!TE4UARiA513!%54Y!Zp2FJU"Y5U($ZAT*Y3%36,f$Q&i#V&-XRf8p0d6Tl'd5h
-E-UY)fk1A3&1DblABiVS3)I!XjV*c0mH,(PC2C43F&kAT[4LhNXYp64'JS(Z4d!R
-H"h@4MihmIeU@6mUDre,AZ*5r6&qX4Z6B!cZjB"RE&lU5$&JES@[Z%,A*l6qjUXj
-0m$rLj$MdlJ@Q'YM)B*!!TU"ffi-aKAYP4+pa5Ai8YLVL8D)4)%lDQ%pPU9qiPdj
-"V1SC'*)%P-q`-c!5$b0q2FVVqGV)B"$*+'5YRM@RJ*Eaj1"qmSMZVGLJHeAL&`p
-(XAl&d+GqbUr'rZkR(j!!(AZ6F-C$9'Gcc&0c,ZUmAGbR5BB-*5@)CU9'8,Nf#10
-BVjeY%(a1"-h-)Aehq2BbSPDXhq*lhjUMMf4*"PQM$h(aPT!!rb5LdrY+3q(`ppa
-@c(XZ&&Hak(Y&f[P@@MA"*C'2@QK%h$JDq#+M5)H[VPH0j&5UJd#3!+U9IQA%'NQ
-A,+)Q4#`&q%L!R'C@Zq4efb[c%d6[#VIf*j!!Aa6iJfPd&1-G5YmkIVqP%`[fhY9
-Z*bP+AQ"j-(6@&!Y#eIb16G$PieEacKKlNa&R8KbEbrKBprA1LFLqVl+ACZ-hm(-
-GBc9Rdb!5)qhZ!N'G5$ADbk0[L[r#-%VXIqLJ(0R,jAf2ep0ZFcZF+hGAl0r!2N%
-@NEEef-Yr@-Y%#PllBGAUjC'i[drp[aBVbPJ+TNj#-%!hT@je4@YRB2m8&2!$U+l
-a%dKLhSk)(@bIU5l5k"C$Z(feY"#-X[K3YB#U+p"'hDkP"iBkK'38"8RGl,(r(kN
-"cbT"KjJN4D`a!k&PCR3)X0m4*@X3f#eB!Y-[Xpq3!+Hb3'Q2XV,bjfRdaX$0G*L
-$4P9E*iZAr@jC(8)$[4XekF'T+Kc'a8%``TE3dj!!lK-ND2V&-jF'S##PK-ilqdc
-M)"eXaBklQ#E*RFJKm#@NKk%6j`QlYC!!i-dbDG$-H6ENVkG0SMFH"CmGQ[a*Mjl
-"JqX`,5pGSDl1YFH!["CXMi)0dEc9fG3!NK0hN!#*(0m+f!)5cIP)k'BDF93Cq'L
-hMFb)$B9NSjB[TUGIa)a4#icTTmN*9[K%[d+16R#iEA5@c,9KkX%YM,$2[mG$Eca
-fZlpQ0(0C%NRNYa#F4+E1Z*XCXXaBVNBKBX'blMjrGGQhe5c)Y!A[5MH)%G-T4Q0
-F6RZaGe(TVN@mmcJ#fJarYAG+TpV$dq$%kR"he65&P%$ZNV,*K64jr3Q1&5p25f"
-QebFrVA0eRG8r@"mm'ZEi8,85,96X(B,91Bm4J33Ae[Q%I0+pXXr8Pcqa8qVaPYM
-U(U"pbTJm(@BdT5ESGH5Le"rceJ'03%'acRU4VbY9Jph'3bXP4Hj,,6"flZ&Y2IF
-PYmqZhB5$k&ET1@0F`bN5,Hf1)LRIH(S'`(-L42G+XYlDkZAQUX)f@H05'PLh+-K
-*,A%$YlGac5rjXa5pje1HJiF)#KKB&m2H$(*[rqpNG0iSaV9PSS90!RjN+)JYh&`
-VpTTm5-iRNp-+%UPJPk#0*IK4j3jYhjTJ*+),Qed$m9,L9pc[9X6E!)de1GIS05Q
-VD*&*k8GjLS"+G854PmKmMhI"Mh%cPr8VqRZ1&-G8Ii*TV3XFh4DAf1UV[k8pCf%
-,RcXH*6Ui`'!qX[jEpk#Pe&Aj&(!I9L%[c#5I!,$0am)Qr30eS$5Y++T@"-B%BX[
-0NiNHES&eB+$dK2MiS%-XPKU+K-lRPf)4p)%9c,X`(0+&cAT01+e81EB!j61-UeT
-0haX6CG"`6$c5jMJbcrh#pRL0dSkL$imrF56!Mf1r%IfLZHrd[+&"r##bNT6mCV`
-T"cGj3ZcFMQXVX1U%kVARHpfH"!TfN!"09c'2eD3Y5VY+)G@6##HSGKc&M9b-+MS
-#a3#TL9$k$QU@DBeT(+mbLV9IHBmI1F$rcH"ak#2fa0FU%ef9!mqCTRGlY0,MENf
-EPq)&I%(8(,2qXrrMF@Mfd[@('4f@6pCJ,j!!ATPX(dmXZ@UcCbCR8RS1c!KT)aa
-LR8mGb%TT5&*(V8*lNff'YUQpG$##[DlTL'eUGC8L5E(35jq[,0@KEacma%-LXRC
-N!M$#i+Z@*0i#D")RP"58a8q8f(*acXVUYV[+H&k1$F2X+60M"9*MrS+E,f8E6B8
-lXYM4F2SJq"T6pS@$c&Y*Q4Zd(5PINN'*UiY#6A[$,6BMkhefLZpfP(e2T@66GXY
-b`3D%GhqT)i&ZTkf5PZkk'+d9@Qh3A3`CQbjITGX(T`r',4XLTAV!Q%rRL@8*fp`
-%F+-!I5pQrT+$(hHT")IAE2rFS`Rk&KTIU')E9*Yj4`j0,RXKDh2iIq**RD6+2A*
-j8c',ae!IIZ+$X9X36S1CSCa0&'-8&MK0kRrRN!#`hAPT4G19Y"XJ6Vf!p!Tea1d
-lP@h'ce2$R!rKhJirU8-l$*jm0FL,jLa24UCPbJQ"SkE$qaE2B"kaX-SF)6p(1TI
-L$2GXBF[V@+$8#lfB(HTHC[R(P5KqTl+dT`5Eaj&K*PCQ2ac(m#PS4G(F6#)T5GE
-d,dN6b-ICDGV%"[V@a'UTCi6#bc39S"`&TLq4Ecr@VYE-CZ2jDfLL5+L%83QqR@T
--r,hHF"$68he1L8'4ESEHpX3p9I0ZpV+*FqGmEML03q$I1@kY!G98A)RdM+4SJmM
-%U&[C`0)Mp"qFi@*%`rhic#5)"N$#i*Z"[-SY$623MiH$"PkDm+%@4BNml1$3FqB
-HVrlBca,HrJ!6a2QbS522e&#MP*mFhM`e%5K`&N5JZ`fh"Xjj&PQqQ&NdKEIi!+%
-(#TBT%ZpY6p3qp699M6@+ZY*9)kJ!rCiXr0)+P"lCAG[ia5'K@kKVA&mc#iXJk&H
-HR201f5c'jC(4%$33'BH'9b56%p2QFr$HkM6h%8`+3'a`[9GD2M3#Y`GQ%MbU",$
-a"5G'X*@eGZPrX`J#e[Pi#aZ@e3qNkYd8BNiq$4Ace[d8ea#aL5qllXI0&XB'kkb
-Sa-R"f#)PNr6QI6*8l"jZUZ&kqeZ%I8CFm5Q+5f[Rr2d([++NZ@iNU#C1-ikq*-@
-0d-U(2ce9+8ZXmK#fafED(&b`VT54-eX%1ajjZZ2[[aa5'3C(Y$LJ3YZ&e&[9JS#
-PhPX(JSE9iJ1ICF5pI#X4`3+"fM1BD-Q4i"`MJY#@l[b0#RXZ3kpRbrIrYN(PrM8
-MLpmhke20T,$$3BVZrZad!e-AIFh[*![KUYU6EmdRqm&JJ(N2ZB4-"aSb[L)KE1!
-b!h$FDhU0R`2lf35rkb3LAaeaYFT*ba[*IfT4QBN8mJ`*-M3d"[1'!%AJh&eQVA4
-%%NSrrd8I#*!!CIi&k2M*A4U1A$cYZ622"rIDHYY1T&6jYchA1&b0+G@1G0%`5S#
-*ZD'UJ14G-$`Z[ekNC,a9dJKfNAeai)aklk49TJXH-&TDe!Z03rbCmql0D1rd1GM
-dSm&SF+rd3hMFUlVbji!'VKX4p%)FeEe&X4PblQ,9f,fhMa,+KYf*HK%3#4*,@q1
-)MVI5,`k!Ff!#Q)mCG0Gh,TI)HhaHX-LETZ,3%[Y$"lb2$E046))j-P&f#XeHd[*
-hA3S&5@LI6ACp'kSa3c`iTqJ,4h*2,`$J0@$3%)'6[mDQT(EkEYaN0[fZBU)C&20
-i#-d)Aj9IrPa&"JT&M46Dha&5TM69R*hcA-Q&D2MSbMq(X!TJ93lBN!!KNDNEBb-
-)&DR,A'-06I`ZriNb+2E+9[b9KFc6A,iYq)Jf9r4VZ%E"#-l"lqRjU%Kl%aA4f6J
-m6)hLeBV,US)12q'Y5VXm%08NEfSmfk@JlETd35-!rR*Q&GHEJRE,[X4Z%B'jf08
-IrBEG&qPlLXaX[(3VY+0@dqFSZ!!m'Y-JCS9R()!b[NSc`pZ4Jp1,B#e%jXfA!Ea
-YV'T!2eKHc0L8-j%+m!M0"%ea&Ajf0C0U*S4C[TL%L[P+TchlLm()mK(kZja4YG1
-1p#TC4BLX023ceKU!"KKjb,8EUA0k@4!6A1PA)VVlAbC!S4XXP0!CFaMDFbdAJi$
-3,#)1CZHjU0#F(4365@*VG3`4MT8*XUr0A@2Y3+VJZiD2'PVIRmcDadq-"chc#VM
-N6*'4&U9h2AT8A6"#%-"(9Z@raDk%UIDE+%'FC5PGrDRH5XQHY5i`#!ZMq+Z#@pK
-Z(dpV@#G!*4e'62UimDhKh4Y091Y`$6KY[V(m(YmT1`aLrbYbZ9Frd`B-a)kED*G
-L)r-K[5!XYk4'LT!!Ma,V%!Tm,iQPHTXS*6R&YNY5PZclbMMf+$&VN3'*N!!&QbG
-qS"Mi6rIDK*!!(+"e-6&mqjbRI3A(2i2SR&@EU!QZ$`)PQ4jKMGAe#,hTIAm+Y"N
-qX8XTHaP,S&b$cBdkY81(pqC+P8+YP43$'Xp%kfm(mpfNAa[-VX8!S#NaU`fNM3G
-D)$9*1K&p4F$P[UH'CmYp2&L$QaD&)p5))P9$43I[h$FR5fRVZeAe5jUVCRFlbc1
-UZ)$Ur*qQKdipZ9DDcUB%cPfIJbPP`b)lXP8HGC5%d4dMG*dUpN@@bMPAjIEp$df
-XLVNDTD1+a&QC)fpYE)ba8'6IFGL,@2,&T5+5ppi)6!UV-##ZUbkJ&L,#rRS55E!
-8a`*kCD5E,`M,`6A!PkYXKi[RRf@i[[a-34%i2I!`B5jcqUC!V!fiZMM0Y#k0mCb
-M9R[f8&#EYHPS(f$iehFl-6`dipHR3EYjjlL+GkHll%(bi+80&#c8V`cbP)5#i32
-rU-6p"0SY(1j6MP`D@@JbXM,0%2f`li1Qi5iDjKrr5%MpQLF!'ZZ`P-MUmU&k+H2
-MheZI[3&$9m%9kf3A"If9rbpklFNbG$ak4-RT+E&`G"8PS(RXRNVEp*!!MQM[`+S
-*P8V4kcSUel6edp"%l@3iKLi2M5B0C+JfLLj$ZPDl5"EQ+4@er-iIc2$l6(Th2hH
-l-qr3f5G@TXjHRfiVrZ3f)p&5TqDPKq5[V4@`&99m(0CDPQ#)4M%fD$,A(('b-R&
-hB$8-'YU4M[9BrcfH43G)CVCB@F$ECP2d6SKU#K&mPF`83'P$S[r(1-UX03H$@'A
-)c'$kCTJjFYiBYfIq&r0LhA0H)B8bpRfHZGJ5)hla(Bh6Y4!h0e-&-!qVA3EUVE"
-iaES!GjK)pr%Q4,@)X,IlJ+U1%dc`,bcqJDS+SJ'F4M&@'X%ZXRS,5RB"d&EU[r'
-3!!G'3!LhZY03d)2QN8293'e40[G('&2M$5C(MZ8RXkE[i5cP)f11VGCL"Ri)GX&
-69+j24A!k(AKNlHMK4i85N!$aafm[2HpYr+Q-8rMcR5T'U$#Q2e#!YFeN1kUb@*m
-Hj6rHU4#XAF*6ZA&%rQACa(@G$T9rUm9+)0[SEZ@em$T,LE3)CTN3(-[p*E"(C(B
-1L"PK)*rDR[P-eI&%P96UD!,akle#fIeZ3*pL4"S(T*EM9)ZKk!3hIi@q!KB!XdM
-&34SfQjm'IbkSiGF21qC`b"*J@cbKXj2Q56362cj$b)SfXEc2Sd'c66mCJ*i%J`F
-T(i"[a+K1UeEQLJLcD2K&Q2Zr*#9G9Zma2eAdGQ8q6MXDf6mZfm6)aF*cqHpL68C
-V&HQh8GPeH%XID%P2YC9cRbjT*86L8bR8fFX@!rKLFQX)ljm0f"BA'bZM1!U2V9j
-SZLK&Q"#NiR,mH9+-lcA!c'D-M(a)fSH(i"(f[GdA%42XN!"K"NK4e!!CJGh#NBK
-KV%5ccFK"6bJb%NT0LI`"(DKN'RFUEK*K0L8q50lV)YKrDKl0!bY$B9Gq1R"1RCq
-aE+`0(4M2"b$Rb+56K%$JIA-c16p9q%EU$[2b-AFSLeFIRHEhYFaaYT`HjFTR"rU
--k%"p1Z$%&h3F[dhN"V-c,ZNaKYY&pPhherE"MaHq50[dSc2Q,I&F9q`8'Mq!5iN
-[c06RAqa21KFLFQ3QcNpV+K**R$a4'NDdL)L6D!r3rpFlk)B`@V[NS2$q4$BB(ZR
-VSkm&a'X-T5Krk6ZaaT4r4DhILdHQ9"B2M%lp3E8cUL&X!fC`0!0kKYajL9bqCrN
-RMAF,6EeZQUhH&$eCCSB-qKPA%#c+%rcV#3VPUr9@Zpcrd#iNb`V-P6GR-*[FamE
-hmMjNQm&`[T%q0NaAjc&bi30XRfe&*M(dm6*rU-H'hl,kFN39Bf+Vd*(3'G,!Dfq
-+rC!!6143X3SFEj!!M#CE!6kq)#dY!j!!eMpYC0le4j4`$cb[*Kq+JIl22(B(cDB
-JT9NT#c#(9bVbld6#EaM!03Jk3j@#HSK8Z'mQm`H`Y,,)`q5E1@LKVhIf@Ip2Rq`
-2Yj2B)+!3Z1Ql-dA+!HFb!H(0i8RkG8@qS'R6b+"iVlh1Gb6QLZ0i"`&E`plkk3J
-RF5Bcd#cY$5rq("#kM0PX1G'l-QFZQ2[Q-K`9cqeRqBNe95F3Iq"(L2e80QY11Jm
-c91S00[)NqN6TdU'aUqMPaK(jqD-[U3@J"[$E3XSl"pm(+)a5R-'#S'PD95C'C1#
-f'4c0HFU`4NA0Y&[R$@KF5$*@'(Bh2NkN14pJ&h!)ii&GR*E)!eKa%c0S2+TXfV[
-"*qpJJ,i+qL4"aA04VPbHJ0cRNS%AAN8qJ-0@QcBY9B3[@Sr#b0*bRR8Bcjcpl+i
-%p,2YadeC!T3Nqk)@d4bU3E'8mR9HqCS!@Ke[6Y4H"`a$cJRPP8-DPi0Ib+kC*LX
-,N6JcPSk"QU,fA"$*,C'91qfZ@hXmBM[!Tj&kI9K2bC,DbPF3c5[RHQc'lCK'"CT
-3(D0pSG*Qfc8!8jB0(@$VSkQGYVd'9mB-B`IZX-AaAT28920)CpqJX&m4063c"4%
-0SG3!9TeiNlS1XdTT(jY8ASLC-3f&cJJC)@Kj[,V1iJSL@m!VV[e1c+N!C2YdT2)
-%+@e1'f0D,+E!AZi!MZ)MJRI4R25$'0Xh0'Ya"3)a"ce1*fTT[@HR",+Bl43-Vbe
-erUlN$&PRdeTSDVj,0K"PmUAa4C[NC-TNhdTeR9Kmdd1dha,HlPkSbZCC[mPel&1
-E0edhh)%Yd,PA!TQDkE@&TAaA&hP+mqdS5)-bdK8lHc[+h4IAS+U5q#I%A!L+0aM
-ZK9MiKBHl)$!0)%J2Z&+GrCT3ejKKp4+bD,15QLMY6L@caf&NN!#1Ke)-HA6-Y!B
-%JAc5a+4#l-!YIR*kpekT($5Y%1NS+Ipk6CK(pUa1UJpYEK0%T#$VrMb',RQ'lXH
-dVV&AfaNVYLb!cCI2-59ZQdJmX,2Sfp3bU6D#a8ADU1UhX"RlI+!I-344i#l6i$p
-*NK#)#XGdCM'`56VfSJj(pHQQP45p-&dU[cJS,`QH#YjBPD-A![rZRpJ3kGAVfRC
-Gl,a%iAR!`Rj'GaNV-(Tr8DD`cfF&3q@jXI2(pU1bIij"3,AB6@LSqf2Q!MhBb`j
-!+X5jBU!8A+X312VVhHFJ1m&9@"Np-ELYBEJ)FqYAF+NGJqj@(f$G&pEdZ9'e4JT
-F%DRVI(X#d&8*0k[U)bVlk-FrP3-rYAfTRb0VUlRKBk*jVG#&T`FS*@2F8Z1@F&D
-*HR*`H33[8+1p24@[l&(X+*T$Mhd9+[Hr1TZQ'#MN[&V6`[U"J0iE3jmUb&FkKT3
-JQ$1bmL9*RJ1lh2"df9b4%Gkf&3pSN9q2r0-&S&4&+3@pKKce(Yq48H#fM2RPk0E
-eT4PBF)iJ8R)$beCQSK,bN!$e9-p2U9XaDRmX)q)6'ZTAXB&),KK"Gh6P1DdHYla
-h0X8S(!`@jhK-MH)HRFZA#-MJQ`qKJZ+p"@[,hX1'X$(e#pd52dh#[HBTflV`jRa
-akZNrG'a(Z`8S3ZVJiUib!K$9"hZamb'@"fj8CX!qM#E"i0,$aM*#-IqQ-l%[#Cr
-C'LZ41M$HHVI"YCU1ZXj`ji%mT(*8J)3fD1bJ#RP1I`HTV0Ad0D#0)$d1Pd-)'Cd
-5#hS1lCe0FhmY$2GD0-bK(d$Xr4f1!kBB6"2MFFIH@((5GcK5&k(6$j5CS)$j9dl
-hf1R(1HK5MEBTqJ$@Z1&b1RAZJMDMP)DJ[8)Zqc0ri*384P0!3biPH,E16*Dc4`U
-@Z&R+#p@IUC*qMAJMP*BHMLI1q'd-k94UUPFhFq4H!VR"L%e(Y8Rp#m(mPa100BS
-SL%$El)ihVZSUMVpDFIeXY,S-pd!*&UC@m(jY2%Pjir8CT*pEL)jr(ECc0ZR@(5T
-aSbIP9!ffdRL[!$SRI[)U&LIhL25dF-U[a#0c9@'SEY%U9FAP4&K3831Qb(TM"c0
-SCH+SV2'J8,EAAP011DR(ilTc%GQeHL,BcAPXmk`AdVb%Hi%ji!P[#Z-4k0NP3Ql
-JVlk,@bm181bTJD1#&pPjK8A13cJ+qFpp&FhQJmNj42b"'pfM([9mN[VJi"B8hY"
-%`8'fMT@5TUQhU-"ASjQB68@8&mQrqEJ!FG#bfF'Z*5bXP["dH!4Z+EjcN8dMr3M
-6IEl"b1iHrD"'NZ&`Md,Kq*2V$MV4VfV0Z"Y%G(9cE,"ETfD9X[VQd-r&A393a$"
-1k4hr`QE,q,94qD!6340-m-"FF`D,Qj)#e1YpV4QkMNBSJ`K*ESl`mla@cTIeU04
-PiTPZp!(C(pr4MZVGf$l)dhmTF0GG#e&Xk6ibmIl013M-beBE[3rCC-#U3c4m61V
-PaAf!VMYkA@B4T'*'#IVGcI#G(fYF4-!*IQP2PZ"QI*(V&KU2-q4)#Z6VMB*pmG`
-0rP,jla$mV3Dmk"+),9l*48p'FQG,RR,4SU2j0qQ3!)3+-K*-2&ZfjNHcC!J*BPC
-DfiY1Jj%mUPS99iNerZ*`V`FbCVpcZ!RrMVVi`hq$Z8ka`KAle%THdKp6IDKA9#V
-d$efU'A86"JE[cZNj0E0M&h[KfAU"IL9H4KT6je&(bCJqIl0FEV!bJr,dM,H%RfG
-X#Zr)113#JrKXL$SpeCSLV,3"#T&,[k)YST'0AGJ5M"aT2l6lY"m4ece(8k%d`ki
-QHc#kdZ)4Y0D2#NL,kaeNj6!irPB4JS$,HaK*F3+EY2*RlDe,[A8"ek!TS`@N1`$
-QPFUPXeMR#c-YX5I'H54,cciF826#mq,ErTF#!i(BN8%(H5IGdp,#R$!B`I9[qQG
-kma@93+"F,CQ+d'M8q8Al11!jBRA)-9*mKkI)jiaf[kk9+9BA`J(+#(6[Ue"G'&V
-F`JGXc$[QX4#V"L#qaUNdr@'Zq9U+Rd-QYG'Bph`pDbG3N!!Q"[q)qiB(YkKSrHb
-(GeZ3!)A**`XhJD9EI["aG6Sjjb)MYIkh5kiY$$c*V!jNI6TTjbpU,iVKi"'jLM,
-2&ZC)!h288,bm8+T9@U2QF4'Y%ZVFDK9SGQ4T*QYUr!))18+ma-A*9d&La!2YCl$
-Yc`1lZHIrCCe*@S&N-VI+kVH8V)[P4I%LM*!!`[UMCj+ZFmF"ETlX&'8LFTf5%CH
-1FIV",6dKLGAdkE&X'RSPUa1h'`RP4QGNL1q!FkQqESQJk3#8d+-c1r,Rqk$"*8B
-ELTV4r&'C8$pA8Ac&eKeXMMIDcSK4NGQSD$kV2DQNCU%dJT9*6[K(45'ICeh2qNc
-M`5&#9MX%S@VRTDL*e$Jim"j'GdLlJ,jb-q`$$)hh!'1[IJi"`QjR!+[N[r"e$al
-`Uj9CaGiDfC6$Q8)RTNjlHrbYNF%Z69$9[J*4SCI)1R,IrYB'IAp6$GBVh`Jh"R*
-#f-+,'&LkE1P&*2-6B#Cpq+lN,FLD'hriK+rh0`9b0+jHq%!hFmlri(c"8ZfZj)0
-c`TcNd&K(jb%LD6dN4`"cP8R19-[),b3Z'Z"KqGMje3*(-D+m),qLT*5mQkHB9Q+
-i6qDb'ZrT5IRXNZ+bRLr`6)*bh*%e(!h12M9dhI+C59%rM%cb8EbE"mENYr@j5P'
-Z5MaDmFbTH!)RFKa%5FG!&B("Dk6U&DYGIcKQdFjrE#f[9`P`f0H4L4fH!qcSJ[c
-Yp(Jd0[Rr3Z+p'DY2IPk[3bcNE,62E0E#KhlGeD+U(%"c3LJ-4)f$h)8fF+3'@a)
-NLSd2@-QGQ8S0Rjp&dd4BX5mPVDdU04#,,CGfk3Um9,jb4L9)e@5dJGE5%hL#HYr
-M`Ic6,TTqR)q#qRdmr#b[dp2qIl[L)UB-+VS)BAX-j#AHFMG,RF`$A0aB1GI8F5R
-GTUe*$8,CM3ANCqScal$-SG(),C%J!eD(d-G%8!D)FSaU(H9P(L@''TkiT2fMc@F
--SYc0"L0N)A'&-c`D5G0-Uhflp0fP&+2,Fr[2`#$9LVU6MX%+MLEr`B)Vr3`4Q'q
-U"#aaC%Tk`3,VU`Xp+`Z0S2H4eI9'ch,mGm'VjUeZ$)#X@A91l[8X&jfTM-,9,I+
-C2F&'B-UFK)SlYmf3!1qqS*E+[Xb"Y6&1&`I*b%4-cbl1(FTbS4)bG$-icT3f"13
-N9H*GV6qKhBqL[hX'S2TQXcRL32e6TU!1*-1Jd-Rq*d2$lj!!c81p2h!p,rT4d(Y
-I-bKcTS+(r%0LJlQL!!iM`LL[S$DLca@ZI[#U6ChrN!#S,PJ&[pE2D0!fj%R'aXc
-8aTREr6C['4J)bD6I3`$[#V9KM"U@fYfdhk!m+j)UH(0%rV1lRLAZBaEi9T6BJ&0
-Nb!HdVe-CKpiD'q"LE,6E@A8!`1ZYMGEr5@kJd$#5EmJR'D-HQ`pdAYjQ&DaR,59
-YTZ(U5jc0VK`LSTdM`-43H3&k%&V['IV3"$R`VbC*-&-h&i%bC*S-j'kpSkaQeB#
-HmS1FrAE!ME,2#,0J)ZVAMYQ0cHRh'pC&D0[jYk[Y+"#3!+0(YAK(jbXj#d,)ELQ
-03r'Lq[,*0%i`2CNqUb!%4$)I8X#qS2AAq+8liEMD-Q58I3L#XA,)90X$3DkN5fU
-Ck@0C`p5"-S(S+@"9Lj)H@!4YpqH8S+&[4#qh[D2aFqm8P-Il!TlhbhSFHAcXb'%
-"%Ie6d1cKMe%994HjBZ`3TVh$hPCZT40T)CG0LZ%,S"AN*BPQ1M0i,Dm4imqY95k
-)$1h2h3T(ff3YQ""Z"prJFbB&h5'VLADH29#@A1lbD)8R1#hS2McaAS19E$$f65h
-R#f5kbijQj[9BF#-GS6)-AJ9&dqa#fTmD0S$PIQSG$1r6jFj(MfL'N4&RQ+ASM4d
-TJrLfrZkk0A#8f2hP6@cd##2pb@hM+Vl84+-NE2%lRmrLkU$FdQH*9C@BZfp*IQb
-*F1*)j,!I&$CXEf@iV4%%M6+*'cQBm6TC@SpbSLXDX9DbM(jfcq0J[lZDX3435(G
--96QDV,pm'8@9IU#NEEVB0F8GRhN59G@EhKEUY3T#"c6NE,*VqK&@N50`p%&H'[4
-A,b'2kFCfMLJHaYkFmfCV,G!r[f(4b*aH#m$YbbS@f@hrcLbi*6V+AR3(Pe[X1@8
-k)A5a'1qkjUGHUUVq%U5hPLqBCr2LMfDaj2GaGJfjdmKJ1LH0C!9A1d''fHeB&l#
-T*+pdKQLIL'He0H,a+84)1mQG#ZIe'9rZU"%j'pph`A&`DrBeAD#8)LY`JG-$TTZ
-N"%0pfJ"$XfDVk'*aA%3lZGU[Q&(X0%[E8LSPc36)@kplX[#X@LHlK@HIc4G`XL@
-),e%miQ6Q1RHj)kRH0l8h'$BFMV5#Bfa[Y*jajlJG`+@3"!%!!$m!%,JMfqki)p[
-Z!!#`3J!"*+%!!!%[!!mif!!+VV)!!#)U!*!%$`"8De0SC@aXFbl2J#jiE@`!!(2
-"9%9B9%0A588"!2q3"!#3#S!!N!G#`G8Kde44CHa@Aa`3[hE5CGaS#)!896!%Pql
-CVCrYURDGQVlm$Ape4ScZU)EUBDP48I%b"k%HcMm09(R@U,dNJRN`a!*6VHBFVAi
-mZmJi4B[%NaSkQ-b6Decf0dR@i",+Vi(Jd9$"f2b)6PkZ,,Za3%VYSTpE-5rK%+S
-DJ*EQEhflGQ4e1U2E$!CdMQaV*ml()X+3!%5,S+ISH5%Kj[L-h3P$KqV0DH3hENe
-ZhQqR),'HUjf*+1YkV@N)64X$50L!PJDYYUR1Sb'6Ta8@H('UUF8'11-A-,AZNlj
-[A&8k`&pTiNS@YTk&SD"'11PY969@L3j)Sb!$kM8*dKTKdhaL%Hm,[Q4V-r8h9L%
-rJS0m85eXHJNN'V["'I1+V,3pc!eUS!,*VbCS!j`[UXCB$%SrdRbq#,cAR2I"8-f
-F6S@r'k5kmBRFb!h0)G6YP&h+(4a(rFi290)Pmdjjj*PR48#E42V[-KM5k*Q664!
-m-%K`d(fU''RKQ+L3!+B[i45+&Pm`b2$HjQbEZ`lCDLLr45RBdRF"bB$C1%Pi@G0
-`00&D$ER(Xj!!$"95M5Q)[!b#FecpDpJckUqda4Y5SZ"6T*@'CkV`RYI#XdVdIlj
-i90+SB2*EXJVYCpQ!X0UPr%!Q*-pVPl2b26%kNi%LirNF,#Pr)eA&M3UFAp%pHE9
-3QlI9qU-#dmS)dl+3!16Y[H8Ara#,K*eM*R9@j93HLX`L&X23#SJQm*4T$H"$)AJ
-aIMXc8C%ER[6dFa%kQ[CEL-(fRG*YH2-,pZFh#ZMHrHl6FXjKQJE*d%k0r&+RZAN
-m&65L`K2Hh4'92QP*@qTa@c"TKD'*cpqED*!!lJBHAr,ZN`IZBEZc0NP*DQN52&c
-2VN%jG8Q9&+dI&m#mp4Ji,4Qj4f"Q#9MF2E0p5m-9Y"D#**%bGD,,,,()G0T!S$r
-e#hi6T6Ih&G(ET"-[(")K4(J8fk'kMb[FDR@,1p'3!1rE`GV4Z"F0*cmJ2E`m5Si
-H%4A1JDj$Ph2h'cFq(bp)FT`EqhG8#D4q#*+%(K0#aNAIIp+CERR6M)f-mLjHYZG
-NreMiDK`*b&)FSk5ad)rr`2"h,X&DIT1A4J'THM+eDDGR'[SAiNZJaje'e"UNdRQ
-HJ!0-(e0aD!5FKHZDkE($XkY@SZhVp)B'#fG"-l08VM(e)(J,4l5+8STSG-FjQ5Z
-#Y[YJjCCP2`KaM@!F4BU$BT%qUJYjc%4`6c6F'5**#ZA!ZQ#@3N(3[@`#h-h2b,a
-PJ'Z+@%SU#r1YM4TM"U&'HIad@M-[(G'1@GAeK61[@61[lMJlLHIUZGR1hXb@`T`
-1$BZ5&fXbm!lD9,#1(Jedk,YZ)KPcb+(V+SqR#hpjrKq@Dh9-G-D0A$V`49*cpM"
-U(kMLLfB+0Va+[J(ZL5ZPm"Jrb9bfb)#+hU'mIU'lqr2N`)jYCDULMqEPTpNhdAr
-Y2"A0-lPqS"$)9"5JZQ9XL)krL,mCie@![C,V3#a%3&XQKf[%0`,AR@i!M&IK$`H
-4e8(&ra%mU51$j0-PS05Z)"@5@Dl3Tk-B0cJ8j`X!pD0G",8[FKXrQEp,RJ-%mX,
-j#ap`dXe-l2aHU-,)6a*X$Zc9KqTld,0+JX93MMC"$N10h+3JciU,eYJd%Xl1mVh
-ENZhr#14MN!!YIcEBKlZ*B,h$bBCR*c5*#hmlA02*0CfV)kSh3e6RbZDq-T`piQJ
-I$rjGjU(ZII1J0%fiT582lYqUpcbqRl!HDY[%!-Xq60&89$FSAH!iK+SBdZaa*@l
-$@AmDY2`Ah&2)M3AGZ@5R"KA'p*YF*lYXL[S,VFH0iX9HH'#,$DLbTUr)[ieDCmF
-G)1-H2r1kkbi&Kim*HIU,R&-c9Lila!4h9R&15KjYqS+Pq3"rP2%1BeE(b%&UBPS
-&j+Q+0)&X*'3CcQ[0(QVmZXp-`mN%F#VAT1&jCM+U&@&qN!"E2c*q[Tmf`KL%IUp
-!cBU`-caFXUa'l$[ljSKfZ(*dqU)c(kI2hAl615BTE+k2k*60ibU)'+M+69f&-V&
-[L20XjQEU8B#CD"rbb!,qZm(3!LP"Yj`F@(p[B@D83R$),(e1qAMc)qHNYNHrNC@
-L*$Yil&6jkj`TbKkHT!&@)5Bj%L"YKU6YH1IDPTmc*E9Tk(MTkXN)*bB`h&'Be2F
-NXEBAkISYE`jS()RYVITkEIqL-PlJ8,EfC1DDj1D!MC8FBIX0V0EIaAq*3Z!cd"9
-ARf6(Mf@(2RCmSL1EMQ@UJ2Mp@B5*Rfc4&c5!1m*B5&+ZlaFR,E$#cAhc(cLG!EP
-a#Tam!PHL1i6(jj5KDE(V81LGNAG,-f!La"+(b%d"!B9!TmDM'mlZNZ9T"ET!!V+
-3!,``IMQT$'2qB+!N!Ie8-bUS@cd3YK@5Nj0c4aUe`ZrVDhkN3G89Q82lH%pM4+D
-E*pANYl$"MaJkV`1ZF#L,aXAlT,XDYRDeQ4fa9(,h!rHCCY(!d*NAdY*ad(*DF*`
-1Qd4KVk'ZLBh0A@3KIJC(+RfacV$V(VMebPZd-Tl*8!8aD6R'YQa5Te+kXG!5'ic
-CXarBV[Hiei"FdTjaj-HHIf(PE6U"r5V*-$,G1*`mScih$+p6dKbJmi1"l"r+9ai
--58-rXJmfXHSq4Xp9b5er$5-pG0++X5T"Im0ZAcY2e"RVFL,a))4AKpcb4G2GH2a
-1-q5MFh2Y!J,6C6%m0m4iZK5VUQ-(`aD42UC9U'"L+ka-aH4G-T!!2'A2KAYmQ[N
-`VFTif3r%bc!4#bBlMYbM"DBirraQQYm[2j%r1J#Q&m98S5BV#2kqZdZm!"a"&0%
-KSXHM@1DS+JilHX#Y9dj&bA'fcQL&8#U(JN$8'X")+$HI3Prb&Y692%a#bi+*kU1
-3!)BebTcEBZLYJQL&)TP2LHKJPM2"mCXP(#VPXMZHK)CSk9EQ0ccKDZF!Aalf[9-
-9%5&DM$(S99m3Gq1!5[*Bb+alQKSdqjQEdGcHjF8CBN)-!Je#fm1a%d6K,M"bqb3
-6M#a0X&LfE-(eRmAq@CHK[FQIR4iSeSGacdMJ(k%Fqr3lQH*53ePH@q8#EAh93B`
-@RqH&ipI+"%KSCEBj,Y-hSXT,Uh)#$*1QYhdD,N8Ka`23fL!HPJEYm+RRq`4I$3&
-AI,PSAA-Z$pcb#m)8HN[*!3FGR%fE''HP9b%c8bC[FNa,059clANaC88[QTT9P02
-F+A*pipeL,h*V3"CPr1UUkmfPMa!6TaYjEC`mHClhY*CK@Q1Eq#QE"CUp#G&XIYe
-2a&VM*Mjed#bMFFEd590[qj`,3UIb+d+ik(%U6'"c!E1,jKV@lACXqSQXU"U['%,
-%8KqM&HkLk,Sca,1C-6cpI*m4GpU$qNa3*NQ@9raqPQK1IEAb*hlFfBZYi5)iEJU
-kh'p3U0CE"Ad68!X!PLkM,a!KpZ+(6JK[,Lbc6SaT1'%ZQXmH5BCDjEk0C0C&G`F
-69F'd8L6Bmq-e9RrfG89iXl35r@G,QiHZ&9#1*DcFBC!!%KR(Zb"r"F)N4bZ#iVV
-)R43'CbiK92M9lrhe'P(q+U"++iUH#H)b*SG0`0ZJ@K)FDR1,MpNb[bA$bPa)`jR
-X*hm46ppU(k28YB[K,J$2Ue3(5N(!dZFe6reZ,eRYcE1j*`Qrr#2%d(MRH3dp5lh
-!T"j5$CMZSYF3AhLBjBHY'LepUJE3iPfjFa@@%%Ia+Hl-X+5`CEifNr(DQ+GRYCl
-!4J*q*!*Qq(5lGPhA)(p,A"@IBPph,+9reP-%kFQVrSaEbEd-6drj(e1PK0"Hb"f
-MQFXNqmBpiF%*JY[2lAr+lpUqC3XVrl!$CdQV)F5#B6)peQ4mcM#jF`3)a"5$G5K
-LDkC)mGL*+f$0"FTcV1hKh5dP'BL4hV6111[3!Rek%D[-[N'1@QeH[-,`lT%JkF!
-q68L2lTMENaY`L,UUerdmYUNKrBqXHUcIEB%EY#MJ-KGdi)aTLKQdZ8RJTHpY"IP
-F"p,Ji6N4RKeME"j%YPCp"GD%N4$"kdRdk%iKJEQEJJa),AeN92*-GjJS%&'XP2%
-F%@hEBi00DBfD6(I6+hqY0JqZF-rjP(rN8BIQ'k-chD-M@Xc%8Fk%"32&Ul&9%CD
-TmSS&1Jjl@0*P48Tq(k5j,*3*r)&e23jU&L,PXEkZ#IMYjHB5aVc$"cF)V+FQXmQ
-ifc+XEUiDMD0beL$DL!kh-5lM&b*CCXbFDC8!RYM"Y`"#*d*Qjd@['mKfNSj'2N0
-N9!TNF`e8VAJZQQ,,Z(rN!l`$hA!0*)GhZpS1G&dBak5#j-"8CA&@j'GHq5jZ-f$
-jcZKmVq`jPK$r4kiZe%-6[Me5*S,bJVieUUHID*jr60A+ia,!2")FM2E'1mI$mK*
-C1*rCZ,AK-"lpAQ+UFaU$rQ8mk"(,aCB$3*&#*Q3&F1*)cLL[AFj'4[#lRpa@hba
-3GCl1ic+0RUSKb+9Ge2P13QTEeE)f![3[lR6e%RqlIL$YY58*FIH!TX3MZ%+ZT8E
-*YPB'ISj5Z6,I",eFi"!mZ)dkL,(@a2'8-qXNh!R'Rbd&@6U1VAZNZP8#L0%IDkB
-Xf2Q09dScFadjZ4&ic!4S"h'Q6$Yqr4Y'iT!!V[`VaT%1P3bCc#8B&AhCAH`#ZIM
-ZZ)C8N6*GL8B-ISYI9eM*eq,S)26SIA@9N!$rQiZ5%kfi2'dqcP,NKH!)$P2ifcl
-%FEh4+RbaB!"Fr8hVr,edRKEhN4#ipAaRD9Eqk099#!iYY*!!'d!'IfBhG`XQrVr
-5)1lkHEq#)NbfC432Hf*3U,"@8&YrrpK(jUdZ!hh'5`q"`p@T`[5qF9!6&Hpp*D-
-I((jF,A8I8C,fi%ZR*%k5CQB&DQe[blZ'RI1[IlNpUlmcGl8j(q0m&4PVK"eNVdp
-aC00I%AN0q'Z"cY5`jPTY("#R+k42#khi5(maU"U,19r"1`hcf"9YCT*L,Y*kkpd
-N6EHTKC9,fZ$FU"BhC$DYIQ#3!,qPIYh1)c3JJmrPHUEL'1)#U9HdMKP(e)TPfa!
-rlr*C1HfQZJia"pBdDL*Z%@00Xc2E6@5f55Yl0lfaR1'fU$hpZ2Vkh&Kk(FhmqP1
-)2Bf'Qh"8a0QE0pQlqDlme%3FHA2F`UTkjmd52&10JC!!(hhV)aSUIE`kS'`DjA'
-Ca0`(UDqJ4%lm9E&4j@*4#*rLM"E24A+3!1X'qNpebXVj9K'EqQDXcY%rm0B4KKm
-Hrb@G1))-6Vm#jle"EK#EHHmX2LHc2mKNF21mXYHfDBL3!-Bc$,SHf[A1pNrFRF0
-')`U94#*(rV8'T*m8CNSj3+a$JZ"%b)#($2T!MhKIDSAY#aJ3`3idqkN*Y&*FXT!
-!qH(Xj8SKarTpe*iHcApZ#6ILPE@NMmfhFB&liCcjEdI0iNL&0YBC2`MH,RjbAkA
-KbpL,MR+i+chEhDBiT86Ue-D,Ce8iX$bNBB4%4dbY8l[FqdVacTjT13iNADjZ"(1
-X+L"FLR-%FdSi2r)YFmGb'PbcSLd82f`!K38A4MXH@P9XrZ6CqQ,FUJJr&#Y[1I,
-jeb"IKf33Q$[R99ChQ5%YS`)NN!!dcKfPe,`bP*A35AhZj&h5QVPP2p0F'0rAQEX
-CPHhqaI9FP9*GC)k)$qk-+Pi!HT6[hh(0hqFp2IIjpePJ!llX,@UV)&Qk`9)cj8M
-0rpJN!XElGm8#5PBmr&`MSaRj*0BHZ9F$4lVJhaKr$,9bH6)fNSTQl0cqh&V-U,c
-"FE2f"%Gj)kli+fcDP2*aX*!!@5X5NkeGi@)'P`,S32Add9PMk&fc'Ihm5Uaa(+[
-f[ZF)A&Tp1XSq#B58h"KYk$frZDc,BK@CG[eQ@Z5P`fYJ*aak+Pd&Z8jl8)6cJQh
-3blK(9lkD[f(CaXZk&M$CF@8!-T3)AT)-59#5D6kVIL2Ta92+'d3-EE'FQDpZ8[G
-jY"XZeT-"i!*(DEHe[MC8-6&[VPb(Ifr2ZVd(6L#86p$HV1[21fLfRUjd9bC'YPp
-Y!0CmpD[8IqVMJp(hdQMbH[i)lBV[pGdMcL6(0"`6Deee(eQN2CYha)IIe4mB*4p
-6`K'(CDp3*N05&LMDA+llPdD$RSeP)c[QGPQbPXP9"0Jbb8p*Zh8PI%jFI!(P'0[
-k'X`VBXjB9@FMSRZcH8DjqUAR@R504f+h#l&BbP+qU'kNUJXA6#mN8j3j-5U+ILI
-BRfI'6lQ@XA2qrl%0,&9q3`lVNY+6[k3eEJ)5k5pP60mqjXXM`a3"R`@B5,(h22F
-UV'%*-6%jdGGdM"em&hp6XU9d3Qj2jUZr8)[fP*+Hc%G[PCUPdVhaY"Vq*Z6)D!-
-V2TpQQbfa*E%Fr'6E"%NNYf$dM*5RXXSVUiI5AM2Hk3JQG'j1ea1LGf+l(L2FhK!
-Q5XbTmmq"[JT#'3#q92*VdmCAr$#RP*!!ZQA4F9AD4cl@P4BNNMcarCJ@1G`2a6N
-4L2"Hd(#$+L@*2&0Q1BDTlEVF9@mFQ@)V*0V8R@4TJp+,RYh[I)YZd3'N938i&ib
-BD-J&6!%T'',Qh`#YE8LMrHIE8&2-HrqIlQFBTNK9im30#r0NEbYTl&S!DBkfbZR
-1,epCDGTPX9lG,!%mdGrIR)`cRR$11m&M0KrF2X%6G-j*cC%0'Y4(hA"Q+%lq`@2
-YF`S-8k"aX,He-Vjj(mSmAY3D*3PE,F4J`hA8LQ%CF"l$Ldf5K'(8E-Xh[@iqBVZ
-@a[R%q5&!"lNK"GCXRhifED+5486@E%XHAiiQLScLh*UF$6SJHTM!)V&+BPGaNM#
-@S6DD&hii10c9CZSY'+eTp`0IP5NGlQU#Q&2jp*1V`aQ1j14F3Yarc%4q"9ZhkRI
-(U1DVFfqf6MRm'cmk!`KZj@-0aPTr48)%KBel8fac-h5[kmU5QYE[le$C-`j8&4J
-AaG33j`-,(29TPVjGY&$aa-(cT8@qQMrAfQ1'Ni`SrQFU4l0F8LR$HD4BQXAVCSP
-Fr0'J*9P')e!'!d,CB18RULLc'kclZb)aGM$GkCDp2iF9-0*Cp3LDDLUXGkX'"Mk
-aXr(jrFMb2rq&*$UM+mbX*"3!U3NS(YaT%,V(SdL8CT[5aDHh1N`YFp4,`N5c,J$
-V1iTLj-Y%N!"26qGI@4!c[,Tk9(fkK@bI6r6I50j2eYQHLH43TjTe0h3)IB-QkRP
-G9@RrXH#lhMEcGpKk(D&%#[bTQHEUAi(E3V1e*L8bR94KNF%EGa%Z@KU0!%K+9M[
-Q@0UrZc0EdVfLG4XEjc6jbBYeU8!8Bb$JDpCCjHNAIh1Bhm%UKm!D*fG+IX[*Xfr
-)2YC,ji5IVb6h2VdBj,rX8qQYPIRTCmbfd[822j%5++P*'6+dj9a*2QSrP-6im#I
-kcDAa$4F89`PkJbhTYpcH[pYNLR'0KYCC*HmMZGXS3'aI#(+*(@QFe&0Z&,ki2Pr
-fJmFDJjf3!,mS03($9d5f6ciFiSfZ(%FT61*Sj'e3YVUeT`,&(b&S$2'-eXU)[ra
-5LVk"ZX!kS9jh'd*GhNTcS+C4*U"H+h5&p[5fe4FaMiq*Crf)IIim&FddV2YKG''
-l#2EY-kH@@PMD0`CXY5N8DqE$Y(`U5a[@i*IBlbK%HCC"(k&&eF*A3j8Zr6E`5J$
-9b,Q8EaAi-NHFNBDCJN)PLak-e5q2Y&b2hXK(33cSaLDh*d-UX3UN*a`GhBfP4@S
-'6(LM[Da1d#DlPA4[XeeeAXC[F2U0%ZK-k@RSQ99AI*a15!BdU2"'Vp-HhLXQi6q
-8dG`#1DP,q22L[69)EiU%qG3XYaR2!R'XZNEi+@XC80b!`fGU6@%R+*q40N"hFUq
-G`-)*Hjr!6AFTK81*pcTZV3HQM3e@jB2dmT)kM%Upk#UhH2beN!$UA+E[j#PE$28
-aaJ+hKM32'q1LF4AaGa@"(elE%2#VP!!0i[!(U`f&TLcLhAZ#D6bYUHiL%QqB9)N
-iHN"5)QDB*$!F$L"TGaTpAlUS!%-VdYKT5j[Vp'd[r320IdmbK*GHG,@BKqfL4@i
-qQh68!JHMkQ33DaT&Q&T9[N*-F8ICh*NbKp#CH%3N!G`C$*aKlUQ&QUm8I!V#F5B
-KilfiR$LD,C!!pBhI6R&#B9$KIb6D"dk2hDi4E",EqGBKdFfYJ@PF,r'XALT@A@V
-*G$kpLL1B-$0Lfd-QXV0dlF#AcdC1`lPfC4lDTjiS%h$dp0ejYf6iX[3mdCcdPEI
-pV[(@UYJUM'jGr#Z*"PE-4bXS&a2m+M*#10B2'CH0[0`30l5,cGqR"29Ec6Vlj8$
-JMGd(ED!DmSAAFK&,K`@FVH9e"-f)&ATrD5FX1ZYLd#BU9,iImU-Kdm+Rl+`[46T
-p,+P%TPIUeTF-rhH$U%VXqTEB2fSbAAmiA%#&THG$MF$Q9U`cFmAi9Nb3!,K5la"
-#K@T'NC'&lXRHkL,i)CEI1qT4-G6KUa,HG#8q$KR&Mj&,k$`j'SUbXeAYL"aPhMK
-lNmkMHmT+qhpG$kV`HD2`%HA(1@#P4Vm@5HZ(#ccdXpNRm(a69-h09RZfNA2Y4"C
-aad$*qYah8Kr%U'iA&fcE+T0YUSr$LS4DQdD!DUEDml6Ta)FGlG6ep[lX2qli4b9
-h5j@f)1GYShX"Vm+RKAjG,ck)rMVc"r&*'d@a44K&fY@$XLCG+YpX)E5p"!Q(`AH
-+GkR5*+9'rTMFqqh!hQ8DZrZK,Yh*!CqekSSp&+TPkU)J)ZCAkDa"C-$H8rP,QC6
-I%FrQ8kIpJ+*JE1#mC6cp)CG)`#bD2J9,+[[$T"F$A**IHaZX)RS[(BqSq$pTXbr
-JbQ)bRlT*Fi'AC%4q()Q&VC[Kp28Yr4,&$2I5$K!R"3H)(*6HNFaH@jLGMG[$U0Y
-I'r@G$2Er('1eYh3rqm1edpUQ0PBEIIMa"bkrQ%F9,G3&djFU-q4hAq2CMKPjqbF
-JJ*CD4*Lci)`c4+NaJrcQPmih1*jpT!A2"(pljHP0BdYImr+Z'(m,-&IcDIN$G"(
-6BI#YRM3mR(i#LRT)BrMEpHD#rFD8621QQ6ZRI8e*qfH"NQmGXZ"m,@h`9G8k3LN
-@LSED*%$,HP-`5@-e!lk%$be"C4c+@U&SLrRM!-$19U'k1#LG!JIhq-Km(6J0md(
-B8DD[B!-l&E09b208H,ldK4@A"qZPapHjIHjHDLkErV6qL8#DjfDJ(#[#Ed(34N)
-%"qT6GcE1HMYIl5Cf1K*m3"lp'BK&2eYI%"4eHelV!Nc2MUKLk9'80%@l3'ek"ih
-FR4Q+AGfd`cDG[4cr)"$6NdAQl*!!T#Rm@EMdiF0FRlecpjE2S[@DdQ)Uf0LaS"l
-&"N@halU`FIZ91HH'1hS#PEf,!62@I%GCB[&d`NqJm-9+GbZX($'M(,dVDXPA(Y*
-h`S)E,lXC"Q(Xl5#''0FQ3l9(-k5jRmbp0Kc2#44p'N3Yfp#GZ(K2Q-B90IdN+$Y
-'-0"[GK-(F6k!q5XjjRN%kGQ-@0MkMD,F`6-#8DMH1Ji9jJH0-(3QIQ*QZqcP",2
-BfT3)#ifq+k#Y1T2qTlI0il)eSh@rjHHp%&DX,3eU[+&)3AFDCSN+6G5YHX(CR6%
-PM*%rH4Qa52(cR5*MSN'8c[,(P!YM"2-6IE%d!HA,PA)IqMQL@'%Vl8)r0(-aV1i
-aJb0YK[&Cdj!!--U&I&F!fN(hr5eB8TC-8U`BAq9X1IPb'pQHHNql6`PGPJpieR'
-$)GKZA#Te,M%l6mHek%cr,JL)iU5rHMb-[qiPG*1AHk6Qb&)Zl%6AJ,TpPKHBb$c
-bc'-BN!"@YR%&m1'`c0BiFp$UlB[rZH(mT12YjN&X&KeCh*1(-6il8I*CCMh@U1M
-aSdJ!fF`XT)"hZ-+M"M0EGA[$3apMDkr#TQRVCraS$bcP9AI'V8$*"bC%0Q3VJ6+
-@#2IT0NlY""hd1$HK0Qa)$Y5Q4,2MSM(5C-TH!@Sk$lc(Saf5$U4`5C@-fdd"+aI
-3(f,d9P$jdD[5`cSU@5ZMXmIeYL!G-Lp&Vj,Bq-SBRI0STZ4q+-%QeLrVe4*A+hS
-ajjaRHp3i''RLf035d(qQB9A2G*M5%m'IM%f+qGEZX5IPlALdY2@Lf&,EhrEFVZL
-LS+Rf-"4#e+-kZa"l8!D0h'lcc5B$h)LTFVJ2[#0@&20JN5k*aiXINc0k$GM&YR2
-amQ,)r,318km!P!F+B6Fm&UkqL$)q[pBXm#0PG-qC51$ZfqVE+fECrELQ8V!Ca&`
-(UD[8b'cAA6!PlP19e(8%Ep1BkEdhi$033JQTMXKHlL9k`l3B0p+KPrpiNC-)PjL
--N@bh0')5GG+$Z4#[SDZ[#EZ$hfR#)KZ!f$JJ%D"HrUPSXZdfh+65a3CCH`r)4Zj
-(p3F66bf-8CA+dX52qQ5#MFYRY[%[HZVBQ6a[51eGPia,1eRVqElB2$S0CXD6VHN
-ZHcie#@UV5V4jSq3q"kS@4$5`S"mP(M1Rbq&+HE8k"8L"AIYB`8K2LU`Cl1'8j-Y
-hGa1*19h0H3a+p"BIml[Cq#"F"UPfSGQIN6JTiYVYRZ`@VkN"S$4CcdhA(RPi#3b
-k2*J4QG6iM5@VZSBY5Me9aC-)pQCLeZ2&Q9,0Rb1GrLj3&'DV%!5*6hC!+Y&%rGS
-[e2+"6-SSk-Z92#APC18A[E"bqr)phe!R@VPU[XppDmLC!S9f&bR[dFpapECkPTT
-ViEG+p-96FGmD&T8Lib3a0b2i'Dm3K!66Q#`@rPXBj+H9)qCX`"SPYH41j4JFPeI
-!I%&bJrkL$ZH!L)aCSbHX%$4LiQl-33`JfNNKDfk%pS66FX`,$,S4!kh51CUr,"9
-p#Vam)J,)dGBTI%cAi+@Ae[b`Y$(5dP'TBCMLB$&IeN@[mlj5T!Z(QpL'I4jcGUc
-aIQklG*,Ldbl#``#f+e3[cq-5CASklPXY9B'5a#dp`'#KhR5`DBaKqU6f!@,'0dC
-6[95$Ubqc[[8*NNTj&&149d+TkEil'Z9%@GFqVr+cM&Y8IDm[UN3aQ[d@d+m4)@,
-H+ZMR!9D1)'1qBUY`Zpeq1CX"JLN&K*R#PjqClAeZe1$k94["&RXqJ@E5$9AJ&Zh
-6e8I[Q(eDYk1pj@GYLRbReTKk!@(H$lR'B68`ajajPVkAl&Y"@'r+$'b)3`f"D+$
-`Q!-@Q,dkN@&YEfmmHCPq-mBFVKGN)5Ic4)LJi)C%L4cB)XM,hSr@1NFL@mINT#R
-Y[NjdL'1,ke!&"!P(eH1Ua9!#T+@a!)UA$kl8UTH3!#8rB,fUqN-"aT,B#mU+)MY
-cmZri-2PTkBKc!f(M!F6BL-pbGMF482DVNQjM5%1SapjDJZ-5&@&h'D9H8be)`)a
--Vb+(a&e&1iFBZpEf8KJ`Rr''"V%61if)AN3mfVX*Xp(i*m8i)&j0SDh3-qRpGa*
--*cUr!6DI(293&B8q!SbG)TpedIeqPDm*E(hFpR6%IT!!8qi[%X%ZMda)))c$GNl
-AKmXE`&('6)A0j3k"Q8+h6FDBA0k3!!ZJZF-mVV'V8$%C[XBV`FNb5!a4F*!!GVH
-ceQ#+r'9"3Y&8dU2[)Z)QXGKb-Z5"Zj'BYB5B`%ZbIN0DC%2ir#d*&95EMI9)r!e
-iVLmkC-MBebd6%%I0fe2Z"6R,dHXK+IaQa!c+m+Y%MpKr!ck@L#HQmQa9Nfr8f4L
-fQ,Dl(-A)q`#RQ6XH!BIImRDIUmGcGE)#mc`@3k0K&1)f39NH0h'JITFHj`%kUTa
-6ZYe`i49Si4$Fh5ec`*!!kkkCl4SDM)X*""P21l0qXP@Spk0J-`T%9T(*e36EUi%
-1*UlDU`SHDfBYZ%Em@*elXabrXiYRl4Y3U3i@3f-*Z3q#[h`aVm4b[,P,+1$lR)U
-VYpL#%fN*a(X0+li9B4Pm*hG!TC!%!3!!-!"!!*!*!3)8!*!'!5m!!+m8rj!%!*!
-+TC!%!3!!03!!Y[&1mlEa6[-!!!%[!!%PZ!#3!p-!"EeZ!*!15@0[EJd!!GZmD@0
-[ENe"3e0"!*!2J!#3#3(Q!*!$J!#3"!m!3X(8iHr%)(JHNZXl)T0$PMe1&X9%h,U
-"-`j,RCS+U(NFRSIR`'$MA4ifZ1eNp(bc"k[8Tf29`V5Ebi-dlUp1aif&(6j6c4P
-RTLP1eK5a-h2EPVY&cfClKmZkIGS2aXQ*%PIPjC5M%Hph@9&a(ZfDKkIUBkh$)JJ
-i(L3&)ZG6@!#PN!3"!!!`!%!!N!N"*0%!N!I6!!$c'rq3"!#3#U@3"!%!!$8!!,G
-D*!Qh@L3*!*!$d`!"*Y-!N!0b!!8$j!#3$NPMEfi0!!%Eq@PMEfj0380633#3$i!
-!N!N"jJ#3!i3!N!32!%,"e(hUjNKc6hS*X&!ZqFG%dkqC`#&3,a$2e2#TXr,m"`I
-TX2aa#U@1B4RRLq-r1QJ#9qLYrI((9&L$XA)2,'LECK*f+UV8Th1V9l2ki)&%iL5
-K5Q'@4Y#J-DE$2UC8f&-1bXefXah+kUPMMV51KF1,@ANmC1b*FBUJTHU(L9(UGP!
-`)+@3"!%!!$!!3!#3#3%Pk!#3"h)!!21(rj!%!*!+MM`!!!%!!!'253!"MNN!!!4
-X!*$cI!!"!*!&D3"M!(d!R`3#6dX!N!Fp!'!!miKF9'KPFQ8JDA-JEQpd)'9ZEh9
-RD#"bEfpY)'pZ)0*H-0-JG'mJBfpZG'PZG@8J9@j6G(9QCQPZCbiJ)%&Z)'&NC'P
-dD@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#)'P9
-Z8h4eCQCTEQFJGf&c)(0eBf0PFh0QG@`K!*!&#!!1!#J!,U!#!!%!N!0p384$8J-
-!!(i08`U6K!'ME3$X#h)$Y,)b+b[M@dhH@qpUpkCZ*YH!-3"!!`#3!lUe$)!!#@N
-UrZ!"94)XqdV)@`lMjA1kK9'1XMr2MrqZ)$NhV"Vi%FU'0AQ'BU0RDr#XAMm&lZ`
-,`,#T"L)i6&Fq[H[,VD-C!m8F@8XE1!X!N!0D!!%!N!9G!(!!F3#X"!*25`#3"dS
-!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfjXH5"LC5"`CA*QEh*YC@3
-JEfiJ5%C6)(C[E(9YCA-Z!*!$EJ!"!*!&D!"k!(`!YJ3#6dX!N!G)!&i"*BK18fp
-YC5"TG'9YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9j)'&bC5"ZEh3JFh9`F'p
-bG'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"D3!M3#i!0%%#%0[ER4TER9P!*!
-*RJ&H`!)$k!#3!p4"4%05!`!"%Je6#TXN!$Z+L)S9caE3Fka%E"$e,$pr2qcAREr
-RlXi-TeMBB58U@)999@,P[r%%XDS&#l*P1diJqC!!(`&8**Mk0Eb&Tph&fGe0dXK
-kNVep(bj$h-@Aak8,&[Q01&G2PI8,*$a+MT*"[ZKdYI"dDK@D)Mi&jNl(,(@,TA1
-"CHpm&"bi0FV-TR9!6`FK$%aAP&QFVF'lCA-L&paq$(JIm$a!SNrM'Ub)p-`20hN
-S80Z-b('VTjc&BeY4ZFc0eZQ"Uj3hhmRl$1Rr92r*E3#3"$S!!3#3"9!!@3"N!*-
-%!Np,!*!&!`"%!%J!k)JC9'KTFb"KFQ0SDACP)'Pc)'4KE@&RC@3Z)!#3"%J!!3#
-3"8F!@J"E!*3%!Np,!*!&!J"&!$%!k)JR@@pe)'KKGQ8JC@jdCA*PC#"KEL"TEQ0
-[FR*PBh3JF'&cFhG[FQ3Z!*!%$!!S!#J!YJ%F"!&993#3!``!)!!)!+)"(!##998
-!N!--!')!NJ$`!CJ!K999!*!$$!!S!#J!G3%m!)G993#3!``!4J#Q!,S"eJ#'998
-!N!--!#!!#!#L!4`!J&99!*!$$!!S!#J!VJ&1!,9993#3!`i!+!!S!-)"T!#)998
-S#J#3!``!+!!S!*3"%J)!998!N!--!#J!+!#0!4F#!999!*!$$!Y9EP0dG@CQ)'&
-c1J#3!`J()'C[E'4PFJ!!"$0"4%05!`!'G`e9$8-L%K(QAQi3C#dC4'Vb4#3,%&Q
-VTLBRYcf,M1"fjmK*Yc06mTPrGlr[fiSm'pr-Yl9!NYA1l-RN5GLq1j-4NZ9@j)Q
-Xb1mIN6q6RmQmfGCf%8N@%l)h,FNL+%$L"rp1@BD49%3iU!XlH1)RGL%XdS$Y8-@
-K&RB5AKr2MQN-Tdqr@5Tb%b2*lEeNEa2deYr0KTa,b#P((lQrdKDbpHCeqFBN#8X
-TDGMHT"F9Nj*A@5m3r1$*iF)A(Ra+`bCSd@*%bYh0[UE$mLb8Z8NZL1FKb4cpaH#
-,'S2Z2"A0G593mh5B(ilNbH!U(HDq*03V2L&LN!#Glm-GLj)350pE&JffVadV0j9
-c-)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"&UFSY0QF0BUD3IT`b
-XGDL,fZ$B!U8fSh08@--BYZrp*)$#,J2%1@+BZ'k&r-qa*h(XSZeGPi*0bi'TkX2
-@JbVR0)ahG0E&J(3EJ`[@YV@,-D*-cb(Q-Y`6mPcZfjMcBMp"cGLljK3Rb&aVTMa
-i@-PP[RfUT+62k1U0klXYd-Kcq8@f`RZ!4-@X%K,E)89)*H!)2HGQk+!L4L(61rD
-KE[-93T%lT4&h#Yj6*Gq@)$NpfZfT-bIQ[*a$ZHi9U@$-fpTGbR)EqIHh6JN-ELh
-Ir*F2iT-R9S%)rHb*!9X*2'JQcVG5aT+bk)"66"T!8Hh@RKiMNZDb1RCPrpLBBZE
-'f'*+5Z1k(+rRjMiNk%bc`$2Y2dPbk)d[lP"05[[rh(fm5+9i5KpCGN!BDPI(P8i
-GH))aB&$'@AMak[HhZkICP"IAk`20U"30ED$cl3ANPB5bhE"dKJq'UT!!'MJ$K%E
-f[#TaY#Qi5[JiZdp@*Ek(V6S2"5LGMGP9XcSTH`kX!)Q$@e`Lj!Hc!YeF"G@qBdC
-pV(kpX(EYJl32qi0AAhd*'kUV,i&`%M,25lL3!)9HJTA-Hq-JNiRVb1C`%N0V@&,
-9LJXedG30VZTedYBKmQ8[pD@$C2LX$T!!US[$LD0[BBPS9ake"Bi4i"NpQ[B5,S$
-!l!aZkDY"[CV-MSM(ZdcHrYqi$lHRmXQ0Uj1Q&hdZmV+6dc$Q@CReZ"0&fVV&S"U
-a`C3d8JpM+h9[1peJ#QP[H2ESABrbfDQ9EXl,)rR"Y(aV,(DK,&e(qXHCLJYTG`c
-eq9R+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#3!aJ!0!#
-3!r-"AJ!"!3!"!*!&!qJ!N!18!*!$2!!&"#"[CL!()'PdC@ec,J46G'p`'dPdC@e
-c)(*PE@&TEQPZCb"dEb"9EP0dG@CQ1JY9EP0dG@CQD@jR1J!!"b*"4%05!`!-3`j
-G#kZ#*$lU%1prGjb%8-8Ke%4U9$M4)k"mV`1cHE"X35+++e)@+mTLVcDH@@K*2-m
-fY,@Gq([e)E3@F+Y3`CU6#q4l%rB@IfqViqmTMVm(#i0NeC)kXl[86Qa45-+m*-Y
-)P`SKT2Fr)CeBA(YZrId!$HEQ0$%"*$3M04p9j!kQI8Mr1XJ2KmNe8STE4UDQIi,
-S@Rhe[I@qarqjqdZ#CYHDLRYFmcXRh'Fqe)[)rKRQcr8Z)jY$mqMAB4Z*`8GNQ$3
-LNF,eb%X++LNJ[Q-))Z%`N@8J`NC%+3H8XKIX1QSI*qQMdQDIpGLhEpjV%lmY1l+
-5fDcpH'C-jhq['[`3jSrETKXX9fHMKlcNER4riBTCqG'#)HTh9+c"*XN$@Cl+I(h
-)QjMblcphCF`KE5hCkEmEJ'dKrURKM#aIRB*N3e24C0KHQ)Tl$%Br@CYXcVBTrfS
-iNkeV5'3-b4AlqD@&QA@GlC-5"V-KqeISpU@)!9VF#TrPGVe3`$j(GLp+(M+%)bJ
-Kr&Sfl6c(iZ1Y!9iHNp3EPSIpCePFTPi6XLqMR56Ea[SbUjGDGG,V$qpI@A3Hj0j
-Cf4[JHkF,BhCr0'i62[6hH)6PrqmTD$jIpH[T![HreCf6"(cN`HmpTrP+(EbH[''
-!b&!IJmY(HX)"[R"cV$$bkT!!BFkfqZ%`*Q+HH1mQpFh)rJ@qePkBpb0ELS5`[Fq
-P*d'Lda$-8qj%Tj%SG+&FF'&0$-QD@&h34--"6@3i6E!+&5CN6k*#4QZTHTiUAUN
-T`YdPZGKX@*2jFEfX5HRlGNQ6`Y[fJLBRhkjk5j-GMr1P!HBl[3'Qm)HHJ"HPEDQ
-!T2NIX`%2j1DEYFhii,)JXp(b1Mbrp)q9Zl25JF%)$&*Jm!+$kJjf`(I`)SH&YIF
-)dciHP@*rMBUa4$IDcXH3!-q&V(Q`BSJadb$'CXSYUpXb)Mq,Xi0GD)T&6U4-SpF
-Ie6rLf`lAZj!!4!fm'%+q8%hL1133Cp,eVX%T8F2L###cAI$mL&00G&-%Cd*2iB%
-iCf`MfF-jf!FJ1%J4[MVRbX'20Z1CcLbH@N1)6)kDFS+SqQb1EX+TQJDrTfh#kJ*
-5aM-q0k+Q%VF[a'CXI#96N@%'546j5+F6eCZ`Y)TX2A,NUk)B-Ej,R0VL%(mE&PX
-rq-#p#2e$Mh`2m[mZZU6[&E)M(T+mmZ5*C[*Naii8P6'D6(cbha3TS[J5ABK&@0U
-BMc(1MV#HAk%1$dlX0f$d-%mhXhTHI(EKj`HhGF*SlVcm3"f0R8KeA4MGl##9e5F
-lJEb)E"IQpI`h[mJ1R[b#0H)%!d,9%Uh1GmIjmI'(P'YJ%XlMTk6lU'PlpV!H4Gr
-mYK0%M4LGSRTmK3Gb$BLAff+Tl2CbF&6Y![$@m5BA+)6!`8@ee[Q9(MN+4[41XU3
-cmMk'DQ'S6h&HI"C4IqZm$K%CM(`cNh-UZ['2M!%2")E[(Qeki1c3Sd5C@fSUeH@
-m*6B09&BcS)f1L@L#PQ*+KA6-TD%G95+1T&jmbi%QIa"&$XCA8%pjZ(#6lN3Mjf1
-EiJUFd@m[mhpEDRiY`BBack+-$RSC#LEPF![d"pU$S5L'jPlJNJjCi#!A!`%J-Ir
-FfDFJj'I2C[Bd0UCE2jZlIl&[h22GqrIq+,l2YIaTXma5M'Br@GG*k@i'TkPPB`@
-qB46N'fV8i#e-mqY#FQQhm,*pdPaSPhIj$G'iC,9Ub5XUlPrMUJ4eJF&a@NLbIaH
-iI1&RqABj*aPfCDA)c9$b&Q1&B+d6")mEj`"hp!LF[E!INQri$5f+0$%85TjqUk*
-%EUa+@q*c!aF,QlbR+TRT&K*AHmBm`H+'b@!Ybe[DD%JNC+YK,rT32-h-5[2H&`V
-q&@3lX4p3qFD#JN-be"TjPN2HL'*jq3e('@KA62r,S8m@)G*`Y9bQVCUKQ*,F46f
-P#De(dpG(,*GddTH@hAh9Cmq89@fhA6q[&HaSDHi-`A&rBc"SL*VAklaba4[#Y3N
-[eaKF#TAbf#jhZMBU6rSp`@$*6JDqIde3IqrP2-(&8*'2lGSHTLKVm%m-dEa@`90
-(@8HSq#r2kiERdSZ#C9dhN3qf5G9@i9,MEQj4F)61!R+`NF*EQ#T+d!MBVHi6(K1
-%BpVk5r4F!%DirSj!pl[YiQ83Vp(a)p)(#6++Y%mhNNJ2e#*CJ3JADBr0GlNJA$E
-L+aRZ3114C2lUKK@1Nj`-Cd`A*&$Smk@bIplmk&rjj*%N!V4E+8QIVZ9DXkIkqYr
--K5K(p'2[p%4qhlC$P5dE9Uqbd&iR9pd`'&Kc0*!!U["1F`I#QD4#UF6[J,+V(BC
-CFebM0LLP5'&(NU-8pp2f1U[GXf#3!0bTkLKeI+$XpBE#8R'ID@5dE+#fMGY9GNq
-ZYN`D+Xf6iI+JTG!R)B'`%6K'3j9)bMeQTe#4CN8`4!JVG%2hqIS((dfBili2!*!
-$'JB!J!#3!`-f,M!28h4eCQC*G#"648%J0Li`!*!$$JB!J!#3!`-f,M!$0Li`!*!
-$&3"8!'3!L`''!!%"!*!("%X!N!3B!$`!3!#`!CJ!!3%!N!F""`#3"J%L384$8J-
-!!iS08`UE*!"rKN@`h6Nj%l$&$Pe,6NmGf`%9!pZaqYJ-9[A12LLS@(eX`@kXkXE
-!2f0r925rrfq2mhC@'FEU!!ZC03eF9Shd`Bj'pkj6'Z`%Xr-S&0c&iM*#YY5j)-P
-c#j!!hfq#GS,Td84dcbPjXa2G[-RZ+i@%-ma,@ZUD8SSG#ciIQp0r"2"krMRUbY2
-UD[qIAfl(Ujrp3rrlNCBP!VJcDU1#E9E"5#Dm4DYXM&@eAPXqBTZhKHeK&AhF&mE
-5@NbNP,3#F4p-ISc$ekiEjSHQ'HT6frC0h3qk%'KDJ#F%b!#F!%bpqLd!rZS*!a&
-r!2#LFZ%#%"b#J!'#BQ!Y1)Z43BcI$%,N%MVLkQ15c,dSF4p-hh6j4F3VE-XB!*!
-$Gd&%3e)$!!#!$9-,@b!$!kCJ`kTUXc#`!5*LB$G,XGYCPD!JBX-HkYR!Q&8a#f-
-UZ[HR8k`+#iPMb,ELGpB!8LMpiEh!JNUia8#RBdJbMUrCpbBL$VrTa[llf*mk9dm
-STT%&(C'kJKQiSm8DVUKU*k42-JV[4Fi&!*!$6!!#!*!&#!!d!"S"'iJE8'aPBA0
-P)'PZFf9bG#"NDA0V)&i`)(GTG'Jk!*!'#`!,!#X!+k!#"%X!N!8G!$3!,3%BL!*
-H-3#3!cS!!3#3"6B!K`"+!-%%!Np,!*!&!J"&!#m"2iJCAM!JBA"`C@&bFb"dEb"
-LC5"NB@eKCf9N,NX!N!1U384$8J-!!,B0@`Y6-!0hFbeQ"Z`CdmT9aMFdilke99E
-'2fp2lp9kYqiprq)E'J!!m!d!!1Jf$3!!#l)Y'i'Pq!GfCr[jjDdYFp0@cGpCf*-
-4E6ZY!bFUCeRCbDlbH0Gh4)AJ8X4rJKJ8[N3-RI0#5DL'!59#J#kS$Yl9"F#6K4b
-J',6dJeNIl`L5Cd'q)0q+c@'mi[eVN`@PK4)VLVPbh1Hj`Y*8H1AaB3%!N!--!#J
-!+!"r!A!%Ve99!!!"!*!$J!!Ird!!)!)J!#)%N!!!*JR)!#)6j!!L)!)!)N!"!##
-(i)!K$r"!)K``)#3Cra!S'SS)-M++*#BbmM*10!Bj*QAd-K*P&#3)Cr`)"($!%!)
-ri#!"!B"!!)E!J!"!!3!!)!)!!"2N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!!
-Irm!!2rrJ!$rrm!!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrrm$rrrrJ
-rrrrm2rrrrRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!
-!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3"`%!"rrq!!J!J`!*J3+!#N)#3!L%!L!
-*#!)3#p!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J)!IJ)#!2m#!J($!J
-)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J
-)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ
-2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
-2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!!!!3!
-(rri!#!#$!!Z"!S!)3J*!#B3#)!K)!K!,N!!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!
-)$!!!#!J!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F
-)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr
-!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
-i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
-i$rrrq!rrrrJ2rrri$rrrq!!!!3!(rri!#!#$!!Z"!S!+3J*!#N3#)!T)!K!+8!2
-i##!!#!K!!!J)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`)#!F-#!J'ImJ)"U#
-)#!bJL!J-!BJ)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!)#!'`#!J!!!J)!!!
-)$rrrq!IrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rrrq!rrrrJ2rrr
-i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
-i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!!!"!*!$J!!!!8!
-!!!)J!!!%N!!!!!R)!!!6j!!!)!)!!%!"!!#(i)!"$r"!!K``)!3Cra!)'SS)%M+
-+*#BbmM*10!Bj*QAd-K*P&#3)Cr`)"($!%!)ri#!"!B"!!)E!J!"!!3!!)!)!!"2
-N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!!!!F!!!!2J!!!(m!!!$rJ!!"rm!!!
-rrJ!!Irm!!2rrJ!(rrm!$rrrJ"rrrm!rrrrJIrrrm2rrrrRrrN!-rrrrq(rrrr!r
-rrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!!!q!!!!(!!*!
-$J!#3#!G"8&"-!*!'"e0PCc)!!3#3"!G6C@Fc!!*r!*!$"e0PCdi!!rm!N!-(39"
-36!#3"KaKGA0d!*!$!8P$6L-!N!@%4P*&4J#3"B3!N!-d399c-J#3!`&*3diM!!-
-!N!1!!!%!J3!#!))!!`#$4P*&4J!$!*!$J!!"!)%!!J##!!-!J`#3!b!IU5!a16N
-`,6Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#3"eG"4%05!`!"!3e6!Yc@"T2hdNE
-0440Y!,6j0bkmfddECX*X[UX,hi6GX0[NhAE9eA9K!!NiTBMrG!Ak'M5Q0Klla*e
-Vf8k#LE$6%2V!XqJ!D*!!aElq",i'!!!%!*!4J3#3(S%!r`#3()%!9#[r!*!DJ3"
-8re3Vr`#3')%!92q3!e3Vr`#3&S%!92q3"93Vr`#3&)%!pID3!e6fN!3Vr`#3%S%
-!pID3"2MfN!8Vr`#3%)%!pIEfJC!'9[IfpL[r!*!1J3$ep[Eprj!'r&EfN!-Vr`#
-3$)%!pIEf9[prpj!%JIrhpT!%+rm!N!U"!2AfN!2mrIG@Ij!&Uj!$IrEf+rm!N!L
-"!&6fN!6rIrCr+Rm!N!089(p@+rC8+rm!N!D"!&6rpT!$9[riphmUI`#3!e48UrF
-Vp[p8+rm!N!5"!&6rrrD3!rcppeC8+P53"AqVprEfrrp8+rm!!)%!92q3!e6ip[p
-rpRmUN!989(prprK8rj!$92Mr!!$r+e6rrrEf9[rhphmUJC!%V&5V9[D3!rrr92M
-r!*!%rbY8rrEfr2hf9UXUJID3!i&rrrIfN!2r92Mr!*!'rbY8p[EprIG@Uk[rN!C
-rprD3!e6ir`#3#2mVp[C@rRrhN!6rJIH3"2D3!rIir`#3#[mVp[C@rIq3"S(fN!A
-hq2m!N!cr+rD3"[q"pj!$pT!$prMr!*!1rb[fN!2rrrMrrrMfN!2hq2m!N"$r+rD
-3!rIhq2H3!rEhq2m!N",r+rD3"&6fN!2hq2m!N"6r+e6rN!98q2m!N"Er+e6rN!0
-8q2m!N"Mr+e6r92Mr!*!DrbY8q2m!N"crq2m!N"lr!*!a3Ej"4%05!`#)P""9$@9
-9%3!K9Hj'RckIP9+A1THPQ3[p@HHXJkd919ilR0"ecjZZ,P[Y"Nk#VV#Y"GcclQX
--A$KHA-'"#b!1j!a($*R6`fd),X3[m6M2QjaRL1F40-C6ipFJAjmh-ES33mJFfrV
-qqr`qEAmG!b'AerIr14e@0K)4!J'3""%"N!-43Ji!A32IQ[Ej"hUL-`Km2d5"rJb
-ZdI4iYUQE[`3Tm6XAhiZ&e28rqjHmNSQ(K@lSkfQ#6r`iVi51%R'3!"ppNiMDBVV
-e&PPM2LpJ(+*"mm&3LHU40Ie0Ta2I!E(6NmKV1Sd&"12cP@QJ+GX')Y9EJeDr$H6
-H,`GrpKGRmP13!#bEXSf"1qIEaTUh[$@iaYbd'mYIm@8%bjemf8Q[*dT#jjHGTGF
-6*F&@[Y`*SR$2XV1Gr`B3[)iqlT-J)#BF!mrN18-Q*db"*XqIq-$d9ZHrJBj8$b*
-c9I013I3G00mrlfl2%H2BSK"2V[aQr(XLJ*m3IS+Y18,qdhm2IfTqeKB%XFVLV!J
-0LIqCqZ[NN!"M++XipJ#IGMNVq'*Ia'@Zre0pE#iIbXiNQ114SC&2Ba+$fJQ#RIM
-'!GA82c-"bfc"+$+J6QE-GGQH%Vl1l5")aN45M)YY`T4rCDT3TH)rIjhk+cA-f04
-IfF3j$*[aXfAd#Ne&V[$T8Iedj)V%bPk-l4X6hfMqFD3[fLH#H8,PN@r2lqBNJi0
-@pqIGL4`4AIQImFqaqFqaqFp&X11(k5,@e[)$GB"[2AT(3"d`@mceeeYLZT9(L*@
-rFMQMYKmqBGlUiUmUp-GEIrM%PDe(j4`8,PBaG9H$6N`HFKc+EC!!qr1l1q*%0'h
-YYpjL69*@L-TL(@Jkc3ET@%K,bNjT*8+Ta0chAIBL3ZcDBCmeU4edkBrm4iR3f81
-8(5LU1JkJXC(AY0Z",GUp@%D3!-QBE2[,'f+d'b4Jr)GXZ4,jimk$3im+-C9HAbM
-8cpIjYh3HK-S#%2[#D,IjrSdE6ldY2$!)Mcc3&(-QCGFq%-%lDdBrd"3Rlp8(*jU
-N!'8I"PX@-MqJFJ0Vl#C(elVC6UrXUXk3!0qXrNM1PM@b[rS8b2jq'c(081e*Q1r
-D,,#CSSebGZ)lIp`X[#!lKa,q@25H[Ce!m)r0)U6jkFYc9-mi%*3SNq61qEJX3iP
-5fer+bKaGJ3&RU&R&Yd(&F5QbFT,BJ$pkMJ6C$d4"`"Hq[*5,FpMPSG@fiFhr)"D
-KJN',eRi%H8ePa*Uh#2'5&M&XV3-&8hmBJZH9#,CQpr`'&F("MV5eAJUqL*41(T!
-!Ye"%5B'E)JT"'T%IQeS6D6,Z'e1TV-L!N!#4!G&CFk+l0Dr*+#IY6e*dQqqhLI4
-3jrD%L#AE!S,)fp(1Jkh#E(VrXrD!HHLpqZZ(c#D6UIkcZ8HPPf&(*V4(!LD6f@3
-IRi@QRYRPp&Nqf`3KYL!Yj*!!a,5*[c5EfJ-ThlMqk&f@KQFc[6A24N)[raKECdb
-GMkT8*4iL`eQ$P+dBX#'Uae4&&M'aa5qU"kT6cAR0KjYbQiUXL"b9LM)SQPZDEFe
-h)j2M[jSdeE1UCmPMaT5F9'6)&0kj1&%h5pM(UB+HY$Kpq!R&r'5FcA0L845jkTK
-2'QUc$1CEJf[bQMjX["HIDBdR1aGrZaJN[+MT,6$@)C0`ciPZBf!#i(Cec9-!YKY
-2I*UVqRVMT$aQ2b2,qNXG,V[I'+S('8qILIHTUc%#TYb-P&8b[5b2R8R2X)Fa"5S
-ar9hRiZ+06qeG+aV(q'IT8hY9UXE$TVc'[UIfLQLMUA2aVXe!r$Pc@NKJ-3F(c-J
-DbPY5KjqUcKNrZ-B@0beZRR[iZG#8,GlRHXV9I,dTVrNQ)SRJCbj8r%AR$2-e!hX
-RqU$NqDC&UNI`8if+HE2U4E"8dmqq-9Y&mkm03lqkqGGJDac)Dbj9,F*N)reSfGL
-3!0MB%#3*[d%%$Eemq!*q[Y#bIS'Ipl5XmpR3hrcV8r9pBPMB"TUIT!`9LiA!&@G
-SIq"8Yh*ML+VVejLE(cG1VA%eEm@f2h3%l5d6$cGrBE69aU$JBFFLeH010CN"-Zk
-Rc'NLp-CIJXK+ACF#a4QbNRCC+4X*3"G3++%XAh0HifMcaeDH05Q5c8p6&U*))ZT
-f96q9X0!,9202'l*F$-6r,MK*c)mX4C!!RSH#a!'5QR2%pUUjITZ`V4&HFhh0XED
-pILTGIA12a6E4UalpUpF5BZ02k9rT6qq`E$eL`f5Vf(L&rT9HZGkb&5$R(DrC!V2
-S3-KFVh0KiF2"bp[%aU[dVr6UcCDYafcZbJFI1AVcj8fSUZIfr6fUeEmI&#'EEfi
-["Vj`JMePK!+)DHXq#fAiQkYEN6f()YP4r9&lT!Y)cTpFLL[Rh5C#B`00(jVIfc(
-30-hmfI*MBelcHmZ2E3YSd6Lbp9K+mZBMK`HDlMCr(fac`IEDBEIjqmYIk`PXr)$
-qPAl`q*'YVmdk"P6kj-J03!bIXd#YE'i[Rr"aC2T(fq6)2TeSDDiHb1ECpiA9$XS
-1Skbli4S!GJ10NdkG,N,CeL)*iY9!I8PmQdMZfbD3!$d0%M)b5#R#'QqAXf1kpKE
-''#4'H3JjIdQ)$f0Yr[rPl(BcYYdKhfj3%,)NNi654&YNY,*kb-$-+&LX,848PKd
-`eb3+B1e"Dj!!MU!UQG&UTL@Kd(aX9T`ZX3AEiq8bAe8`[hBGc#F9c)G@CeBp3`E
-HG%CKjXr`c14F9A(car5aMUN+9B90c5KiJb,Bp%eT8UL&ZUN"L`$!d'rUK9('+*'
--@mRF35i'10l5,Tkf109'rh5,A8De@8'C0mlKRpmR3RBHr2CjLG#YfUrTMZ8EJp0
-4A"[GB'k$Se*)bM*Y&bQh)%[&4krYQkcVpRNCQS@%D[2(&2@b*US$0Ia@*jVS3Qf
-VNX3@ZSb"%pdaRRdEp5M93eQAD#KAQ2p"$NET'[G*QqfTN!!%8(D++2lTk'G0T2(
-m'P5JM9Pb8Q14A@XdMFBe!0XEdf2Ym4ia!X80Bc&P68*p&A,HiQ%dCR4L&-fjaF8
-k4,ID-E$N8AY#$MSpRdY9N6T@J8,%L*rcB*)eh36+0cV$)K"439&#6-5-+XYR+&,
-8j%E%La6D"Pb#TKki0$Q80mc"`(A@+-6'0&FQKqMkV2YJU(l$iA'C-Uj"dNrLF!8
-1Z0%mAIcSq9Q#60-q5ch3I(1+'P'NYJidPe,60H#I*D$%m92G8+UEXQaq8@@,+iB
-MXq+f)$+P&0RMFClj$NHPj*l!hX"6JmdhVHPV,ReU#!Ac`dY+8$$2j8Aa@Pi8#c&
-2HqhT$P`,T#MEIVV$FU,EZ9FDLP*8BL9mX2K4)l+$[$3"0ipLMSaKiV)YcT9Ilk!
-YUCe()i0ld%*3l3eMQeRTf1kPF@5Qj1pcdp%p)M)ifSe$CPZCZ4i!5V&#JAaVT-!
-d`4#Yi)LD'++$P4!GD%b`5cVCTGUT9cIDiPe#3TH3!,9j`jd-aX95TNDUYNPPY92
-2,@iZYEI-b'Yqh"iP!)"8f[a&p5qXAN,qd65+,+H(,X+959YFqF+q@AQ"P8c!r`T
--#0R4MA!dJN'*6E,$q%TY6''+kb4'Q*ZDf16EUcpkC9,)+2!3`#U+AmN@VEm!)Q*
-!%[$+AZ2aJeQL#i)5*+Kp09'mQ*e#F2%daGZcjAA1VR)%9h2"ZH*(@X'%+"-,jJi
-iThbT&%qQhDV2V1VKJCXUp3!82YBre2QmPCQVDMp9p64p)69VNhBkKZNJQql56MX
-`lC@QcaK%E-+dQddE4+c%Y)p0'd43"QD9)A!3H,[rCUNa$l*P)CBI[$8)%Q-KJ(e
-bij!!Df1ca,iK-F8"N!"d!1kl#akJkPFCE'A(8'N"XTl9,4&,EFpH!I!VLTm@%2L
-'*dS,(S"Sf6J&!NNV`#""!-mXiI6CJM&!(A*2`@BU9YA#$QF"6(AK5#'1m1-JMYP
--ZDTaIR#YiQ!,J%"CC3&"Ta9A%@Li!!GUHA9l'4YYIbHlS-54@e!#0p'Ya-,%,S#
-iC5$'e82NCH1lY6&Fm3NQUP$dp+LUT1-&+HDd!"TFqkEM5"djQNQ&#hc2!NdMlf3
-A&G+bqCZ1h+*#bPJ#-6-0lQ4MTXkqYUCE`&$d$VP[(3"j29"8P#F#VXrCDf4,(B#
-M@MB%lq@ZK-1S,2DL'BP2UfBJSUU+0T*j#,rGSh0S,YZf%EMe4&e+mSl,GeL3!&@
-q-qD4(CSk)XbMmDCr@AH(46H"V4AEm#2lRkL$`*hF[E!%"*'[k2V"51mJTNX)K'K
-#d5iRRHRYNBjAiG+QfJqRQbjF&4ZKCQ6$EF*VMh)(00AK6C[m-ArqPFM3p,kFV3i
-`1pY*(#'jVi`*QYTA"[8Be"FLTFaBT,)i@q#UjmU+iZ+kK1Ej3aNSb2)AU8SLK#C
-3"+'aZ!'99ij3hFX9d3%aHjZr"!0PB"pSb#dUbK&&j14CClKJHmQqRU,#jRRF841
-LUjqhp458K)%r343iU2lfX@UVFdEdLePaK4Rl*8FPU`5)4%h[aMQC),P&cF$XNLH
-*U'4D9!LRJE5!j*B)-NmJ6iJV"(M[mcCpJd"mS&9#6SRmCBbl)jEX#cC9Y'CENf!
-X-ZF@f[#cUENTZSM!-9@*[4eQmCUU+-q2a5998BikQZXHa%3&&ML5kq11L&i!4Sl
-)N!$KLZQZR1T)Ri6+FbkSl)!*&6Nf1V#NcMU`T-UFYPC0fk!U(f3m&cCpNk(U'He
-fmZ$PEM!YAR+9Q'j!-dbBhN"$626K`#JBeI6#e#3b!&`1,,PU(9JmM'Qr`m8V,[q
-"J$&MM@[*eA*H4qh#hF'Q2&b-,[!5`)j6('##Fk46*T!!&DpG$[%Q'NbIZTBm5S$
-)#6eL(SFE4-M,TlVT1)c8CFllGc34NkJBM4NA&rple4T-,,Nbi#Vd'TJ)A)2B'89
-4j9EY`VY!)5LhN!!UeH@G-pDqASNYl5Qm@,),Ri@0D9'%db8,R49SU'TL`R[#U&V
-M!JU,(kfC+&kV(J+BJ!+ZDkfDLMKclRB["cmY3(%D$F(Ba5[D-H(Pdmra+RAaSfS
-flHE6Y@cDRbED[B4Lp$`!eY0FK3QJGKlS8P3BL4'$df#f(!J3!`*bd`("Ab#Uk89
-d3(LAP'Lk8`H"fX#5NMFY"-`3H@+SY2$[MGlU(J4LEq%QU,+1M"""-qN3QQjl#kD
-Z5P1&a66Pp(i1!45`*dFMmVka8)#D$-5#CJ+Z`J8pKCY5iXXYdP804c6G18PM[!E
-6L%T#GC1dY@+0TPXK52#Q4f6SiFB$2&Y!e2E!FCj8dS*$T*`pq$Q+J`dF2"UfFc,
-bNNG4a0qd"UqA($$R)M##Q4#C+#hF4-!DSZbSRP43k-G29#)9G1f0jTRkQSXJDXS
-jc%NP82[AG**3!)dLC$'U'Q"1@@C#XcI01%N1fkhC01`mQ$G)`hBUe04b4+HqCP&
-KG,+U,GIP,B5,)+V%bAf%#-b()UpG*hE(pLUMc3&6ccQ(+UeflU+L&qE5F8YEVK#
-&d@Z3!-e4X!c6cee,bp-)'#ke!+$[!KP[LJP)bqmQ!k8,i-V@8h#&JSp,f*1FL-P
-I++r+rFVa,+U3!%A2SCK+A5TlDl"Skk(VV%)#k-T+p9&MHJYNU8ZN%Lm+ZQH'$5S
-*j$Tkl6&5-B,e(K3R4`RmjX%kD8q%[CLaXj1QPB%SB10&d&&LdNFTJYU*m+!@5*+
-DH!&3E!8J@V`&PmLpTB@M*kkJQ5A%HijHTmmdm2BV-@iB!&83hB6NfkpSZM(`*+#
-q1k!q9(5"e43iSN56U@JZ98+a&@e-&lkaVqd2hjM6cma3BqdTD,$f&-dXjiSjC,"
-@,fd+SQe`!+H'9BXqLR5#4a*DLhc,a+6,afD+0aX+*j!!mBTXF5TN81biZ!#*`2G
-Dji`Y(i,!*`cZJ0aCPS18aN"l4m"Arkc6(qd3UZ!KZm2Sae$Yk3MP4EfS[*ILilC
-[`ZZb8*CcQp'QCDkbVc4kLAQi)r#pD"$-&ILilI5k,($DMZb@Ya--L51G-rj3HU*
-E8J@2M)6Ne!c`N6GGj6M-+54h@dAe*ClC(1fFkdJ,AEdYB4X609m1*XaB!,$mj4b
-RQV+j!2b[VDlC"r)*$ZH!q!bc6TKM[Z#Vkj!!hJ9$p9EAT-Z8$`*diBj24!J*HKE
-GXeG9"2GPDNU[GCSF!&jbjAX)[!raUfch8-)L$0BPcV9L%"+Kf,MT!Mm5!M1U,8a
-l-Hh$)LK#H1Q0GSP3`*UE9(F&V"(AUbj4aS99q,Z%Geh#kAZ9K2UMDIY8SDXRTH&
-DG9GS*E)B[VF$"Ab$r1D2NDNkFFq%5$Uk3KG[ml4d"ECM$pq)J[KJ6`,aQemp,mV
-%,IHNKG5L`T%@h*AAKkXVF(c-j!5CZ9$Z[L%YQ5mm4RpYc0jk`hRih3hAPYP(hMJ
-[6J[E'hYl)rfhLh&M!+pppj`(IE%##MiJpbIJP(hiNrZU1ZmLNk"#9FU'SfAeBTi
-49`%AbbL)YM#94&fX(GPUXfaMpld-9m[Sl2P1Rf1qXb@fDkK%b(qFLma&BV0`Y`%
-eZ3aS2ZLF#rC)V(4rCXSC90ka[11Tjl()122l-rZaU#150KE,lFD$F!i3#rkI$*N
-@QfmlQB&&B14iHYCY@*MbmSJKN!#4FMb2&R9C@0&#X2pJ6%F6L'+M0hT"(%35X*E
-SKG"q!,lHL#[Q8hG&IhQ#-Y0M)0Pd"8jMZCXUB)Sb$"b)4'r!kZaLNEC*lRi'KHA
-AhVApX-FFGF8pcZ'SDjr(UFDRbeQ"U5ki6)KB"Dj0'Q%1aL#C-N3*+D*cak9'8#Y
-AjC,J@i05KI9#RGf()b,Qiqk$P&%q66)'-C``YhLFSZL1fF+qkq+2C6pHcZE'l#[
-cZ[eVi6,-c@-ic$cmC"i!MFV!AL@CBKk4D,UL2i[L4QF8Rf#HGp)P)9J88b*'M61
-j+q"rS3j*R6j!)"eZqN#1JfhTljD0M'!B4DBK9+2fQ&hU(cLX5%KAJBr2kAea,+D
-Z(SY&TH'b-4`C5`,&1%a&(pc4J*`QGlq"*U"SZB'Da3$ma!Kq2J8B1@iFUBj&ADT
-TpP#e)%2Ed53m-,3@jTU5e![!86q5`m!T!T0i13SMI2Qc@%McQIB#[j!!Ek!'Y`H
-#SQqm,&T0jm8fA0,M#0LpeD&BU$T)SZPeSJR14IFQT#X36&6eA%55SqJA`p@r!'X
-&XCciJ$-dF)B@cU#@YP$YY`rML[(UU,eLD$1FDdS46"D*D28Yle#L-8Pm"6mq,9`
-m2lkfdKA5*U2Bj+hdLJFk++KF&Sq#T@FePJVKiBcEZ&*kU[ZNJ*ZJJ%[4k89'V4r
-NrP)%C56HJ&R%Hp!-3f)cS9E([1V0)S$LYF5NCZbDjXGJ!0j%(BTP2mr33l(#!,M
-Rb4@NZCU8DVT9MMX6P)PSmm"phHmFRZdk#8H-b3QR6qfjUckf5kf1Z+Tlp%8)%,l
-E'S4ENeVe1"VDGpG1c4)J*d6K[,q9*`C"4T+0SS`hb"6QG$F19DJHI`I-UUdBq&@
-&A-![9M1F+QX3E-1UH@"V8Eh!$hk&aZb#(p(Khh#RM@SFVM+1%0Q!VXAeMr"V2GT
-Ve4XQV$CjAD*35BYhb+PZ(T&"39KiJDZ"Lq-L8',CGG`*84+*-X$Z'D#,Q[L'Ak4
-$r08Y5(cJa58M)**jf$8Y#S5R1-*UIN98p4AIV%qr@DMi"BlLX"C&+4PEe6YdD"i
-rp!+rdS$FfYA9[!VfL3eL0kh'I[Fla,+9)YJBUSeTJhqhhS$i*VGbC6h!)i%ENl'
--E9*Y)dGe5MK%L45N6@mZGp-2)D%UC3-N3BLV!!Qc4Cr`,ZVbLEaC9-6H15JPpfS
-DN4*HPA`K*IILT%Xhb'IViT3Y-@+,NpNL!G#F[5VP+dUUL!E@#l2LpLJ4(fLi26%
-V$QFNIh4)p4-3PDqFNT,&PC*V**TH0i-jR61AkM-iT+`L93L[6K-lA3$@cCJ!)[+
-kkP0@*)@M#j[I(`2aY[RY@I(S)Y5Q)9@aIBSIJ6L@+'&f9ca@SCr%PRCe!4elD"B
-)L$Im*4Qcq@JV!$$6`S,J3d6ii!NiT%3RkM"PGB3Tke0*@BmZCmU+5JTTqK3JIEe
-H2DCh*H88cPFUTm3(e)G8Il+hD"RISUCmi5HN02Z"F'9YEm"KHhR++VJ@VpS-bYS
-1!ACN1M6rE0AUfEi`A$f2AK1Z(JR`0TJV,aBj+DRNG6J#m!b-BmBGU@I58i58r*!
-!#Qdb4mR4,$,a`Udm5Gf),6!j!FFap5rpI#)T6GLh'!-+8V%K%GcN8R@NGjBl1L3
-#@A4JE,p`p1CX5K1YNhpkIr3+-Jf*M&[$QqdmDdPZ&$iXTV"!SQBN%P0IB`'jVMG
-['S(UiiVQ3p4$f648S"m3)e0GlNeH4ep1*,T*p-M#2UKfei3LSX@5&QK[ZhCQj&+
-XeGEAkRpeL8T9*dCZ30k6@ac2M1*ci+62H`15iiR)T8JI+TCEGhM0Rmffj-c&pEj
-*8qiLZYKMdermHEFjlh@3!%!QqdFcNF93MkV%CeVmHNPX%e3km(S*A,X3m92hbR&
-lLc3P%H0q-4HJM9UD`X%518l(H,0paqM[ZH1DPYMZ`#YNCc(Q(hVNZ2EJ6$P1%3I
-(0BQ`9dY*$PPfP4V0UDRpd[&@kBL9CcQ@E)@B&PhFAY'qU'4ckk+5Kl!jN!#Rj#L
-)9#"$PY35)`K266`Lf[3'b9r4L`k@f40Y4q(8ZNK9[$m3FfMCm[jp)@Ic-MDEJUf
-e-P["ii`YD@"6"`d*'C(5%4XNm0iSSNIhi6pl0(U%,bJ4kXVSdG(Hr&'Dc-JjFja
-2*Ke(l6l(%53L$HLc!8a1kjJp*bY$#PCIHp'4r@Bp*C2hpj!!Fm[ZcqS$I3**3lR
-KAq`I1Q@Hf0dlf0rC0pMGeYFEi5krA-MaV!YRQ*!!f+U%[-5%6,6e6daqCk*ciUa
-H$!8LJ&&HYR#cKBm[cNZ"c#M3U855[DTJVcVCK)DbaSNdM+Jm,b)`!TZ8(5qL%j[
-&FM4pfSeZq8CUCYSZ8XA#QMkSH1VkKb+6Sa1485&'2%-TQFI6-qA8R&cl"HI"P12
-Tm(#@MjpC5QJ@@FZ`A9iJq,BKLDYhcl4Bb(5@XZFJ-0U$#SM!UGHi`'i0hpT9UU6
-JPP'5Z'C($9aU5e$C3e@U,b3!iaddDe@0))rPJM@E-MX1@bKa1JQ8a&hH$AAeN!0
-(*M@p3lcB89faPN&X4CMB@Llf%lVZ"'88,1$J9"-AI9N[qR$FILm$C@TTm3B+@K&
-#9(P9ME[V%b$`6aKR`qPmpfF@0"Mf"')fFX8Y'X&Qfk@Y8c#&b%[iZ@+-0Mer1,k
-lhY+MZJ4h`S!cY#I`cPR4dX-ViXF,U4$pk@$h+4K-IeX[4aeCmf8F+03M,dZ&NrT
-%hG"[4F6i$5Q+10SPHQ8MDc2lcHrhPDR,l$el!h5%6%0LfZH6Q)VZ)l9e)+["''J
-ij,c*FBL1r1JX9ACL)d-)P4hbSbFkpIE,Lh"Z1"@d-ISaC"kS%`2C%[!LE38")%,
-'2p6G1GKr9VZPqmch"kJ3pj1U#Pq(UPCDaiMqEB8E@+DGK&UMjLb"KKfT+kB$@4K
-*ekQDkja41JG4-QabSMSUP0M`iVl1'EYf(Bj$PG'f[kJYK!*)5(1[dZdDj1FSd&F
-Y3kBF[ji5Lqi421K4`ZX@%%dd&2J3+G-FVr%A+aep6hq'TY18Sfrh6%I)@G%HII-
-IhJmH$99QHj-1$L0TUMU*aQYp!00qq!"9%*YT8-rih1#pR0(dPXhh@5(FI0,*@E'
-JSLG1bB8GV`(iqF)dD(+$XEl&,BPbfRLNYKL1B-2,F1b"NEJd5DjY3h$[P@qdAB5
-JQ@Sh06paB4G38$Yhm'Kr"K&qM#+m4pKP554ca5"KmdELA%`Th2SJ4K,"0j!!3&"
-j#"Q"8,kULG3%TYG42-$`%YH3!1%G#+MGGPm2("B,lX8@e0`i@L6"&A8pFDlDebJ
-VieB3Y!E18SF4kQ*Q*!!ljm0)c[CfpNBQfLVE#NAA,KL,4erTla'1E8)MUGiqpXk
-NDYI!E35dF""S&i#9ph[LpK'j691A3&F*qU,V"d5BFTZf#Cq%b!mN405SI#hk!Qd
-K&8!S,IS(2kq%JZ$0""5'0U1hr-*`13lhp3j1R'SET@1G%pr"dH'TrYcdc*6Fc(4
-C!k216-R-6Fdm``@U#3bf6-,P%Mr*Q*Ub3*&S)2S1%Gk5-DmTe`$JApEd4VicfMd
-i53X&3Q5XF$5F4S8HL$6#82KG'M,h$YhHhcRChbF&0lL!"F@i90$l6@6U&CrJq*[
-e+D(CY2JX2I##lmfC-d1m!"1aEF6#,aKR!4hZXVGNmDMd5bT%!KXTbM1Kb"B8&r@
-'3(pTX$Xbe'Y!30U`8c)-J'39,k+3!+KJ5&IS1dri10,EeMXa'AE35NPAr46PZqY
-jK4KeC)P1*cQ"G6E2-f'!50ASX[8EEqZ'J-&Z6@mRhhLaqIj[N!$C*%H!J'3kZqX
-GlMHTS*C-b+p'9UipY1H[21LK5Z(ZCA!c3l&5JHD$'i&'BiX6k2l-Nf0aJ&*[5d(
-)q+F'+#,PaYQ[FA'jDVFf3[faQ)RF9Nk(Ll2bLN,kG-liPHL++em$#'JSlrU#1pM
-eGZAe3$IkGi1Lm`HpU-+h#EHYc1Y5IHMdIFm&9eNTBSiMBY!jKAU,AX&8BCYkcrC
-h5X'UK%F(LZb#"UVbpG9'dC8ICDZf8l@S0kGM10MEfFH2&9&5*4iB66e&aGYH4DF
-G&J+XM5SCf9dk&aIUNDUlSYp#H&92r-ek5YMP!0$"LdJ*26X[%"H*+9lF8Q)EC1`
-8&40`ER)4JF4FEa9bR%KeY6fF'4HqqCRMf0-cF5bk1k`)4Y5p#1@JQ8*A)E1JXhQ
-q39PiI3b)3I%4$9h5*1Zb$DrPU&f,%LU9Y`L-r2A'MVM4fh!S4hU9J9H(CIIR&Qa
-fP+VG4!e(SYla%NFrmFP,@Al1HM)@f[DU2*9[X8T1B$lp&[CjQqF$)2C5Kba-56f
-NS-)RSIaLA1$Y3IBqSQ`F4C+qD*a#aFZ,aP'U`)3q+,1+%de!1AjRSUG1paZ6%mk
-c-Y[Z-,pJLLG3)L5QN!#9DZq*4eqM6GURV&0d%!639JNiP#el"#lfk#Y0A!cb6)h
-KB[-%A$&B88b!#,pq$bN1bZIJf%iH"FZNLaQSmc88a5MkB9C4A(CKT@8m$VD4F15
-NMQq3!!9fE`qpAXQC1hJbjCd5NXUYJ8AQ,"p9hL)6iqQ*@k0aRjU1RQ2Sp("8pR6
-3"D%HYdc4pKU20VL8kPA"&,$4S!!pf+,8!)'b62fNZ&'eZ[i6FR#-@!i,+k(M*j!
-!eQ#f0,aVS9ka9%em205Yq4c8`[l1XpfR4V8UT3!e"IFJYHQX[)l!",[1m4)9+hE
-CFHKT@RLX"($"YHUhJ`PdQ2AdNGRm"6IrXrD)V[I'2c+'pQea8L"3p"P3i9%p$1H
-4d'i5[c*KTQjZCVpm,`QRkL#k3fhql*-MA+Mhm*MU,-5L1bj*&#G'kXJa19bN0$R
-h-NcJ'3j))1X&"3JjT$mM05J#02'KB5*%%c--%d'DD$4-H'PL(KH1ETk3!'cXQH@
-ADij`FTAP(4j*(N8NA6V9UCNBZVfhFc6bZ9kChb"PUSNF8iibUm+9HAm*8fC9Q$,
-lp-UmrkB15CRq5XVdVe+CIP,QM("P$NU#H#0LG9@bb@hLjXY@(kN4jM9S-#m$mcX
-F-2GX-3$QP`FR*NF48TN@p*8pUB&AR5Bb+jIk9G0%bp4X9fkDIP!c-3DJIdm!%e-
-0Cr-L)#bie2I%i-i)pa`"iS83&9Mm&j))qVb!0`jE1-XQibTBE2''E+TqN!"Xlfa
-XQ56kDDRD*N#VAKm-V[C2ST(GLfUqZh2h"!2*898(rDbELLJ9,ccbfKd,HH5Y4-&
-2Lf%HH5LL(cK-N6Il@,DK+[G3B@2P$4XL#k"`VC8+$KDmk`fQFe8UhVicS6%SVNK
-[2Vbc$&4[KG3`5+cMKBA(ZJj94b'T,laUBSLf-%56U+B+&H"&PQR`J1#)Z9PPHpU
-4EGr0`6!A-VD'2h%p6Ff#,TVbSb%[IX%V54f4,ZP+HX%#9RX,YSbA%K!h1)lM1MF
-h(`5@QbbaqDb*8H%B$+pSl91X`15Gh8R0m*kiT"DY-8%YI`Ze-*hdpdiDi&K%cdi
-di8Q)'SN-4r9%4@6)l`H`,8Z[8'JA@lA03$H+G*T#mISmVTV50QkMN[TaNH%'IpP
-hMKZ0&h+GG"8c""5a1JX459+0ZHP5!Epe$-UMcBa4X5`"8XBhQMTd[h%XY+-#YJK
-,)+B$!bq-ZA-4XK@E1RV3"4G%64Rp64eN%YX%#CI!Ih@pJT`aa-JCHS18'VNN#Nd
-K5C3%*KP%m@V&0m!ER33#-d,'N!#@N!#KVl#MK$MN,%HP[A+e5VX(9G'SeFp!X"+
-JA+(I#*Ul(USH8@&03Cea"I,DLJ9A-Yb9))*M)5@!)J"!CHZ*aj*5d#Ne8M9*SJD
-d6@8'jNPBkaXB&HK!%T&,5kYDhm$(*Rbm8Gj"cIbB"'`SA!Irm%"imaq!4$P01Rj
-"#bl3m3YDV'U3!1RTTd*a89+XC"F0aeC+6FV+E($mf%3-KUENGrZ(9Y#5C0G'FHd
-i[cCU9@X0*FLZ8XGD*)+B*2jA965T9c2)F1@d$eFTH0d+"#p5#JD`X9VENBP0DX8
-QZC,mR!cLCQ)VQ0KNR)[pQTSQpH!qM)*"qdbB4kY`$dI4!%"*JYA#a`52-i9l+V2
-KNL*L-!#S2b@&-rL8A65&LeVj492m)Z8P8G(+,[(%+J'$dJ9IIi4HKJ'LPH'`pEY
-SC08AlC`HIY%(fSdB`$h@c+jaH[JeIPa$48'5LBl'+[40U'GQdi38N!!1p3raeK)
-6S0B')l99L5)bmCQJ+4D-&1L9A+8AKL,cirkKX"*c[93`[QS92&S4VS+&r*,95[r
-eZfaUeCF9bq'AIFc9EDKr@E)6'lV!S%3a&G6!h#r5a!(K1*YM(hmekK2rFp+2K0e
-$NDTB"-1j'He`k!J4Q,DfI3S*11a45[Jp@M8kG%!9Xd@Z4+T',id1aBJYb0N%CkZ
-3!"+)lklD6BaqBYapDII3p,0j"(Dfb&8f0c+c&!P'9YV'&%JG%2Z&c4hTE4M-%[i
-&(M4re9i[GpVPLC!!rZHNm+ITNb'"FPF4'!pd",S#Ji(4`-Q!-E!RF$N`,p!8Q"j
-i2h"(B'1J0&!B5SBmSIE3TT!!+D3*h4[+#Kd)eB@q#VdBQKfU$pd4fKJU$48'Nm(
-aB%H`+cJB(!hDJqR"Sm'&`GTJ3h"QF'j`Dh#R0q49Ha2H6Gj"lkMAlNhh([A@H"G
-iArI1m-laAZ[Gl0hPpVY(h$Vh,,IC[GZGi8ja@paAhBqi&lRVhAHiRh6[m[Pp`ck
-GEjD[clIEGpjh`(ICYm$Ai*[TQq[EkYYCjLZE+NZ8fFS1Pl@9R5ilAlDrV+TXH9P
-efHbbqV*TC6HAh9Hfbarb9rK(r1hq(Il$ISGrYrrN9+(i"ra8M6iE%f9f0Mc%KrP
-Xq"SI1YM`Th`iaSBAqE#($ErL3jN0(q($&MDmN`qpE&K03pmZ0UcP`meXq#)IhX5
-'Ar,Kh@ciVhci"4ZqaBF0E0M-Kl9Xf-5(#pQ`N3q2XH%52NaM`m9mH)i0AqI$%fb
-iL!mlfI"Y2R5aiFriF!FErT)2@pP`0Km1Xq%,I1KR`qNdG*H`iIrQ`iIBF!BI2Xk
-'rmD(FpR`2rK`*KYq`SF[B,N92aC5kQkD)J838`0R@-L'A-AZBfc)PHT1Bd1Z4[F
-jKDKD,LUI-8J)k`hJ0h`iaPjb"EPlf*!!4i&ECU+UY+)U'!0AK&Z`)BmLlc1-rDI
-k,AJhXUZ1FBBlf(!q(ll2f1[`Xi#ccfELH(4iAe5)Hj%c,&G-r5ZIXV!Mh*Lm+@c
-))m+ESEMJ+'H2++BZmLQABZS$2N8+q!NTM`Z4&3a,1)0H!G`-[AS&m-J1NJ+QkC8
-AI**YGaNIAXZ'cr(K((E`(rP`"K[bJ"9mR3fjq3BA+&#B4bJ%,f2j(Rk@FiBp#UA
-8FBBXaC&MI1Sd%mN$5l#0$EN4"JmVM'8CCpr''(M!$UjNL(1&"09Xq#`IKYM`EfN
-BfSRP2qX4#ch!KLrai6@+DekLDd,[+DB@mLPP!(L%6p8UTVl&TfS88r2je"l&e(r
-bU5b'eXrjeIFbKZrLj`TRD'--A2QK``a4(M%K'f-r3NE2f8N"Ib$ceaYe++UimYp
-S+P#LQ*V"TcDcBa5C4rM8YBSTESk"paA(lZ46qJ$!83qmU'$J84pBVTML35CJ88`
-em+PFYVfMA%L-$Dr`BB30Mr"K(aYHiX0CE&M(KcSfr*J24pM`+Kp'fI!$'SSL0Vc
--Ke[BN!"(1dH0KJ[jm(UQJLp*qB5Xd"H!h'6%#f`iM`qAXH%hqA!q'riR(k+,'[%
-q+bMfB[&2V)JaXJ&99aP-Q963jl-A92#dX3'*FV%"AEQ*(5"$d,%Ahm*JR!d)%68
-E8$AURASrmQcNNJ5Fj)P[fcNimb`Pl#@ATE#%dj58+N5*N!#mGNU%b!'BQ4b!ZH@
-Nm,CTNe'2`h0L0(JqZ-"VN[i&Cr2&L,F("cY%J"qYjNIMk"6['Zh4k@+"-!Z0Q)B
-H1kH*h5*GR"HA4D0i%F16BLD5)4c!FTV)&FI%#6&(I),"FY(!*kH*qF0MiNj5,"D
-e@"c&iX[B!AaHM+AMXbb@Ldp6l$`qcE'6q#b*RF$RpGKZI(i@dq$c3Xb"crq1pH(
-c(l($q(`5km+R2VB$RmpLfr#C'@[(jrXa'CmjX4&m2Sa0i9-BUm#R11E(jl%B[+c
-95%,T0LXf,B&lqdk+N!"1#qiY#m`&@2FkYP`(YqfD`-eLIZ$$`,@"RB'YJFf"dY"
-+84hb"8T##&LL+E3b8!2!,aTU%3fKP4KD4,ei$UUi4X`9'`2ca@C4,,B!K23(21K
-c5!lS`'3,Z!"-QJ2j!8hJZ8"ei(`J"U!bM3[i!XM#!6``$iXM&$La1)S&+C'##5Q
-a#JY5ib%X8V!iKX8j,&l$JY4BKm9T,(j+J41,+eL3!"S[B@(#!Pd-"TCLm6%@T-D
-V@(4Jm3%@#5aU+("LF4',&Lb@Bj(%iL8X3PJX4'5@B2'h@$b$a9GBh)I&GbP`BM%
-ILjZ`3*HEiJiXjQ(a)4EIT-#*a50Bc-$L@eM-aQ)"&SeBr!D,@LcH`S)8X!J,8X$
-Ec)LqB%EdMpb)rSNEdGhFL2k&'p'eh)LZi8Ed"$HL"lJ4hFq0D$-hSYpb)lU2'p'
-[Z4%pa)hSB@j%TGb)rX#0k&IFL*lK4[3eEN3lp8B8p#,Kb-rJeZj6MiQ[5blVS5d
-+`eVZV+!1"[MJ&5HDpcJqMB[k#4GeSej8D!C%,@HLhQHLPLP%(A-Q)-V-"lIb35Y
-qf[(6JamNY(,+-4Y%lZ,Eq$EIaU0m'b9m'p[j0JVij8AmFTAfmX1i[*PGrZrXmJj
--@YMN[l(*BIj"JNeNDD1i#AQ(@j!!I'BV%MK9SkYUS2VB*Bjb#)QmJS5Uj58Nd1U
-BT)H2G(a1ReQ6KXrS+ITi*JdI-df*'Mk`d8GFTQ0LkmX@cYccXS@rp%XIVS`2UGX
-h@JCA1M2iBL-jUI'$,dS(4"@1TqN(H0AfXZ9l&QF+&r"rRI[j`Z2X`DZPB$T-%lF
-m!@Bbm(USUTSCkVmb3feNKVUB'@S$-p6Cc&"rb3ae1M28Rh0$IBiEkJaZU2r!$I@
-IZD'qa`heapa3jh*$[BXEkKhF82r)$I9kEUKriSEkhcb+Eq*4I$12i[r,ShJMMq+
-Y2)Vr&irL*eN8Rd!drF'ZU4a*d@H&H2fSFaYI(('ZT-@ArqK-dU+f'TRH(JMC`XA
-qPBYpR)[p#a2ViadK#8AA*8K-car")T%+3#B3+hNh&P&lP,Nh8I)%'h9h)KdT1%E
-1Rkh-%B3bHJE1`39prM[Ri)lq#"*demU1fV*CP1&lEI5FU3mGYIQ-dkJB3GFpIHL
-iai6N-4hLX-l#&chY&NVUMXl0(d&LH$KH&ab$!pJbkQJk*&502&(kE"Tk"AFb2eB
-GJ[#dD+jj69()RR,GKh&06j'hVFF[#ZECFJYU%rl4)qPVRfMQ5G1e)TeH*0&[4`,
-'BqCkUPM-DjcHrG0L,DrN&L`50YfLJZRYL`TQNaUT1YHlU&*@T%HQa`P9)bF!b4Q
-I48,0HEN*U2&DC!+3!(-SUEF)"*!!(c@Kql&BK4cmed3V%T!!bF%lXC!!(IU%D3`
-dN!"FaTV`+SN%b'V6ZjbiJfj[H')U2#DM9G&C3p6[3E3K%pc[[$I"ZQf)H9[HT`l
-[d&P--,&fTX@q"3kZKekYbKI'H2dKqdkmfS%Z*,ebk,'k+SXF-VY-,LckGIdhrV-
-ZqX[h-kENQH(rIRChjN-J80X-"L12j5Lkkd*d*+Q,-(SJMEkM,@h(6jZPlLU3!$L
-eG3+G[lhUDUh$`-m(4e[Vd(e60!FGVP$RL0qZbqq@(HM@"4ePmBRcqGfa)QR$hmV
-1cNM2cRjjachSi1Z'HdiHcmM16%[00**riq"qUI0@l9@H$48rAbRqlm)N#dQBP1#
-%NTp`pY49XUGe([c2"mmI,iGTL,Jidil1J`Z86*8fa6R&kJTXkIcG&"Lq4EVVH&C
-@6LUl4N+UTBpB`e(AXJj*DYChH!)N9Nimr*2@eMTNa5$KkhB0SA+L1mG23`N9C8G
-+G)J6)SRC,"hPRC(id6&%Gf9@5Ibd"9VaYJd3Vj11AUIidGpCr1KeLrqAKr6L#m4
-kL-HV`Q,T'1qS"4dTj+p)p(iQHNC"G,e%cbJi,"d,&dS&"K,lI53DRCl%4f+C(+K
-T&VA26iKDZ4p1K5ZI0iX&Ub(3!9'LYBiqB'V&JpQQT'f@A,0LC1"iV#G",bkC5iH
-PC*jk-66%G9155bm81m+c9TY%,9XXSm@Yj*VA5%Y#MaeD`!p4eh%@L4fCY,LQm$b
-5ha44`FXQDr&`U`9iI09)*cSdJlYUNB,Cb+Xjmr0JNkjLD0qREkJj1U#NT+04e0U
-p*Jcia"5kJe`3D43,IU44U5BEH40T2TK'l0a35MEQ8a,a'L-p6'@RqC`@V8*pKe[
-i88%)8*T&+"8b*U0ML*ccNFcN4ZHJj%iVPZAMmA&)[1N`DhL'lq)5**AIAXHFlKq
-#@9SdB%'QF!6+jae@5Sb2&U25@%N2DQ&GJ,&U(dlL'A*Q5NT1LR`K9qj05aqmN!#
-9fCpV2*JqQBkAH8ZA%S[Z)b(H3#Q`G+QfA(VMM9l$ZVpE-G*Qe$$e)8Q1fUE[XUq
-Gh"q3!"#JA&AZS+lIfcY%lA5`C2'1i%QjLGZT8N(@2Mjh3G'dZ#JTHKPAG!ZkQ&[
-(PEfCG6@a(0dG),%[G6!JMT)JKH*,p"d2@YFTe&kb!V8r4*Qe61epA1fl&'VIaGf
-I$@V29kKpPelYX[3302m'+$cer2'8MQhbQ3X(-V262pSJjDX++9Q3!*4"*P0hb$9
-`j4l(`qjQ5JNEYTIQ5mK59b&'RR!+L+efaDNcQ5P+b5a,5-d69fNcNpCKmkjf$L3
-k4eT[id8$3"d1V%5Y3CiS#KRXFP#[!!P3BQ,SH&Hl-+UQ8aFV(6mD8UQBN!#9*)3
-#"R8jT4Fc61El,*P[Q%#!)@'C@`D8d,N$)F&8iGHVSZ3j548P6c*9Y1K9)623GRh
-8`5lfKfeL"cT`iLL[GQNIZp6i0lR8%!88N!#BXUBqlqE1q3U9YmGKqQU1S"4*-EV
-+S$3)5L1R3%PPmTX*6H)#XJ%[+V[,Sm*E2m%l[Z9*KJcGjQQVJRCd,1JPTbKdM4X
-eRq-GF)p6*8#AVU"+UR5"SBS5J`k4hffA"X2jh5K3ND3H`%cSiTc`lKKjN8+2A[A
-+P"JqJ%FlqT9Gr['XiLEK*cIPmUV2Re6VUdmaFYh9*`lei0$*eMT5KZaJ(Bfh5L+
-qI[Nk0U`A-X*958@9Ile"M4QL48+h%T!!)@A2Ca&D8MA+A!2p$,QNS4"Q+TmK6NG
-JTPEUc,D'$*&9aBU-BG&",bSIecIrC,rk4MXHdUKm)@Z83b2Fia`HHiPbdUU'`%e
---"VrqJB"KP1a+!G5&dXJU[kBi3&l*##r,Rc6US8V8&5&DAQiNK69d'D&DQ"Bj9r
--,QJ2QeMmlIQ'aeF+E9*(rM#Tq@5Z6RpN#44aHf`3lV0TP%`'R6`qd'SQJaMSTSS
-'"N[UYr(UD59RiP1&#bR!8XFbhcBbK0+S)6JZ`KU#84b"%J2(U$')kLR+#ccDFY+
-`AIk!6fhAZ+d[@9m&`eId`,2q8TiSjcB#*TN+1U8!Ji++"9i@F0X"b%AP&KkFef#
-6(GaX$["Z9R9KL%P"f,)LNbAhLYDD&88(SMKB[iJRqr2[2V,F)JF86&%bjjBD*AM
-+NdPMdbPb`j&-Efe2$&e%1T1*Y5hA6&VX*BN*Z6r-*-p,P4S[T0GT8B-+9FG))@G
-,q3X+,N`KUX2P+d3ec"9#fapAGSj)#'N(%26E1KkSp+CGSVq@NSDU@JbA%ZL"4&%
-E+6$S,bqD@IlP4I2SFR2H6li[48249M*[UA2jpZ`rIc%FMVCSU)bfQ+j%@m4@B%+
-E'0V[-q0T+3pYI66[U&'UFDj&UFBrUe&a*YrE5+,i%0!XfER0-2Mk[BE"eeC@,[,
-RUX1+I)"d8T(rKhRAU9ab[TY')U6L@9%!QDqVU'D&XD',fM595Z'ZYVK%T`@Qd,5
-"mp494A(H&4BBG&j[dS)0KK@TdX9PkXV&G1%AUdfp[YV822f8e)Qc%[3U-CGAeFj
-0eeHek#CY[DZp4mHPSkY(1"jBS$B8b4)"XTfk+@fCAT84D[HL`kSCfapT&hL-ZRI
-kSIcZM!J9`qhRb196$KU-GAZASVKE*aRXpU[DJ,41B[ZfjT8Ki586MQRdKA4XF2U
-K9*0Z0C%P$bK%XZ*cqjK@*!ZBZiVd)T8*h282Q99@0P*h@3d!JM*p!),3M'49$#r
-1YKpY9e3b8L@arD61,%G45E6`LJ-A8N96XSXB#CKbd'2'"kPc4`Vm*6BC(3+LmF+
-,$5Vb`AbjI6Q[U'4qe6VTXUrI9dj9GEZb5T!!*@3"FSdU3#jPmBdQA,r5c)%%J3B
-Y"**)"U6D'#B1REj80VqLDa@ZB,`l-A*2KaYB)%diMZ@-@j--R29dAU31c*bK+mp
-HqfbNkVPMH8r+F#AcTPAZYS"AG'Y`B%DJ4#Gd!+TEfcUQfYdcUM6G*p&ek,A,TeH
-P&ZZ#mjGc9R4a,,',p[EN9kMiRhb@QTm')&S13RfHm+i,T-HJpJ"Fl5KVki&,Eh5
-E@pH"VUDKp[R(5$N05(L988&Jr9G)b04@CJ2ap+Y$FXXTG*rif1*YlZR(6UkmpPP
-%NjGG&HfmQ2$L-6hS8)k-2(8VM#U+4jZV$3mc03$+h)M819%*p!$b#8hhrX"lMB,
-qH)(SeMS8j@3HDMQX)h0pKff8H!2'9a9qIEX!dF-[0AcXJe*LeLdqeP3qcj[+KBU
-Q-LGe+*V+'BUQFU'fU4b8b"-6$pmiLQiSE1Jh#@TkV2PCS+S"JXrK"eh5THP*j4H
-Sj5cEdBD@-h-ccXJ(Fc26M*QTkCNC@ErI8*)&+l+J%1Vb%-TdmD'kl4b'ILZ[SLD
-TLJS$ZhM9j8Id460mY%6(TceDm-0!XKhQK(XG&ArjBF9I1#"U%,Y2DY)45D)kV)K
-B*&8GIr-VT+-mbk#&AkF21[l1LbFU&lPrYQX9'hYZa9G3pfSdV+p40Yr+Qjaiq(U
-ASB)0UqBI,YQS''a@$+k4M[jT,2bSSH)ZILKFe(DK'2J9!ip#E$%*L'ZVld"22Rp
-XIQ!@,F+VG#6Ii#Vm"C&iGi#)e@VR#IG4B1r!NEi6hAKUqMhiS@%&Ef3N%'M1)@J
-PH0"#iJY4cB*5Kjk8)+Rj3XkCl*2(cf6+pZ-AXN"`)N*6DPEQmC69!`5Id"pBZT5
-G#!m3(!bk[M5miIZVE9+&rX$#p3'$(TK$)XTVT2l+AVQCL53i1l346SQ8m4!i*1$
-h(l@S!q@pQ+Pi`36FS`Aqq4BS5Z)`8p8L20Da%!mD$b0q-c,bMR#8$D!ADe#dVJE
-B1%!m$2'QE3SR@@cE0bB,l@3Rl`Te"MTiFe(Q(FLE5)U%!M5%)V!DA@hQVNKPP%A
-*(hc(0fF,fa`5T@QlT@(G2&"$i9Sb-'+)Nr*Q&+($&8-3d3G@8`[)V!'HT4!LJ%'
-,kM2F[$6DL6YNIhih*fT,%c0j`jfMVChm3QVf6RdLU&ZCqB5)rQ9K)AA++UV#*MG
-MdULF+QU4!NI4$UimRMaCqr+F4#SS1Ra#HfA"9Vj*2FZ8G,aJ*dHN`J#DN!!T'KV
-5P3SaG&)C4Kb#ZYj8&#AUmJTZ,F&QHp2US1Z+#MN1V#!21*aN4Jp*eT)SHAFKQR,
-*%%T5a4qb9N5U-*!!5"3N[(%$#FmS9LpbYiF9ZC%QhNQ0IcA6RN,41-)b&-Xe8MS
-fLH0fkY6'6k5j969HU%*mSNj2%,fVAX'X*0V@Vc))DJ(MbN3R42fl,0((BPADUK$
-C%16#,f&NSB`9NldF0ACrC2(2MmVdSej0TCi0)M31'jMc9m5XIiJ%-Lf3!094B@h
-K'5#5Dd!dM%"3LG5U*8`V!I52K"GUZ"#Q!UkDm!Bj2k`Z2k+)R2I3i*0e+b#Xk6G
-A8EjC86@k[CLUd8+rBU"@$)55F*!!U#RAG$GFdBX,G#Y@Y,jj,@CTQpH'$4G*64J
-`,#l`Dl60l`*Aj5TY4@LUdPH98EUH9kZ[qfUH#(4+bL,N$DlG'ZU8[jLjqY"4)Nb
-Uf84d"B'Q-N'i[)KJMb2!jQl@%LAeei$BUqNfA++UV8b3!+KmHAPJS3%Ke3(&&KA
-AU"D&AA2hDNFA&mLV,",d@h[jPh-9e@JK5m4F5*8l1p5L80R5X!$eFS)+erj9&QN
-D6GhUL"5p@2kf`T9AC+p8e6#e&heBcRDl9U$!UA+feX&HGLQf0PbT'(5Y,UbJG!@
-4F@mBfUlV3NqTI'A9[&Tf%BM[#BA6QIcb'fh#UlZBZ24Z[r#fCqX-i&581T6(G@%
-&@9KNM2e2*H+BV&ke-C3Ab9*#DriJ,dNPZY8$fBUL2c`59ad!bJpii8&)pIi+#+J
-H1YjDm`TB+5YJ4@68$51ldKpmScbJQNeGr,e#RG98ZX5kVPfIM66jaJ@1"$lb5mT
-($T@*(UQ"J%iS@hN(eKf"QijZ2E60r89$PXMd*Yba8+YE$Y8F!H(r56NJGBPQL*C
-@1Rj"S+YY'r`*(k0+68H%"*diUL!)Fa9+V,TE&iPA296GU6F5qqiE,#0K*#diRC4
-AU'l@9m%Sd2G222br2L4AQ0pZ3iAFq[-j)(TZ&KSXKQN5JfS-Q'Y@`@B8p%RR$K`
-b%A%6VmGPhJ4RcDYaBY[H"*!!ZC,leZS1A[U+h[,r+RfklS'VeTN,UGP%&MPjd*l
-pS0k[E"0j&@5RTabrN!"q"Y2C"XHbX-eXIAqp0e1Xhmc@rd1E55eh-kRDc4K!)b#
-fHq,KadT"N!$edN*6PeqAL#6UfL2dq+',rr5Z@5`P02"!E%`!E3rBVY+IPi3reFE
-"(B*SLh01G'mSXMPRZ#I(G5Sq$0R6Z(irA8q,F'6cPHJQT#N&`P''F24h4IM#li)
-`P,YaTU6FM62A4lNEcrmjPEY"KJ$PEY4)bYfS@9rPFS6rE-TG$i6ek#ESFTCK`Up
-PB'+PDrQPpi4Gq[IXdT`c'hMKBeIrTKHZ4b'M[p$djbNZ1%*rTd4Sd`d53T,1ekH
-i#%IVce%JV`pDUeD@fNVG%(BHI#3M*r["#aQCZAT*ADRT[cGQJR&S-&ASRB%mA@`
-$IFL-#V@2$Um41cc"&2HF)`k[ACkeKTceLD3Z#qV#QC'KZ$NA2CGIMMRVZq@e('D
-EZ'H$LVCCCc*cde0q(qD'V5IhM8XAEFHI8P&CP4``NC3hjXa-Kirala#T3rpIAV[
-#,I0VShLD'@A4)I,3853qDq(5M3M-23j([`I,LF%(+3VT)@qcV1LbD5J!d!C*$Y6
-m$d2!3l"+X`ihq)AYKrK6YZ+5U25FV*`(-e2+Nl9+89[+%AA3D&bK+&idH2QMELX
-ii%TrU)"a@#+j4Y1%*cM(S[B5-(`#)RAFFFeLJp`,CmS4+CR2$6CTLSM-Qr+1RlR
-Y`8T&N!!mmI!6ipbChDFJ2C86Y,kV$&RDLbJ+b"dI3AHTV(lCFYIE)"M!LIh!U(,
-kFqf,rbUArEmDbQIIHk)bX[FAVJqbPRH9f1ki*rYXCQjQ#U`U05FM-h9r1M"(f9P
-1J8aAY2jCVNJ0[i,!D[bK(A$L!J!m61Dr3RFD)K63&DqXb)T6%EfDS96mRkT*CFA
-@+SbHq&06bd0NDVd3HAi&TD%"$id8T)")P2im"'41@T!!!%9&38%GR(Mi[LaU"Z$
-b`+U$9#SVAPFXkYIPL#S[51P&SB[bJaBGq2+1Tf9RCHBkdmpR'dU6X+M5&f(&",`
--d%-iLRY,9E`$6LK-6Bmhj3ijH$`!$jK0XTSD@!`!kF%Peh9"C1L#T+p6@3be06K
-f21["ilmrNjfEJkl#pkm51qP31`kKhpbF$232YNTqBa$X!f!rQ([Qr!9lqLS`Zk"
-"(%Ci0#)J6XP[`d$`CdpJiH&LGP!KNlY+#AaR%@i-6&DjSZk"U*b$k4XS5e41r($
-r94j)eHXEA"H%*9[D9%iJA5p6HG#JhTHlHpi'X))r"Z)L(KH)2bI#+rq`S5l,1r(
-I-Hr%(c#%H9b(B6aBVQ')p61-"cI--"lF%-0iX"c$U"`&QmpTSk$`Ea!&LS)B!!!
-`!d&%3e)$!&D`$e8,,#N!+Qec[jGh@9G%A&BL)U)9%G(8M((-'%IIppepbI2,b%c
-06%(1,4J"`S*QTXqlZ`)LRXh8'M1RF4c(DFbDaM'RS(%FTm`m[aV(2$HH1b8cN!-
-MT19qRJ9F2(I6I2r[ZVl[ZmlcAGF&'ab""%%3"%'3!%L+C%3VeYA9r@Ep8rTj4l$
-i&@M"-f#1`jb'k3V$B8*K,X0dJZPlX-ec+UE*63K"8H6*hDGbXi0(@j,U0%2kK5(
-Mmp@lkQ3M%$f1re)YTPmRYG-mdLbM0RSCIdmp3"mRcG'+T$ck)1P6EE6d@f0-Y*R
-29'FB*G'2m6qSMp"h5BZdE#QGPL3Yd"kAPKU24QIaa@ST68pk3hYDqV2a9(3CIdf
-GBRLM$r+TDJ&05jUYQD6"aZRS&qVi2HUrkHkNJ9UPG)D'*0f[h5NpB2`cqL`IT"k
-PQU5l003$id6d-@j93icbk$raSHTYG%G5X(CFDU#8T)He2G*$a[24qrK`GB4a+[S
-jIUpkNKj-'URYPqBD1G&lq6IUEKU@0%UVPh*TIY*#lC!!0-mi('hKN@SR)c`kUSi
-rSbE6[j)kDcZNCZU6p(GYXr4()bJkJGqZCP#rT,pUldKr-r+M-rP2DRpMBr6Vr(G
-U%rdPUDr@+1fLRNNrehk8AMAHMVl!HkZI'cHMEr![e@rT0dRGYB[5*iBl1TEr9pe
-#rdKkAdZ6)UK(dSGDM25$X5QkPIG58qPbdUelY-qN!FCAd5[j1E@EX5*k&Ap#rCk
-H61UL,CGH0VC&Im6rSqkNCj-kD0ZPVG3qk4AY6DQMm9EdDYj9$6@14'rJep@eG#8
-T6&XMVD1V5CHd,k4VaYI4khQEkL*RdRP0Pa+0qk,MH,aU0j4S"lGC9-QQ*A(0)YR
-3p$#8rJE*0)i1d10dJQj3R9%ReifV1e$hH0f*1M*lDJ[c!NA'Q1*PmZKa"e4lmBc
-4ZVEDV'X56,3jML2Z'UGVc`GdVE4BefTKXQ!HJ4N0T!NG#cV(`93#-f1-bcjk4Uh
-,E[!mPch!4l[XXV!(1*!!ii6eF#`KF)AX9$!I%(DFX'2BhKQeZZD"C+03Ya6UfMK
-Cef52VTQ,*52k$Vl-mXI%P8%a34&T33Q@2dVfVpbaPZEi$@j,3r+H&bbhfHmmLH!
-mEP%cSL`*jjSb,9rp'1-1HLGQ[f9$C[+TrCC'LeYV,EFmGhL,l958B'TVbScj-HB
-8XVcRQ,#`$HlRPZ9Pdl,l-S)XQI%@06E'hC5Tr+p!RGV*qBdE0bd'pqMF8#f'a@-
-a*,Z(d&0%G'JHXKM-@MbUc51ZqJSHc@2Sh+0D22%'#Da(e3`2j!Y1b-%3M+Laj-%
-!aXQiG#"aRGM$$8I&FJVhX"eL-B8E,VB8dd#a3CUKBKAZFGJp6#"R#U*RKl5UC6M
-MUMlQH$'Y9NXrchSH&k3QHMKbF8jFi9aeSNmQeh8,0j&!@VJU"P`BX0KK9@jb*6)
-'-R%e[S,4`EQV3J!h+6D"9VR&TCQiNPLahH63J!TP,'+hHTkYB&,Y1&GXJN89+cK
-#fC)3Ee'iKH&F6LB%DkYFU%69kL@b!CKGGVq'Z,BIaV6hbe"iSF9X+A6CcB9N-8Y
-FZ"V@86@"8I&[0e-KmP*,S3dp)(QK3qc5a8EX9bf&NQBZ9*d3B5Dfh9iSHLS1a4k
-c)PJj*)&$%C)Nj-aLT0S+Ui4,BTQiUR8Va)!&qhLeHPAm6!UL*YCK&L*9SCTr498
-Sb!X9aQ8afrbDJ95Lm#fD-%SE)a!q8@N`!JmS!MNe4P)`F-d9,mijJc!8&NJVk'H
-`8RCJJhVH,d#FqrZL609i*KFLVQK8)B('5cf#&C6VIRDffbQ1aq[Pp'rQ@X@UGU(
-GGBY4TDh39,9C+JUc3KZrI*5fJG3,SpS983P!CS-N44-Bb5``kV9#k)-"JB-8Xf)
-c#aB3#cQG+R+l@a)lmCY#0X"Z-PaF8Ca-[-)9KqBA*pC4l!cTAkG0UC!!cpC401b
-1&lZ!mc-+P"fb9E'bSTaRbl"m9SAFke9EQIS-(FVf#`HLf[(+i)!b&SXNqUJpV%Z
-5DVI!9Ja!MH[Si)d"&P9--VRLr828$X%QfF4!#B8-BXCPNCJXa5kKCNJ5Yc#V#,'
-1mibR#Lq@J!iQS3d@FrSAB4JQ3f1Xm*!!5S93PdhX9e!cE@!9H-ldU0,*8E'D)l3
-#Ji3QHLa8k#&cS6l!6+)$i#rd@$#`L)(`S+,%#Mf+6E#+UJFfp3SlCP[K@1hBSYU
-a4@L*J30e)C6*%I)Ff1k`#CN!CE-JfL@a%M1-(f9ehLp11(6')U3*'4AU++L9(K5
-[Kid9b,R2b8BZ*d-jl%)2Qa#+#U['3jL*6"*c8Kji3Sp*BTl3"$J")H$U*C0($4-
-(j!(H!hIRB4X%a6dUSb%1&#IM8+qc(F+B&$3,lR1bNCm*'BIJ8[`4KH84CH"`XKe
-#e(Qa2-(PBJX6lprZJ'T-*dHSAa'UBNJ%QYK4I)@+b+$Bb[$aINj&V)2-46jmUN#
-l(qmNprG9IM)1IimQQViV1DM9M@m)KqQ`cd$IjBjVbJMDN!$C'Z[qbKd4&2@1HX9
-R4!ADV+X1Qq"4dHrXZ$3"Zq"SVr"5a,i1BeB[G+*pF-DXk8"I3(ma6,#ZIIp*J9E
-6!)1AU*VMUVBU"CdM-+Q#`FY(UYU10KJh$$+V&IeMh!Q@mY#J+T@KaRY((GGD*!P
-+[,IHBEbh(*dG-*PBjk`kB19m*5VjpFd4qE'C#HZEd2$-$)T3%kZli'c[Z+3Q0lT
-M-cGASB@Xfb'V(cVGaF"iEbE'mHM2KTQVDmXAUApjDl8VbKd&8VL$)Rb*-5P+d-*
-Kc2%@D(0ba-#BFaVbDM$'Lq5FpC!!Ge(9hJT@%prUN4U4[cNLb"*cDq*Lf0BjMGK
-QKqQ'VHQUYM9DI@,VNI(DI"(VpLR)&N2XqX"aDb*m1*N"dC(S$")$if2#Z%H"pV%
-C*N[A[ST@Y6HKjjYR#ja$)eQ"a'INEfj+hKPNLG$b'5P"riq2JRmGc&CGfpC(G@l
-2C,b*'8'CQpf0JYQHc`Lmh[Ki+rJM`1Z%k3Vq#&AERURD$V-YcKe4#6ZM,"Rfr16
-$qN53!+Tp8U$iH*(MZLp!I$`F5`a%"l5H$6HqSk[U6%kEU2+#GlDP`$QlNTfhjFH
-kGqBhlib)bY`Fa%3CXiq"*3k59X0Nk&VbBM9aHfC9J3h3di)bh8GM-f1D0QIL25J
-M2h2c-3LHl64QGcC#,)k*TH'U'K%6P0Q8A29eca)6#ZSi+JDhmL1B9&G66'Z81lQ
-4!HEX5'0f#$5C9D"0+i3T-N+J8-JZQ(#B4L1NG@*,D3VHSei*LJK+m!@TPZ!eECY
-MSQ!hVG&K6'Y&abi'aV5V'+1b6ZX'dpm)`EH2N!$,"HG$ZSjYh8YLhCF%bQNMaJ+
-8dfSFaK42J6DP4!b-+6PB'ppITZb(NBb3!,jBZbG-G-%c)EdHl'Qc61LA@UCNLV[
-DL8d*0DC`jTkQ)$e6%Y""HUBJ260mA41%qlLQ+IfCDpS)30fi&DDji&C)T*!!q&+
-Tie0G9DY1,61Q&V&9TfCKe4(S`"p-2@k%",GFY8BUd)D@q&HGHYbrkNbBAM$GB@l
-(1HVP8&2"Xd-RiQpD*RYUHf0U(iFa&38ep5HBhXC3V$2dH-'!SG+,F"K6KaY6Jl(
-rY3*Y1X40Vc@'3UfKJ,UKi3AAKNDfA'hkIQ2kF@0SSc'dpHU',mCAaNNVkr6`PT9
-eHU[$Q!iiRQiA!f-kbQ8kI2PdP-[drXE3d1UUQpL8(l0c4e4-%'TaFe464Qb%)#l
-ErbikLf"'kGVV(94RIJREF6iM2cN+A`l+RFe4b8&Z`@deh[$Uer+[6T!!f$IUM6I
-1'N0R'd-""N-M&6j#i5X8(Uc`AbMm2`Tr9Z%r+Abr`[qUm2F8RX1`II$kTr!5KIp
-FiFmSh+l`@)8rc,Lr9hLc`MFU2&lKQa5q@1&1*V%E#mq`m5k&rd2KPBa29[K#d3E
-Q"8`SfLXZKGY8mEVTB'GC#Kr-a)(lGB8IB(Y1-Y46#RmEE3Z&$m(l)C0lJDda6q(
-h+Vb0(53UI+h#rkl`q3VIS[!3KIGN,I`4E"c0dV0(%DpcZjR'AS9(XT@Q+IbL`[-
-8IPhKhc*"lCL+53Tr3H&r8rKaTNUM`Kp4H*V#Ie6i#B9rTr"I-Y3CTKa@6DjDVjB
-0VM"&XIN*KEqLm$mVr*,#PbTmS-,raA4UBk5rMHRd)91S31&&,,8+5bF+Sjh#cbR
-m,BA2C%Y+6)-%KAr##L"Ei4d8EPAi6S8(&(j8i5UMb(5&peGi9jCJP1AMM1jp@GU
-Q+,b6`JH`ihZCVU$qJi`klbVm)CD'KpNDKeLDda@q9q'V&,j%i@MbI+c`'`Vr4Z'
-pf@,$fImCTNS$)`d5Xje"c$T'eUX+Ame+#i[GBRTJl9HV3'3$Sq#2,*&h-pB[&,j
-5i5mceLf-q[XBiF!k@q%G&Iie9'I&%`jC$(TL@6R0B8`@*RS9+im(&&k[m1F9(UE
-`,eN#)-+Qm,-+(k68289FLVCd#SmdA8kGIETAkf"ck*'C$AdE8dUkVTja[1HZB)r
-6e5lRpS5jT9f@6crlLAY3EG[k@I[lCBc-HRREiU2G,pB8fT9hFc[[Q1mpYh*+CBq
-)JAPKDclBehrMm1cf@aH9pli3%SL2QecIThP8@EF9Vjej2fe)dG9eFdlpP$NL[F2
-f*FFq[ePR063ekI!c8I-+ERdflB8I0Ydcj[U'hqlj5p2$Mh9mk`qhrIc(1iV2klr
-HqmHJEjjqm[Xhr[RIf!H@AI[k[C0rIHI"4rrcdG,IrqEEZf5EiaH(rT@mm1#!VkE
-qqm1BZdGI@I[TmlplrD&(ARRcZcqpq[E3FBRhrA,hhcF2HqU*9AqqmapElMp`kBZ
-2RrYErVf22lYc`BN[EjLZ+8hZPfJ8,dUBH)kj#-jS%AcCSM!a-"Ce`aLqE&%(Q"l
-'d-'UYRN(A,IN@1RiGk@[$k)*(0+Lb,&NM)Y'31D3!),%lr+B%#ckAEUaD!4H"C!
-!,haA9Y&"GVPS$MV),VmlBRb(E'aSX+T&e--8`@3,*iGF"YYVc!ARDd`9qG4h&ih
-[l%D0CG*-#6RKjCV859SYAI-M3+Q[ma1#-QKV8%6q&a%*34&X,-4pi*LdR41I2jj
-KNF2iEMik0@*J,$CMM(aUX3NQakM"eC8D0,TV4,iFU@V00pA,cFI',[$D*!SXEMB
-@TcQ-aH[4[`N6CY4FRN6SqHCM%fQq6%4D1f2aG+0QCV@%Dj!!i(pjB'de`62)@&T
-Se!aqBX+A#TphMUAeaP)dj*H@S3rD,R8CGp&DhjH5T3R'dNcMVY5*YHA1953r,LV
-'r5Zd(*IfQdK"q"[M5bG$'8$+d[PLB#`&G#hYJ[k3!!*Y5Cja9d8$mbl@`%5R%Df
-peTI3l+Z-r#frJQC,YSe9Xb8SZ58SY5ARa-"BdJ&M&rTpB(SEGqfUd)aAD"CDF#Q
-NpHZSC*q@am4H%jB-E0Rd@&$S-"EN&9aE81VEC"%(aJ),cP!,&TbY'"X,MN!*%'S
-"@N%,-SblaVp5K&Be6-4HTl(JR((A6)Grr@l!ifd$"5`Um0(NaUL)r4CfG%N-GVS
-MSTVF-Hc!FUa+CepjLbXNRDZ3!*3Iml1NB"GHD4EJl5I5)JE)b0"(IPPV,1L2,P)
-8H86A,Qi6(5mZ9QMfFi*$GhjEkkYdrSY6fVq'fEq'fBKdSiYLLZbYDfrh%Kd[$eD
-GpSY-3XH@p0ML&eJKrTb[q)UcDUSm1Ci!,fUER`ccm1Bp,kkD$20@#M*%SU8iEbX
--2K5m6D,M*d1#i!!C@ZLDrk[S@Nd-XC,CQ0FHh5N`D*CH@#ikIQ+XBd+kqPI`,l!
-MY[PR8hTq`*KIVQ[IMLc3V2$T9N#L&5l0'UTUq5K1+qUV&9A#L[TU4E@`iYA0ZJX
-[lEembl8C[[l&,9IZ-1DM$Xj(-Fl[VQXriMh#'Pfa,TbJ&Fl35MlV$SE"5j-edVq
-ZG3D6rXU%kAaaT13,*@-K8RX6E`9@N!$8LQc"#P@XH2@ciJh*#Z#fiJZA&CA8LTc
-+#RGUlBTP*GrLUdVYLbbqK8Mc3U4jiIX`lq*b+li"@B2&kPjZpL)I['Y`eG*HhZ$
-P&LmAZR6eGM"9[jY8[*PBF,8c15-S+S)16q#),)IYBhZGX4a@*ZEiR`AeQM)h@j,
-cm8dP)MECR4p4EXQd(,1m%l9VCdc6KD#U6bH6VY,LDdIedZ1rb6"d44fEp(9TEXm
-+ph-VfIeMDe!9XBljhqV#',E+9Fe0-HB'-qLI1mYKc*eHS(d$p$HPZUCC98hVjZ9
-iRj@mr!K'kldm&E(3beHVfSd5,`r(9BpCAYjiRfdI1@LhFDM`0#k(R63hR0jVcZP
-8bA2-1H'98UkC'cGZf#HbqUJ%apJ5-HUL`hF,!h"4f+2F60Y4Pah'+!$1+2qAaNi
-lla-j-@L@M*`r1FeG89(mS5R6AH@3!0SU'+T9''%-Sr%L*aGS`c!BKZpRYYShrAZ
-kMNdQ&I"K$[pHBaJq%!a$NfAB4TKiAB[(Uhpm!NbfUTfI#r-qM"fQ4(8k8jMJfbG
-4ZKVH*lS)9J#!$d-p(6C)eqcp+r4Vra,E99m9"cQ-&(bq5)&M6GQKDk'9AYl9bcZ
-T@Q)0c"bBpM!+$0c[U-q01UjUcJjH$MrPA1lPPe8YmkUUfBE!c&(2fc,rCm"l2Le
-)e!K,HCIUqL'%q2NXIVlla,YF+AY[GcQd22kCdAZrZ!4ES2AHri94Pq,PJq'DMBF
-[1M3[6PqY1(feaHNX"bk9IQCdVcMYlRXk21Y'DTe4+(Z+!q2-Br*'ebiV1Q!Um"i
-XIEVXUC,(XKr*HM6pFF[Kh%-jHqYh0qcCprcqNkHH1re#jEr2r[2-RFG[+rr6dGm
-I1b&&l8K1#'VHh0LdmI@-Gc,c@cG&a,KMdlEXq[(#QpXqfVicI1`-EermpZD0X&P
-YekjfDrpXBZMeX#[SAlTmkpb!,NpfHk*VarD[[2bI$XpfHUEc[flrBjqrpre,rpr
-eqq[RArEkSFH(RrchrArdr(R[9l[rj[-[Sj2Hr8@lAdrqjFcIIK"kj4A,aiQcTdf
-C1[f0erjXQ9'hk,[&5jFXL*`hIq(FkjF6EedkeqA*!8pd(0cej3lrH@$)rF&hK!b
-YZFYD4rp6'UL+`kA(hAGN`jUeklpHpdAUCbZr@[lpLP@VhlTlUjm)BqABbSM!0E[
-0H6jqf+IIm&RS2c`UCIL$$iedMVMRh[2[$4adGha,'[cdYjBdq1P[2M6iG0ClPMR
-MDI!(AaTm-fTBbX2$(aVji)Kl"pmcm1j",@J`bDq`qQHmL*qiGME4Re6RljfHb+m
-PEbHI(hq42em"i6irbHGA*p(BIe@lM3NN5lrbVf9UI"%J`B6+QLIKPmCb0&kM56I
-aX3LBN!"-RDZS06'k9IaFGD,-CC4N-38`hFY-BbL24P-Y,D-L62ib83(ZpML)ZmQ
-HTM*kLNVS-FUQ4bL,(U9d6!fcd'(+T8183hZTRRC6!qfKII3mlDH6Z,[L146h#jL
-AqfrF4r42h*Yf*afRfkLFrS5ja,qRBjKBKS++SKf86!N84-fdQ4UTL6E5kj4"le!
-QjH0'Zdd836(NTPK+SbfdLhkN#r3QED12D$[Y4+Rr[`KiQbl5Yh36mpV#U+k0VY&
-9kNEYk9P+T&#k$Z`9mU-[d@@k4HGS!(@K*m(d"(@PMQ"pK9kQre!(E1P%ce"RqKI
-G6RqN2[4hkNYrSIld1qT(IkA2k8[U46p3$rU3!$kKrp,lp!rU56qRh[3UGDII-)C
-Sc,kLGqNAe)jq6C2TPc56INXI3)mV@19Mr'E60*T#8fNk[8'[dCpT"Rk,k$YD6%Y
-T#5fJ5*T(mfNKcBAQPj'#@p$k(00h!26Y5)1Kmm[3p6rd!!fKqbQBlU!3'NSeG"G
-CU8lj[`m#+QCA1-K&1XA4IA5%0Y!D@N[Vk@YD4ep3+Re'+qNV@NlId`TD4D[T,GV
-D!J6qA`5-"`(FG+@4R@cNT2-86m2S8rS'f&RN4cp-SbL&KY1$p"#0"0-)ZSIZ"HY
-l0*!!"Y(Gf2*5)2!6rHdP38!`4&2Ga%$J8qM`(Xh"Ed)3q!0q%`H"Ek$Y-1Ml-$3
-@qMi)IHm&#0`$EHq'[K-&!6,@m6Y8flMJG3MQ'K(bPV2!44LG`m)()Y4QX0"1"&-
-F#aG%1*JY`Q1$4FKfLT!!EN+`T'YX8-N#fj!!(Xr#C"BL@CJV`Z0(@'$(MrGRB4B
-,)d5`P,+JX,#D"DX)KpH`d)@&%"&b%eL)CQ'*#(Xc4DM[)m,Z2"E1L0"J&Z&%*a'
-NXb+NcKEK+lEjUd%L,%pRB58,&eRSaF)L%Ei[BS&YrVk4K9!@2Q'"L9Le@)3hfl2
-!%[EQjb*XBkTX+fGK1`X4)Rc%52N4)mTf4[VYM(cE@H+hGfDKK`MKM#MKp5b`!JY
-RL3r[c3)MF6K60-V&`Q84GR4PJDQ9c!k5`ePiQB@I@'!N5'C-#5B@@#)6f)BJPZ`
-J4TUJ15``GB-Bk$6[&k&a[JK0TePJfjTB!63aj6BbdQr-BS%aE@4-'fqb`)Tcih3
-4-SkcN!$+!P-dJi&A"Q2+B)4qTeQ%r+-X-#$,pk-BD1EhC'%+#`aS@XYBB)4VCD$
-3bTC[hFS#+kV@[Lb`cDf-P+d-@$Fa%QpbXm"8fF3)YiQ"a5C@Y*Z'La$"LLf#JA8
-%+lB)"XSa,0Na$&aL'$PL'2RF!4BB@Gd-V0fXXVPC*A5c",[lXF")idjKJ9AD@%E
-3@!X,$&"L@@*L'8M&XNS9biSfPUNBqaS,E(-D+q#d"KBBZG0fX,#,KA-XX%U5aXL
-4aUTPfK!4YM#PYl#NEQ&*hF)+D8Xh&KMKYV"Nla,,m&d@i@NXZjKAf#@NDVYkb94
-E+&0rQ(D&XP&D+"FZKh%Ab[*0Q!r351pE+"F(B#S,j6&(#q8m$*DY+C5,qK6+*4d
-+j82E#ZAG10MG!fC%SGa`$!B#'VS8bR[+BF#`"m+I6i!"m[REBAV#c)5C!C05+1m
-R,"U3!1A#5&N1R*,PNM4ChKdYbmrhPqApdfAj4*JXUd@bV'6)XYjCPZq,Jh(,mK'
-6,'m!``CXA1Z&k5(,kl0J9X)XPZ@[JIbkQbar!8'THE,mfAiB#([VXLb(Mj!!jDK
-d'!L+kLl,1bl+FR+U,!H9`4b"!5+S6CDE&9RH$%&01'K&Cj09PL1JC%3cc%qb(0-
-H"XTZk3S$j5jdJ*NXbeRR22,TH)rm*jG(rRfj4ck"cSPq(YQeh52VPchb+S,"!G8
-@bj4G,-YZQ(E&XUFrc)KL19!+d`rQY@,C["AQ!Nb2BRR-l'+jGP5aA03"CNLaA&"
-B,"qF85`rA9mXPi3AbpPGLZ9(MX0!B&CHXCbZ`-b%'9iX2ei#FlPB2R`'jL)-0ZB
-@`C6$""I,Kl$3S4d`@1a3CjMHaA*1*FaUQ$DB2M!3PJ-&pqE#5$$BX"H(HaFAbrA
-,BAE"32(k16$cLqAG8'Jh&QT)+CEh4"6,*j'`NpK`mRdB,(U+B"B9bmp"NHFJr(3
-C$!5IKS)[R),T@5aAGLq@cd,aIiB@bfI#LZ8lSH$a"TK2LZAEc$")f'hlBD"%Z3N
-''mS(&mY(Qi[P%p(&XZ5#Z3N68L`V5+4b&3E%GZb$@3H$MDi!$)MSJR"A2-bjBMQ
-ZY9Lq,keB2J,PMX`YPMId,CEAG#Z@eqE!J-"VSF"k&0JA8$B9KCJ+iCqP&X[,)Ia
-l,2jpHaJ3B3819m&3@8#Q5N!k`I3-b)'iJ$`Z,5#E!IhQ9TLDJ$aQ)mcmJ*bh$bB
-$TJG-5%!H$FE4R`INfJ$-6CM*!APC,Fa+Q0N"Z3M#$`"a!%*-%'BD%C!!#qB'C1p
-V!IRJQS$m9'T!cZSIN!!IE3[)k9-#XJ9#$Zf!53R)$GN"qIP5Q#%"qH64J(`+R4F
-'"q4+-0eT#XJU&(8FJjNCN!"Gkf%J3#q(k3`c-L$(V3kJ-X*J`j()J,`"'cEd#mK
-VHJINp8K3+K#Ir33c25"[KH*EV3(jc48"1H&-3'l1JpN1dbH!*`#J!5ZX&,U`G"d
-9eG1ir5iq$R0EF2%'Xd"j,6kLU0V+VCLd@AK86-IRim4X6DdedK8DQA@@mR*SA"N
-B#lcf&'k+ifZmL5Pdf*a$biT8@bQC6bND0r!9"Pqkqr)m6)$1+iLr2j6#McH3!-8
-VAFmV!bGC625S)Q4%-QE9PYQH$VViD9q-1*r*J8l`*Xj%)fiE&CGMGV0ICLKN6S#
-c#Cb&akqRTqV*9+R'Vk1F0A5i6)hI5Xql+Eh--E&dqT25AGMT(&qejkl("k9+Re'
-KepZK1d8YGp&6Q1fC6DZD+6H2(Ld6-h22P0!H%q%k2b6MXZR3[K$(0,Eh)d0FaK$
-TU'AdZfPhmB-1cFMefY[ji,$ZBPm@&`pTL5V`hF#dEHY(GEbr9NBPARSk@h9UjC4
-HJPBTT4p4E9Q8hU`kbbLGprBRE69E0Phd$+&Pfah"H(S4Ek-b[21i9#IrJ)T1UFi
-X+X,N&Fh2C,XM@1cY*26TiJhV4(8P1C4RSR((UJSH*rZmB5PdEdNF1dRh19R[E8X
-K5dNfQB[`aP@06aFESP+cUDb)$TV8@hP8j+8X%ceI5RY0H-&U8I#pr&[mRDd#,+U
-JiDES&(Jl42l2bq6ENC18LF$jP!PMD9%Q&4cM0rL8#3qT,T-59LBPV%bb@CQ8SN`
-kq*C*BA@CA"&PX[eQGC&-CN@5,BV%dE*)1JYeiVeKRImh,*)f&)QjN@UcD9`ZlPi
-G[p[-*P$9JPSAP6Cm0H+G9p$[q5JU,e)((+Ikj94C4)Ij9FTZS)-jG$L9ZD2"STk
-k4$@YUDLQ%$K%YGh!T(MFrYE9Djmp(PAJ1a5+p45Hk30[@mqIU91Yd#R+R2Dc&+r
-pQ9be)Pi[+CZ!bYPHRM*4I*JS%palA%6M[$k&9IQ5*q%P#C1F0)lpj$*1cKkKV'`
-U-"(ZfcY8kUUZ'!bdl9lE,",qFl6`Ri*XhEcfZD$ST2L`Z65XC$APPG#i)Tp9QVh
-A8kM1QB9,4B&M`S0!q-L#@c@$DAHp3Yib1T!!+cBG3'RkJ[*Fi9qAB,CGUMGd,X$
-ChJe2V2-Amq!AZAfTA@b(AT%0fbP[6AAL)iA#REfKN@6*UUF!GeE)9Dp(i$'Y@EQ
-q1#eLK')[mFRQ)NDiVPVU+mPVHUQe&rG3H,R3h&+NAD"!598plBLUE-((RcZckA3
-flFQQA(a)bUC5h$'TX"8`9q@bBZp,i`GY2S0@Rm&bRm&aRd&@Y5$G@544F8Q9e`l
-&iSG,0e*aGP81l%GGR""PDUa'e45F&bJYem)PV5KEYEPS6,Dr&('K954CG'X+VM-
-fEbB&XKeD"9+l)eJj[ipUc95X9LN9MPY!+JBiaJedZ'&'%0I[,6F0ekqAi*0XV@p
-0U"AYKbKmXbV1Uml+Eb%V2jbH5mY+bCY&HFGT@4CcZr1&dL(LYCK3aNHU-9V'*kK
-MTJP%PrUV([!QAh`*1VKKU%5+0fIj(Zcheccie63DYm1RKG-'3BUphLFP+lI'fE1
-U%8LiC8+%Uk0apKL9jG+M*F+plLQPJlP89%)(c95QqJX$j#8'V[j03e0p!'dm$Y!
-fE6)Q(EEJr0@PRjj8qQQrp$-YTCpfK9P+d)aV3CX'I`Bb+IlR+66-'Gj!P@Bk@8,
-IiS&XCQV)SLB[0AMTd%ANJR5)pk8lDqR3$NV&U)3DDZPN,9A@1TLVQ-98&Ge2a(F
-8eZdT[U+`lY`#@`daaYN&YU'$'6+k`"CLqC@fG(r4LcLaTGVYr8U-[XHAF&aRFSQ
-fp4JqLiTU'I%(#FAprZdDr0[%b)QDF+KSUdqG&[@Z6N[I4iHmkQAiNE0dS*C+&AU
-XK%Tj9dC#kbLrB(6RLkp5j+qG9A9h[ZTXR1r6CRj113+``@epd%"Y1dfjkI4d,TP
-+k'PcPCTq2lHi'T!!aN-1i'8fjY*D[EJPqe,p"ASXTpT*iR'+eBc%h+3IS1iUF9A
-YkqD,PJU2mS(5qG&m#CQVmba`IScCp8Bl848M5ij5hQUI()dGBiDeS01`%S@+Mi0
-1&GJ)88I2)fXfMIG'm%#iSlkUaZ,PTF4&HGi**-+4Va(,c5Z4+'rjT+HK,(20UK5
-jTmpT()qVpLi6FcV`FRQqq$cQ3dj9Cc5LG4-hJ8paa8H9mT6Uh'5)hqZ@m9l9Z'#
-4+Y`rPqEMDd*Q5)ADe[h5afi6jCYSiaP+A8%rPP&U%IhG4+RVDDfAi[*)VD@M*VV
-65j8PG,)Hp8p8bU1eiL#ZPYE@8ZSqHZ-B"9A5aPV+Vb@h(fVE!EVkLREcB[(9@26
-k!a8XHQN!qA$4Z`"8U1LG%eq64Dq$q*4-)1'XlAKr1L8FVKKPBP614VT@'#pk!N6
-I&9q6@EGrPFK-mIQC`@qI!QG0,jqkp[pAD1hr4k%f##eiNFca0EdUjK0TqFQ+jYf
-1QlT1UpTAh960LeYD[-d`p[[X,@BHJ4@c)F)F%dkM91#[6dq3!-@G%BU%@l)NTfL
-YPIM"GUlr&F%jGfcc1hb@XKc',I$+pC+L#9UYAMpiPdk!,r&H5a'lafZP(8c9YFr
-3[[SUS'S(-9rQ)'B@(6aANDLf&YaUU1r'FcVU!ZV$I'aS2fPbRI0)0#QZF5r,UeX
-QI*mrRjU8(VIJ6mjQ8lD*LXj333Q0,N(,c5%iCM%fmHdKXfSNURHkejNb0N+e9"q
-dUTMY0H'"DV+9jV+UkX@XR#kU9SVj3Z0#GHh8,PA,bX!8Ida$R2keYVVXDfe9Ae9
-lp#KQLkISfQC-hFR0!4#ZIS[4m1"XPG(Ni#ISI1+(&@pl!5mk+LAZ%mD9("'@Tl1
-`NS@,,24LBC%)haHaF*D&4J6Yqe!GB-UkQ'jT@U&U+rUViZj9EG9L(6H#BV"2GEk
-eQZ1Z@GYE2AL8`rP@-)mU9*aEMh!$Gp*ZM4E4pZCCR0RI[)MR#EcCAYMqh)9,3*!
-!E(mc"2eYH@+4EH8kV[q)jEIeB@'i#"pPLm12MQ'a8PAl+%29$PK9qdF3SAhdVQl
-rD$B%IM3AcdRBVQJ(!"2EXhAlpNT)aAdEf,NGmje`Sk*fB,*Uhhi1c0XlBq[f(N#
-&UlDG1@"blNcPN@L)lZb1E6YRL@dl"q[fm(T`KLrARH%*20bMD1'pJCb-TbD%,q,
-K!38AP-3$'U)X3%9G&LJY+N5hlkL&P"d@)@@(5mH9*YCGM2A+9AYb'64)hSFYb5i
-ZlQY2$YIYb@N#'bEXbm,q*'`da#3[&J4)-!N4#@Ge,F%&-EQU&P5NDd(T+ZiSdS,
-Qk2BJT0iH9!0YQl0dHr0qE'dqaTpcf*T[BJUBV6Q&Rh$B0ZrJKad-F*E03#2JUK$
-D1&RA'N'bCGe9He-@"$5GeV8QV&+l!ffDQi+RU3p3[B'+!mmJm'`dkrD0A86[G[5
-Q)bNEDlLP9V'phN&XH"hb4MHJY@h5R4RK()rFd$+FZMe$E-QiA8HcA,#p8kVEhcN
-+h$[`Bk04rc-hkPSQ!$C[Z'V2R)'66%"e(ZDPjD-KNSI#bMqUfr2MF*+r$EeQdEZ
-Jfr*C1[*l!MG&i%DKC`8e@N&RVE9HYlHka(#VX*N#C`HZVqMee(%Y5j!!Ga-$qNh
-P20aKhj5!XdeZhElTCG(VKGlRSJG&mZ,%*5faA%54MJYDBPG%QJ#HL-kL**d4Rl-
-#MCL2ia(L)#D,(F3FC`Fafh4R6#-QRbMf'!'!-3#Q')#Z-fDZU$afG`"BGlTZG`0
-dRHieIQ`'`0TY%8GGG+HlRm"UlZRJ5K()B0dHD`ClV)@ailiKPce@*$Bf3U$Mr@J
-"6V'I#maVIN``0UHCG(YDJqJG4fm(H0*fLD&6GkE0%QTUD80dqaDKe4CSYH8)J'T
-,Z%MrPM!G9lCBYlIZh$+CijCqEFX)-I%@VJ[3q52Q$)l$%c8Z,!G0E@m6#le%Z,K
-0K'pV"I'q&Gi(RmC8,6"II,9%jedaVe3AAfF@1V3EZ0A$Jb-1Re-B,+DDkMDY'jF
-G0NaFaPEl1YeQlbp%fB4!Zdf8V`fe`6B%25GUlIN5(JlGcYYe@la`FTMDU0Y#+d8
-hY-[AcXI1m$U3!$2lFphfL"RH5FYDSpZb1[-kKrCS$ee,amh6T4Y9Cqi-2JpmKlE
-"Z8,ER"*GbeQ13Ar9ZGI$&cBSfZkMZQdhUbblHk!l3Y5c"RLVJf@U[F%0E4VJele
-i!@fBM-llURe21HLpCjZ`0iAY"+BplGCac"BeCDJff3db1H9f2!V2#I"dd'fHrX"
-S(Y`[G1"f95X'43i)HTAUYN!r!@Q"erK#m*T6GDIj!XI$9CcQ([a3VD+03Dj3"-p
-6LlRXbp"m+EUUfSTB05h#4-iLj#8&H($+-U6Vi!add,4i'RFEeGj8YC*`2)i+b0(
-`&GPG"*QcTr"$$YXMamAJ%6II$B,Pi9&@d'6d4NaH%+k@TeXiZ1cT-`%YkFah2ei
-#M2Bi2N2J`5V*+!j,AedlI!DlPQ1QJS!"jq%Ch#K8l,P&)%-Z*SrRSVD22SCC#m&
-#dd0EGIXK!Cq(,JJVUXkKhVSY4j5M,@He+2UF0KcPp-'L16-C@P3rqpjFS2G+31r
-G)G"lfrKQKlChX@kVAbi3pEZ%r2TqZV0q$UZKpB#f[$6-LZJLA-&ZiB4f)c21JbY
-Xb16c(,D'&!#QE8m%#YLfCcK3fMj8kRe1ATHPD2X(klD6E8,bbIFj@Q%RJhAE+3D
-ITd6@UMd(PreF215G9Qh2#6hYTq'ME+I4KR*STbrUfZP"UL92YEe`5QakJ@Rh3Np
-9'i0XYa)eD`amd&R-`Kd$Ara2e,!aI96Y6"Jkje6YcJ[SS0510qLfimbr(TqKfiq
-24"*Z-qZffjJHYiQm4#XhkEEb8)%Slmi3JhAY6ihBM`TlY&QJMZ*6URQNDMXfA!$
-bL@cGGZ+8+-36AA@E*$)m6@T%9`#m6HSXMU5"ZUDL5@VZVGU8VB*&ZDVE(#c[FJ9
-BU"GS&pSRCN#`#ilEG8k8[@X+FiJZNAATH!5''91-pFr4fD8kieTjH+RL[#q0Kq2
-4(8H+4051S%6-+e6RKVim('@fBC!!EPXM()bf"ZfFY5)VYkeGai*E,,N@V5%c@NR
-Vd@Baiakk,blUYLpB1bL9Y5P5SG)i9*!!cc#aI4aUjr*fD1dFCDfICKED#iIerAb
-Kl)TXIJJUV-THab["hNF4hjc(+DV051'4$Ll(fH5HF#1f3*cB1NjN$6CcS3!@FbX
-Ee!L#MYQ)QSZb'c0IGqD&L)D50MS06i9$&KJ)%h92GbjEbD2JFCE0aUHl-Mi-EDJ
-$YA`K8!GUG+GT"%-9c'8SlfZkGK![``&-a5q&K`QJCT9KUR-!RjUI3U++RDU@MH@
-+YkV14clJ#e%"Xd!,$qEf2iVRGAMJFG1RS0-C6`F#!(QJh5'dPJkK@HI*!GaR#lr
-BJ'DRh+SkpjeP%Tj('db'H4iZT"!ZiL6F5#%JpC4!B0,i#`#TbT[Ll8Leh@N5%Zl
-XJ0IeH09jfck@)GlQpXI*V0U9)hmhFJ&plk*qfRkI)Ic[-EJ!!q9eSNB4hqh81!!
-BEJRq#FmR`-h"BDV0F8a84FG-%9cV4AEKQU,Ep*'L'lGDYaeKl[K)*)##Y@[Aj`V
-%HV3a[XB0Y)fUE9ffJ*TeZ)9k*F$L&'le9EA81!HZH"BfZr[@p-2[mS`CdXS+Xhc
-'M"XGDfTU"PP$V0D"6ZG8Uh@)X1Lr)IV"mf$[(ALM&8`e9QX`3`krF6l8DMd(4(b
-`04M)N!$je[&r)6@I6R$mMIqNKTe'KJJKLd*B$,''Y'1pTG@)EaEAe$a3`e3B!K3
-dZhqZdaRLG!kXi"JiTH8B'qkZ%D,[UDQjafkh$kPC+)*!,I$h'11pLqhXEh$0r8j
-Vc4$r%S1'3X*`Ch!&dphIER4#`0de)l"pF%d&q[k4cZ#DJ8kVN`Ppf#PS&9)c,Hb
-Fe6NA%Thf%B`XGl`@HRQi'&FK8[alr'SZB2[mbh`RYJd88U$m``*p$a3%i[l[a1J
-KG"qShVP3p,kT'-kYk!ak@$"&9LeA3Dc"GbbaAPKqde&9&#Mep"lRHi8pfI'16P,
-M!1Q#X1HNeekqjiG,mCFZa8Ykr+AZGl#rpm2#`JB-[4b@q%ITR5Zhhp2aqX""Rl-
-JZ6[1NAD1l(M2b'($T+dX**r[fL8XV223i-X$VPdIf1&@fp9ZYhTh[A,pNl!`UAR
-+$e1Q5-N`S3p23IJGJR3Kc1Um+Ze%H$)86iVGpRE%AIp(rlfp9i"c66!$pprqZB,
-FRpl`eJMXM98hZLIpGXKVm4m-LVr4+IipK+XhRl"qE,eae@QpmF1hTdCDjpjB"H#
-imD(6H[-pqbclC2Xm+iSib@TGB,A1XIlDrZRPP(01P&pHHHa$9b6P!FR9mm-KG`q
-j@rV`0a@G[bFqmdV`S2k*9r&629HZ5j0l$T*5T4U8ceT45(mG)MdV"8PEZjbAVSN
-bq&CBQehDBRr@6[krfb5Z&UNjK0QmmD'KciD'GR[Lh-[SGPhje`'*eb@(X1Y#TG4
-3IrJ`Y&GScm6VV`,p9ZJRLCmN5Npm+Dhi33e)dk3Nb"XRCGV#L066E9IDK(`!!"`
-4384$8J-!,[%293eP44%!-@AZ3lpYEjBjAm,,$2Q'N!#6[)3jadbbiC%d4b8Z@4,
-R-T+a4!RFI-R8C"2*NMA'019kF$%aK'JKKKBXPd-$TDIaq3`X8+XHJ3'@`a8[0r*
-mV29i15)8T)MPYPb[f04prRl[Zf3*PR,[kAhq!4ZQ*q9"%!4!%!#L!4IRm4'G$Lm
-qA-KF8)PNK!'qrQI6#bh1aZi@2YRY$6j1PIakU[aLI1'41jh[rIf,p4#*3eUE'RP
-f1QaCD(,k902TFL3G1!DH1-f%9(bZ(jeRSipam@1B@&8)ca,l@K4#KqjM"FhS[%2
-lm&%YIL6%$lq[$HiadFdM1B##IR)i1IK19aFh(#8A*#XScD"+5+5F10cV-!jCIK@
-ZH*QhAMX5qZq#8!%jU8C[qH#CpDP@ERNR%&Ul0d5Z3pehHhXG'GH2l`fdq9BkPBe
-lDLhcZErlar5hm8,hMmr[jp[lR(pfD)06rH5H+b($6`24R%"6fC39Ie99C-IPPpb
-p(M6hSfECJHp"9V$K`0h9cJVVU0'UF$Q,AT1KX&pTNN("C"PHVI&U['*&IV`q1a$
-+jEhEii)Tk$QM")IDp)RY9STGB@d6`m1-M$)#4rd11'bKN[8l`ME9AlpML+ZQihY
-mX8"-hG#NK0YpCP0qh0[iN4cK#8p#&[KR(U%T%Y@`LPKC1Im-4D(XhDC)lel2DR@
-$NUBQ'V++&4MAaR4SlZB4)5@9#DhmXj'`48dJD@A9"T'mLkNQ`eBbP`3MNjTJ)"9
-1(56-r0SESjcIEAS$)J@QmVT9'CmhqXcK(RMVJmN+DMJ'TlaFUj[PJ$)R)'keH$9
-aHIQAIE&*DIMrH1'8RRA&NediCr@9qklNPUdZJ*YFU!r[k"qE&9,(fq,YKZ31ZYG
-bYI0C(cV#mRJU+I3jrk6e@U4P2IfHD8cI#ZIh!Qce1E80DD`H*,%kker`QG80kK@
-6hC2`pSE0fX6Tc9a!d8X*51Y@(K[4A(C-bfSl%RdDDphP[G9+P)TIpXP)h,@VHe-
-4II$"CF5F-`5+2$4*2)+[)ZT&XLmXAKUZ"$krq0*)F9TpU6ijP0m'*kJ+CX,%@c*
-6`Dbfqkc)DPU2PCqa8USbUD61PU%a3("NT%HG2I*0$KaA5)dKYGVVL)p&2DD#!dX
-$S68&[AYArAUi3Ndp,iFF40!jKdG3+k)@0A9e5G@N-&)4&F)9eZhI&K4GLJB`f&F
-mq0b+ja8fU1cFLUZ98S[AD(AQreA@kPe[3[pkm6&X6mA'RhVEI&C[Tqr`I4G88rh
-$Xr+4SUP)4V54PT&N"4))'9a'-G3bJP6!&kQf&f%f'U%%p3'&0U,NiQJ#9Y$&FcQ
-ZVG#e!pq%+`!mB53e(&1$J6C[+I4P+3*6rA12I!Jb%S3N[VC#14"ji0G$&DVI6)P
-U$R%PdF!5+K$*%q5QNe*JDQAcAP*%eApICR1D!6P6ECjUVe8effp(hM[be,$2T#k
-)YiCl`hX[Yh1N8pAeeB)%9+[M-LP8CfP%QQD*!5RC3-J$SYlfYNRT#%2&80ZX,%q
--Z6"ie%mI!JqJ)j35$SCd``5AZlLB8U"da)Up4Q%Fb35@3"#)88"Lr$X$BerEmR`
-bb%JQ&"V!4*d*J5Q2GpFKQHH%N4J`mClqH*1k[pImR"B*T[*RR51C*T[((`C`mS*
-YGYiN'[`F,T4QB[SDkIe'5NeD#L2hpY@C-'3Rfdah[a,4lbE%33N-5F5E6!"+h*!
-!4N'+"F2rfPIRlLmHSL[Id3pa"BNpRX"209e+06SEBI4Y-!T)*-EKISCaf8E9Ai%
-Fh[d5*Z"GfNRDA!chFL3lHE$la`$'9QaNkijq@N`(M'6MPMSFV3@VXZ)M9+e*YB(
-e9'T`bfp@',F@)UddZ+9ZKA(,aC8ZA+I(e[K"'Jlfi@$bZ21$0$TSF'kTD8#([G#
-fj49em)1ddkM3"SX44*Q3!""Nq"a5JcYp-pkEH5KX"VTVYLhK&L5N!V`['JYEB6L
-189US0UD2m#`0D1lI3+$D@"p'%UYqNK61CjeBb)A&[5F@F[qMB*NDE,PNFHdIE,R
-4mXR6MT4JF6hY-"qCliFkq,@*-ika`CBpP[pB2pM5E(QRlSfa#XYre,da(&cl"2d
-GHq,1JP9[M'HPr-eGU[8VK'2JY3&-+jXl@)@IN6'lakaD!3E0a[V"'CEH,Umh8ES
-)U5hRRa3)2S0EHq0HVjA5ZYK816RSfY8fa"2RKpJf9e-#%B*KqGC1G5EUp@R%K4&
-DU0U4'8Z!IDQP'rp9RI&Cb'b89MZ6dGND9e1$cPCX@fDmXGZjXIN8+MGH2hV,a[I
-Urcpl9BZ!A%[*Za05S!0$YD4`[U,2HGYmNieeCl8PPF[rZ-6%QC'1B8%Qd,F(L+b
-*Qr1#Tq`EebcXfRMX9!FQ1DCEZp#bXCQQdFjj+JT9#LL$'mrN+Ui###e`fiVXDUZ
-`me[Yd@hkU6rGfj3NB%"m'ilSlYDf)pa8%5Hh'&ANeI+"IJaZU)U@91b'STJ'Ypb
-'3*Uj9U!aQ$4E#ZFS'1#3!)dmZ,A3hCpZ5H%S'F2K*pJNFK32kciTR&jX'a05P8L
-GF`dFE9mLiIN[A4KZI2mCBY2Rh1HQ)BB#,U&dRk8L6BcdH"G)k8EciNPf39QkB*3
-(pd[,)#kF-2'TIT!!&X"e&*0IZP,h@6J"0ddC,J-@`@CQQQTT!kRke(cHAAS6Sp0
-d5'S1J+`iC5Yph00[)&35%Lf&1Kd*LN)RPVmAYL36,5F4'&"!fi#Vc%+5AdC&rNI
-S+,EF&Xf"%GQ[dj'cJaLd4*(Z*%Fm'Lmc$Xq0AL6@9F&LXlL`a5PUGT82Mh-b9"+
-`HBM5`ApmKS'K1Pj0V!N8Tqc1eQJ63dTlPH[!Y3q3!'J!%R*c[Xd-qI*GEdrekb9
-K,P+A5ilb4R5j"X2KR9(hHp)c*Q'q,iVQ'i&%VUpe&`hK(8dm-!66dS(1-pX%da*
-IfKC*,Q"N`X5!q)[kf`9d0*Q%q"K!J12NrXQLNcHcl6Z)ReeDh[)#$+T+,%$S,VK
-M$i,&Ye9B5'DVMTNY%D82CT(*krjD9cGkl'!@K,h&$q)UZUHlXh923A'bRUT%-ia
-)(N2S`DILp@*kCM%-XqMh0$8'G(q%-"b,qr'bH+3%UQ(+-rU'%NB@D+rI6"#qJ*U
-mA+T4!9"DY,)S0(2rbS3EG$@IHNfqMS%Vbhie'9Bd&NGMQ5Ar)GY%a059A8D#C`S
-!AS'3!)Y*2bdU1[2kKCpI1K#JT8f(,@Q,EH-35)fYTLk2NPSS,He&9cREPHfRT8X
-h,IY`-ZBVmclZbimqq[0,(Q'J*YVMdi44SAB1C)jd22kT1QH9BfdQr5h+E(lYESI
-DHIc55'a9`GVAk'r4DpGNhPh`T50$`EC3UQXXh$P3iqk29LFV,$HMkekZ'`SXJ,1
-ZirJPVI!,ee+Z5qN,@bN5,R(GATXaeVfiHh'[,D2%T*lI(q2*3HGk-0R8Yha1MKk
-)+"$J6UKRk"HhE$lSSFf(5N#i4TA9k83(VbMMA$*&I"F*,[13!(J9YpN2)3G#d`N
-HX[0+K%CpFRkr3K1G!00XFG*a&*Cf'jhKEUFcB1TL+0DReE`cemG(Eh&HR8c&3&j
-`9"SfTe@UR"#S%N5FX-bhJF3j)6UB5%h)1)bG&b6'X89J0adG-(A%`m9-r-YTi!K
-ql2ID1)PM0[l8-"U9UYkLKdT2i-mL`V5*C[YjN@KrcP6r3S$6U3+P%RT'rAEUZ'N
-S0EkK![Zm+14a'18QCcM$PX*9Q@2f,8&+EUQl@K`!b8+E-q$'))Q"d48BG!DS#If
-jcNX*I`%Tdh9bD-`[Eq"bGLfU+LE@b6c9VQ)KN!#RRKMm1aK%Ak@UA&QU%SaFGSC
-TqESF'@,pICPKSh2i1PGd#'B&dmC*-"%3+"0!eXeeAbD)'clY3Y-56&BjL%8[%@A
-9kH)h6QMNVL#I(&BMeR`Xp(f6&Z0b2YVi1U-Q'B(K(AM%k93(qSdmp&iH*h$!'I9
-R#@9#QlhCZReJ-$DC1#(i1h34+',pp`TBa0JcE3"C4-G!N!!S!8%#B"R')TY(PJJ
-Gk)rb8+YK`#&T`1FP!cjhK[dGI24l4Gi36C6&YT)#,33-'hqH6kINd)-EG!G,0Y3
-rNF+'EY$Id0r4KPkpdJheBb2(eqGL8qImjcB9SNKA[("-k0d!FXU2"0GAhTAp[ET
-kDS-hCVrPrDG5Ap9`LiZ)Zf)M-ZD9A#rPYi,K-&q4RkkSP3hj&KFPGh@kaBjS3MV
-d4KBl8K8@e`JlU(--"@F9C!MEXSaMUQ!PdG`h!S3FX4aH%H00"S485L(N-03bM4f
-%#RP[KqH6+#pr&8$cAIHZ$kprc%eeE-SXqbmFlF+469m%2384i[hkpB2[emZMP8,
-'G'T8M4&!ZlA9!Rj#Ajh6kDUjGC51MD[dh868h08bBjbN$UNDkFeAMr"#RXGITJ#
-SDZR3Ci0K0jp*QpBSPE0G&16eT52HfPKTbCq)b&dkR8FS4,"CbUj9'c),JrGX0YR
-6@p'93b4*qQ'3!-)$r@![ih-@'Dk"'JTM3C2bJR&c+5H5(`imG)SjRmmY',hPI9F
-CiZYQ[ch[0HhRVJ)&KRHfDbKdlbYR(2T9!Iqp[ej6ULTFF@r0pD8AK6lq)LA99,*
-!$3AD$#ifh5k!+f8)G%+U5qC+GZ$P)!*`P,Z-HCbkQZB,ARir`NjNIXIAr"YcD&1
-(E&Hi%5jDIU1kJ*VARqYm(%liAGi&8*A0fYZEiDCmd-B#E5,bHYiQKq+e616EjE2
-GFBiUaV'T9Z2lpIIRRq24K(3i[PkQMh)N--V4YAQJ8'PaAmSHL+%E'4llkK8K$S%
-kUU6%`B3+AcQZ&XCjG#KP(f,,([c*+b(G340H8%3)9&@ACiI'qDSVaG0i(Q8(Z0i
-ia"ejRhkcX*!!!deVmaLU3"9X2K[%lc5SP`,eh#qUCrN29-pbK!ij5e36Jiec53d
-P`!ec,&pr!XB(A8cU51LUA3UKP%""L'db[5U3!)LFPcS9m[Ip%hi1"0(b9X3h6I*
-kDaH"qiidQCVcer6U&qHb!T5&&EH*KNT14Daf5K$GN9E,$FY,QbNXchbjmK+@pqb
-PS`IBdBZ-V0i1E&+C2K1TdV1SC'V6bqGTF'jL63%0Am5'rlq21ea@+U`Faj%l(,@
-F%K90kmhFNQDeda)S'6qBPmGp*UmFMAhIcN-$&m5M0100bF4j8RdQL2lc'$9-5LN
-NQX0jl-VhCAEFmRlcGDlc%39'fq+!f+'4",6b"p`e9VYXjjG*YB[Ze(I#L!'Ce9k
-'(Q%cL#249ViIC*4pPq)`"(EQ@NSc,Q,*)J-TNb)T,,`b+A[6i9"0)LN&TjbDcZ8
-4XkNJlYHXlLh`l&,0F-RYcTUC1C!!V[dYpMdTM'!jNM(AUL%@NZU)Tl3ferCiUrE
-mA!G3l9T[k*iVQH`c,0a6NqD)#SDMNG!pVfehK)-dLETGRHeYkp[p5%IKq%6Rc)D
-LR(k2jf44cXa-ZrZ!HdF'5db@'d`S"&QjZ`'*%VK,bGRHF4[RC6P3!p9RK312"mZ
-@I9L%4dc8cY2[,[Yd+3m+TUeF4YSbTTU2IqL0q3*FIZ##qPNcA-Fqfa%HL1cBUdC
-f1)V@qIbEpUkk-"a4+qr,R29GM"HeUYJ1-(*j,E0DH'a5m*QMbP$%QK89!R$2RpY
-lB-mM(f*5[fN,&c`#820*eAVk"L4'j"I``-ELap@&&$a,X)&ERN6p6+MLCmeB6YG
-3(@6JI,dp&kJ)pjF!jrFbcT[f)%BIhB+EZ9JJm)Z9j)*cpmFEeq"MHGV5DS6CYGl
-6#A#fCYQLeb0peXK5E!l'h(hD*4)#00!UelP`FF($$jiaS*dM*F'lrERXbBl#!dA
-D('5#V8J,jdj+N!$rk[l(AL`jQChY55FdaBE&`[1jr#d56Kj*d0G3)$'&9$Zm%N[
-llYcFSZbFd3-dNTMC[eSRP@ER&18Hc8R2034q+j+CAd+"[(&jr,$N'(9`*!+AF-9
-()%P)3,Pfh!3RSLH'4ePd!26eY1#bQbZdZI(h8$@,'AD#p@'BSbHEEDP6A$*)Lf'
-58RK030UhF$FIJ-@C$eecSj,q#M(MBTk&a!+B4E1eeHc$)eCFVG@`MjhL4jqiS&f
-X'0-fXSpaFF#`Z-!RINa2dDX*j+&Tq,I-A,QjJ"hif985Z)LF8JL%-2@XBHX)5f$
-X+bV8Jq&93BLY%&**(R195aIpXf,KIE[aFY"V0L[-CJ86+jKBSC-91P(iJc62BqP
-j46hTlHj#YZXR$9XMTBX)3C%BQXmRe0ja"FQKTm2Q2pc++C`eJMBa`"eC'rG1),!
-qcqrEX1&@hK4J!UeVEpcrHXeC+eGI[p"VAf@'d3TP2+"YFfA&`hP+B59EA-X@4l"
-BH,h'9iHPADXki3L2C-a6@5*`2im(*[DV2+qbK+hbCXhV04"eQ&,8QUEk4IC#aTh
-UKTGk3+MCR6Qb!@LrAmhJ3JQbIeqkV6YGfjYcp-$0lEP(M88-VZYljZHQrmLHRTd
-$H+m-jaQDqY+"MNNNq)#Jb!G`Q5QeCfFSRa+DfXTYMZb%'[NE-aE4DMAbTN-UM-l
-MDYL#E@UbZ(BiiKVmY-+X4b`1LiYYq1i8R!9U6#US'ZNMI$1IZ1lGNQ%+IKV*f9!
-bb&TeL'1Na(EZ2*UaHb9hbf"ELdG"a&"-+*lX*F@626k$NY8qjBAM$-+MU($Nr[1
-XSH,$cdH['5mELdJ+bR8'4BYX,PDd5$d8V3q[9lJV@"Dm-43,[4Uk&0SAI#K5crl
-')QDm-RdbZGj8q`LZLBF,3TDIa$JHUr(h08JUK1BiMla+bf$6lA!kqLAbrZ9,Nj4
-'DedTJd4I`e5rU(3mdLT0!bB#Ba)b-#%@5DlDUdiCQMH%T#'F840rQFG$!8`l#+D
-kFKqFdrLX4Q2HLm"SK$b3!2K%c)4VrZ)bjDGVIMqATX,M-"ep$Ehj8rhCad66`%1
-r'C)C#Hhk*(KY*C8P9r2aNXU%S6*3A&PG-TLV`NLNH(TFarZ@*'KmFRImUQ!!q'`
-!(J9A*[3fS0S!MZ#D(`E!(cLdRQeGD+9E0r3@a&6VXC3f8la%X)qfKQh()KTHDV$
-Y0-,@["DeAGbbDYhYf,*UI'Td0f(,k!'%QkJj@JTSLC8#66,NR0rTNcmHiT!!di#
-[d%294*8,Mr`J4J-'P*frl"L5[APLm989L(Kk%3p"A)QTA5B)(r%4eHje,lX9,Y(
-BfIP)L8%8%Dp!c')%-YE96$0@3c#B3k8l(%Q48j9L&m[,3phX`[rF9G9-lXMq%B3
-#CLNrMT&djh'$L+B`%Bfk$55-B4$$RA"#U%b-JGJPQCD($iV1C%S5+K"-mkA1FC[
-$Z+RB[HY)5X6-2MNlZeGEG1!jch-(MKTk3`JRid@&-bIe$b3LpY#MXH6UK2"30YJ
-[UHV$pGLSlFbK[BJU4PDE("#N40Fa9ChG6b6"D3kjYUa(Ej'YiaM#jePhBref&+,
-QB9Xidf[#ePIM@R[Si)8T&!r5d$G[5XU-aA!a8`S5Cm8[T3d`2)ClC@CQGhC4)Dk
-3!&-dbDAZR-4TmcbqMm[QHBJaprDG0KKfFhTfh,6EU&h*IZ59#&2-X2[%%(XNi5)
-5dNdIB4h+)KMp,Gabq@EHa3@mc$b'Kd(,S(j!(h8)63dSRc3Nh!65bdUfiM'*#-[
-4l-Q-SKdP9(mXh2KK'l@D'L`Nr$Ap'bCd('D"6'%(`(8'U')6Zk#[G@FJp)QS#e'
-[#ijQT"GdC`b25Y)I+KDj-pfC-!0Eq33pHNS$@YmE4`T06bLXIG&Qp-8E"4Y2'+G
-4N!$M6EffH"JrS@MeiENd[GM9+3BQ(m@)5A3j%TllI$hr3-F!`!Qmkh)[Yd"jc*F
-lZ6XUi00GPDM"*A`##[($L-N!!APa$b-Q'i@TH!+%61,(bY4P08h*c%D!GqNVMFF
-D(C-Z2*!!kE-N&F-##9dp)mR$$)3-BF-p0+6+j649,XGe5mJ0Qj5,"diIJ8!qmBp
-&21(EbLeRPa$#i!@%JE$D*5Xm`%KT96X*l'I4`-#"K4iSd+h'Bmd8I)-+'1E9G#K
-0M`[G$56c@l4!-SQm*RHrSGPT%(NC-NPiPRY9p1,mQA,HBrNlRP6KPVrVk"(",`$
-15EirQFjlZ!f[!Gk&ea5hi"APjZ6R009PiBfCQ4cL*+P+-N')aibR"U3bdbNeT"m
-Afbp(F`l-*r6YBS)f"N!aJAimASCAM0*p6+@I(qM(jR1%)C8K2IrLX+f['@TGP!h
-91%!mZ'(#C)3HY[H%mJ3i)CG"J2`8VYIB3,qRe85J1!)h$6kmRk!jm&ZUk'Z)EP*
-0KZEpDc-cf6m#2-5'm$`@Q#%ehiPCXfL-jK8E)h(BC!C"8633dJ#3!(f-MQZ)k9'
-4+f0V@1!G@cR$'Q*i914)3qkQ9*3*kU[CamaNZEkCe25&-hd'-hPhD62CQj)-V@C
-6XCN-cdLKJ,mAYfTQkG(*QD-C'HN(CQEqlf61C,Yi$AEP@E6dq'61I!1UP&j#L#i
-YfEh5*DTaMl@[J5e"BmViA2E4R++V,0NT,DREV@I[$'XiFeSi@l3[!6'iJ*I!B`X
-Y,9SbiRfl&mr-j"E&RcX*lM2aM25P4c0QdTFZ!4-ZT4h4N!#SKCY&$54j@1hSEN"
-iQd`TACD`faffbfAFl9P[[5!IjRC2L(hX&$rb2%fU[8P"d+!Ek9&%%K82""XmVN@
-0"1DBHbQ1IhL"d$&b5V6mFN%m*UCUGbZD&4pjeXQYr#A2lANmfU4'FK15F+4TY44
-BhVR'S@fqaZ%,iZQbPcbVe!iehc!&'l4,HTNdRK+@2V2e3V6&@L15R-"3)K`9M46
-8D#pHbUk53191D3'@lL`qCX[G,1eVp64Z1acI(&9-NH)V5Laam&I$N!!r'0#&kGX
--"E3Ic5d5%4lSUGe*SE))kd)J"S8bKZB1p#0`GX`3rQ9!1cCJd$N'ThQ,IT!!T9L
-jYFULEkY8I&UPiT+KJX3,28C[P`5a1*eM,2K%`Bq-8-'548(UHMA4NN-@NPM-BKF
-GkkHhmE"Ia&@3!$[RVK,#Y4'ipH@F1AG[I0["PK38ZaM*m&Q@8,ViZK0h8-"FU"Z
-0dB(qdJ'rhp"4X&5`UjF(UiDlXJBN"!f%eT6"Y46'[fj4I4e!CEqh`iZ+@IN(3Yi
-)rU8&`Lk55!$cpeUT#e2L!X31&B%pNIfFKBLdHq5(d[iapl+GKp'KUUL-S9)`j@H
-I5rQV"'k@L*HB9J1MfQLL%-P`f0ca9a5XfH8Q+pca'S4$QUFbl6GS$kYrHI0601,
--8aHfEH(K!i*[)3mRLD`&,%85D1@Q0%D@aP6K58$X9NHk+"6`,2j9KYVjC+Q!482
-)!"'!X!'PN!!hDN`"(S`["FS'ie-SK1+Y30P'J$@8T+N@iM'1j6F-h'(M%AFr&N3
-mK0iK6`V"YiN!MJG[jQ&HKQDRQUa!U%+C*3FGT#aYdJe2SMX0&`D*3%8S&6UCN!#
-#)FPPL)A(J'B)#MJBkPl#'pQRKVfk94-*FY,f`LKmBplDiAZLEM6cR80elj52&Mk
-alhHfdCUkTh%@Fhp`b221k,lMhGZ2fcj%cF4M(efdeB`QE#eCSlFqAc[kj*rZrA$
-9RrpfejQ,&bmHH[r1dEZA2AVXZdh22*krr2FfZfhMSESpYUX2,EFe(+UcG66822h
-G,cHh2(@miBfIAYN+!!"(DN&%3e)$!(VJ%&80C&B"%$%elNAr[fh1-9FC-ZaLV2i
-bPQ84RhHKLEA%i*JLbl"UTU@'FQ#PX&QLXN-mAJmIElU"2'q!jP$#5HQjZId5QT1
-U9#A2HbKI5h)-d)45$YHN0!&+%mSK+D@%FJNPKSTlrrjq[cf[K[6fHcr2rrIc!"Z
-YTbJRJL!)J%!dcjH+4h8k[-6P,8i'd"qrJ-a9XX3A%@"*9MiG6"K')#U9T-H5N[q
-rSrK8*6e3YQRQpCN2TE65rT*pdNPT[mcX84KCHP-9P$&ec,!jZ&eApN%NBIKkqY&
-j)8R6&E0+@UKSp"Qq3"`r)5Jc6$-[J!8QJm0L9JDdi!)3b[@Fq8X89QD2G%LHM*2
-)H)kDKJ+4R$UKaU,-SPH[2RP#K%aRSE6TPBT&A,)(r*&L)!R9#0!*0RqR51iBQmV
-$T%`M)V`kjNrX0bCq2ceJ0IN$$JaSPkk)d2aL%ESH5Z`20Yp4T$dCl&MJ+pb#aM%
-6KJhBRdNhA"Aal-TRjdPG,LaK@DmXkl&F4-Yk&bk'5-JeK+Ck93AcXPk%-'&$l3R
-GiQI5(4d[&c&*Rpf4kJ*6eH2kXH[(5R0T8-GCBR4NGUGmf+$8&8MbF@$CR,)emB(
-cdG5jpU[a4G!KYIZ3!&#YFiAkNmNN-kGY,$5TAQKU+ehD`NUAb3a4jNeQ`',`UC%
-ZI(lb"&M*PBH`U9i%TLeA$*AC8K*J-H4-@N044,JU+l10p5-G6(!Pd6TG3cE51+r
-S6TUGk0*VU)m$55ceBG"H'V6CFP#CP5RDQXCc3b)jq"p5ea2QbJaD(*U`U$AP"S#
-5`)EcJj9J!Bj0RJaXDKMLL3Q4DVq,YeKEH3LLbeN6,K$30p9@mVCk5Y,j3PM-$Kb
-B!(UprrI"`@+l16JS'aRp68bSNR4-chIK)XcJG3B"m"U*cDR'`HBd#h'UU%GBES@
-C[`KHHP`3a4`cLqh-IQdrS0@m&)TRI`eXE"2q1d5,5##I-LTFTVSIQ'+2MJLM"Y(
-pX6T%8iJ1a#4%@a(pBU`0d5&%Xf0f4*1)TXG#)d#3!*BAFi1+!dJ#$)kY)*3T8$G
-L649@QK,l`B$V!fUc5N2cAldH5TN1EI-XN!!ABeZC*CrkAi3QNZk"@PPY5)JIUVp
-Q'R3f$ATMa!VbQj3KSrpMQr$(($PA4A0-2kpB*'2qP-PSYcMJ!DNK%(FIdMU"SFe
-CIERa%3J4`SrAN!")IJmCIl#@pQIZcG`,SDG0-bkf5qZIQkSVdk`2Aa&Y30hqXA'
-Kqp$-8Dd[XIml4BHfBD*m+EfV46PmN5AU#fkGI$55b@iU9[@"YUBk9Gpd4AdrZr,
-jF%TNTJIm6rDTHM3f8f2cLaUEd6K%M8-[DKb5kQ33F3Jl!8UX*9@RRJTBQcc1b4&
-jFSpkbRe&A4SQ%$0+k)&5dK"T4P%0&H6Uh$D"!R)S&MHK)C!!41'GCLJbaU9aR5l
-rHDF#!N$)a6ZcZV%j3i()iNKr4*L4H$0XNrbXmJ8,cQj-5LpV2h)j-NkE6N2Bp%4
-Ac[(&YNC#Zh)PIdBZ!PDcp(,*4kkEmQGXHG!cc5H&-*fDZ+[m'9XHFDT!dLa*#m"
-a'1SpRa,$lDcpLZJ5SFad-0HrBa5HLi`#15!qPJG1H#Hr""3H$L$mak$U2rK,%HV
-EaJL@Pl5q'Bh*+k*G*!**83b1LP$MED[Y(L%&((Jp"99[IVl(M[8$RCKJYNei+K$
-(kq%BG`0-UI%JL`LV8bUffT,dL2DBPCDZ#*8@ila)KdJmL![NjU3!BT8-pk(!b!Q
-ICH,2[dp%@@#4"rC0R$V-,,6`H@ALX(ZL'4-e9d5#96+VG)`D9Tk9Qb3d19CI-N0
-&fFB,`NF,4Lc%JfC[X4T2VXE&iX%NIi!NUM`j+0N@j-N1QXbN8[(TjmmRla-A96e
-HBfScAMI8)E`'e$Dm-Y8@1&E%eABJfhr%`P(e&&iPDMCH4PAlf(f3!'[1iG@MMZ-
-98irLG9deif95ac#T9ah&+k8fiP@RAX4J(5UVcRXSfDjH#S2TA+bkk2-qJpPPYRe
-@JqhXr#Ld44YrCr"H93hddF44Sa#PG$%qb%8(pDSAj3XSaie"4%JCc)DLamad`BK
-UaP+GXZ6#8ShDXjZhdJ[LDk"(e1dfUiFa9&E)D#S1'30QI"`2AHI0K3SFUd0#YfU
-h1940"l3(@SMd53a4'#SdaRIRL9#S%*m&SIZ#`IcF*mfKBCPS3!MC!B10G$(e&#H
--2*ak6KQZ98NF([!qp5rbJ1TIm2NVp4NH-,miG2e*XhVmb4l2*3`cl"R"+qUTCe@
-J$9%-+Q,j8*k!X[T2VLVGp-CD,UVP`&D'E+KSF6PH38$8hAY`K@lcc2!B)jbiaQ-
-8b9E6QCK9,YErA0c)4ASmZ"!0ISM#CESF"&[pKLV4$,(k(HUmCNc%4(X9a1TY!20
-GmV#eKh8VQ,NC&lVPVl!DH`Q,iEM+aJM%EmN2iAhjr*1hp*,RCLl%Tq9j+Jrf53L
-(V0$0JE2$LXMqPlH+U,6ri(B4V8[qilj8adB8RIKTaK$,CjmmM!kCqc,hMDdH,M2
-ei3Sek$C(fQqrqGri&iL2!)fdKdeA4%FJ16DH$lHBGMf"MKqLUa8r$[cBmF20caY
-&I#Z+jVD!#`Lb$F&8`m(81SmrJ6bUG)ZD")+i"U,m&4'rP*r[E4*"$6*SH[`d3h&
-!L0Lk#m%jqXTpb-V2Fpe(5%'b$9E0Rrm6Jme'Xi3-l$`HP+ljCebc9qi'0XULi6J
-j#2c*1N[i!5)G3*EhLD3DabX1P)QA#!(Jp"5BQp8@[)BSU,G48'p"8"r@[81!e#R
-mcN**&P[!mTdD'+m&F1PH#qVQca,4Q0k**)eKG(b0N!""LT!!34f"G+0k,[2)m52
-"jSfqf6lM964%U6P&c5MJGR0J+m'V9ReQ0hA!UdRpbpqZUL@ke`0K1E'$cIPl*A2
-I0Y@)j'V8[6kMN5DmLFmkYH45FljhI4%e[CR[6CPaf$i6J$b@-X9M83dF[Ja&mh-
-,`jbK*[!--AKf3,d*N!##bP%$Y`GffPQH$`E0G"1#4NPkS*QATD3d!!E1p"Q0r*N
-bV*qkFCmbH"5$G`Epmh`(*JhXRqFF'!(B3iKb6e#0fZG!G0jpA*8S'bcYIMqTiM0
-+Re(q0$UNJD`MMf9LLKb*PKal*PIUZ!N!32"1Q+kUd3"BeCSk9FS[9K0BM,b#4Ge
-m@ScL3p*9)C1*#AIk8JFhHY(3U*Z2T8CGeCfqpHr1hSG*RET"kY#*)&BFlEK@TAX
-RGI"0hbd'TN8SC*ImIS@ZZ0U!,#1"(UEiD+$"QdaDE(rp&k5'"c%3N8%#'9T0ZF1
-6L1"jc8N%"T!!)J!)6d"3AqiBHVN)!D`YJaf[CY0V'lp#0i`LY(HL%133X53ki9U
-KB@H4adPUc`A4,KjSQA5SfANS5'Qr@D9Em50d"[*BT&ZZ*)"G'ZMEUY0*rKQ0'8G
-5!bDV%`eir0M1e&J,&BY3f3BFFZ&bk5+jcb`haS-*MM#DQ8I"$+KVN6%qXKkAQcS
-+F30"1m6&2GJ6LcKS1kl0`bFAj-jJ'TTCV`E6C-%"BN0Bf5b+p)$L&!+a+&3[G[H
-S0FL%lifDqRkU0V,$$[qRJ'#PaD214EUd8,@fD`Ze&i%V%6,L&D(LU5C8`-%UG*@
-$9HJq,Y4#eAJp(#S-ei@ZSSX9BY2&[QfK5b`@cfK%4M[d3XNJYM2j#HKEQIK"2a2
-&R36U1j`%4Mde,1*'%(bEjfb3!!B@a5mim%dD@,)0,%dD1+B-,%dD@-,!fKF0'kG
-KEp#JcEC"QbF01U3-f[cL33RTKi%)&J9BX'kM4,9Rjc5rSl$'5Kq%Ha54Iic%J5M
-3!mMQZC5rP`Yh+YCETEV3X,0S0MCE6P'2-cU*X)-U3$T@!%fV'V-#PI@5i`f+(rj
-iZBL"!NMhmaD"BQ`k&pQ'UfSF)Z2dIL#eTJC%2iHJhmDCDJDk&DGi+&bb,@E0DG4
-p(QMHM5PU,aIY$SM1((#%lPDF&*`k-)LR3eaZjq#`Z`ICAKb!M(1MEMU'XX0Y$4R
-R@,+T26[RrV55G,N)9iVYB9f1%[4k0"i,eYpQCMT`0RDL'!&Q!aAa)0C`i"`,"*,
-Ti2E3*D$E&Bc#3i@"CJ8T$(dG'39M'k1+S)")G49*a!iMbrP$2Yj*@!6ajFaNX5A
-UH4$qH+$%HB"UG"kJrZ@&$P",h!HS*Fi$e10!X0V*"d`J3BmP!CbX#Cf,K5``ZXJ
-aJef1S*!!YMBfL[#)$ZbDZUD1IRp62$YRfCD83@T!3L%6+@GBqqlNl'Td!fGA,d*
-*$PDPm+"!%md[&kA-Z$K[32m04TFKS*)jF%BQB5Bd$kcb5`GPaF[PB"!AITZZH&E
-Ub$q$cleS2#H$I1K)82ep85b2!3NrFqb0%%PZ"X+)D""a)2)8)NP%(YEGK)!Ac$r
-'))KK0[-(XeEaXa8,ldQpm`I&UGYq$23H#2kQJAmi`c1XZ`CRL!mYXcD)3%AEF"S
-E$MGe01RPKHA*-8(C(+XLjYUEp-aqATSc*SkR[bK3#h@c#aPVS+Ihr[L&Ekl$)-m
-JD#E!3'PRXN)Xl4`6#*,2%2Jc3k89"Hmf@a'm!m@RK-L'VkIhqp%p+lYbHCUQ5bj
-1XD8M!2`Mc"a0'CK40GD9P4ic)dJFZA@$Zi!eTH*5LI`cc2"EAMc@&BXU3aeT@Sf
-P(@0GcSNBLSF["VZf,aDM)YS91%q&U-[bU-K21LUbeU1X,hJ8YSlYqC!!)*Ri'F#
-2!6mpB+0ST2h-f+h0d'@#5GQ!$R2"S$5!DGJQ$9"6PQi!6ADPUBF)fmJ4h3"q$2M
-*C$)hkEZBZ8!J[1*H!Z!)LY6p-qZB!BR"kSMX9P,rlm1("2%0#LcT#!VN"TTk3CP
-k!D54%#4DJ9am("L!D29bm#"%&QE'K59UN9PPV&6!pDc-D'fU%pHGV!Yi3QB"*CS
-T)h1C!%Z+fEQ*PeEdC+CE-Vk)iF"S#U`aCRB!4GM%IJ3aU$28b%J3VqL)KJIBHY3
-NQ)9*D$dTLjahq5)!8FP[#D3"!bqSF21-M4&+RiM'GAaYlLlLr3+XaABN+G`lp6X
--4AIjH-2'T0aX-AJ5`X'3!#cHbB*GLIG1heeH4BKLT(!82pRi-4S[6EV1J@$L,Kp
-[i*G[d`Dd9&30%-+pbL,cA6lMd8QG'NY1'ZXQ,EB%*8be6PVf"j[[mNNH5lBXXiJ
-ZMUYMdXZ*Ki4$SfBF*,CD@)l'&Pe`#FG%KK,)EcIkY4pTpeVA"**K4m$rQMq`c1%
-`q)C#"ZmeXdD0Z0P8(Hj13+X1Z@2'XB!pM-j@G*iA#QbPcQZFRHZF,+BCl'3lS[Y
-kHZFmrIP`&cc&i3J1e$L$+LA!cBL3!2Y'4"r!mTaJFSEaKJJNqcXH[NG[00EeX`#
-!!Ja*0Q2`L5lrQR[dja%),CB4025$,@0GFL1$VY-&9eINc(J6iT@chY1i1pKY`lT
-TM)L1XQ)!bdE4-Fr@9)5QdU0Je(GmBPRdN!"JALbid#VMc,3IQ@P@ANNHbMjAkBU
-3!)&Ze"AG2-R&'Lki2$[RlP,1f%3-FYBQCTHCm8HlF+!"KIPdh3UjN!!lbYQL-I[
-#M*HcRN+"F6-eF&QeIqA5`#rq8qM4e'V,@MBc%qj*bNa#b25c%N#Y`dmMILi#a)B
-8CC!!`pJ5E%29J#5pl%Bl1MQFRb4Q$5PCDcm(r)lcA#5`LN1IQ6S"4qq&iehXc-m
-**QH!daiG%h,bfIYd1Q66K,T6lL#GH1X,XG"P11YecfB(picEj3'ZFN%$9@KBiI%
-T%)d3-jeS-0*eUec+H+`!`Da9bRJb%a8H#V#CF&!r$pNK,"8)[HJ-1ZEjUQmJ%pQ
-U-1EM"fTXM2N%rMIMIaXbbmeJ4iC%Uj%M(BM%j3AAMi'DJ1Lf$i&&fASmh4KfA3@
-MjDVJ5"YqV2KTK@+K%dlXhhhKCN5L8%)akNKNjfbVEKVri[lErbC[N6H)BU31'd`
-jYbGeiF#SP!%4,m%S4%4R02)4SSjjMkkV+PFD'AGGqRqq-B&-#3`L#DiiTEU('J#
-JiCm9c,%)$i,Z+I`NL0#r+ZqE-!5Mmai-)9N1JDi*lXTG2L[rYqS*AGUi!*J`1F@
-664d"2j,c(r[MhE-KkR`j08$XRqX!&iHKm&dlJmcAlM@C[`(@4&KFGZ6j'Ab-VCS
-1lD'f(`S"*UkQN!"CZGqkTEL`6a93%5Dj8JJ3dJCm)-q'SCJPBm9J"5CcCMS!rp'
-a+q)!-R3()PI%H63H`*(AqEM31r`CI&pQed#!AJ''qA8Xj)*CFjfB03LD6QC0D1Y
-4,SUL%&jf,N$(32)SC369,ED!T%9@,)1#8KB&TH1#@DmP##,A1BKmHm#`hHK-%%j
-@*5KHj1#)M'('*8H4&f`m)bUef,(Cmaamq!I%hSaU&''jS5KYBN2!(US6Ia8U-fq
--RG*!jK&h!*(C%`Jd!b@mh"PXIV"Bf1N`#CR3FB9pN9!L+96MXjIiN!$YDD5L,!(
-KZK'I&qNc439EJJZf[cZ(B6CeSp)p!KF*L%-$ik-%JPNRll!m,(N("X224@+4CJ5
-B$Gc+J!qP9hchqjU%YNm'IUl+m+D[F1X0I'J2MA9SqU6NK'XhD`kPNV`S$`LPP2e
-kr#Lc4"+SeL3MUaC'9L4mq&RG)LHcbUkbECDCTahj*HNb'PH%Y'Q+N!!'GJT8YP#
-"Dmk!9I8RYhK6GXSThSaX)L%J#mLc&cqZEl"#I4c$)8JDKXY1FA%"NE!1Pi!J4!+
-3!#`)fG&mcP)3H[U5,!K092NCIQYRaaZUH0&hrl[9l$!lDT8k-Sj"3F2-4hm#1K9
-(1"Tkba[b8L@3!)GEK1&G+E6$*eF+H4fZlh+(@2jSlX!p$Se&3DFj+PIkDiBkTq8
-ITZF*8fk-eGe#ABj0X-Mc(QrK4KH8,k`JI`p0-d#BS8"b(NMmFk(QTP#"C["rrEJ
-A49D4C[b$bZrf`UfTL*80d[LYcb3*PCLQIe!Ch8X+lE0"4a'62NmD(bQFd(JdU&,
-6Q$4qk4H&PNd*Ce9!&*26Epk-qh3k!AaP2iEUPH*@21GNG5M9dH54(5@iS,c4*HQ
-cS(Jc(3U%GTk8p0L5ZX"A[FQdKjQLVA#PL*P5IQFAGU`)k*hUlSPG%*AF8q8T'&S
-TN!"[S%!@#dha3$0PNUB"I$S(rjAF+4iL*[TKG`CFk&(mDm(!d-"pD2QmNpIpb*)
-Ul)dE8"df066*iXN+&*V*f8"B'')*)dM6SCJIb6*e`N'5FY#&IjKZG+!c!rJ3-Q1
-EUFSMXUPVR`iQ-$+!b&3MF49JIdm'GNd(9!p1YX"'Td-3XXEXmZAijVSrIZ'Sji(
-$$r4G9V0clXN#m+(S0[80Yb,Vbq!J3LJiXh1qDSE)0a6G@j+1!N$r0khZ!FH3!-)
-LdBFEG3q%r1*RaTE*MJ0K-,*iNY@RD6F8!F`fj[ZiJNFMR0([rPG0(lXVSR!CSUT
-SC9h)2(leA!X(&VfT!mT5IibVG6C`"N+h1$YRdpb8S55G&jb*#U"p@l,(p-`DfI6
-P#$IE*c3E-9!E"LpYDN"P!$J@2-e94j&jTFUJ%0EBKDNTcUL%,V%,cXSF1,E,RH"
-%-"-C-DJHG&[Kd)),L5heF2l3HH%HC!!ClVNX)#lZS-il))BZ)9E328"'GQB&X3[
-"2-T5a+6,DMd)HbX-"m`G8Up$BaEcKjMBfMhDRRPpKAc)$N*F1l#C-*Jq(B&B[8M
-X4q@p*HLS-3h&%KU`caQ"A[0*kX&Y3S9)%CV4D#d64IMaDIZbHL#-Bm!&2F2jP(c
-R0Af4*$28[q56%a"CJN`+'$h5rUL*'8jJcc&+CA'q$5T&1GP6YSk'54he8Ur5%8i
--b%3QQ4hhT3*1'(bJD2l5F6KIj(aee`4f&$QLJ4AMH&YmFpfBripIS))h$8%"&HB
-f2F#98#'3!+HCHSCEkjf!PmQ!Yh'U"H!GC@6CiR"d++"R4e5)Rh'@cYJj'IKiQDG
-a*cL-)LRUQ)'b9HUiQbSC)D1H&Q$J@1Ek-5VZ)31im3&d5Q2`Bb$6p$!"0KV@!R3
-,0$d5CAqLqfFdML#46$fhc*`i05,$a`P8TllTUdiKkeN8Nq`NjXA#5$"@LDY5r1D
-a$#M%A5dC2GSq5V#qHAh$43bkFJ@@p9[@!XSZU2f8J,$q09ElmB,&K'JE0[(bP-#
-BIEJG&B)#M36#pRj')'!S2(hp"JHXjPJE#+dMSXc9q9l*imP`'L4bJ"&`-YBkZD2
-*6"e4*FbB583cb9@FQ8"0$4C"TefThL`((R4qGRCG9k!9JrC5FMZ2pGU1IAZ8JCZ
-6q`!kPfERE0Ji#Ga-82UBf2N3!(H8!&92J(U6UR"beiLQ*d@JZZ(,NcVE+BP-NSH
-"&@#&bN@-+$E-CH,+J,YK[KY`0hc#J2ZP'ShI8Kb!baa91VXX8)3@UqmVKHJ3#4m
-Sh"m`M4,c$-TC2p$+NY49pAf!5c15[80NACHAGf'TMUH,R6`)-RiYF#**2QP3hjH
-6F,4,'5$RXTUR`LQ&R8`d+@B@&+6UK0&i3#BdL4LHb3,',iG'C8C,,`XQQ(#9"R$
-)9iYTZ!-%e#``B$i'Uk"aU9&@*%,%4JBelChmUU9IZFYRkSR&&a5$PEJ383P((9F
-Z%SB!I0c8!G%e6*[BK-$BM'*),q'JQ4FJhVl24,0EZ,YeMXU13C`G6#MC4a409i5
-VkBVSD@TJmCBckCaeK%"afTCaR-i&HBXYkrKbqX%#"'[IB"F08c%+!5$@D1r4Q31
-4$eSL"VFTJ4HB2M$c#@c(LS,6JDVMel#"bZG((c&`)PKQDYc1HVU&cL5hc2cHk#,
-"c`@bp)$j0Lim&YGIJ#*J*YcT2hhPUR$TLS(8jYGH&6fkD4!#&JCAcM#kXm@R+)2
-%fe-UaPYF1R8#B-+&,E%q8I6E'TYULjCdcb*3YD*"6TC)+bFJ-Z[GPA)f(*QS1'r
-)b0[kjX4,@9a)2m2Bhm&EYNp`6b5'(LG[[XQ-`-0UX0j8lC6U51f8i"AYP1SV8*0
--#FUL"4"$MVKS-Km(5&cT3f22P#"-E441UBDbl8B`K+be(JejD2#aii10+EqXbF0
-$+&-GF[8$&YhAa-$m@!CA69CAP6N(@l@#83RrB%S2@#Z,&`"a!+KEkB+G*J6`30Z
-9`LRP8h,aUTqbp`U'Q9+1`q[GeEV"X1++D+`q(XMmb''G(kCUe2'hrR4lF9#0R(#
-c0CN)lJZZ#L)V!*)iTNZe8mVIZSCAr9[&3QEhSQ&9*V%eL4b16rPD0VEQ0KU-K63
-f,E#Cf6$%D&59T6)j%TU2b$Ej`l--bE10#`Ji9U'+El"M4Q-rh-18,PrQ!1iqJ+[
-#-ZX0`FbU6#PJTh!jqd%,Xj9$"L`119+2bUL(F"#'Dc%k(%2cIkJ4R'QIbQ*)(fA
-*89$12hClPmAK8BIrH,UlbU[XIKG'"JaJi'09[f!A,$m8hDUNIY$*JRH!&9e$8C1
-Xb14Ahh*b[V6,(@Bd'ZVp("LCjCaN&6pFjr5-KTrSBD4eCApP&X6DVJQ1cieFD8b
-`1bP3@DZ0J3RP@&DJQC+&QTlS2-k1TPN6%aD-J`)q-,'ASd#P3pQ9%-5d6q8&$Pd
-!TjLMIrf[@4p"b%CdGXkQ0'60%(9Fc"S49Pc+iFkkb8",e@D5%ipK!Cf(IRi[!fG
-*qUdNS4b),j,*PRc%KQ53!)3kbMi1FJ6l8eQ4eIFHQFVUrALGq1hHkhiYR%DNMYr
-ZPE)H[#Qc53,edQ(Y'BeIfa20@Re6K1dp`K`lIPR8#lMD&#@b1-ZBiLcMaG%@GYC
-#SP`FID)mI(IhD4mY2rkl[6i[9qk!5rh&F$MAPcTGXNplU+3(KM`FYppK4UH8"6B
-+-dcXp8![#RYQVi8J0pqCJC!!Y,@CZK9iJ4%""9krT+eah2[a1PpYVfiq+Lb0kYk
-XYQ[L-0XabX+U88mIpIb"bK*F'I!e",-M(*!!dPB!C5l+%`J!#j!!)5KP!5bPC9,
-3GRjSfmi2,EEc3pYfiYM1$hNlB!+95UG,UR5PU+UbU+3AefM@,EVp'MDf30,+'e-
-ICA8BLjfCk4%Y+B,58N*ke*k8Xp6NS&(fZ#pF%KQ5HL60H(,(AXZQ'R@0,ra-hC!
-!G)JEA@D$@@jHibXiecJN(HCPYp%',2m&PdNV`B'iMPqAGRZ2"6(KMVmUc!8P""G
-l1Hb@4-$UA$hI8')30d,D3iCImfG*5BNB$fAe'YlMci+5!R%dG1U`iA2qV#q"le+
-S"+jb-"Z#KDNP8l&`cNaCV6+B"K+VjbG,`PJm,Lq@@LkHPaFAZaFcAABS"JU&EX6
-eX!6%(9kQA(8ZNMh-ef53!'pdT'!QSLk#6#4-U%LHAPr4fDKRcV(6[YVRG&[[r&(
-FHmI96qSIm%VYpBp[(ibdrrA)AYq'Nj)I%ip&rA01BZ+[3)c51lZ&2qlGr[R[6fh
-b5[&,eTf$dALjR4-iGI#1D9)$1Tb-0Xc*T3j*h64d5-Dp#5RiTBeHU50[eGE"QSl
-b0AGA(I&YfLI&-6dAdmr5G,XZ(p2YFHqlEfaHFCGAmPc@EaZXmj5hh9fjalF4#YP
-HAl5Kb"[Y8$SiG*[3`4(hrMP[9F8'Vq3IHIcH`C6rVr[1qZik0Q',-*DPfil*eVM
-hm*RhkZji9fTiflTLX,%"9krif2I!5DQG0YUZE$5-DNIG)Kch$QTk9p0'9p&'ebJ
-ErGbfd628S99AK!kYFHr5hRp3DD0kfQLEa8E2f$BUkGCKZK6hrXShH`0[P%MZ)C+
-ICC,60[h+p)4Z!kBRiYjp2FpAF!)4dGYPSU1#IpPkaC!!!'dB%BAi%GdZG)c%[6V
-GApkL,DqL,DqK,A1RGL*rqaam8*FDh6*dUBPl2cTqacZmE8U!Z*)!CcJ"LYJ33iH
-bEBeZ,MTSiYllEUk*VM8"cYJ5i&(G9%aq&#5DrFq[rPfj-Qd&%ANcNB2VTdMfAP5
-b39,BPD3Be@e"ap'ipp0rkrZBYVq+YZp-LR@F&)f#%b0KRh1D1ShVGU$6H0clmQ[
-*TpD5(!hBYTh*LiT%TA([SXiR$e!b2-(*m%Xj'H+8B,NdDA(F@f4qhEcqAFPqk6F
-ihPkqNSq2([cl0!@%9bV$,BYl8qI228IN(L*b0a1j2k*NKD1he&k8kr1b%d$Fpp-
-&RaG[mS(-GL+c95(c5L,F5LBFKY`Hppl9j2Kh)Zm660jIbZ59!GE$5B&TZq,H8)m
-eiqr[5L[TLL[P+a**1`K8lFU!1q,H$4rFkb95$K%TQjA0V1-NBbF[D@A45EVNTVM
-[YhrrfY502T!!d%iNY")*2q*NSZhBLml5e!eahe1rqkpl@D%jJB`V#5KA+S6F%[G
-1q9llAC-*5BM$!K9JDRlFZrJl2cM$'b*#VP3)Z8m1(KD%A"Ih(6TR[AmYK'a3!Tf
-mmDPaErFrrE6Mri+3!02LhV+rIVH8%j!!VYKJ5fSR)Cd*8a6h"Qk&eM-KmiC!(#D
-N6"b23Tbi3XDjFGrhk`Ef-"RVl5!1Nr%VFP"r!e2ImXV*V&[b,4FK[9C'HMrp2MB
-"emAriB['DFUkZ2I-2brb8K,[TL4Z8)MhDkRK$lkSRkB"!![rrep%1I"b-GFB0aa
-f(5E#Y8FEA[G&1fJD%Q,ThD0f)XC+*NEjEqkH"A+FN6cr![,5*!5-6plCeX2"Tlk
-9Vre6T8$i[5rD6P-faEhl(rMrZSPBZiPB$ECJX4)App!d%'V4(rBEQ9"mTCTf3kq
-VP`J9MkjmhAPa!2!lrc)h5!4B58Mr0dkNEb-5NM$brllp(PflPDrp8`A4r-&*T+e
-allB2(PP#B,1E`+E"LGjrlp`m3'[,AcA(R#5+aJd(A3ITfTp,+rr&H@d%HIrH[h8
-3mPK*S2mE*ARPDmXNf"$hVYq5rbe#(N`Ncdq26%VBZA([[9rkjYd8h(C6F'Y`&j@
-fa%@Jl*U49mSATf4E15RCC#)"1+GpjG4Y3X`V#G4ri`Cehc(P8L$#iSHL285Q&LE
-6r6C!pje8L)"%kD[6rC'5VSf56Qq*,U,fd`M)Ve1eq,K[eX),2hi!!Hl5'YV!UJR
-SBL@QfQRUpVL[l0@Chb*Nd8!Nfqe'&VkcES,FrXXc8iKN,8bbqff)`THVN!!$5I5
-[pRAA#%fd%CV3@k+*D!-1pG1KZk"kq1[Lrq2[48M`0C6JUpaS`RI'$FV(F[rp35*
-F!a&ZpeS)K`"fDr$Yp*p)1#48@Xfp1bB6cSNHL"`bi4E(IGp9qka-Z,`eK"j@ZG'
-$M4`!kHcNQJmSN!!e%'VBVD!'5i)JS$fImICT#K`Y($MZPj&$R+j[#rK[h&Mq')2
-35"ZZ[a*AQd8Em&YX!#"8GmHGIf"5%-(L#X&1m[9"-)m6V(pjpZmrBP*38[U9T$c
-cTCYI(46qH`C&mSj"BBHJ@6V*35-j)S+V)2)2EII1!HY@fiI-3G&6AVp`Y&aD9H4
-pb[HSd2ECqb#XEUJAPe&r"1+ebJjXc)5pY1UDldl[h4mGZRr+ZZqmDp3c`jFqLU6
-9ZrCH@[@Shc!R&FSmIHld0#m2R0$8L,[hj2S5Th&S`jdRjrKUe+LQ9Hck+1%jIRU
-D6jRJrGfHBpHLRP1i8U-bS9brjD4lJX(PF['86%b*((31SE8B)KMqAI'aI`cfAeT
-9[K*G[G(92rhSp2`D-FHAm&jDPI"Ni8T43r6KDZ&Xq0e(*kpKHM00Khe@C`-M'fj
-+H(JEdBIAfCT`52I*DeR(N!#ekd%@%H*mfLk,6!Ha8q3-V'L4@5YUA'%Ei%2XYA3
-K8M,XMbYC)&3(NRcZ"DS3G01pJ#T"&TrHfHk2Ek[M'UAMcFPAN!$@Z,08ML*TM6[
-EaCr1$"Sq(RF[IeXGP#-G2MGMSiYC+P$(6PQA@TfR4MhPAEZkjjbYm@`kHm3,&`6
-rC6AUap+a1[r'BhZmEd2pZRd[JPXV"cITmEGbJre&Z3I[Rck3!0,B4E!rkYrad4c
-I`IZR$TbGhbULIYG"`d&HH%pC+!pM-#a-Si9)4r6aeh0jJ#pJ`A+!2ddDi(0P3Hl
-qDlPl[+DMc[rlBpV$pX18LBY*(6[h4M[+Z`MT[5[&m4QR$qr!28Qh-jpG8VBFH4N
-Z(ElSKYIAh9jL`4DE0%&DEcP"9im+Um6-B$0e!+*k-%DQeqDT&`i&G+@eH4r0qUq
-r%N12`+ZX%kB65RmcV(Y@U(JY%5'm[LBmH*8*2ej,43GHD5+1PdkdMl!$YGiB5Hb
-(%i(GB@9PceXYVPB+r-PU[mNDf`D'+"Zm5Sf!BB'&,A"Rc&FZ%Ld"fkT9BG(S&V%
-C3kl55&8E&9BIe(hk*Mm8T@G0T"i*k,[B#2*&X2MK`+!C5JQSrC0FC4fUb)Y`R`M
-*3!-Q4TVG,"UK*US6cEbS#KM!8bESf$922!EPlqKF%F*")6TNQ!BI"AX8lV"fGL4
-,LcP-YE1@J)Nm2`-40!bLi3Nd*&hb!S`$`9X198B4JEYNl*cl`%"f8(`36E&ck4*
-ff@NDccT8NSA0,qPH+X(&3EI%lB+8kV+IP"h18l,$H8EIrE1qaUU4*rTQ,@&h8'-
-0MZM5TGe+f'Z&EYD5kfeDA!%"%kq$pmpDXUD+e@R'1*1YHfS6Xd(p"YQeH*'KX$L
-Vqr[dLVLdVLb&L(jANlLS'(-X"j[d90SL`h"Df@!jXr%'2i-LLUX*LINiiRUR&P'
-U0X5-),&QV[K[B@Zq[G2Tj)%"PZ$(iXM"$rM9K'Y"TG#YU5dqC5M+m[@MXReaLD(
-S'iJ1[ST,LX&F0RQ*b"%SqXd2&Q*L2C6k"fL3!"RiH'S35LKFlc1kEK`JXa9%C5E
-ZXX&b9(&1T%i`ST39-Ghl1)%-pHa+#V0Bl5"bHF,3K'h"G9SQ$60jYl*KJHl[bi[
-pV'kZIH-k,E*a1E!bhbKJ)RErL!X`*CP$51ClQH5%!,P+NS#lQ,ll*&MpADai'ra
--RXE+K*H,%LG55Q"-@qaNj,I99[aF*MAm`!XVZETeK"aCh+lVTk&1rC!!'dd4pG@
-!#a1qVLK9aq3Z--%k`P&8GDR[@j'f'#cEiE6&['3S8"GQjrafUNbZS*V*UPNY0lQ
-(LE9#8@0RiS6BGIVbmA4P1T4RS45j-B#B-BGNJMZ)F'l6#$-"hlYQU&r*UJ%fE**
-RmN(*B69jf26!pc,GJkJlPF9a9Zd`b"#c'3$$9BfTHqA6[FlVbX0p68Y1D5Pj@qT
-#2KVZTBd!a15NU4'B3R*[p4e@LF5QIRZ%ZAFqZDijH'N0!S,kDMdEc+JMBUJb-E$
-3BL0qf),iGLG4M@aIr0XQUGMbNdJkCRD6G'QG*8NI5l-Bj+DbZ1f&51S'*6BkmpX
-@HG1LALC+%jXk9Z8ZE'cjYqF)TEB&1QN`6%CeUBA"1%b9@j,'BGZ@DVNYa`3M%aC
-''k4*4KXm-+U"J"l32#1lZ3iC8iTD*SN"V`%ifmB`aER)KRerqaUaQ#f-rX))dVK
-pSqD`P2bJ%fBbcV&LX@Nmml2EjDaqkjkCkNS0)#Me*6*(e)c$K5"@F"@c@%'b*$Z
-!ErFCrBk@PiZBU98$pDA$`dU90S&U6j%ARMTEY%ec6M@1f6[%UTmdIB2Pp+5Mii6
-JTBc$e8*AIQ@J-LJ0!+J2i[VP(!fG4V6qT6c48*PhKBe9kbVITSCVD$M08FrI%6h
-,d3iVSRX`q3H9(r2N"PhP6@T)S'%K4q1h%Ch0dIC2%AdINjXVCr,NeEV+'G5`!!f
-IFM6j2+,&(0@2)PT&PhK6ZF4Ve'"!`cb10Rb%k&b1fUFM@N56TbQ6hl1XFL!jfH5
-UX9R,&3)GDpi#,!JY9caIFc(%,S@hlV98D%C)b%eZ"i)h`)QUYM+9AEQSe&6Eh5H
-Vkef&9DH-@6#%N6,PhKT)qEQ!e#N&T%jha939Zp*AG49ANUSZ[94B1EhU[+Zb5JX
-e9@ePh&"Be3ZecM)HLJ2$bKk6J00[r$Y6CTmFIUfrYZS8&M@m''"c+0-R'%b"Xfa
-8-DDF8&4iNNYb4+h)S+pjbj[bXK(QD)e!eM6kN!"!YZb4Je!&V8QXrJpI!L,S@kH
-MB*c$THjd3,pcMcM0f-%BfVN(,[hqe)R)LFQQ*"4K[h'YbUTQ9P1Y68R&4'`2mb@
-KT(*F&Z@#"H1XI6b-Dp!IadrSNSMZMhSP9HZl!)-2NTV&ND5NRZ+)A9*,11+3!04
-c(,&+kR'1K#8B$%@NYHqR3XVdfVf-U!VRjI&JDj!!Q)q@L(c[&PrS0)XTdGGVa#2
-H'U%pPR1'(FT,2Y+HYCqP,RI+cL3#CRE#1pbAAX@%*9$KLbGUr+&)M6m1"pDpaNE
-YDARB1Q6(0K`,83@m'Xf!H1SBIXl@3*M22mY'0$RVp[VM8R[''6K@6Rr)j3mpe11
-2`lebQI-JJ%+4'`84+Lm3jmJ!rcNiiU'C2V*0(0AcK#X&`PK9a)R49)[11H)'&a0
-341Z-N45@H$Y0%E@C*b2##RlTLVQU+*-VpqXi+RRF+)YG9&1b)A'ldB(*"SL4cm*
-JK!k)r%1q`KZjJIL#bPPlURGqRBSb0L*#kPbUDR9AjDb2P@PF`4rSj8IiJ&+8PE#
-eP9$XVQXKYam(AG(P(N4@IV0T%NabjCr-6#Fc9Rj8hj)(Y$ETPB+"TdJmF'Ek4"-
-m6M&P4-#9iC6PPYQS#JRN1ES@Q8!`H($GA3%YiM6()V&*PiPGb8M*M,[-9-MRS(S
-P9eAM!4*`E4lM3Y3XBL&YhiZlST!!f$2CT0'BA'N`b5iHX6T6BGA8J!-"HbSIdhM
-k*A29HmI6X6`03DLfq&ZSQXNLA[[J)kE+#Q[!#QF4N!!5(Gk6#LZXf6IKS"A5H2V
-a`!+&%#4J#X'19-,Hr4ZTbqllV2akM-dpp5X"&pXT4dHr"J[S1N6Gp(4"L+@TB6N
-M3mIhdPA-R'&jcKFEj5`#98&'*31HJ%68`q@q(D*`C2+5+i"V6ZYq'qK`'Ll[#,!
-61JkJ`P,HJ%2H3&"dQGR&)AA#+Fj$pBk,"P)34r9`%1ZNDh!P%KL0%AVh`'cDUU,
-"f3d9B@3(DqXcr'J(pqE2Q@SV'J,MMYUUE9c-'AaM`S8P)Ldl6La4K1VP%+LjUNp
-KeEEZmkLFUEGpRZ#(466C#*LfaG'&5cG54U644RU(E2kHYmMGA)pBZ0UhQ@UVTJG
-S!$41arEYf6H0c8j%+Lr3-%PX4DYN+C-)M(CkN!$$32TK)R#5$IYX[bdEq&RfLhl
-4260aJMI3l8KTB4iL"$G1')NJ4diX3i!D-K3p'N(eQcN,I3ZpF2(HbrpAl-dr[G1
-(c1B-GK0V+'D6A4!3Y1j2lSj("cJ-lk+l&Gfp#hd4VFD+!e#%m!'6K`068BXKClk
-%kS"9dr#+9Nfp![1I&9Dm)K81UMMSi1eMbkJX%hN!!F6[!Q%i14$CPTe6Ck4Y3La
-PTm[Z%`S*je`j8@&(TXCRX6K9FBlR"lKmdMqqr6D5DbBQPH-R$i!L%+PQ!9#dGfp
-VUUf`@hD@HQ")[PMUJe'qVa"J`E8+9aU!N!$j#DlPSX'8!c"3%"01pBm[q`8qkM'
-N"d0kQMMMG6`ljj(TbK"'$+((%+IB,GIpU!'JGFlD"4!!@mQP2facklF9SfPfQp-
-*)9aNMTr&Xi&b)#Z,!%bb!%6`!!`#q-Ij0HYCRM+KfQ5p1Q#DT`i%HUJb4*`B$(&
-L-+5`B&@bpLhmZ#@&lGE)Mab4Xph)'$6r4kQD'BJRY"#Fjdj%V,)j1MbDSl+LjAB
-GVP@$)28F9qH4'bl9jRZ[Q#YDM-h1TH-qAR!qYU6*Bc&%jqd#)+2aVrd,1h3bD3D
-0E9fa835"'hJXbQ8T%iiI)E"i#N3F!!`h6KK#5DX1Fi9m4-ZUQq%H(pGYVd8(hEB
-4&5)YCkAaS*XI`(e``J8k,4beC!0X-R&K(XcS!MZ(Lp)Ef6N2A3BbpXAm$Sqa4Y2
-AK-!lD`Q+(Me(E*Pb"U4MR*&3b1mjRZiF2Qd(Zb8k$I@Rj)S43e34Xf95!FHZ6H3
-k$aFcVQJDIY'%&RN#3'NZ'@!DNee)Ki)`F9GEN@#"D[PmVZU*+VJ`[X*9j$P6Y#D
-,hCMpD93T*%)6MV)"-XX#L60S6L-86jJV%Xk-BQcL8(SD#NDcGjq&fB'0,0M'U0)
-b3"kX)+ifL#c-,bk9JdJ464HC#IdbLD36"R,-SB'UL4"#T1%+F*-fe(-QmrQT2#b
-b[Th1J4%`3dK'L0*24j9"mIJKUXCDrC+jZ2I+eG$eL[0i'5[10HPG!@UkVer)KJA
-NL1HN%MQQ0&3MmS8L',TUiU,0`aA)2EZ#CPj#%1d-a+pFpEaGFBl"!Jl3$3M1+CM
-RFU%!jNhEUI)RVV4m)kSke"DEjPm0&34UD(V+kCkXJ-CT621"H)Zi+j`Aic+B0(A
-`CYRjGr8"5R#KYY%!H(5C6"!kDQeND*A*X,4(*S0k6LD$UQ8bU0P-"JBCDRa'hV$
-k&i8!Tj9)VY*`$Sm%)e%(6erjRTXBS3fS@'0*M-X9j`"UmkKDXpkC9("RR8#Jhd5
-4PHk`5-5e%!S'lAiLS4bE*a)+alU)&#)d5S'd4EPNjI,CR+9Q8T6Gb',f4KN(J8A
-,6%*fji@CrdpK(+%B&@5QXAZXdc'@6%-dJQ'aN!#c!dj6+L'J%YeF)+m,Z2LML$`
-CD)5cEKe9FANR%%AKme`JQQ`%GT`ED!N0TqQJ$KaqD`I8NIakaaLA&a'd,Z+R%3P
-ehX6QXb4%"b)'*0imr,b'kl1$H`QpQ$PNa6'GLPQb0VVF8H9b@Fl,e9j9fh5Em'V
-4lH!XHShi1L0`cebBSq-(HQAR*0Jic5Dj'NFLM)mGQHQmFDIc,4d`&ML+E@3'kRL
-EXF3V2@NlD[[5GS+9G#mMNUHZSLL-i"1$228q#q)33Tc%rN5Z(K0S`e$Y-+M3l!4
--E1046CGLCU%HE1%)1HC(')@`ZC1EJh!H&l+!rkH`,1$(-X%SMJ4-Q(i85H3L*QN
-0M[Nb+S-LdkL,N!"CJ[fkSr`"Plm"F[k2+!B+-V'eipKD66!b`dM6,mJ)%5bQfR9
-IP0dbXh2XMb,BlFe#%,XVFk*Ce#i*U(J)9G9DBDLb%kLCX`C4b81&hl*!%J*+Z0J
--!D5`f1`UV%LjDSX$3A[4bCLG*S%(J1$kk%Z(+dZF#kJfG"L,#CPpTViU#j2MJLX
-J1Bf+)G'5L'3bJph8Jm)'CJ6!DN&Pr$DZdQaM"hCjd*b8$CK!Q#0$+BE-IQBSe9D
-FGaB+)-B4"KqMDI*J2+8V!VCLJIS2rh1$8F"-iV%R3!%rk*@CA&6PZH2!Q+h+-l,
-Cq0r)2bmGUNJK@2Ib`kf!3&BKfqMi8@A&HFdK+FN4ia"0FAib@k,%iS%`'jd9"YN
-`-*+JHB5I10,eFcqFNEZiDK-A@CeE+"V[4b@+PL)#S#&8#rN3lUFEYIYXdkUdI94
-!ie%MA%!65h"MIHGXm`frTJ2U@6'%`2%QLVPErVrK`5mdB3H!D!HBrSf`S06SA06
-kH,P[@9,Ji@-dc)a'HjrRYr6BVKTHH,#4(JMS[&30A8U2ajZ8%q-H`DG6#L,SZb[
-!,68i9F`X"M5b5r'N!MKPcZ1-4i)GQ-(J,A#b8Q'+T5ZYJ-eISM),SR)4d3%63'N
-&-"daJS3U8j!!,3bN4)!S'%dX06L4h0+YPJKZk@)RLS33N!"Ne,Cd8FcfF+qP[f5
-d&d19U+@r("%@8jZ9c$!J24!D8Ir@Yr49L&C$6Q5eG+(c%,j@8cZC%)m5)eBId-Y
-S(-@pPP"'1dm#QB*)TXDaVS2B,0a[C84pH#+LCY5qb%K-,Z'h(X4Q*L0Y%kiDL01
-eie5Gp"dX[4VJb3YIK%32@e4&i+(MmY#H(!9j`5c1dM*'AN[,eSDmTKeAN!"APJN
-6!pQZUV3KS0!f4PjT3N&H&b9dCq3PEbaYL"GU-p-N4Q",bf3%PTDS2CbQ`43K)c"
-dZF!XiMqA+eH+!"3H[S(#H6+V)L9)c(q5`B!UUUFCl8j'$$kA6@$#h$Z"#92`!Nb
-B!TN*dqKaXf&b&[*'Q8L,GmTA#RfiGQC-cS,m-cqC'C1c8'E'6'D!T!M!RKF6*KI
-3B$Ra6db(L04Xj06-TJAGc*K'*c1Q-H-3YP91CTYc@VK+!a4mZL"!M%h!I(`%JBN
-$&#X$)"TXYTp4M!J9Q2B&f$aXh#RUXY,,"S)!60fd9r+!c#D!iG-EC8+S(c1!SKT
-T+B-6M0K[UKeHDT!!#q@88LJ[X"A+V6IGKA*VVP`SVa@-NGb"Z"L')Bqj,`c!,`C
-f5h"qHP5qSYL+kMc49hU@IP*lH1QR$)B)S-9"-eGpB)E'dNmJTZ9"D9eC%3Q-Fi%
-2mPP[#&5l2B5+!q(aMZGkiCLI[+A2l&[3@lM%#1E9JN1&5q5TMpHld*("Nif$9G3
-%fR$8!)l+aS3D$$q!53H3!%QqRR&S![K9bq!ReFlk'#EjUMRCj16#ihG+h3NChJj
-!33@`d2$%"&dqcb*")b3'LU9@#`F62&+L9@([-81+c3Q+c8L3!"(mA-+R&K(T"+X
-JMcb(5Tm!L5*Qfq"aM8m-YQQk4PMe95A"30YEpeIF3%,2`)CZ$(lQC'V*5Npqk+*
-G2k+5X1QcQ&iZ6`ISlU'KVNGB*8qXAME`aTAqlAl4#%@VAcb"$Mf+1VZfJS*6plr
-cJchKlV"#YhMQ5e%I0lJ#hImZSdiD%L`k9!+MUMhG06HkZ%L,S0*R$&@IZD(l&6C
-($k&UXD+UJENVCY,)&a4EQ&N&K4[-pX8Z)X%rV5dFR-lCj-(0p*Lb-QA`lGe2ZJV
-I'-"2YJ'4`5!QDieC33mk`X4jbc!UG1PPCjl"IkD(U*BUjQq@G9GVZZ#DS'G6995
-j'Bd3l3Z8CEZmCDG)rhJCYMA1C*,S-C%C#0"3,Z3')Ucb4T8e[RLV6&Bd`15k1`R
-dHcN*('aib&Be5-NJ*a@QLF2#Y8,*e))PCl8a!p1)f6VZfHjNRr9lq-'mJBZ+DYe
-MS9L[IF-S+mYC'3j'VN@(iqQacCDX%'3qDb[k%6"Z)1Y3@@(')kZ4P0eI4k!amfD
-kVBMHN!#hL1T+5@6Ip95*$Jb[aiFX"ZS!`f2X+B#c@)M(Nbj-4-6lVhPMc9'$p*!
-!Q!QcDl-"hYGHJr%,RZJD&*p`*'Ui8#!@L[IaQLeQ`J$6l0I39&KJ'K3,Ecf+LK-
-,*94JeLf$m0S@$Hh`$Sb(fD$'Vk@1(Ei"FeJe$N9$cX@"3eL!US89*H,AYq,4FCU
-+Baiq++DcmQ8J!XY8#`IbNY3"Mr(qT+jV,4ZBrErM"RJL'1$*"`[%cE8XAV2B+#p
-99KL3!0b'@d!j2%fUV6!m1#K[r8e%U[eiX2PXfZ,r0X3!S"VUZLC92'X'@f#Hfh`
-A+b8jJ2*3Bq0UeiF&iQ-8j0Abp0@Gh'#2`(Kl0BZ[8,dMLZaRHS#0fAQiQDHl!Nh
-MTj1k(B2r`C@4i6USiV'q!a#U#YGP$aiClH*L4*l+,M6cBC!!i--H)a%V)b+U*cF
-2hmXGRB[C16[(-m'+Xc!KCVXb*Jc)9aeLak!N$a!(UL,#Q-A(NlU`HJp0A'a$D'Z
-8'IQ61TNXJ38DRYNf96p3-4l'$+DN+5+'Bif%$(B$D*!!0F0($bVP%V+$S`eH%1G
-GcJIZGJR,*LjLN!!%1D&,F*q%QCN3-i&2@D#D3KR41ihF%5U5k*%!k)kY'S#-rFF
-TDkTFHKe%,MiJLJ3q4G%,,bB@e)cV!X035Rq[1!X[II%T[&c&*AJp@(`1489@X99
-fLP*)ZePHF,T(8H#"Le4qJCL13kH#AA9+FB!UI10FXI8PZ%89Rf-e[,2"D(VKibB
-lAp(5GpGbL$cCpJ!$0KS&JX@GMRP3SGC@$-"N8j,0[pUBd$#8FMXQId+a-##6!BH
-2dR81&TI`85m9L+R&Ti)0I"`I05B@B#R3q(#IQ#SCL'$XPVLNq(&jLr*9E-5-8k2
-9cB,'d(qcf'kYlCL2P@em&pYp#1jVVcU"Gc"hBN)KD'9JB%S-pcDG3pZ'8iCr+8p
-pb$NdN5k#`&Yd5Cr[lHI#p#(E3G@6$m)!+bfZ'VCGe@4a9D[&95AR%1`+fEU@kmT
-$fSC4KX89`jCA()f)Di@2M[Q"CQlHm*J1&8D8l2iLcZiVQc"CE-*+$RL,"R-Y$2%
-YN9d3+"296`MAiBU)!Ia8idGk')+r-0$V'P!aA)N"5MF048#*#fPj1L0Sr-c%crX
-2Xj%h%ldqaUY"6!@l+@%[e1RH')KP!KL08)I9&PpRG4KABNZl3e*Y+M([6Yp,jMH
-bh5Se6$d2G9TYm3&@TehUhZ)Gb)Z%f0MF&Yp,VMF'D'!Y@,%3c0l)I!N[*!-%0B$
-K0r*"*S"K#3H!Z&PpL%'5!cp%[f)@0`$)286bLr6`G8`RpF8MpX*f8Abmd"rXB*@
-K%(Sm6*p%)$b+[IJ3ZYd`DVlp,YfVZBZ-l14NPP',M&CNe%4%MiM"Kr-q(a@EkC9
-2T,f6Ji5-TRi`im9S5N&'HV"6Me-``L#a8B$+$`NB$a0kf-6!SrkYq0`cK03)5C!
-!J%82EF+V1`YA0"XCkF+!4IF*"83(1BYK(dDfTG8jZ&0dFekB46JBV$X$`,)2lV&
-9U5kch#l8dK$T#,LHBp9PaA1-mR'!ScXb%6%lf9kF34SRpY[c'r#6$hDM!3kHcei
-TV"bU$2(V+fPJ-Ni(ff`61`kj#VZcm,2C9GPGMCpl,9P[!5MKrm*'e'ZqcLqi%SI
-H6S(&Cbm8rXS50RXV'd1TmdJG(h4bpAH!arXlMm(SPIKCDI8f21kRZ@kF2pK3#c)
-3[NK(cXPESBM(80Mp$Y5CC*E9Xrc3rGh[C1l*h%0rqN$1,Q(5$TIf`e$8VRQ8!69
-qQ)[(-C83Zc`3D!fLQPY!V`%,&Bpff'Z%Z0p%CUShc-e-ChHQr[BQ-[[S4aEjRei
-M"kFFIa@cq%`RCC&r#!6jaVXpkX[[`Q!k(Xm08c!`IU%@`AQBcFr-B`HURj8@*ZA
-,'d0e(Q@B!VTi"bjH@iQVHNBr2#C2jZ%,Na'P!fq`FKdkM+*$$ffdYK)!i8PqQ)Y
-,5DCMh!(#AC&ckpKb@ApYpfBd6e-bhCr3TK1dk8jXqTLbk3lDG!HaN!"`L6[HXff
-l3lR@GP-ZNr+@%F2h@!`2GXJra@MihNQ$[jLJG1%lV[,JPHZ)T2)@MR"'Q6*")Qf
-M6"D29YkZa`4`[`c!23I!+i%bEKJJIJU#'9LDKX*RMIL"@F4R-r&6!S-kbmCB!)&
-lfCqAmd36f)f"FB#ISGF-C'1!@l`[9Q1TJ$Ebi`6e%p3lCpd+8[cT!*A2ld#aEbJ
-f@4J*+f8$$mj(c`1"R4mQeb)94e@N$%Aj@'*Q0-$96L3!H)-)K)Kq9XV9c"2lS&!
-S8pK3-DRfM9`8jkA9afX,hmM9P8ed55)(G4K5$PLKi&d2P3%BF,pE(04ajPj-Rq6
-FP-19IF'i+(h`'KX&iJ0Za@RBdJR$PV)4KZ8l4TfXX#42C`CBBKp(q5(`,l!C(("
-c,dbU)C)5Id5cY2r"+A!SFd6h`T`J'fB['ak#!CVe-%N,TXR[@!'UJbD,JF01@AJ
-%`Zr%)-jK)dpIcmjj(Sq*i)S)EN-@Z#JB&Pp*JkQP`Up!*+`F!M$Jd84TCiQaD5H
-R+cY2deC@mL19('jA959K&2Ae!NSF[UE4l1,AME@5@#m6)hDjLIimKH@ER@3&XcV
-f)ED%am'@Z9Q@Eq31cb-`Y`,-6mEmNXHB*1*im[HQK'Z@X(q2(r89KPR1'[c"'p)
-MI5)"0""5K[$r%5mB4YV)*&Kq!!aHqd3#N!$c'KadlKNJjdb2l+aViCcT4h@2+0a
-4NYd2A1RVhXP1Q0hES!TbG0r&b!6Ahci'SM+Sh$-p+ph#JB$%#QI`94kH"@(cRNr
-`Cf#FX(c%'KX"TZ0YcX+6,R!aCH+(ejJbKX['kS3$TMlajhJJ)bdpbCY2`+#X*'S
-HimHFKBQ"ZPfj%"5JPSpK3f%8MV83H&L*U-f+5`Q%`lr$aDf*KfJKKXL3!)diE2j
-GjBj3$dehGdLEaJA6#,(cQrU%l$K"(EN5[,!M!h`Uk!")DqA((GS%kE,EB4PYr*p
-c'@dS)V8@4YUQGaA1HPCKb#59S-qQQrL26E"c)"jE$C2NT8a@ed)jb&@F[f@%@mG
-jADQaa!PZrD[GJ)DJR1c[%aS%efXb`#dll`Bi01ETeU1jR%&dE&#Ba`#QcQ$0bUR
-[&$fid-BB9e"(iBHF9D@!V9pl`+BJ1339@c-(bkqqeYmM,J+&0-X6+XirZ"",'X[
-++%)!a*UlmepL30Z#$hhh#K6U'`qLH'&fXc-*AccY*3K+,jlBj#'$L8PbS4XIrXr
-UDM,BaApbaRMbbF'fX5k0aa*8&51M-&P*ACJ&kZGT-6)kT+YL%*pS-06CbA3YPJc
-b3cApcZbTK8(e0q9!J-5ELjqLi$L!B4UL8cNjMH@Ni*fV')qm-IL[8*8Bl5L4HV5
-k,E&6pUS[(Zc,d'f)$C!!DpmS6Am68lp(8b2bJM,%(p$`#M8i)!cm!HE&V`9$-"A
-Q0qS61"k2)#S5I-%fq9"-(qAT8-rPDFDA$Ni-N!$XAXb%#aEmiZG`4hK%-pj45q4
-S5@5!4&CESjiD9CQJPN'Yb30RjL6F%2RaM@&E"blqZ)[J,NEPXBX+XI,*&$NEF+6
-+1JKLSfc)$K%09p*""%Ti9L#N59fb%q)@I,a2D,U0rY3GHHPkQ*9c3p)2kZTAqZP
-22XP(%UEBp#bZmGN`CrfhX(XBrDNX#MM%HVNj0Rcp%Plr'H4U39[Ck*,m4jPSaKZ
-X0%f5VlCd(3-%1iM+3-8",KJD[$$'$cD!)@dZQ#"FcQCQmmb(H1KI92rU-rjXFY$
-LNe4"BjIYq"JPbq+Qm9VmNj[L$QSDN!#*X23F(AP8RXL%B'5*C(6)c&RAMcAM2rL
-0R%JbQCC'U)YG*Yl5&[kN`q[iBE"!"[Q-)Y1bT)jh[`rh(EjbR#CFN!!(+0XZGbh
-E)9qKE)1mqE*mMBI98*Cr5SR6'*4Xq"G+-N,L6pr3f*bNCE1r6E*4V'ECqIPTXmB
-@")0LJRN`UZBB(A!UHC6r0qe@dAA,(iBD2$,K%D)c,eJmD*-HB!!`M6-#J"VhBk1
-,R9[PLRGeRS'mc!jN)([VHf(f!+BcCbCNShp!PHbJh"EX(HK!bD*pX+J[Rak#d)Y
-(A%eJUj1MF(+#!I"HYm,&,Dc95ki-cQ$+4JV&Qf0c#@ca"mJ`#adUXm9XDSR*2"L
-8rc`A2$4kXDk8rc`BrZ0Ji,kh1"r'VH%J@SE(0m2809GdI#Dpq+(%#@c`2!&$+4P
-6LR,L$"E$DADFd4F!i`I&0IKX9$jAdDH%aa%AL$BT%fKHiLCAJ"YL)9I'JTlUd+L
-(#99mKBH2c5!MJSUBX(360T*0lY9I$(!5hi5,CFKi(LVH69bG#B!%BiG,0c(c5Ef
-#T'hM6fl1c[Q[I$JIJT9*"RUh)AK[a3r-Uk9YiJIPik18Jcb8GTYQRQIJFB(44jp
-1*)Sr&N0)*K&VBaG)F[CDe[h2$VMl`I&'",BTdeB319B%G8h-j[J@)cFH2"MLiPF
-Q&8r!cr019!QRKHIGaTpD"8bi*A(dBSM1GV&VjR2mm)$35Ilc@b)HHXJ$2j!!+Lj
-1XKh6MDKF2b%)S$LJLP%&iRd3f*(94dU8Pl-'qYQTI#BPf4!TBcK"m+MNj3[iMqH
-C@+L3!0&8IrIrJ%"`(GPN+-cjeH3BI)kb%6ph6Kc-4%DD2SA&2`!!-BP"4%05!`"
-B)Jp9$@C'%4!KiqjKrffrPUVdjZqk[VQHj['jVUYkUVCk3I0%GP)h"Zc+!VeZ*V1
-cb*r(e[+3!)lVQlQ&%-)9lHHA(A$+M)K1McJA$K0VN[%mkf3HYa"Hcm*kK("k!b1
-%j9Q(dB#"*YdNlh`c(Z[[hprrph8G),ql*1mP,cm!&AGH*2-J-L)5)I%!%5)'AhP
-G*Q-ar-LqCJ'NQ"c!*L')CV-(JC2-S[20R!1c&,&8JZr0qr1q#52iqmk#M2G`pEC
-DKMbLd51Y3amCHVZK48lF$KFUBV(IrB)9$i+jGMADr*`4l'rh@haI,j*'%1&V@$'
-3!$VG3"D&JAKK))8c#+3,I1N**R'qR0U+J,#d[d@@iSMNQ$KF4Yka2ZGiShr!2`#
-`r@&r($qAeDh0F5L,bQK3@RaM-0(+iVm'I"EQ!l&N"+cJFTK`k@35*Qc#G2I$E""
-9ifAHl#RqDeZ%Lf9SP9)$-MJpFG4(,I%a,MkL'[&(2c,M3"SY[YDM,QA4,b@h!L#
-Z%jG$)#S[5Y8d3Vr[c#R(PeXFh5Q'2B1c&p9G9m3$fZml-mS$RIS$fR6*8CIT%CI
-aF6+LbT-UD*qdb*i0(EjQGF,3E#fb'F&d-d$N%%((G3LakR`CBrj4Qm0[*)ZeU58
-Cp6rXD9CVUILMYU@lYJ%jEKQh`A#VM&"r&`##-#p$%1HMj5%5b%2'aX&Z,k$'M)!
-D@DbS3(m(PYUc23a'$(r+"[qKa90L"&8#+92@`D@PLaQ&*2"5K(&fK("@jrR#mUh
-GNd&1A5$mrLahGlrP#DHa(%U`eCPAHiaN@cY!iqA+)aH94k*B'YKlIc6Bhf@%("E
-!ZZGZKp5GMhkNDJAYqIZ65@@"Ab`iZmY)#PLI$,5'$C6$b%*1DM"$ZkfpXGehK8d
-@#85Y+,,VLqj)JfA"Cq5NfAD#LLNRl@dR#[RK(!F6fFLNa$59Q#E&G(+j#d$#C!#
-AjV$$bU$*'!cfcqq6UVYPj#X)%Ph-b2#+dp1Ke1PBc*FdU,!",Cj!+UX($1R$aXE
-GV*TU[$PThAQLX14G[Y0L,"'`a[#@YY-#k+6ZSVbX!9+bmX8rDe&65br&k[aCP`6
-jk9l@[9$VeTUk@9K)h@MH1)SSE)KZjX8Q8XjV-J`$#MLkHD'CP5J(a36hXrM53F2
-5SiX,ZFVd!K-&a"[%e%V6ZQf`IPD*Na&-cF4d3N`RT9jBkej8#UXUKf,k,+Y2*X0
-G*(Mab-1+i+@m6SANB`(jl+1Kh9r-aU(ZjI!m&m2V&R8E95,U8dG$[-%XNKld`+I
-L!EIjqc9)K*!!`,E0meDDcQfhB01Y,&iBAVH4cjNH,eq'J2'EFcNC&U$JP#CPf`R
-HQ(rH*`Vc)G@Ib8R$Nc45E4dXEM8Ni%)Zq%PF[!q9j1+H00'P@A@'HBT8%J6h$!`
-(B"+JPFd(8%&[QSP@!CBmZY$[FT8b+2+p*a)&A[8R+QCdKXSVA-a+SI+(-9'S(Vd
-U&a19GSmZ[p%#SmIPTUkj!P)E,!4[B#U#BYLN#,N5e@r&%DKq)DpLF5(r5kZq2+h
-LP0EibNkPkS[T%,@H''#Bja9@&#J+L*+KjpS-EAIQ6TqINkC3[6[R!Z-Il@kRi)H
-CSAXC*"b8`+I+@%)+512ZiZr`D(iNfX3"@2Lk9f2QbENd&pm@j1,bRr2B,dAHHpL
-6Z46&6m@P)(jFkV@V+*KR0Nk'5+e!A,'[BG2fM&4lMhe9I9TjYI,B9j8VP&I'XDq
-qkPCHK@KVMcVZT$TiLlj`!`+TIj%aVk%09F1N["J+Xh0K#i2)jQ6TZ+faBlUdS1f
-qEd`"k,*Yl5cFbldEUaTl0eETld,eEk8TQ`mJ0*Mb+r1,%1(`4KBZ+h-#M(-%(Jq
-`@[@-U%9A@@MDC)$)%SXcKDVHj@dAT2VD`9k[Hd9jR6rBkkpZ8PjlMhN0#(EcJ[)
-b41c'SmaBT&IH&)Nq4m&9'*9Q9iZdcc`,!U)F6N)SCh)jb)j`NSi)R`'f!da-%2U
-"M`pKNQ9@1@9EBT!!hK1@lG"UH)N*k,d4e&0iJqi5P-jb&9c'ZqJ!p`&6S@-B8hh
-MNq&*1mMeZl,e9-2A(aFE5$K,V!$K0'(5GQ&k@+`94G'GFc$CCFBmZY'+l,Z5`hm
-E+K(QbL#%"R`PV3SK-625h`&J--SGbV#S5+M3Y"drjUr[389SEb%p2r@hBDX5r0N
-TF9h$56ERf8(#Zl3jZTi$qkA0N3maUIV$!55eB!k4-hmii,26X9BkYY9SGdZmm+'
-6e3"3V6A1piiM`,B[b%K@U$L4CK+Gc'U1GiJ8"5H!(11r2A"EQ0Tra5&HmDSi!(-
-U,GE)`0Ld9T+CMC2*hBAaqG5cJKNkSU3HAQE'Z[,rhNHaXD,Sl[8L"$(-(q0cUN9
-bVV*b)66h8UaD(FF(NcrF$Xe9aYDTLhT4c"Dd&MBBFAKaFQpp+,pGcYR!S&C(mm&
-B+&q1@e8RZQ"PQKKHjb+f'-ZE10cJJVB3X59@+G)UraIr,r)rq#pkc(p"j6m0r`A
-`Rhj3eS)8NL@icl"XK[29`rK$d%+0`SSN@&!BY-D'r!q(&%1ZqBG$"cAN(CcDC82
-q,b`k'ENah+SNkHT51(blR+lJb3pM#p[qi4!HZ$L-BqBLUABTbq@d`C1rM5eB3jC
-B,#1,NmrAYl@(X-$*AD'ZGiU04PS!F@NA)kU,Em15EU2U6%UB#Gm'`Ci!0&GZ0E@
-3!'V4T()E8+fTPVq'TFAU&V5,)69j-FTTJYLk@&e&!#a-L!,DqmD!k)Cb1j[G)cC
-f([%iUA1YT-lPSXlPSmjeQ6UAP"G!lKV"f2mEEa1klIreRcI18rKG9d1TdIrI,j9
-d-bZ2['PDm+Ki*0&G[1+44cMerX,GKYJPP,@dlDQYUL4AN!$*j6#-C230p&K1V)D
-jXa0Kif+CS!)aUA$LDV0m!r'B9#Gi%Q(&MdP8&Mk6&["`%YDdYmL2fB%MHLmN'B+
-`JQa`JT*[K[R&8N6L@$im5BG(eDJM,Pl4NNMaah[Aqj*f!QELH1dP"@kH3rV81TM
-b*6)44M#AZT6kfF0PIrQp*8lU8J@1fISA,XGL-USLmIL&2#BKGi3RFqr+k#)+F-1
-!akZNi`%qI"GK,C,jH-P-cTCcR+,qEPk'`1kC2Jll+SpJbVH#J0"fhQFfiia%3"Q
--[FpN,m[TS$qmaD$a#K5+hBJ6l,%-,T`J2M&Ei5Dl8RK5R*4MYdjm2)$$rq#6d@S
-iX2`"j-aJmJD5CJH"5[*aUScZ"DRE-4PmrMk!'CYalaQ&4IJR*Z)6Ba+ZR4X"rMm
-Faa&F&)!mpf`M*RFU%TEfXGJMA+"YjiSLT-6,1-$#NAr!RrHcpP3Hi48cY15d`Xi
-`fi)rQf'"1#aAj6-K*E41$BHL5iY#8-[hVLH(`I98i+08i0I)H1$S4ae-bVh8h@5
-NP6SI!!J!$HkX[IL2'TG!(ReCHfqqZ0Uf"),H0S1$'3+m'(heFm5JhMIZI4IKq,#
-G`6N!H@&M"Kqd43BbFMKNJJlaCZf1I((%FV"$USBF8MAd%&QLEd5qQ,k4iXL3!%2
-UKKa5Gm`KDr50b"[T'bQ1$MQNGXJKY8-18BIYJk39,r*`[G,i%"D*CfE4`XRQh@Y
-hh!H-Q5($K0[,H`K&h&(m4&8$KUI"3+a$6DIb1Ged@'3f)E+*[HXpeTQPJYc5[[@
-qmpl65l(UB6Yq+[[cLjE8'"X`3ZVhB$SPF#+p#G-SChG2r0Q(2kX"#qlMp"FcNE&
-pB0m1FCJ%X'81kQSIM'Sl6(NIEVErQ*0NF+p%Z&X2pQ%C`ZE9"VTVE-AZ0h[206%
-FD&16U9ZX`(cj-a*`h`Sea`UNPd192FbXpBf$A*8a#HZGiXlHGakIlHi8ZB1@B$-
-V0Z$SD9QjApRk034r4R(HGXlh'LkqST&IpqVGJ3q(+ep8la$8$F#!V84akpe!J4Z
-LU3'P-b5(JrZ@8(3DG3)%eepYjNk!)Qkp5JR6c3dM$`Bl(,Uq*4d'%UPiVJ)!Vj1
-AC@'UllacbZ9AHh'jebG$KG$cpmR8V`pfjiN*lXiC#G$J*T6#IbFi$Kd!4IMCli+
-d!VDeim9*Aj)!V*0[R8DDpM354&h'I'2A`MIi*6VD'"DG3"%diFD,`MVKD-mJ13`
-JE"[IASbmqU8l1$)lR*@[EKSHcX['*@3N#(Thq9I''HChRFr1El2-GF2-p`"X1&'
-BFTh(cB(&#KNE"@bL0KF#cprRMFePXh,$`+bf'"`$40+!bbj-k#rplUcdE69#+2"
-kF8R3e`&fEmTXh,d*K,U%#68"q18-'[-$Z(PaG+0D83KFL4cqNNK))%N(pm4#J$l
-8m3FSjM#$(lM-$Ha!FS+"LXPLb[lZKUi&Qe,!0Gcpi"$&&kLK4eTL,dVTk&U'V8l
-,@(C3C0AEG6L@PIAhmY9P4I+YHp8PSm'ai'8j-eCG4H69,!lDB-69YIK6``'@FIk
-4%XN+IF!lIZ5`0''L,K)3a!f$,QFbd+HEYQl%CAcMBM-[JASIJ1LQ2,-J,SB("Km
-VAhUTZY*Y'Mrmihe`9iE*FC!!Jr![LFlR%N&FV"bJ!-1UV6RT+I!#GN9hrDREp'l
-RC8B)")%A@i@EC&9Uj!&-FBU&`q4KDj0)ID,DCk[h6!DHNC-%SLkrcNB)V'5XHLq
-E0UTC,N**``A!`'SIUbjMBM)9b@X!K,3YRHMm!iScfrMhcXE1ar*JlFIK3JQMpYJ
-*CSVi1#4-ZH2'Fl`j*!6(P8"DK$81)L!M4$Km4%EF4$`Z%ZQi8Vb4#-S0K*rR2-A
-&(q1RU$K*(lZ+Pr0(eFe&APd&9[#R8PEAUBmR2N6T`dMLJdBITK)I`[5K)[%K3Kp
-bB`%e!j0ZU5j4ME'!1mSL9jXaMG!dP@-'l(GL'DVYVbjcG*X`%Pm48VaP"3H)r10
-'B%XRM-lekrY5+XTd"aGq`A6RbC3Y&1l1IpJa'@5QVkeM8U*T!94`fdQ!T2&6$8r
-0XTV059qc%HIdYT1C`adrCPHDl8IHJ"VY)MADI&RUc!EFDm+m%BpFYiNf*'8Y40(
-+bY'6T'hr$ETbZ3M4K9!Kl$)@pT6-DflV#iNe6@`$*,Ca%YY8'M[G5f,V)l(G*E%
-9Np!F*,5l*$5940DV1K,#1T83dd"#3#X6SXNQK&+!8,b+8(S53M%63JN*S6LTQce
-UJ`0lTK$SEpp`#ijphCj@JiV)Zh(,Aajr+GClr*ZQE(VM5$f+BGjTmAIj*P+hf"P
-f@Kcc0rJNj9TMSm2#h4i0G,3V8R4PYC5KFe,H&lJ6#3J0US(CaE#MBm@Yfbp5S"1
-T,VNpS8!ZJ#Lq8Z0kJ#1X!2dd*R,#T4X11A"EBjAcI#F$d0ML@(A0kA1fFjD@kPU
-R*@U*eFCLZ+Pc@N"ZmMUji5fT9P)CmB0erk(!0,N3Nd-B+c8+$Za`JUpM*hM[GQD
-A&-8A4RGMiBk4F--NeKRe-KcPN9SJKh9b@Z!+[A3UFe@"i%D-m`cZ*"j)#8C%GLU
-3!&h&83m!`T)ha@[P%1[",[,bI[dLR[Khm*Q+c[lVXl%U9"r%%+!U&l'G!DfA,Di
-("!!*J2#h"!HQT9C-)XIFjIa)5AL'[mhL5,Pdq"A-!!N,%02N[0J`B#[qD$9k6c8
-9VUV4SSF)CKX%c$L)3P-M0$%T*HM-Y$%mpLA*F@dT"4dAkA@4(Lc&4K6BeS!b9Y2
-K+Ib-b8ba"5a-d565`a[AiY,E6M9mIX6e!!T!DVZJ8Zjb9kBIUmFe&P6R#KZhh0F
-CjS+*p'0f&JNN6ZJ#$"j`YPq-I0,0,LKbQq(bCb*VI0(q#ijED*!!j&c92[dc%IJ
-M`BB2D1lc%-#a46KA26ccYVMiBhd`69l-DQ!%651Zb99'dM1""b$!aeDkf%9rBHC
-YU,`4Q(8a2KESifdm-KTT`BGQqM#,iKRPK*U2652$bkYYh"eL)hIfbiHS3Fp$I3r
-iTF'(C@6TUBCAcr,PBb0XkVajcaL1cFLH8`f,0[(+Hdhf'2q%"j!!DX*2mYGRC8i
-fibFV%Icam6rJQq32q!8H3JI62pZP$cpKHGB2SrG0*$DBF2'2IH[1rXJDN!"YG[3
-EF5H*E+qQQ`QkfCIKQqE[L`ILp2&!J@p+(k'25b9b&6kfd32&p!#Vra%LqpYj5Qa
-Z16hJS`IfL)@4&X%Li)9AX,ad8k#E'Z@K$a9RSa(h6G&)LQl1dJhJrQLBa&SUQ*E
-'pJ8l'CXT)))q'!K5bNiXX[P0c`!BLYA-"U0ipKRaiRcE15C!"S$cf)'f#lLaRfV
-B[edK4M+bcl!c('[B35EHcc"4H[r(&m!@Ii[%Zjb2`jmf((Q0(3d4,Uc&iKjDl)E
-T,m1&Yq2#cX*mY*h""3D1!!lBH4+9RT3!*J63J)I,+4QdKiiZ1p9`Z*6"A[6L,P)
-Ga9ae0*l`XY+k2F[`,iU-(CIf'DiX1`I9C#dJa0IJJ,6$(9G8T+Kk+cHU-ZcS0#[
-J"2&q8mH4*JiJP)SGGHQ508-Z28#'Jc5pCq@9b&@0&aLQY)"b544DBU&`JGjFK-A
-01IQpJGJb1Z#h2Jdh+P)1!"PLbcbpbUBQ5#(B!H+X10,%5FMBDLGA+IlM*UT8r%U
-NT2j`2EE+$mCj%YZ$4qU84kV%4iKE6%a&0CLiP&bhAe`F8eidiKp&edSK16$+AH[
-TY528YC5ZRS*3&lKl2Repj!&ZEJpfpDH[d+GCdG'I[JRfmPQK0TjqEH3"%e485[@
-%LCcq9Qe@@"@UR,r**mMX6P*S59*%-&GX2m4++-dj+bZDeic[ELBhIb5k*SU-CHf
-c`d`b'lYmSk2ajlSDfUHM0pS,J5hh1Cb#!SL$Q!@Hlq3JllXS#0RTq%##('MAdKS
-cQ)UEp!3h@10N!eLR#VI4B*QGbma[lbib9Z$BepZCf&-3NC'Gl,6ZXiTQCm3NXFX
-+8Y6Nk'%4$G(#D3f16+1)NVr1pKrFS`f%del5"U#+8hrr*DNpmSBaAf3diT*rr`B
-1#3qQ0kh@c+#$5*`53"22D%KF+Ha$E*JCGM5XBp8ekcrT'dDhUk+%bq-JAbBl-[h
-d$$p8N!#q`XcmMp!B38E`!f!-2qYN819dSmCGA(+U-eQ3!2jfRh9brYK,9A0LG)*
-*S09kM)0!Z'+-NrbFCRAf)Z&N,rMGVBrBcL!je'rK"2eSF1pI8F%pKH+Z"32D@3M
-X[Xp!4$EHH(V"cNR,aY26+AUS&JmpTFiL"!`HrK)9[YPiqRDTXI&`24FjhbkB4N!
-j@MjhDqpIJ4312TlK`fEC$DP'@8+ITLI!20j#8iFD@U,aC5#dTh`bGJQ6@XqX%GL
-Y#jA"ZVUSK9YrHC*4"A"@lfC$R#6h"RDR0@"jhH,XK8YR(CN%6+jJ-NQ1YY0LN`2
-iU)82S+BepVF!5IkZ2&C&a9@(#UGLAcHi)BK)jeHP-@i%iqIBN4pX(X6[4&&RLJ$
-RC'"X-SZ1-bCcP%k[B4FICJYC@#!!PA!iDhC($ZA[rQ3J-0iprK-81C0ldi%NMA$
-G)RHb5VeC%%'!V@#6*rlM-U$dfS,SYXQ#RJ3q3CIm'KXAXfLLBBI-kHcDUBEGebP
-Y,RdU-lPJ[RZ-HHlBAV2a(*b&Q2bdJZ`!NZkr`"8pFT+f$fJEA6kR'SDpep,BXF!
-%+YIE)R-)fQYl6kUk-eA5m3D$(!MC9r*@I!A96"aT2Yr*abSA6JeHH,DF'$EG@@!
-2QqXB#K-&QEZ-JX5$'8-8*UIQEk%Spp"RTm%165K1DR$-l(*iU85c-jQ&bQpQPCr
-Z'J43dUXA,c8(+,0+"Vkh+-Pf00kja`iJ0bj3)bf#qQ"Nf$JRe!Vjl,b!B1(X&',
-&0BS'm6iR16(C55#l%,,XZKK9P'NKTiZP)8l03%afRc[U@&3K8iK6pECa-f'P%F8
-H0#GPjALIhA"10@cCUC!!pFHj`abjJ)*!)L'69je82'CEGq1Yfd+0rd)GjimrE&+
-ea4rqTKZEV&)+[C8+c8`)2*836M[%MCH1*[&)BiY-6F[U(8-#P$T&M44QlLdb-cb
-DECm*BM*QYRm2B6*3aV#H4Q!(,Sm$P@hQK!J$C-2#F6E5eXj"Uq`Tj%f'm+0`I"1
-TeGmKL9rPadH2q2!S2T6JS5!%9CHGT`YDp"3)1C@@NXS`f9R,hdi0e1&NaZj9&Cr
-kQKI4c&jkMI[qAXmP4A#2U`jf"MZ(VSVL6Tf4T9*e1FrhRPrjU4R(CIjGQ!-E`bH
-hf!3f@(b&a@lPS$ZHR$M)Nc*(CB3UEP'Y-i"PeEL5!,S2)d%$EVJIe[YlI38BS8P
-XKpdGAE633G5!6(4Da8dP1X3jU9iaIQl)Q)%bb9k@C&SVb1"c"UN2N!$p9T!!r9D
-$Qjr"PElB22)A-2Tk)`q'Ni'Y6@U5!XKkr0QNZ!eCS8!DXI8H928pE+f((!JdGaC
-E82(a(e%Sfe$il+VQa-([X`+MlU8djbI&e5-8&aKA(mM2M'k`bX!$jH5d-"EEK$r
-eHY)Il-FrSJP,)iH%k(VfUkEL#$ZDJmX%3)ZDf(X!,lI$4A92V"`1ZVYLCHbQ'b[
-"bjGM0@#(NJSM*L09KYeKDE`e1i$MAmDIrILcLiFmq#@A,KPbk8@q0#UiR8M,bmh
-S6YDaf(XE00q%2`Jc1V!"Rc&C2A2(VhQX'c52I6MJZ#1D,S!pAIEGCA"@NM#P'Xm
-`rc4LZ5F$J$X5Uf%h+U!6Ed&"m'4X'jB+*eTD#YJ6S&[ChR&ZE+Xb8e[H#p!cDal
-m3EL)Pm'BYY2&[-V&A[CB$lDK'3'F,Z03KCZ1mL8J[P`KVMG"Ll1!&`F$ppMlNmY
-*#C86%`bJm[GRpG""-RYG"c@cA#JTGB$-cd6$KM,4)"-U`TP31#UreLm%CYJFV0U
-Fl6HLL9qCEcmfe!SeC#8bBb48N!!"&@3)&45V!N(K-+S5cAYU(#F,pJfhTZ@k$iF
-SS[@k5jAaK'c0X2-+KcRVL95[SHkbU8KdPhC5MZh$l`UR3Ma3,aJP&02laT65A9B
-FT$XXSqiJJpq!8XNUAD*4PF%2UG&0bf9*,0"U"YlC[%ccLV4+a@8%3BQZpP#-p8,
-Pa9B8mR'S0b8"fL-DXK*m8b"SET4!Z9I82MVk%`KdYATh*JM9qJRqV&EpZTS-RP*
-8IKHk!NMCG+RZQK,FGX`V0[(9iN!eS9D$c2*riU%ZiHL#D&Tqc`ECmTGRBbh#lC!
-!#dT4[6r"`k["HVA1(!F4Dp'*'%*J-&")A&`hi-!1TMH2elp3QJ2XJq1FqBJ0k9X
-0$4EfE4KBD)9$8+KaB0Sq#YJ'M34U$lA%eR0LS-%bf&JrGXJ[ICUrhrFcX-P`beR
-*a49Tb(Y#lQK$h[FD*hPJI%&+64fJMf#YBJHHjm6Y!CK"LVI#D5[aq8J,J3+fV%P
-U'bR%-p'X)$T,-2%frc83'bRhRG'BlH*Nmj8J8XeKE[c168he)jd-UHiM"dY85EK
-BEV%mDQ1S&daI(SY#rc%5Dr1&AfQ&@iC0C6Ce'C`!IS*+lH3'Kh$A+eHh1DGkTeD
-f%URjH4UT%8N2*MEK9`*d`$D&R*c)-%6I"MA3"RIp8R89E6q!lFGjFfJqe()QLNl
-2-)60IpaAi+B#(MXqEH*2Ck,%a2ifYNC0dI3K6'8NTDL&M3QP-+1$hP!$M9#F@9)
-,0P),YP-0[qY6h&RA`,%G#T*!l3ZLBh!k8@E9diTkf*LQ(-4&Im%APDq6JYJSe!-
-,"FV"aL'rc)+*c'BY[cQ1#Za5&)5KQh'rjB88KFcmMJmUJEVi3"fPT)ASeRZS-`p
-Pr-S`,)G9"fMiD1SFXT*6SQZ'0Tfh@NPeQ+3k8JVBpeQ!I6i#qciR3ZHIZKR#"$P
-Ui(5QCi$#i`'#qel*"&9R392J2Yk`$[Jj&DE5#[D[hG("i"j#ead("rFL2RD5,BV
-BfMhK*)(8dMi)c[&3-Eb4Mc%!%!0r5'ip!AECC3Kh4bZT&6r"qaG&FPpZBP9ep9h
-jUH+5Pe)!EcX65Jabi54)#+`q'm!NNTcIc$#Kc("6J*Brbm+k[,+`k%qqM"RFIp1
-`F!`,ArQc,Ia+VE*3F6FP'$S0`-JF(-$3")"KYDB$')$#P+CH02M)++Q60Lj##0[
-1$TVM,mP`E!m)`q@-R`I@Z#`jC-i%qc[8-35mafp2C!,p(D2DFef1EJ5[28L'hPF
-5Sp('il20ZB#MLer[r5[peE+1k8q-`1&1GYI1cMFHAj!!`H[Fd4Z26mZJTF!+%iN
-!0*!!Q'#&#68KJcGCRG,J5kHJi-X94B@KBY3i+IYbGFcr")B4bl!DTN0VP50,P!2
-VP!2VF1!1p4!89MNU&GH2B[D),N+U-[Ukk,UkHrPZ#e6VGV#!&NUID&"pB"MQq+(
-J(XY+'Ef$0V["k!"DM`@8*N-i9!3pbND6rRk2M+lP$@*,e+"-f9)9YV5Ah8FE"aD
-H`b3*XV(cQ)dT+MbU%&bSjI$3V89fdGD#Y$8E05B#!dc#U`4TX8'dCY[e3[kLc!A
-h[M0%I+(qMTa@hZhSf[X1a"FkI$m"98"mR&,Reh[Id9me3(b&d"@0)3d#55$!b#'
-#55$!L+h2Em4[KX%qlm#fA)12-LbQ9'Q(8Vaa8BQT#[)B6+%U[+L9UK+PUU`H@XJ
-9`HKT'I2ImE&K*p%(l1SB9hB1eGY`"aZC`8ELMAH`N88K#N%qaD!Q@'$ehf+h(el
-dk2qq+$2q[LR9QQD-TaI#C$LRCm11EL2Hf,f`PhrJ'&$#30c0*+GI'#jA,r'(4)9
-#kHBbT%,#X6##kUa-E28i0pQPVD,)j$ZL1-4@pF@mBEGG321+5pfMkZ0`NQKc"cC
-B`#"S-"YZ`,XGkE8iTmV8#KiJ,"YR-'l1JV!RqL-iP'%5a#5)53!6$C-`*J&-2[i
-4Zj!!S5%&*KXC+-43,H*5j80$0(*BYbSTUK5D#fKJDV5FI@aqf5h2"&3ch,#-94M
-kkCE2ZD+E2J(D-cEaB&#qH)%"2aJXYTedacCB"SGZXUE"5@Jmd$$4`)#4NFqih1E
-hE9IJ'Q!bf&8&jV&Jj0GrKjPPT`X*DRqX8SFri&jh@53C#RjeN4e&j3k#)KQ!21h
-LBEeDPD3aZ3HrfXQ$E,Mh(,%CB6aFldipBJ0T![RDbSrFi`(k8Kd33@"k"4a"Qr@
-%BI9Q2XaRCa8)dd!)Ka3e!&B-Ge@HIMXp$M&8&4c(Aj8A`0LpiSl--9KIkad[5[h
-m)hF@!r)K(2'1pb%KbMG`&X4V)bKH'0dcHF1"C1d&ESL")Ep`f2T4)jA@Z++1#fZ
-PD)JeF88D+5j3$2Ph"`eVeTjUq+0G$0l0"AKBU-2R8'8AX`Nl1`Y,B1q6[XHK*T1
-qVj(5V()q!B)2+0f)$eKqE(&B`+C9Q3cY-#K6q3bR'b(SbAN-3[HHF2r*"XCYKbf
-d94H(i'fGKIbcH&LQ%2lKZ29qKKNmiZBl5(K11(""Jcp"S5&YS3e@463&B+I-*eC
-Lif212!r"KH-GqY'm@Br@MarDYTfU-!(@*L9Jhq6Q[JGT64BVGHJDA6J1KSJCE(B
-c3DS!JE"%K3!N9km53,+[K`NY[4UMbMEMj9VaNU'jF&T$b-&"VKK85MmH0pDEF93
-`!rH85LjZ`maBe*j*[QLVFM55aGAMbQ8[+TI9Ab+a8Ce6AVif5GY*[%4$K'T6H6Q
-$6J9"I+m[Fc8"G&CFFKHlZDYYC2F[%iqe8YSja!*#Gi&S-6KJRG4q`%RT-!'1#9G
-9N5"1VdbLL(ap$p)+TDr[35*&I0!LTS9FbE(%3Uk@NEMPLX4jqkdh#PH9E@-BYBf
-(A!m'#aTT+3D0`fJ5bJaK5QdQf-FeNhmk,kdc!(%if)8)2X2X5pm$[A'%Z@J)Nq2
-&JTNd`8cf`M`HChALCcA*5Qf9mQUPfrPhhX+iXGbAqXf$9eC%MEQViamKJFkT"5Q
-I02U0CFcf)U%,9U[R58ScKihlQAj12I-J3Md[8Z+i8L6Tf4AQdc8Bd"%-U'm'J8L
-Ym4crrf9f$IRdMj8K(cre'eFRT6i!j+GhqAEQE4a@*3Bpj)9[MD2DfNb1@%'`PCY
-,qM"%SC(d#D$j4EAA5!T9`afNUA2U-LIcT2%GGXh`HkIJBT'#'J%,KdpS8L-D%%f
-LFBZlP5HF,#2h5k4Ef+%"BVRHakNaVZKT*-E!H#14VaRRehqH4DG80iHd@j!!#dq
-i&aLIF6h3%er#')VNXrFL(q,2$EGm0KrjmjPh)fYrL@#h#F&5bVZ8a!Y("0`8dH"
-0p@$[r8K22m3GI-[G[JF(%AXCLje*%EClV1$hR'S)Aq*'h8F*rK0Uf2l*hhNcidE
-UB-+2G"Lp*2be*2)6*(!-`'PpL34H*EVJPeFS`TiecZY$0AUh'lhr")&(eT!!`&&
-XArjD3Z"mkp-&rZ8`#E`'S(Q01rphAQr[jmIK+"!qHN0`%@Gcl*f"H`'!d&ii%I5
-`U+TfdZ#LCGcJ@M%-+3pa'1c-Se0Gd98qQUSN6)5A4lk"#X'XV!Bj+*4jHqmGMVa
-(*S0E%+m80T12V$*-RXK$F,@Q&"*prQ$Q@@F[Nefi4+bD6)*N9@*jbq6(iXCGr(-
-EEL#bc@fF5#j)Q"8ZpU0D0L[I+"*[0b-Yk&TJf0)$eIm$Tk4[2a$0#J&6lZJ64JL
-5CNb4%9B*%IbSrZ"'5!T*`',,2A&R2a%cKf&b-j!!MCrcD%82UGP6$D&C%0)8f!!
-(*mpHl64k"B(KKN3mq1IQ*f&drHXrciNUEJ62"UGIU#rY3X`!iD"iSCHGj&%GFD'
-eG+&A-*KX*AGAA!J9MA`$&h)FFb%E1R3r*E9$aNhCJk'%HrQbQ4Hi,)1TNJCT)AF
-i5P#!f$qN3Z8%QQ!!JPPEaFcDi!#MVBNKYTL"#Ud@3pRk3X3Dl4*$d[)2ZU!9)Ud
-M4SVKacTh6MKaC2VGelj[8iF(3hSmF!mEk-B!!a63-j0QQ)F&+e@VX&,A%fa8c9!
-fkNT%6@&SiQk2b@bGSi--3@hXQ0f[6kIc2+JV-8e0B*VQ&+DTC*!!68*('l`T-33
-$eU%`5dd*CURfB-`5&dB4#N2,-'Z%EX$$h2B)*Bl2'jM&9$jVp(QG#-9MG9#4Q`"
-l`(c51Y[192HPXprk&`$dh8c+2'%eKHDA+IUC8%0&R2aU`6!%mUB9!M3"VJPia8*
-(2),A69P0BD1U"YNS02j-dU!+8m6XR#B@VISJ,&Uemcbl%)*4UrBd8i2&-0a[SCS
-L%d+jkk`BZTk6f#rH4T)C-,%4JiCD0R,#B3e$CVGlV+PfC)%I3NSij8RK11%L0qT
-kS"!#&)AG58i9+*aB&@kEZ8ZQ&68$5@$KSkYC$38AD$$ET+HBLK++IGfX+%L2bZ3
-kC9'+d+)8SCq+81-Lp!mm86'R+D`JP%YE8b(23I-ac+!e8@"T$+(Fc`aKkj!!)3X
-i(1+ZM3&T6eCFa4EI36I&YT4!kh6EK8cH0BA"K&2XM1cqS`mF+kqkB`"DSC,Ir-A
-LeA%'[$ZI#EcjZ[l"0d*J&!qeB[*Jd38,GmD-%'mqmGJFP)TrF[l0#r`*3iP(hic
-Kd`m+8UKkHLL1*JX3h8qV'&b$fQ-e&&Z@pfM2K0jm[H%d*S%hEk3GS!fQM(8A2rm
-E''3hM+@Mq21R#9E0j)%Hq)&[BcMAf$TFj-A#94!jGZGC"dDRqMFBTYBL*bZQVe`
-k1r-X(VU)2jIGX[lc'0b@h%JSZA!#DDQ,X3m"ZYbBi3%E2`YRqC93'4H3!,UkM!6
-AFXqFG4i$YTchqJ'&Sd(#qM&q$!b0C@d+L4`dL2[9YFFABZ[Ka0SbIICf8@b0Mb&
-k'KVCJkl1JeQTcX4MCZ+a%$m'T`5k%)BB5KcUf8Q,3@$-#qj("90"fpa'$mqabff
-X&Bp[JcSc8#d3P`K-Bdk1Iq3"Zfb1k1T@$*1VUeZmQK&$#@2"#9,Q)5BRV'!63`A
-c5hIL*4,EcXmN&[A4Ll!J0%FY@kQrrM8lpfPT#ifdKH'M&ND(,%blS#a*@jJkGU%
-m0'4KbTPS%NH[0`ejEDBGHb(Y@2Y4aeiDXY!qH#`2hEjm[I%CIK'P,UKr-M,iN!!
-BI)6*@3%TD2KmcKGK80aX2*@2`-R"jAHdEqLBVYh3-DXCbI6"4hKJD,#'la%cc1"
-"-l'+M3K-mX3#[LZ+QiD#9Z#%m1+9Q$*XX4JqPD$jf'-mJ'aNkfm%d`%@ae3krH,
-9Cc64aAP!F5B8!"e#9f*i["jNS)5'$m&3m-2,)PP",#Df#a*#!r(HP1B)'Mq#'DV
-brR(IR`Sh&Zi-LJ+&bT`SJmU%dJPHHhX)#mSAj1f,Lk+,,M,VY1iNA%iaLC36ZbG
-H0EZca!M1mN&*mff['-EYKBk5Z`6lZHj-Rm+)"Um0(LGAZ9e%@&eJpe,%("Y[$`Q
--MMV`K"K!&1`5+ZcY4m"aHZdBKTA[4e01+#pfKZ@$0,'efKIFfT`)JpB4HdrJL-Y
-VFHGT+aS#PHAN`S2U4fXiX)9SEXcNe4`(*Xa%9ql5+b3[L'+5Vq'Sf!T@R(LBKbH
-'SM66JeCKGQi66@%Ub3@fXQ#U2848dJM)jJrk([5h%lPTpqe0$f,B#)R4l(GLN!"
-iU'Sr$`-[0[69%S)Kj#pjq21*Kjp-IjJCP0*&FQR'j90G)YJXZ(MSprqFrYAX-aA
-5S[ac"!$""%PDHC9GTL*R"IY!JhKc+M8j+L"#r1-'&(C8RIVLNmYb9ih3fk@CF5%
-'AZV4"e`DSr!'KTNbK5(cJ9k6"pR!F"Y64LMGH&1CN3H&%dA1lhpNT1jDVP6D1M*
-jZ)jVlMiH9[ZZaGEKc'F!qlDGH$B[QLM4P2jT%*UD(*E5e%j!0%qYQ0TTfSUTPDB
-'TUddG@*Ud$5$UC1Q18`c0-eLQU2T0Nbc0&h%G"Y0+c"GT'NHd`UD$Q#DTqNiTJ-
-dRF*dR+BZ6+GSfSZTLkCpQ2E5G!61Cpj-J*S,bAr9-S'"MQF(T)NrG[baiNmVrKK
-'B!Kj6T)BIF@r%Q*dINCKj+qc8H!I+lLJUaYGL9CI5JaTa-e%Z,XFQ&bZQdH3!*0
--U3,B"$$PqJXB[eDErN)RkkX[69mKXVi@IpB`@HI3dP1-fcEHN!!lJZ(K[[M0CYi
-%[d,hlY)ArmZhE[rUk-@q@Gj506IiDd2hMS,NVSf&b$8J432L'QMU8H[qH+h+K0B
-hKim'%U(E$VE-(6[i-LMc)%,e$U5iLTajiFVrXCX-P#'50UqMf2Rc[iJc#$kSB'[
-TXDi4JJUU,Ab*kZYS%[F1-aI968Xd$'Ce&eqZQT2"cIpaY[TkE)3ZraUr4KLrJ%2
-VaD&Va`5Vb-2J`fNp35")`5"TVK-+TGKZR*(1AU8"GGeS(!-D,IDamfHPcQ#k,%3
-mTYBl"d0mN!!M#)Z9&CM,#e$U$+&Uf-a))6"9NHA468j[2HQp*e3X&+,#NNFUa(!
-r[UMMP[+CeH4,Jjq4hNJD[3k%4(b*3@Cba@P2R#kB5L0b"d5K1-jb-99I)ZC+9Zp
-P9i+K+H+VeM%aC(0F$"Z#4'lciIXCqpD1`Me@PmC!MSF$DdBUKCf9-830TE21FZ$
-Kk1C('VUQbaUkCYNGZFIS9Re',`r`Xkc$YcLUZBhR,*`DG*XBXQl+#1T&T@bcNNN
-'#ZQ1e#J&G9*FY!$QkpRM8[X#,S1'V0bJ*FN!&)8j28BA&i0"EXrTDBDVj,6+AI2
-5YGRL0!A,3#%FD'%J(c*CA1mA8&X"$!4F*$UQY3dGYm8$ERTJ+#12I`CN8KPLA-X
-TLI,aa"%Q-3Q1V9r#b%([bYR'GMJ!qihJiFlLDfhRp1SU"mA"@Yf6XcVB'#SQmkr
-6e8"SJ6lm1am1JQEA#4T$DM"$&8(jp8bH!hJ+pPbMl*C8LF5AbB'R-3m)(L*Lb($
-QhQ2hC"KrN!#8H3c&"QH3!,!R3fj5E&JQ"RHUi$#0Nc[V0M1XNj'2BH"qQ&U(la3
-YQX#Lj&','0lP4CqN,CV!STiLmj'23%*)$6VU84JEqfmaBa'lH98-')N+"eC4Q2R
-[SVU"aK%Lp@pq,Rhi*$%iU5l)ra`Ub"*GN!$4'``9N!!J5a4"KY)&'Ee%$a`Mb1K
-V*%L!6Y&C)FMS91))Hd+3!*c35ZQ#I,@cf$a@N!$4CK*N5JF4Y3q'#P+lN4"NL3,
-&L*4@68+Bi9H&--fMK'Q('6Bjf35Q#Xrarf4U'3*q8dMFpN!ijN`H2h%5P(d1"Z!
-C(5USrlcdVlpL39@@TJR+$N(K(qULCFem,*E'$l+8c1+VC@P,QfQT4NZYbP,l88Y
-"$QRT"fP,VEa8(U+P2FV5jS-X[8e,h@P,HfKT%beY9CCDMc9),"AER8YEfSUPGfP
-Kk3X[r*pdbFh9D3Y,XE!8F(U,q#G'%XBFeSfj@MGQ0U%Rdidj@NE'A$,8Q-8!*3@
-#kiaJBTK(!HeY93eK$S"dHVCE[Yd1Y[6Vf!)(35(ab0$"4kiZ-ZMhC#G",D2-'Mp
-jA3Q6@X(X4Mh0!)4i!+U`Z3bDM+"e%0`mIjT"Q2cN+3+l@Yf'#&)m,*JJ"4dD(@I
-YSb"'RL3@[j,r-5eC$hMAlcSr&Vr-iGbm%XkG4c2f@p1ebfljAS-MJVEKPXme'Zc
-YKS)2&!9helXX3cT-NE2h"e$`2'3L1bQicZFfU['CHh2YAlM(lS2-E0+4hG2lm9#
-RH'J1`CMM!U8I06&i#QeZ$F+BX-IN&006F33'!ra"$d8)d!R65k5V-*aF"4-*cbK
-h,F-&*f0lJQAA2jRTRr!c*9MjTe)S$%f"EDYd))%('F2,%)A*!!+C1ANUT!K"bMm
-R-8Mj)B!XFXb$!9r2`('&#YYbUU%f3d[Y[2#E!j`-%CHV(FAa$IqmNekRp-rrA%k
-I1d436SXXp1Q9Y%mc1+Ch509kKe4VLN&S,Q)DlN`N"j2L(f)#9#2KE1pIrpmi4+$
-K8hR4GbMP&MELBLJcKQ25i)8J`GE@CMc%Jld##"l$[bV"+6SFZRjdF%!fIV$iTlC
-ca6h2er1!1G&cl,pbbGcbTJA$)NZ62k"j-9`INCB8,NZT3@#Frr%MEVL#MmG!jP&
-,-#CPXFRrh-R"AV19&2FFr4TG8I)rKmI0rQ)a0T+A[mkK2J1K'@8aQLC*VjDf0BK
-I@SmjKSG*6BQZ#fJ!#6*b-c(45!30J!QZQ)!jYb2Ga)dI5`BE!kF2``8!!#-E384
-$8J-!9q)293eQ4!)3)H,Z91r"58kmfLZjQ#[$k#Fj,aH#(%fYie+UJ-DF*cfZB#R
-MZ[%8lNk-r2i@N!"5amfF!5eMhDiD0q0f-PNhQdN6'`aLaY"EkeVMC"a$l@QXieL
-EB4cUd&3003FPS[$hrhl[ppeh`1'Cp0PRRhPq!"eQ2L34%#m3!"!3!""4,j@*[fK
-U`KraSeFSN!$5B481A*FXl*'maYH8V$&P0li@53akdN3GL+E--E2PNq8[P9Pl!Cb
-c)d@IcCmB%HfQ69D%%KXA4a*(HX!#39VJCaFkE"jBfEKVS%`%Tq`3CDrTE`C@0Lf
-QJGZQaXh)P-kiD1Zq2BBLBUrZ*)9pq,3#dkC$#)GD4FIA)a3XkM6PI[BDN!!*)0m
-!`QikdABZ8[6&*"jS[eejIY+Pkm+2-@i+&Ef6CMDEkX4jG(!C6CSpF`b"@a3l3Xp
-QMMehpCddeUP$kD4A1RNLL8JT1[@JNf&JAP[3j2j'%hYkSqcTG[ATh(I51Pi4RD3
--kqehdL+*I@pc%HM#d(ZB-S-VkMhm6-HbaGS2a``&ADIMjd3Nm@#Hp8emBZ+I"HN
-$2e$LSRCF!U+dF6-'pQ$L88aXia2hi'Gh*0'qJclS%RT@qe%h3X(G1F)6@5Tek&c
-*TbDQ9V-VNqTmqrZEQKJka"CdH4TES*Y@aKBid-PTE)&MHJqb"@hL9EDJl9%4p)(
-iCE"iV,(JC,p`a50mXB38V*Y`UU9MqLJqD0JpTJ[ZKaUX0p4Mfb0,6iee!$PH9(N
-qDDJBImaGD62LE@Qdh6)SZbkdcc`ce)`#MB3@F`,mLCQb*bEFBp,41!2PX`@fpIY
-9l-M%VMpJ#,$dYbrXhqGEJLeiQ4K"NKHP*'Idp8AVdU0*bDL,&Lhk9NSdp42R@SM
-15pPTC`rQC'JCmNT,5dNqQaaG*2Cq!3reAV(f5N&Qh8RV-)keap"L(0HZJ!QpK-4
-3!-cTX`lcaABF-KK#&CKPTi%[YQ51D5($'H-CCbM1-D'%iSMpX0NYNB6Bj!DldT5
-B"qaI&1Xb#RlK[)dZA1P)l`CVVi36jCM*6B&fS'*ZcZ!LSM!i!XB9r-U8)rcBF%4
-dDb'JKK&LXY-"8T*6Fl*e@RT@0Mi2T#GRTICTfGSa,IGXhCQ8R"0489-TI1"JPLi
-Rr8`d068V94Q+CZZ5,bTMNUSSk+Z%H@9U'cA#qD"Gd38RRcFl5)@aB5YFYD3FpeJ
-9UQT9,M%X3@@`@&J)m-#0dj&%3EC@+0h#(APer$)#3(Cma)fQZ9H&K435pdV2GAb
-GrLFe+5aUma!)&`F(RN5iI(HPF)"-RJjh"Q8UC8LrS39EFbbY0&)Sb%2(X!i$l3$
-b*%$@&BL*`cT%S*4Rh34e`i#(2cmU(5aQd-De@P2Z,aBU`kDN)`+I@iPKiL0b&UT
-ji2K-J+EFGcl&"+m"DS-3U+S'iU)TGdiT2Jj%LZDXCBSS$YeqKeHMCV$11bG-Z6%
-62QlLLSM5jBrJF*)kSI-Xh[%"X0N'pP5(6FGCe"'2[Y680-p0$j1VH'"jB(&hbiY
-3R,$JM`-CINPP!B8"JY60d&)cUjdLi9@$dhS#b+6'@rR)8Q,lf0YJqd,1pK9!0%Y
-XlqY9f&lUIUfC!T@A9T)l&-k))*Kre-LZNN6)I)S*K6dNN!"P%HY68(CC5%#3!$[
-dippp`GbPKH*#0+0Li8+Z(pFmA-Jpp3ZjYCHZN!!b*"lkKiI0R9C,apFjbp3Y)+!
-j4-q*fHLm1MlDm6iE@)m21YC"BJ%6&r*BUX)Ne&N,+5k,bfG6)(D5d2EeR8e+LQC
-RD%PC+9V@J@3YbkbPRXh@4Id@@F`kNf8q`fFT)T[N8l+,K,HEA$*I+lk@dB@P"kB
-,UN!h08VC598G-U)4!9#($'$*Q*-$()HDZ6&N,JpSNm'!"0#8M1AJl&S0F&DJCL`
-*bUH83HEJ!Q+,AVLjDI"$3`X2qG$L!AlG9QPK&"ZE-mFbZME8EQb1cS1LD4J&890
-Zi,Y1X60aXB-i0R0`ITmH3cLl(T9,3%lM@Kc4Y2%SB#6"6a[p2`'3!!QL3((,M($
-@$h+&JQ'GV0pfKkYSRC2efd+ULRMhDl8%$N'SYBlBL8!"B%SdMS`k&(96KPcZP*C
-F6(DcLIG310rY9M1MEC3rYF1C'@hpeCkk&fLH%NV'3)KQFX6,fqM!`KH8!dfM53@
-@9a4J#G,0JfQVV9hm%N&X6q+QJN`9B()488&RU*Nkk0V""Pi``48E!%T%3Dpd`1k
-K&IHZh59#9,TUf8I8,90)8k3Pchi$@1*ejd8A18XBEbV9qqhaTP)L0A6Yh+5LA[%
-hr"6!iSGmq%TBX(e`,`FEVRD`9kTYGEMQ9R(dI#ILSX,-0a&Z#5N&$&Xf6SdQ(6b
-E(Ud*1Cidk+Mr!EQi2$&#!Z$NC9DPr5CXPEE,cbTYP9p9QJ[LZ!EJ$3Bq*lF-,&q
-fQUUh&dh#5d"`%F,f$T5iC)X,bQ*3L"!Y8,$3f%FRqiL`Mh(fB@!IHTMkM$@9Q1S
-Xb,i[AQ02698EQ+"U"Dbd"XbeQ`i1F(Q)LbL-!XVcXIecY*!!#JDam`amRL)'C#3
-dG4`N%SQ62!bB-aE)MHCQTIj%bmR@"P*6SYNjkFkS$SM#[RT'DfCT69*CUI)l5)8
-`221#d$2Jq@Rid,12+IBa34mG1US8Ijp2a!&9I[85#*YKG+C@)LG%d[&m9fjANMI
-IPA8"fp[P9*!!ckJS+$C0TU"e6JAj1Qd9&02`l&BB%'UkmD6MfrM&fk5,0mNZY[#
-,5c"KN!"GA)+I5TRL'f8ASq0R1qMLr-9#ba,LCR8eK!$+Xl,6I&rq"KLK`MT%f3j
-e'G42rHM3QRZ-!6E,''!MUbi6RbN-%11&41G"0XN13Kd(*3B"!pa!*9G(+XeKCD,
-Xk)qeb`HcdMr3`T!!rMBCV%b,eZ@N*&-Y+*YEp96r@#iR1bGCl*A*'Zr,R-dHJ0q
-RLI3h5#%"Mr8jFC)BD[5BH`c'FmF`F!c&arY3d+DM[ZlRK2CA5c#SiDF2"9ShLV1
-GND8M!PRF"a-UNE5rHqdhGk#3!2%0%H%NSpj8ep4%KNf01b&-([UJd-5G1kaJ5X1
-VdE@pB`Bp&NNmPjNjKSTKplBCPm&%M9YN6,5@-Um462I9f9,Q0B)j'f-bjPcMc$c
-HN5U$VG,&YlGb3Y8S,DG+MF)ldL4#Y4M-di,M-l32K2jVcABa@@ZZL"pLh4*'!E*
-!Y%mF%GiEDVGlGQQLia-JIrC4F(&6dq3Y6#cmbd003TSk1Kf(PKifm)G&d`3l'#N
-cSEejDN`eaI+e$9PZG,eT2pjlaI1PQ9p`I'hiUH!cUardrU(pMcVrFZX#E9(hLiD
-ja[Ie$idq0h9la$VaUdGqIZIh*rrXb(rUqfhrYirY(acSf(ISN`[[QLk&V[Cm*c,
-QrZEij,P[jIdSmmr2rlp6rrIC-r'cPp-cSQEGaCc$(ac-cFj+qZqT+FN(dRjFpj-
-6Ih(d[lhpakklVpBfhl[jrCBrZIA6krrPKrrMfY,TcmriR`rmml6rqS0rrI$[h[[
-rmrr2TrrlihpmlHZ[[,Ai'fm8,AQRH'("V*IrBH2VqGp0r)GYhp[mRcIpCYG(Zrr
-qXErCmGIE(klmhDTI"*DYH'(GccEmlGTr@r2,2Epqr*p+rqAqAl9qEZHrPhhjkDq
-XAllbdBU[E[NX9PliaC+AjMA-RY2B*-P"9KTUX!2C@XB"AX#f#6IXRDfGjMQM8Q$
-9%4S9Gm$30cMS5,5rl4j,%q5SpJPH$%TB%`TVNTK[5G8I&SDT'k&la,BS[UjYYp3
-*EqINc38JPaLV)p`d[KL9dDJBlcQ-Qbk%lTiD-hZid`C#-e(J(KX"8RZ6Sd1KZfE
-(lAFjS)Y4Kem0ZXF3)Vf4$`220&mmHl`@aNqZA2-*dBk(Y"Z6pf"XNRFD$hDiaic
-di*!!l-&pcJFR!L"Tq,AQa@NLG0-XQUDFJ1fVmpN#bKMC,C(`5TLkB6j-HiiiLbX
-0J8ML$`JmVBK,iCD'9ULd$m!MU)3F1E&(4ITfkNiL2NV&0Jm##5H4"5FaR!r'AdX
-,#(NlZRE+*MZ3!&9!d84$PhX-drS`d)GT,f0D*EVEDF!*FVbLjQ!l$9TX"e12"qi
-DBBENX+31&0mPeijj0@9#DJSCe#BGhmJVV)fm`QVi9!CX&K1`DDL-**CINi"03b9
-qhT!!!C[&6Q$$1hSjX%%493hd15*,hehCd2VZ9bafr9984TQb`hNM5bGG2pTd5$`
-c+1j`%f6Ra'"N+8*AC#SM(mB823@&,,*"E"(2'Q`[$U%`SCY"l!h%1)kh+C*iG$T
-p%&Z-*0LKDIK$#J'[[NrCbLl!ie#MCUY'Sq#CAK3cmd$!L)l809p@V@lMkYS@5Db
-rc05e$6mIbkV9(6*eSH0ARZEUiZc`d#Q'S-aqM#f)A9D`"GM01j-Y`)S2"LQ-$RE
-P*PrC@FRD@E9+e"5`%Fe!M$)eHMChEm"MhrJq,IeL02f$P!1j@Qj15ZlCj25,[b8
-k2`R9EXECj,0D6SV'+Qmr5$J3bQXBkIh[B8R[-Mp*ljKIT2Gm!-"+kj!!NBVi2*!
-!6N6iP3XJ)3Z)&1jZiD6f2Z&Jj,-p91XH-a1*YUS'DB4UmqRh6,N0,BcdJh(rPlD
-b6&aR5rSpED4-"!%@NmJZ4RD$N!$JC&HPl2,G#[RhG)H-r![)''52,IRhjHf8Z%!
-KZh(S)!q[Q&km#%YK$bdN)q%6dG3X,5X9T*MZE(*1@P5lI-"XMUCbUSSST3kqMQC
-FbNCf6R+1N!$(EU[-d%YMmYbY3B69FhGIAcfMTd2fkbR6$#d3$-VU&SQi2riT)qj
-lkb2ZZ6N`*qj486MZYk"+#'jdA4lZ2SbK`e$@d+FMF`q6f[4!8DGVc9B"P*d(ca"
-'CS,Z)%&2DZ)LlY&CrRDa##T"(HFK3aJf$h1$[jZd)2GB8P-m1)N&2BF+bq0`5#E
-5mL0fDLa)ikJ6XNXkC*GN)!&5-&'EBG5'VYfc8MM0`i[i0NI8L`F`KBl)3femJkP
-DmGfSjG14q%a8S,hGaiIA6VV-mlS(X!A22k2lfPTkV('$CXN%d@9aQRrR&JY*9)Z
-r&%j8LfIk*kV&lAk*kSlk40Aqb-$b&DBR)kSlBlDLHMbCLG-'@e(GHG4[8Ae-%G@
-Gdm+)DUQYU1l8j+)U&e&X*(MkSMV')@mpX[Vj%&Ejl8jTP3qITVLZ-&8AekjErSN
-Va0("KE9CTpFXefUYa1Tf@hD(i$U3!05)Lkmmb-U2`CQRD3QT'%PR,-i+["k4YA0
-aHa9(8B38$L%5fTS()qE8mi1PDhaD$hI-H'b24N4Er!Lj+(NR"'6LSpf(HFEl)C,
-bM8"iM%`-Iaj@$1ri+BD$ISPK"F5`K"*r'&RJf&KE*`aA1f#f(@V@RGFXX$!&4Be
-!EdQ5$b(H%L*i)%K&X9CHQ1XPJj(l,DqliPh5*cP1Z$J8a4lRA5b[5bEJ*IGGcQ[
--#53DQbdXQEI'Qch0p%6ZG8kQJHb&fIG9FNTj[(*h`L+Sdf*4-j5l%`akLd9V+ff
-"kE[RdQrdEE1DfjS*h1SRHL`,QaFGXPMd#p3T50DQCfi*FJXCTL`@E,&EkmPXFIc
-KdUEZYS9hfql5G,UbHk*6c()Ca'5cqIj$(A54rSb-h4LiqN)a(F0dNBMrf0-3!8C
-Nd#I-(!`-Z($4lp",iEmD$Ud,e0fJ6N,!*SJ#QeI('AAikF`a*&d+m8F53dXN`IT
-#+K1XqPeJMGBK#L8M'jUNJcle)DScRe+GSB,TT33$8Y9N9&88JL$S1[((JD#k$9K
-qLT[k8()N'D[f-&Epml#XHYj29MAl`kS0QUhbCpk4+EpLB2N,JiVbAaMd@rNpe0f
-J6P+92j-A,"J3N@G"Ejk8"9qUU#S,K&042#084Dk@-a%&mhNBAeS8FPF&lcLm8YC
-4PK($'f3CN!$+-Z#2`fD!bmm-Z1jA"Y3j9FFG%@$i&hBC@ZCbGkd@bKacEPp9m&D
-TNk3d`C9fDUaqP98$hKiCm'C+U0E&84fmmf1"&GB&phiXkL3GbpjFeE%@e(ci54a
-0FPZ['`c[YZD%)3I#Q1!CjF3KTNdKkEFH!BYlU)"NS4!pL&0b9HTkRfNq)XCV0pk
-,PZU(0)Xck3pRN@Q-4Iia,)ZmjLH,&2M&)MYNQF%FY,(cf(J"1A,GiE+LJ'9&8Hc
-FhKL%%lT,&q8)Ll#Jf'r4MZ[DaTFUB!m'+if5S2J84r0pZ(Q(*1B!1*`A+5ShmQ5
-a$H6d+QrR!4H2,LP0J#!XP!DPlC8r-Ji&QbmJ10A"hHq%$$,N6(8)C#-5@4D9Yi8
-%N6QkQ8kh(9f04qpc%kBKR8HC&*YpLKNVm30T@ZM8Q('"6$P9Q,U8(r((e%A3NDD
-FM1AJM'A+I4e"KI+E4Zl!,'F',Z8R0VVFBaPHbBbJ2*N0CaZ3!"!Cj2Ba!,#CXU!
-iIl$m)VVemJQAqB5%k+jj!C&&j%6df'9(19,28I,S#&'Be@K$ibkV01KQ,PaDK!`
-Q-Tk!UeFMpflj)6+5`@''Z5QC)KEFN!"-!UAPa``YQEC',6!*SFTI3fEc5r,d!Q)
-&phlk56+YiFr`,HXd[X8U(KNRFi$YP)9D$bS&")h@M0+5Ah0G9Lei@0Ed1*1-%ZY
-,$'PN!P*qLV[RpH4SP`DkKkC6jR$(GrPlQC*C4%*Xi'6QP(05KQE6TDKm'VP`q`A
-[2T-1)@FV8VkHJ4F+#F2!"1!a(Z((IQrT`jVp[UZdKIjIha*SDA8CLA4EMH0ke%H
-)000c`mHV5lGARl$d$3+hFU9E19JNa`V%eV'`%X6[YFb@c$pC@'NZe#lTce3h!YB
-c`)IM"3(fK#r'Ye9X&!Ni'#lh8P'i''CE'Fc!`,H(&mpDR3B'[Teb!i2baG6daiT
-l5"`iZ`!+Zj`R+@aTCEfEe4!1X(bZKB)"bcETlGSK8p)TN!#C&"6d28DAFM$FUhp
-q[$Ec1J"Zi5paQ,M`4@jM5P--`@ilQ3E$f9ma0Dce))P$6'qrheakRIjIIheY5fY
-c#+E"jVDM[QdJL$1kpYcFH22b2*MiG2'$I8`0Dc#(IC!!LMrDZkDN(Q&p%mAe![8
-!5'DKhILQ5cqBC%qiX,bT@3+eG1K&chX%#9#JfENmCl2-XePQfLc2fba2f5bIP5h
-GY4Z[4kr(CmUIjGA25K6I,2Qe'3B05L3bAe)N+C%fdLp-5ABBJmmTipA+pd&J$9[
-Ij"ZIcN2M[$"JZ+Q%hG1Lh*J3EMbB8#EEfJ)m%9-!UiH$!5G6GVfSJ5(R14Q59jb
-E@FAjF0L+Xp,2LR1YAa9R@A95i@Ip9C-+AT98S+)-*R@M+,193&UkGm%MC+iTFjX
-!B*dDLjE*#e5bcEDbcAiel'Dhq,RC4Vmf@k)Bqb'CVLF9lSM3UqRYf2+j3('R''G
-&X0jI#CpG&,mDh9Q0a*2!CU)mE@$jQJ3)KmAFP01"(hYi%S0hjF4HH8C9*)BTGf'
-[T)k&$iC6ad+[IqTBD2"((E1p-M)5&@P&XN*1QLjD-&"Z'&Mq5lG8P,%iD1&ZB8Y
-l[3@D)p4TVYSCRhDTm%,Aa@C,K&EjaUS,,dkLeq*a-Y)#Y4K5i9)IPX*h3lE(MZd
--eA*!0Xc#*G+dSe+P*&2h"&2hYm1UqjLIkJljTHj-HKLUZH8--+)+"d%9LcZh3!'
-XmQh5SF@jHY9mKbiaY(!L)-5R*0idUdXNM9RKV9V&dP9)m(#B6hilFfbr`!+9lCD
-5L38U`X`3-(IEdMLK9ZH0+a8b!NJkrLdNX49XJ@)NM!r3#!D+q1,6%954D2S%VRB
-3Qe[@R9a`ENb(-'IM5PQBmlaL5V!-C2kFDIZ(Q$%"R+%[HVNj()8kcpQD%bbMC$e
-EpimdcT-1fl@G"lr)j,4A)6c5cfD64bS,KUDD1HFJ$feH`!G-`$"f'N(-lja0Y`e
-U3JQ2Rki5S)!YD+U(,kcpqr'Ip!H)p5FAF,@8bY55VkJPm+'0@T!!K,ql69A,4PZ
-e",J"%#9NB@S[P061Vhqma[8)'3H1UGHAF)1)a++2eHYIPPf2cVrBaC4H+#Rp"T%
-dL6R&p5Jp(I(Ej'JeY8ZM6d6aiE2dL9p1KJZb6-8',5Gj!$&C%3K,(JN%9,VQj!)
-fT!rYbq3X6FEFURTl&+I!UP*&[6`SLB34fJ99[4&Eam#U$&)[Udime49k-#Z&YNY
-qd'Sl*p36h2KkCH0)aZP!X(48H+lK)%C"cAXFj-Pa36c1cNT69$(8`d%$ZFTjN@G
-,+CM-lGRAp'pF'HYPbR!V6ScIV9193@k-PC(%JMj9'BGX(4Qrbb4P8%"h'3j#(iT
-#N!$2'4)PjY3"$Akq9-#$N!!`QqGKb+153T4YYq99frC15E4X0MbZE,LbYIU'YiE
-#EEMbSRc$h0@JXX#28h-J5Y+HT3hcS5Hfi5eUCC2`ZEP4qJA1S28BCeCfbKaE-&C
-Cq5&c2KfcCH#(2qDEN!!D5[,)6I0X1AE[jRR9MmXVkca@@DH(VD`cr+bXNrbUV1Z
-8S)qf4+UDDe6$-m16b"T[2UVi@Kk-5Q3%4`ZUp'&L)PDpVjC23,0HEFV!"*RkE1,
-2Zf3A($APcSk6Qd+kV1PC0cXq"Ui6%LC8Z3[4G&h6)4RU3fND!X'j#emK"j%-q3C
-$YQ'"aLHD2!S5UTKJUQKaETYI8qHMX(+E3Jb,632,pdbaT","qNPJkX##X)rYK36
-HaM,kVm0Qp(Br-hU$AaNpcBDmpr*N6caj"SL+!)iqR39c[EC*3DTYF,Ub`6HEpl,
-"qfb$MiEGB)@I'jcYe`CI83p,"UCf-X['"i*mc'RC*KYZJpY"!JbG+2DAm54T%XU
-LSSi!Y8U'XUZSFd#p,%-j9&358$rJE#DK0"9e(5LA$$@SSX#UM@D*i6M+TD+3!)L
-dXBH,Q!m0XjBbph`VFl58d3F8-,qHV%*V05UC60IdU8YkENTGdV'fUNXk[N0GdME
-Ee#A8-5HQ,U'f16Yj-)i)Scf-#*qSedQfKEQ%4d@CfB)U[e9eqAM*jH-KjeM[CH%
-c6[bfV5[5J#5i'PScb"5Aa9(aJ#J@P@)R8[1Z6QT#JjDP#!3GQNY0-D,49AkPm0h
-KLF1fN`'[6mq4E5V5bj&,10+6j'0AY+'Dkh3HiTb,%0`!Z!bS)l,M19'VJ$VR4,Q
-GU*H"5R+L8Kf"ZbTb'T!!ef9)688H"HS9'@T349d'DVF6e88+8TkVARNG8bU[[ir
-,$1GPaXR#E9YjlDE!d&BTFj4U+q8RZCHc$SDam2l1Z3[IbFU)(ZcVddAp-24f"Pi
-j%03iBHP"d+U9XPiE3Z+d89%U$jJ5'iI!eXr+Ua"Q&X!c[6A0p``e59`'!i&5lX,
-fQE[Je'q01rLbc@cAKJ)Z%"5Y'lM4cCcVcUjiISI86EHT!d`"-i4@@`-M4Ji"BDD
-UE,%S9CTAY!RVjKEB*B"@m%`iJ&D`fMq!9Y$Y&d$E9#0TVTm9-LTbab,ZPMZGUDT
-"er#N+pAh,fr0(C!!3Mi`B"l@,*20-+VSP*PM)&!4U0hJNP!JUeVR`S")VPUCkND
-BkRiE9RApIUV1j*IUbRLL),jT9&Pl&#FPrJ5T)9dbEk'%2'MHc[1j&UYJL6F8`k3
-e0BKF#-iZ%5EK6Ya@`(l6SL6F8F%F919dMpB`%MS2#k@ae)aS+K-cfi(6-3cD+Qf
-@'3C0Skc1V-,&4iempZJ"A"bSA$a`mYQlbE(UQlb,V2CdPk%i`KIQQ00K4Z%Fl5(
-K#E`P(#pLQJCA$DPaS!)"l)H%BpNe3KHr*B,T)ae[JE4(Kqk(e'[EYDI3('D,dF8
-[q9GqKI6)6UG,MBHk2+(DA&i0ERa&@(*9JC3ae6R'9'I$-Y9P2jNUfaqQQQ153PU
-rlR@'Y1Tc2IqkYkU!XZSq6h603qFH)LE$1Fi*cBbl@UXLY6Kj8e5qMK%0j%ED)6p
-HZ)A6qDP@kc4j&k[@LmTA9@Rk8N,'&P5SB`IBkDC'R%YBSC''eUMCTCKP&*8hUNd
-%F%+0KU@3!%*K(f[DQaBMlM'fK2P6SCi+RK++RQ&,3PQi-pLV-h'R-`ee)J-G6X(
-M#5h+'0+aPiXkcIPUiJ4Xrj5D-FTa&4@cBciV1h+QcC((C8q9f$`e@12)298FqF*
-H,V)pmLlCNGH6FeYaAI#N'q6JAFm[UC!!M-E+U4(epB3S[+0H(Q1)%QP4f-X1,-4
-L0Y5YZ4HZ!-!r`4+ac@C6k&LVfG6CkY5JESS0+"-l`hEfQ0Iaa!G5iqJaFS1f25B
-l6)Cd'20@0V#kaN%p5'abAYjNKk+'d20%%V0V&8A%C)USN!!TSN+f,GXMHRA8E0T
-XG3XmdE6T!`U&&KkZfGfmSZ0j`pA-@h0$F,RGUZpJr0QMNf5Z*ahK935L+Ta*Zd9
-QM@6fFFAe+LADCXqR`@`!eGYF0i%AAZ4"+,X`DIaj[L$"TJBH0H83"j%@m22Yp+2
-QC)AUB$EPrMSZ0F"3Q'mk5#jVb3&3@'!-CIldI66dBI`T9DANpLjmJbYqMj3KKDm
-4Dj2C-*NAm`lcHBHe6,f[)9(,9VEiJH+8,jc"KRl)c%'8c'LK"1rQ3*`A"HDXYdR
-X,4N3Kf6r6%+MNMAB`#PHm+GXbAFfRb"i8%'lbVDcfCR"fP8T,'!m8bqiCFBQe-3
-&6qV2'CSD)+%KPNQPf&UF-Y,UB&Qi@cC"BLZ(MPb5$MBS-H%9+4aIH(KbHSd*AR2
-!pJRj%9(pR@!9kII$9U3YIPDN-rbU5*0B4CUfPiSdcEq+G&IE`2,(KbR*-SM9[$$
-9kDM5#F44RM2jmNGG94P00ke4%K$`*M!XI-U889$LB#3$2UTF4XBY@GNRI&mZiN6
-P$4P*Q8I,$Djk#-Z3!%*B[[j+'-)bdjD`I(e#)5cTRh4!iMZ@T#"F)Yd,Ce15Rda
-#ADNa30Tf'LAAQ1SSlPFq,1c$cMiml-2"2S,X`mXq1YfeRPTZF,`aMCZm`SbLNXM
-&ElTimqhfiLA8p,)S`!3pA%K)lNT6aiXp3Khbe4KUUc%d9'2)8Q2S4SfKVKT$EbT
-$-,j!mfp4dA3a(Uaj1,MjFI$S6Ja-G&a,me(6`++ND6e-b#DSNrEcrYQ"i[lClk2
-TEldbH+GIB&!mj1UhS($+"lX2DErUY`4)XBF@ZIVYS`VL%b$X!9,d*d"iTK6%"5!
-m!9,m"5!F)`VLA5!F!FU)Gi%)`NaQ!Ui03S&eJ!`'+(-Z!HRPb"+',!(5'k!-)f3
-RhrEkA$4('pr+1mCBaaJkmLhaMP!!bpBe,&ZRR%V5NjSQB*+IechK%5r@G[+"mH)
-H4@hV-*!!Tj(a%6UF3&0hr!Sh$#ST-@N(%T0f5iP$Bp19"+IP+ja*4Q0Na$*-$fS
-haZrK)F06a8H3!%k"VM91i($0qI4--5@D9j+9FM!hRi'jSV"JESQIB#lK&jLlCJZ
-Q[RF+)'LA(f"U9dd`Y6PqZQ"UmmfpJkQ!5`kQ!UkU`G5X0[r!9-'Yd`06N`HcI[a
-N`&4$krmD-0A3qKmhQ'TS26d`e9$fT`&-0C5G(TK#FZJ+8S44BT1*pj2`lm&Bf+H
-G*eLN6`p2fNHI$Z&JRd'H`*!!2Vh#bcil4HHlAi&i+8pmc"MR%FS'DV5"NRVVdB4
-$3i89B)ih(eD%IhF(!dj35-!LZSShQQEK(3*'N!#$V(0JP!`Lf86pN!$a"X#DJmK
-,mq-dj5JPM)Cja+2CdY-`Dc@aj2J%3LRTr(S#""A6F#8bJ$faR9r,(`#JlKUrL3-
-EU&N*p8M"+#Y3mZZ0@THcZ3J'5"pMJ25&X)"dRCq!Y03[3*TIdb4Y@GI!mRp+0V6
-mAQUf,U`a'R@53'LJT-S!#L20CFf@V6D1Fb0b0"6('jZ509a@Z%GUq'hC5Z'a*DD
-PDp"F($YS`EB&5T)5H90a5fcGKl`4258*R%Gh3QNk%QDdlDcTVeTH21308ZfeH&K
-Rfr#AAY"'b)M8bXf9#r3,*$-bGL6@I"9[RT-+3TE`cGF"3KmiQ%aTdMA@'+@XpFN
-ReQK8`AV'9Lq&CDYjrV(9V+kUf5TdHpD$CJFk8PEH*m5X"c2(',-&!#)Ih(GSAmi
-Rha[ifF"(!pmDh$6`YAdI$UB0IRr`pAdE"Zm0CJdQG9`Fr,Z"dAdIGk4dI$a`8V$
-r!*!$+aY"4%05!`"TZa"9#f5C!&PYNqr@ET4DPQB-deZ'[)aDkTcEN!$&')l!fdf
-PeV'9EXK#5&UhYGedep1cke-)Ke9h23b[Mmej$"J1-BD)'03&G8iLdSJh%I%(`aJ
-3BN!%3BKkHh*c2$YLl22prqrEkpZQQd$1ZArh04e@0L32%4!3!"!3!"!3)HlIe5Y
-4M`Gr&088FU5%&GQP)Yq%Lpa5T@cDaeaN%2ice%ZZ'4-CTXf5B#)f+F5%8G(bk(!
-3cX'Ep2@(&'GpE2"1-5'Pc6d+"-3dmh3eF-)FFrHTG,GFmRMUE5NV2*klTV'EraL
-Q3Bi@-QEjKr+N1-I#qKV&Pl*#86kM@krTeXPZh4!0K0Ud'-)ZcL3T6R3$-$`!rSh
-GATCMYhpeqZVdR,*pT@RTp[`MkGUpf9bmV+qI@aqMSq`#%b8b@+0FlCkJf'3ReUf
-#F[T2chZ(i,!GTe5'mq#feZ&@2"MRDBdH9Xam19F`+TU6iP3#3S@YdFb9*q[*a8D
-(DS03hHT'Tk@*%+RUKI9QpK++26X3aiqjhRV-A6X9d4'ME36qmE!E5fRbEU8YVp0
-BeSNI-hjXq2(LTamr2[`d4Ha"1ahejG+-dJU1'X"CCFHQb9dMKRlb0pA01L"*Y!&
-P*c401MMFP8B*(38-[$*#)Xfl$LK1a8P)&HHUKN,0(-"F)9`Vl2BMkDCe'q`KVDB
-R,6FM4eX@b%Q9[Mrd*lZp1+h`5,(@ATSCYMmNMlrkY$fK0%1&led0Y1m0p6aH[#A
-!e-IU,Hk$8jr9T)3YKi5Tjm+0q(-jH($UZ4"8ZGF&aca(G#4kb$heT1KZQ(l0q-(
-T8lX[,TRD(FeFlSXqTbK(MNR+Ph8h%$D94)dA6*GVh*cTH-jd(*L1$ih@@i`B6K$
-GhZRA2!Q'Nm"`%KK'L1%[9[XaA%i-JlG(#0(r"YpR!d1SYm&pF1ecQXTSjYTLQ[E
-FF$6c-ATmJC4-0bf!65iVQlA286A"P,rb+9qDTMb2abd96[NVQe*b+ddT-CZQV-I
-MfBUQP0`U65RN8il6P-1V'&NPC66PcfmC6#Q8TRc$TcaVQJ+b5[396[Q'69Pj0de
-Cf@+D!V*@0P8dCHAGI$2Zi2+'d26P$@iAYR`l,bjCANHJiQSISfR[EX((T`JBeSp
-R+bmZ@41MirTrA,lCm+-DNcXcPpIG%9AUf-1D'$f)Z&(2aTC#G$X*F3YLG898JZi
-kPc4P-`h$-J%#NC9Prf*m(%0!X(im-rlLNV9"1UEracAc$$qU-4NN""Jjp,!fb-K
-C'qb+($jP(Jd$Z!,NE)F6d8b9r%fl[C!!4-[9IU+PEJF%cYjX8c8bG3Q,%`"QK%+
-cS-j2FB%b*3S`b,I,0l0E%[piV"1rl5aAc*fP%+JGdXHRq%HRmFFeXD)IPfmfrSK
-"BqMih`FSe`EPfcAcf+h%*P"dZ69MLV*H'kb!K(R'(`'N+(8prYd1Vk)%X,+U!3a
-#2U*aGQaaE(IA+#1UX`b"0A9Z*5Q1[cL&6QN%iTKh)Bj(h0JJ90',2)MqL,bJDep
-KF9UkeL6lrS$e5J[YQY*LEAkZaVjIPS&eKH9(8ZdjU8G+Fp,afFkk35B##H'4FL@
-b"ZiP93XMj%Jq@c$XBCY3dR*r6RmZSh#X9Z[Uk0I,4lplJpr4Vhq&4bqXN!#D`XI
-Rk*0GM3FcpE4&K1@Lj8U6RaPJC1c`KD+PQIQjTQ292F4@5Xp*e4l*R$b8jHjb1q[
-X8,h6d*ARZUj0eqE3e,(J'GKIV($c,pIe"f-!e)C*YXcLq[6bY2fC4c+H'eXq5"l
-a%+2FM$*YUUBiEIpB-J*#&P)A5SlJqVQSfJ&8E&e+"`+PK6E"ii%DjQh(BSjBj)"
-LM[mT0RAD'bbb5(6GR2X+&TF2%Fir8RK!Fk5dH'`Bl6FaZMBYHqaKXIr99XkZkm&
-B+fIA2!1&aE94VFR@dA"9&@XLBS8fh)SU&Y[bSUdk%R$C(SH0&#X%aF,f9,YBGG@
-U`L'US&KGXbQ9$m'#2,kPIP6aG6b#6C)SY[(-@A!5&1HTPhUf1TcUTGMfpDC9)M6
-Slp`TMSM19$&VYpBjUGV4JSh#@1H,l3X5A*V&RHSE%E,FZ2NP6%D)j8hEHlB*E2Y
-rmSML+fZRfa!'"+2H8B$MAFIC&j3cP[V%qTJ%`(dT(8%P%"IfP,K8YJ3`#284Qi`
-[4DFFk,QZ2j`HcXh*'#XekL%pBXIf'4rEKQ1E*hYXFqF)dR#k2[CQ(0aX1VB!TQB
-FfPE@3T0aD$-rX0Gde%SkDK)lDRY`*(6Kl+M4JIAm`$ce`(AYiA59GL`2c+X0UKr
-5+j!!JML09d1B+0S$iE6dXH()A[aC3r0,$3fII@PKE8CQ@TQfk+)(D0%dc9M9r@+
-$GIj-c-T+8bHcI&H+,CVR$G1rTF1p`l0F9&8V3(H%P"a*F6CXAd*!UU$X[DkJmMB
-TpJH%BKk@%*S(YeZ9fdZhm9bj'dDh[q[S[pPbLjpLEeFqMl2eH$aqLVfk0SSpQDk
-lCrpN&,[+acEMf(2*0@!ppShkQb6&0KhlHT0bffJ5$QhHEU$Dfk(Dr,"3lIJ,fie
-9He0Y9(YLaNUY9EYVMSqIDRHpk0LTGLYh#!$"UNlUb!2$5F18H0Xj6)J2R%Xkaaa
-ekLAcb[QI!,e'Z'HQ"p2`VcU(Z8(-2h9X3+,[cI5"MX9H`&#3!)aNC5Y-m6UB#+h
-X3mB#HZ$"hF["+2)V49-(f*65F9EKB43IJX&MEZe4pK&,fP``GAlP8U6TCf#A-U"
-06U$9@Rc8$Q6hAHCrXUdJZbrle35CS[bKaJ"N[,ViJqa2Y3ECC#T+VGA5!'5R'-L
--!@DJB*XNF$RTS5*`@B(eIk&@DBqA@[f50M4dT!*)6i-`A43DeTN([A3E2`aRm3@
-iMpH,#8%[8Y*dbQP0qF&bTFlc&2pc`SfY1P8l0JbH3P)#*5Y`j`9F#`Q9AR%[Ra$
-M+Ef,()TbeF'pRJRLhR[,PG1H(i548YCHlIR"(YHpDXmE520m!``Q%)1M@cq2`r!
-XE"f0%h[im%R5m%Pmq'8-[icKiib'la%6a!"F4DHVcIF'2&IZcI"Fm6b*G*XR+FR
-CV@M1LKrMaBr#MCc4MrDi$RlXbI$Z&K-1"V#P'q$,A-#d#jjRi!DIJ`pAHkCK1k6
-Dm`bI-Qf6#aX4hX&Rk"m2-F,8P3#9"FcpMHfG98UM'!r!4$`[m$r$!-m`dZCr#G$
-q0m"i2`$eJQF0T@CB93)G@4mhY2YJD-GcB2fhBd5-Tm28Q-@,)(Zm42CiN!"pdC-
-+XZ-jJFY"hR*+`8-+GN@Np8U1H5`20pH#52bp4h(-+4+l+AYFYkU9dpbaFBDrHTQ
-rH(Q25h66mM!NIqRGM9GAHplL!hl-!I)@(rCM$K!!(SU56bDRHXQlHl!C[,86P@R
-G8RC,'`T*`l5"(Xfm2ir3pI2H%"`9NSZk$EFm2CdH&hYT%([%`%e*h#@+fh%!feE
-2'(+E(RJ,!q"N[&md(E6TB))RQk0aYS6'Pd$N5kQ*qYe)i4R&i8Fe05"NpVAP5S2
-RG@ca[6l%RBMBe'SAMf%VM9*TXNf+1b*[8,RfDBTcdmZlUSF6#pDV*(SN3Eh8+RV
-Z@rV+4FqV,Cl6(NIac0+JXaYY&U84,YLq(8XpV8NAS&5YT&3)15YCi3iL2(T!dCR
--Xrk8$Kr5*+'5&KbK(f&-Hi*,eB+I[!5Hm)NYXHdA`3M*kc!3bcUaY4IaRSQkSRT
-52lMS6S4Ff1ULVE-@T(pXe9j&4+Mk+$9H-ZaZcXe),br9j)bPZmk648T!+#GR4I5
-SJD-LbqUSX#)aHCi*L6P!HU89DE6TL+1fmmRcV*0K[&EkGc&*E)%YeN(SCQia)AQ
-[Rd1NkSFUiJjK@kZR1!Ta6"ZP*ETrUN48hV#2K)6L#cD5Q0$B`Tk)LlB%)DM(ki"
-8&(jJ"2Y51R3b`8D1Ql"A2`UKeZNq"&GVNlZ[f-H#'-RG'M-a2)k85)JqK0k(Q11
-ec1YfNIK6@3HG$TXjZe2L6YT+Z"-9cA4V0YhD"V&B"+EpVVf+Na@#!E$X"UCieF&
-9C80F6KSa!U2A%%M"#S"8Bq(!0VZl99lhD)BaN!$[Ye@MF%LraSQA%3l%8ql4iM0
-q3$5HX)B%Zp+2LK1MRkpG+Y(4H4K&-JihiXAC9$2[BXk)"a#)r9%a[cRXD$Nmj,#
-#1"AXKej3kTeLBLFAmmk0pFTN8$*Sa,B+D*&CjDqT9L*2%iZN1*1B,M8)A+U1SV%
-,@bE*k4pmSr[kJdI4d@r@j-(aVJ`p44fjBY2d5cFNA*a)r,EKC6kf$@j4kG$CE#C
-a`%331[m&[20I`%@4ac5m$S`V2C33mT&9$6"mSk3)Ni`U5b-BE+4%[RXcP1pij[1
-T'c")MjqVm20hr+b5EZC$$"%4'b5fYT31G*2[iHFQhVRI40f"T!JN5-dSI)'M0Ei
-1dfLqjqqd[8%Tc%A%+!G!ie1-r-EX3EJ0XGbAJhFLlF"#)T`'hqcM*0l&MCa(SD6
-i3qQT)(i"42jG)6)9CT(4%#aAE*dlrpCEq5,50+J,@&5I9cqA$J6LCq(Q,Rk3!%5
-rBrbA$ij9Vj11J1lJ%XL2PilKFa4,JT3R1[aEDpM$MFD2B%MH"4)Ej9IIRFE61Di
-(%BXk2UNf$pjCrkP-rU90r'8R%BMdAeH)A"#r`a!U41BhL"d0+H(Eb6A"#dpLJ!k
-(FP4c%2BA!@"r"34@KbM0EcBChM!RE8L(JQ(kYpi9lfQqp"p1B2rF@LAqeG#pA[8
-k!9mUhf++T#'eU4j13"L(UTMN+((Q`f(!YjCb%mD4m`!Z[cakk4fP"eCB8V5`)Dj
-,4CbkYD)$9HfiA09SBieAY$DQD*D0*YG01lNNk4'SehRSC3Q[D1KSj($%6QP-(r&
-UpP'5T+U@0M"dHMC,VL8RN!"d!6mhK&X`l)+Q%S$Ic!hACf&mE[D8!23Pq2KX1)C
-L`8Mk6l83kd3R@0r!MH@'A56!h'm[pGb!aiF`GCL+(+1)kE"L3q9jfr-HNIRl$-p
-l(Jq[DZq"M"L[V"-Sm2'VjPG*e6c*50aAHkj#94p!+X#3!,c*b)qfJ4pYJhbdS4)
-XprmpXcMVF@!5PSVj2S#I(1PQPL3'aNR,HRN&HJNr2q2%rDaL-6$d'CM2mMc!JDF
-h!PiIIUlM`1[M`00ci%d#m25Hm3$HH(bF*!([1L2JA@F![1XNi,NNi,Qimir!pS!
-%YJFJAYEK#-GPp9qmM`[!U`*aaAZYJ!NUT*)!bYQ++RlMbGXYIY8q+f%Jh2JPG91
-aM#qjH&V'+r%bL+D0*Y%dalU!$JX8G,h!k5ERlARq5mKL6EH6"0["(ClIF43YNJT
-"c1&#M4HmmIbZhLBKD*%IJ[lV&!Qi6d&QcGHbB009+0LHjF93fG*6%%$H&BKM"i*
-3ZX64YmS)IFrMCb0(hr-FIDXiqXB!IDZ3!%*0DFG)cTA3Yp%)I4X0d,G43YpK#Af
-(6HLl5d,IACKf`P"iH8iB#DppZ@-RZE,PP$&QF*2)B"[f8&bqlE'5a!8+jARIG66
-jEei`99%j5DJCE@YG+V+a9P[cr`QC(2@5@B1GEL3TGj%8a`(C4!&2VG2aRV#+##b
-cQ3@C&0EGaK-%*FHHMYrSN!$9613!DA,!DI$"E2#"`LiNT#TQ8fKb$`Y0T!&bH(+
-23AJbhdS@XB6L9abLE2BIq(Z%+FCT2+kHLX,4LF0I#NIrC0qlBq5Lm[p%U$NaGm0
-BK*UZikC3mjeA0G4m[iUKCLf53ViRSHD)FDJTT63pAU(Q5+e$c9GKbqGa#$9rCa"
-UMKL(QK)3M5GX+K*U9MXD%'TZp`XeGA+SkErPpkEVHaTiMVbL`229hLkEiKGiMR#
-$H*2'6#Ne--e1fM)m(S5FCk3EXiJA%$e8$*f&P'%BaZqVUY'&E')ICH&%KKJh)Uq
-M3)icG%U6,R%MC6dQVIFc8(XP*CPL%)Ef3V#fA3[9mYc!Tfl"S09'BHLA2!4&J9R
-*`0RL&m$p&6rrj)E#2`d-8#6BXi-fMS-*qSr*"+)53"VhX#-d[L#&SJ@'S5JRFh%
-&SHJ0k")@aeFp&&dmd9$dHKcKZ(58-ii-I`1)#1C'@qrM()c@&3P''lS)4Xp@5',
-Ai@L"`B4DKU166r@5`p(Y4F24'*('`Xf[B9EaMASHN!!fM0+$U4*3i`&9$dXR5ip
-"@$SLKD@5fMNE6)'T0ei+6"YdRS9iGCCA2`K![l"d2Dpikj0-LQYCbXhc6E*jAL6
-Pi3*h'E%`G6X3JSe+)$8,a[SQcaUS6``,C2'L[j6m3%@-&KLCl!Yi@VR9E-IVAQc
-f[+fAYRZ-JPB8IIV)m`iGiD%-ccZHKGJiH3F%T[#+r35@H-*2*-b[-'5G,i@X%Eq
-3!(8,2rB@kl'(@P'Y2r(FajP2-`TDCdP"+phF*`Q0DAj"d@r`Xi),M49&K%Dla(i
--AYmAG5&4FKB(lqSZ`GZ(Rh95)%[JAFh"1`AJAHejA3,[&#VFD3,[1L2`VLX#hR9
-qi$8)DaqLB*S!1`Z#DP%&3Hem",A4#S*DAm8LT2(CbB5e"3CKV9A-946@GV9%B+`
-#fm@e$Qc21+Ul%*-I'BHfALp(kf+Mm,D1SrM,,P(m2(9I8V",+2k5SrKPS2K,cjX
-5LPr'cjXQ&2FDSELh#)Tlr9"X%2S#aBXp#kqP2bF-K@3Y`Yk*TX-EKEdM21aPhAL
-0+I"e0KL%[GX9%T%8pT,SE+K0f$Za8-3Sl(hJHa,f2V"K)Q([b#X*HhQBa-,HGak
-hX2IpUSHp%pf%03jl&m+S@#JIjGTLcViK&m820%F+Y6Pb%EM#R1I#@Z*KYp1(#X-
-[2eEA2mX+&aLb!P'`9`ZcFa#')kQRDij&@0kbG@)XpdqFT8X1EY!dS`eT&mI##dY
-F+*9p'F,Z(NT#S"3&+YL[A[*K2M8qb"-8PR&heaceN[Yr'ID%A'kICM'UqXXKPd'
-5`Kb@T-"Z+8%"dhK$'MfB+TUp0fU3!!,ai45q!"DXiBA22NqY6d5kJXZ8VZ#$N!$
-aXZ*d9&JqL%)i5!bCM53'Pbi"k5)ZeHQ`46rDD6Qqqk4VQeT"FfVE"+KSTH,N4Pi
-"Eqj$CY#f$HV+Nfh3m"i2VDMaU3[ee%62KASH%T9Y4f,-+*UdK*!!IRIkr6[h+56
-%)-aMeHr@ImS+!KQRMN""el'd%BME"ph6Tij6YB6`4ih#IMSc'DV@)d5LR2aHASL
-U")dIC%93,"!(`*r1Je-Rd5(3b"%+i%dG,lU4U-m,`0UAF4-$4pY&4kZ4MMD01RI
-6dISJ5QeL1hrejX(-U423$81SHelRM5iJp)$`IE1V*'Cqa!J)@X0-S3S1ZBSG8KF
-,pTR%F+&aHG3rrF'8bi"5Q9elQk6[Tim8NblQT+9b&p6AaB@bM[Ur-a9YCFeZm5E
-B3N'[cR)l&BC,C%@c&JXP!p4YPh8'3d'%`MGpJ+4V)&G-E1Y$J'YKiA8C,k)Z0j[
-PLN0E"+8[D&qe!jK)4A)BUUPlqXSX65`dIH@H3jNVpkc-#KjFQ58H#`BL1d9,&N3
-mNZ)Y-iF4Z*XMB6-DUU%QC+e&ML1Xb,&A[H5ICb+m5e![QGN8'4D2eAL$&h8A$GR
-AJ(ePSTLBp92&U6eER4Kk'Xb8qNqPiVjkhK(RX3AIePHEN5MeX5k!SX("K#F8TmB
-TMML'1VB%SlUG+2lEcJS+5k)B4H%qMm1f%4Uk&FpaSSq*!5TL&rNA%1ifUF0HZlf
-fSP)'*J4iH4T+HD@Le'i4-"BB(E3!B#bB#"LcLS$4"MF8Gq'0G+*j%5X)r9J$K!A
-rab"m[bJ)UpK&9!a*3e#Z-MV`+S"beGL$FZF0IU$dB`e3V[UI$-VpB`R+fKFMRjP
-N,8DqmZJV,dBqmaI@BZ3VXkY3M$b,'PqQ*K"3Q2SCc9(CJ6hieX8P+kI*VQdb)S0
-ZhJNB1,#a$%mMc"K$)T5@kF,TEH63jX@aRe&M!91c"BA&4p**YYVp3#dAQQ`P`"T
-hN[kUPU*(8HqB62Vl363Ge-T5YfIQb`C)%%)qQMNcAjTbKVS+iq-9)EY6,[$jljP
-($QMYA9-S0ce+95JS05B(NkNrdP0bS8ah5hXplk,h*SRZMJmkcI0HShp,ApXi2'[
-hpedq*IlFf[@IafNAm#4*YR'a[5`0fGYf3`RC3d8jk(rQe(bSJEhKTBScMk3I-#+
-&0I$3MN1fV0a3'$QXq%!B5,%a8Xj5F'M4plP4l%56"a)qdFlL982D1!%"kB9(-LU
-QSS[P'A&M4i5U+"(r+K14NCC6HbTi%lCIam(*G5DBTTaDqdPCF&rlGUIY@+1LG6C
-B(,cBHbq+ZbmV[Ml,V$4m[ml&5EK"h"NIaaZXcA9eJS5FY0a`'"@m!Pb`PDUkd0+
-*,B6SF(),3Ec"BDG,8lbGD5K8Y,iXj[9&ADIe2eQ[A551k-J0G`FBl5mYdfC8U$Q
-&p2pqa9pGDF1#e"@'8$q3!(9flISbhqf@@ml!qFq%D4e#,2hDpB%il@`M"Gf&T6+
-1T+CD!pSL5PSB+14SZ&f"Nl(*eY1SP2A,`*K6h0"J9QM,J)T9`m`dKa'S+@K'[X+
-"&RRJFIdaaDG81#M2H&#6FNEajRf,@h,$YMZMZk0rUFC@&M9ecaEb*Y+V5N@2CMc
-$3p*(Tca&hih2cXQ3!#5D52qX`J&HSk-e6)D4B$63)C&a5CP5a5Q#dF#crJ0j8m`
-ZD@J-6&eX-'rQ'6G[-QQQHDi#"*+53-QFC&Cf$Yq4TV63`qb6r-'XQ0q&)U+`ej1
-+'3f[,jPC4X(qi$CdecZJ'UH0`fb*Db%93HZL`ZCrA@c3F-4T@L`b$0HZ6@@$'id
-C&bmM))ZTmTLTfe@$#rk0r*K@cjDF1DJiU+3q9&,GfIESD23$+F(+3pA8De%[q@-
-aYMdEN!$'hYM[#P%eA5$Zj!k%b3Q$3Y*jUPe9AHD4L5e6N5M`@qE6"LbK`e*e%!U
-4$VKSrEX9I'l!jdSbQb+0cbZVGjFjRfq-*!DR+Q*NUP+CUVMhJ&0hcG"A!f(c'PF
-K8[hMQcY$SC2Yde$BiR&i#1aqGN!laY&Lr$'dqpNpfUAH2"aq(Jjr03kIPQ[#Rk%
-TeV-h9-T%5iMq3Vk%*"(cU4IJL%"P'h"`%3G[kM6MYK+hZKVc[#[dEqQ9'iCR$93
-R'S#MUA1UST2!-FB%$N8j*bD%QXN4+Ri9hi&Qd"lh4`kJF`k[rfF1SMN%)M1"k$5
-C"4Q6Ka$T5)L,qJ!JYGqiFP%5Ja6LM%%P1iT!d4f)BeARamEeeT!!p9lr5QV%D*j
-kbD1AUm#Sd-U)#[X$@@EapePYaAP8A",TZE`"J1C-R+l8DR+AiRm$8@5QKdHT#!`
-*'jhaDUH[YRqXcG#Q`N+VJ2`+f%5Ub+E3'!M86"eV2JZT"Z4iGF*9Xa@AI`L&UA(
-Zqf'L1[Nfbf'Ti5aANY`%N8-Aa@8ZR-b0%Q60E-ePc@`CZ&&Q5d@IV)eVlIF6Ukp
-qieU",Yl*33f#!h)"dPBS'[@Ebp`TBN+%YR(G)K8QaSZZ(%IL6YjiQ'6SZlkLRNH
-9mHUi9+$UK"RZqT5k%2GJQq`FKlRrZ99GikS"A)3V-ae5!aFme&bX5-9eI&,M,U+
-I$KZ#4&D%1E+*Uf20&ATYIEFJPS,`'+kDBh6f)QYJ)PSQlKK&b12Z`64rTbJ5T1k
-4A+*SRQVfDUY,&!hV9HVkYKe$'1bF1@`01lHjBCBl)m8)pP%d6Q@10#HG5aM9Y*U
--Zhh'$VZVkl+eK36Y3%qf#69@(0"RJNQS"lI@!"ME5GKmN!"#X5JHZU22mFEpT$!
-8J5CYQ[CVmRJJZ!!IET3HEX6$$G,$$AMiKr6`$cc-PalQiq([dX2ImA#9p(!9(Uk
-4(Ul"`ccTB4iHlT-HlX2$,1PK&KiHN!!H(UKGd2kBcbKSelrbS2faZif#p[86#GT
-cDE13!-#V[84X9pi[IrKUA5!Z*AIJ5(jDDSkL`19b[fDlHhV"l,3c#IJM(LbB24-
-&ieE1&Z'm381-q*Ma)%r`QH#H[Q)CNJ!b9ba,D4[%3hdpFbZ(JNPJfDFpA!U1B,P
-L$M&E-8FmZ')1-5ZB)c0E-5F$MZd9ph!fph!fpcaj6dTZYpdZ6CI-)bp5i2[$&YF
-S(0@fAGLqfYFDG!I1"mk6%+b2K@IhMX)Gbjfam@&k*)GfZ&92'eh2QVH5-++A#4P
-86*%C6Qm-3L-23'4R3)cN&ZE3BUIf)9J5+qZ9##BrSGJL1HDY36GF9ZD1,6`p,$H
-b-l[eRHBDLbkaT,XX%S%M("p1ePJ+F-%BR@AY*aSEUSpTH%QhGVjSDHY1$8$-fC!
-!VX,*L&q&jNMi!YY!)-L,XI!f2NDG)TYkQC'ART[2laJSEJCj2KJZ684%q,YrD4C
-h[[e"*"UqkbpYZp$JXN6db$re[cTAkAE281d63hH@NrP0$V(EGLUf1d2Nj-DY1A)
-HblE6XPr(4iC0$`q5bU$CS[0hBK"qE1&@-D4[#bTC6bMQ3ZHf(YSFqacJ1mF),#l
-0B-3TCq3`-l9e8dGiD(G(f,Rl*dLqi83&4fl5rqTmjFlPefQF`5F9fr+rDFb$cB0
-JLXD$NDTc@bNR%hp`Db0AHK+DjER!&XR0N!#@i@C!24$Ek*U+5EMJQVME29AaSUN
-Yjqifh2DVE&Lk$BpC2L5Eh,EEYc8Ppf5#"%4MA(2R*CQ!eI@+lS9@hEXEqX*$qMi
-jQ!XUcc[A0dGfr[1[iB9k1"Yaf5+,r&+R30Abd*6(Tl,#SBN,01f",B'RmBUK1-`
-E,0@TcU,a5aYV0Z-f#0&G"&BhE9acKf,ZC40akH&L5H&EcJ#-69"#-Hc8GfMbDlB
-K*6B4j0%Ph(B!01'8h1#1hf`+IrUAjR!VJA[MRNfZd@B-DGE%$VGZk9L`jmkqk&C
-aEfAJLrIJp)64B3@b$VFL"2PY)h5a'mC1CYYX)LG6QkV5fY'NFMC$,N$P"B,lJFl
-QL),d!RhP$L`i3a0L"$"Lp,Yh-c+FG`,dr0B-j9cZSq3hjflF"10AJL6G6k%#kc4
-$JbHk4ViK-4RD`cR-*)2!D%A+B1D+eXifmD[EGLM11r!!CF!ImE9$1eDd1Q,dTr1
-e1hD3!)RB*kN20Ei5*(F)QL2Y(&RaL@DSqEf95eDdDT`dA(a4CHjXCJ`(JI,"CR&
-(d%iZNQk6!P)h"8&NbaY9&1rhKdBpRQ@+E43TJ%TC(Llad%JAB5,dDeDKiie48Jf
-Fc6cC#4Y&A$&#CHcQH+V)hD,Xp@9D!%IFEmqh9[B'+[3$"(pRiqJQ9l!a(#KaP3e
-P"rMamqL`MKKEl[LbT,KJ&-lfZ8a-NA!VJ5'6lc-YfiZQ!qB'i$!lj-E%"SJYjeS
-kqJ+CKC9JaX"i+Yca1`2$l-9[T'iF$[$8Y%al0UbYF&TDF6SRQ5T8reIR@CA"K40
--3TH*DYe1U-3**"1d-m&-&iq$qM3rkj+Ec+9dEJP!%pL0CL-AL&MkT6,YC"Br4BZ
-,#-iLGb,)K6,8+jA8e6c@p,Bq%Vdc!21P2@P8Cm',ZNiR5b+T9'S8+$95AN8NZX!
-)Fchr(r-(a-3%&bk8XlZ`(),d!pejQ$j1RI[9Z3hd&A4VTcPDM&Q(qQM*!TIf%Ge
-j)M[9aT*Re8Y@E(dEKAGJI!8!cUP+!qXB6ZiY29b4122GV)2,,&ZjL%-lR%N`3JT
-1jVH+&Rq'`@M5X#lUEY-FMalqcK4kpHeRaXMr(+j&A',2rD[KbUJHbA6LF9`bbqc
-JADQRp5XAdT,ZkFA'*j+(E&#5Gf9AHY*`m"`hKq0e-+1TB6,4R66-',lNMcK0k@&
-YQ49eR($4N!"`G2P0[cTR5,i1j&G'G`%JPHH`S@2@L-&i8Ra92c8Z,*&LSdmid*c
-"%i-c'!Qr0P3H2b*iT6CVmULbi[M(5Pcj0PBaIR81f`j50I[f-e3c$1M1j,`NCc%
-jEZ"LZTi",FL!PZ!2Y+#LXh#f,I85NCm0"SLa4(#5j0,Ydk4U+Af#+Jl!8GP`U9'
-[am(Q4&A5B-FM)-+0kMZ#p1i@PG5Be'F,3HDCS3-,Ed%cb`FJKC`J+3CA@)Z+40N
-)c*Fe2*!!bMf2+)@hH)Nc-(('!@qmP0H[#FZKE!mY"aEcjF+%B-,DBZ"-5#"61"l
-aLN-*He#"1pYrEfY8(YENYDp#8Q`-$c'0%`m2KejM3c4AFCFEY"HjU$N-(a"p%)(
-Dp#iCaMM$KcR$KcR$Q$($rl3bc%NcBNF'`feSNP#*i)q)*#5GiY02Jj-(#8Rij)1
-M1[H+RIUjX"d*24TYUT("#G3bB(b14MUbi2DKBRflMK)M1"LM2(fZ4QQUT`ES,UA
-!4!S2P9##(jU$4aLTJeSkJlKaMkVNSNbj5,$3SFN[(bi@De%509kC#9mQ"+03B31
-[82aiT-b)+*r*4BMP)NLRDp+CJ`M'9+&G2BUZ3SC$f0`b*&3J3X@j4+B"H6iVHDC
-M+l*UATD4,P0%*)N%*MSU91eKMFfU41Md2EJB&bBL93+Zf%IQSJ)d&U#B6RLI(LN
-Q$jUTQ4401dqHIjKBb"2#PK*AjRB[66)R+(mdijU+miCUP0X9mfjmT0FF"3d!Vq9
-E&abLTmfr&a[CC$C3SF[`QPP3`)qa,XL6E$4j5-E6D@T`'6ZAaQCGfZ&P%rNRQc%
-a#B4%!"YE`K'iB,hXmcQl(Df,fFR0`!d#!-%F2Bb'k&Ph0GZ0T1e-FYY'#*c%"%V
-FBXa)V[JrAja%lUrF!3di&M+3!%)8HMQLkH)&qRF)R$Y0)(Dk4kfJ*@A6m+3Ll5N
-'-)5-3kRl0K'!Ak3#1+UEB6k1UNiKc"Z5`@%UKX%[eqX(0K%Z1JRa5A%b#P39)5Q
-2N!!ibrbe`Jj'bSJdDe(6+5rcmh)#3d@6MB(UlC0CR9A!V-&Y8H@&B`@ZUM$L$dM
-U0b%&EGcj)F9@)9+UMC!!dQmLC+Sb&mcUPEN101@#%*Ch1ID4J)3Hm#kd+Mb&JM)
-CILS[!93@RpJfTJTh,+80eldm5U*jm#5UU4-0cX6a$BSQ@A3$V8j8C+QaB-DQ@m2
-PY&(+24EQK2eL042$&98kpNUZC!N+NF8q-S6DF%eAVFfiSV!AAbY-C*R3hX)'bG2
-jT65NKH#FNaUmb9r$LbF0C5Z63aKM`4K#92NBkYMREJfA+R6-4(,ZRXCa0T9LQ4e
-eMEBK&-V,JlJI3YAGTMb-`1k13m)AP@&2$6VKrQdJ&DJ3YbNqqS$J)G,a'"ccfj5
-kMF1BE0(L-RYRKViH1$NJ0Y+3!'kl*NG,2CBL1bRbSq5N'*!![TY%,)`S+eJ"a$`
-#085AY$`6L$+S0$U$`rZ-$ZmhK3XHA%T3!Pj8Tpc)Za5Ub+Sb'@RI+USNaYa(P5,
-2jP3XQVd`#he)Sr'9aA$aLlU#UBU[d-a!kQLJPfep8$8BZNM6)l(MDm-3ZYL%-DS
-GHHa4%KE(B$$Y3aG&65"%NH!!iaN1J'BZ(VaG(`0*cECGk)4N4,,2!#k9QP)N8mS
-'%(YK(0DcLfhNEf#"$J'EMDYRJfabC5[l("deE`U5c#YY*KVdj9h-+6)(qTPCHlC
-HZ6XX`Nb'Uc4XUARaf-!'9f@Lb[EbJ,JMp*Th0'&!X`LGf9R4%K8'K8j,MQrQNfJ
-kbh,IX'YhYk['qFJ9$+m6Gb5pKJ6-+[m"fr8[h,kKlhkD(M0pA"5fE('KdXDNaIX
-dLl""HTL,)Z3'&b0NcF34e*3QXq"3&1iakN,K"5e0Xm-'06QfpR'R&P3M-bqF9q*
-+ik+&JKe+2e)[qD,KE6dCPET!C#6FZ%+['KTX$MHZe@2KQ+D&Ua3A2(a+6"1Mc3"
-bjm%CE%NjbET[HMN!GcK*%c,hB-T-rb++jJND#59ZHUKQh3JZFN20@0RF3R`FE@m
-$m9&(1ahLZhSFiKjb'Ri4c@iN3a!Q5Q'j9ST"dLMRPiYGMR$Y""KP@)#U1&f)J3R
-%qRDJZjm[SBZi81MN*1q@T3X8mb$BENG$9@9@RPd`jDciCq88Bm@,mjSB[@'hldm
-YKD9[iN302,mKQlkQckJkcKqGiJCYqR2TGXQU*j0abZdFPI4C-XRTF`4"!KF0j9c
-J1SPYZ!(HS-6CCPl3T3%r1NHPHdpDbj!!6[P3583J+LU*$Upl6l(0p-QV*(B11I*
-53A#U4fbNDN(C&eE6&i6CHPeGESYJmqRTr9#``["cKT23+!"H$p2V6"6d8[Kr&i5
-Hm9F0#epGqFpcU`H%6fBYq0N#BFZMp*rDIGGG3UVk0RA+XHqV$kQcNLmN,aILm62
-QDI92PmkD)D3+*p91YH@aj+`VDVI`KR"0mM2khLmq&$+%[`XjFj,A#MeU44lBV[j
-dG[,8bqUI#e1%CFN[*hrci6FI#@(KMp*)BGR6`UcNbmN6K"2VNVqC*ka-[Lcm,hj
-@#qA6K0q1&j,(#b@FYSprm1$jTmH0HhT`bjA"Z)%Vh30#3#J62RlkeeHq%Akp),P
-$k&Z``b2J8R(+3qSI6"2HIr44iAmIII6MHfB)Sc1%jfF)Nai6PTiBk"EHQ#'X9aI
-f,%Zq,6PrF,m`@hhdf-(Nlb4r0ILQfYBXR"YmF0Vb[42DK,p-+qQa#h(6"0Ud'Lm
-i!"*lYlU-X4AHIf[4SLr`)r`lAKbj8,$L3X&bGFTJQr"EGCl`dK9K3$hcUGI9Dki
-)*eHG%-je#"d&2e3I6ABN[b8F&[jPk@"LEh*1F[0J@IFh`X[5L'pqU-j*rQAbQm*
-[KG5PJc8I*KFQ$kJhFXVb-Fla`bH&kF)5GD2`3q%DiIM6*eF)&iA"RY@[Ulm9[K5
-Q$Mrjc@@Kjm,2ZSAA&kPI[0)RI(c0K!Hq'G-Rr13(`XAahH1lCj`I*h3[RcC&+&`
-jir8C*i@,mi@2IrhM%bm*&em6[RhQ0d*fKr$-VrYqG+jlc(N!N!-B!!!NL!!!9lJ
-!N!-)!*!$)!!!2c`!"kR`!*!$#PM!!&h!!!"G`!#3"#j"9A-b!*!&!e0PCc)(Ff9
-RE@9ZG&0PCc-(Ff9RE@9ZG&0PCc3(Ff9RE@9ZG!!!'Qi!N!-"GJ"1F8U$CL*"l3!
-J)$`r2!!!)MbTm!!"5N&Q"%T!C`T)3%K"))!K33!%3UG"q[r1d2`"!#m),c`!!"P
-Z,`0K!!+X9)pR3%)i#Pj#Tbmm4%&836mm"0@S(h!"%F!+ANUICaK1F6!mUA#R4N2
-k!#SLL%(k!#!`2+P`TNG+JfF%F!&1G8lY!#*1F8U$CJ+Tp(!!6R9J"J#3"3&1F4m
-krrC+(fB551IJi%(krqT3d%kk"Dj-h`F(,cVrhNjeB(*"6%&%4%008!!$!*!d8(*
-"E8MRB2"d8*r#,dJ!)#"2)P3aD3!8!"JK3!!N-A`!!3!XdT%K33!ZS!,I`NcI$`C
-1G8Si#PjR$#!U!!KR$#"!)""R"Lmkri41G8MR(`C"q[qHF!`L+J!%`VJ$'Q'NCJ!
-"2NKkrij1ZJGZ@%q`H[pDCJ!"$U%D,JJ)+J"!!!4R"L"i!UDJ'b`U!!3U+J!)'#S
-!"*I8PG3J1[p@S4ir1!)JCJ!!l&42,%JJ1[p%)JE#Z!-D@%&K!2p-)$Vr2-#i!aT
-"q[mi))"+K@B%S5*J"#"&S#GQ!!#d+NJJ$P#!3IVr###!)$Vr#P'!3IVr!##!3QG
-)HJ#m,a9)H[m#,cVqiLmkrZ)[1[l+,cVqbLmkrXTK!!e1-"pR)$m!5S9R##"0S#U
-J+f!%)%fJ)b"1S"mJ4k!E-Gm#)'"J)%kJ(b"(S"Yb!")%j`RM'H34!!%!)!)"!1!
-J6D"T!J!!(i!")%fJDYA8ep4"q[jf5T!!C`K`!D#BF!1JQ#"0*8J!#(!!60pJq%j
-e60pJq'!!rVir!#"1S"mJ4k!E-Gm#)0A8ep3`1!)J-F!+B*()*8J!#%cIB2K1G8j
-@!!")j`!i+'i!$%IkrLT&q[iU)"5`NQd%)")SJ%U!Ea)J8b*Z!!LL,L!8dC14NR!
-!B!3`22rC60mF!%jH6R919[r)51FH1#BZ!!JS,J!-+'i!%%(krESY52r83Llrb+%
-D,8Mrc&92U"``(cS!$%8!!'pF5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'r
-F3LHTQeP2,blrl$!'8dBr!+J1)"mY32r`FJ%I!DQE)'lrm%U3!'F398m[#+QQ-"p
-)`()%`)&Ra#mZrr#TSf#m%#i!&'F+@8mZZ!+Q)&qJ'cmmS2a1ZJ5'9%mY32r35S"
-R!!'H,`"1ZJ2@@%p+!'F+F!%G3!!@6[S#'%KZrq4)E[rJ5'lrf%kk"@T2l`!-)#l
-ri+%H,8Mrh#!)C`!"C#!Zrq5K(Le)rqJJ#'F!!93[,[rN,`K1ZJ@i8%mJ!fB!!+C
-C6bmm3dp%48*RU"mJ(be!rr"+J'F!!)iJ3#*3FKM6`5m*6VS%Y&K2FJ1`3@Cf)!d
-J3(!SdF!Y52rd)Qlrm#44F"M9`#e+rrJ[#Nkk",TB6be!rr`JE[r`S#P35LCZrp3
-R5J!S@8m[,[r`6VS9c#!IFZM3J9'!*d!!,&925(Vq-LmZrr4)E[rm,``["#mZrp`
-[,[rJ,blrk%kk#XC86bmZrr#TSb4Zrp3PE[r3!!`PE[rF!"!PE[rJ!"3PE[rS!"J
-r2+'B6VS$9P42*N!r2+LI6VS$5P42)J!J#l#"CJ4`!'!#F!%J!#9!!"`P4!!J*8`
-!*%Kkqm`r2+$m2cbJr%kk![K86am!6VS98MmmSCK1ZJ--9%p+J'F%F!'JQ#"m!!!
-"@M!35-$JJ()'X)&Q$%(k!+iLI!!!!c`LL"em!!(rb#"ZrmbJ'e92U"``(cS!$%8
-!!'pd5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dB
-r!+J1)"mY32r`FJ%I!DQE98m[,[r`UDB`(dM!FJ6!J@F),blrm+QLB-)NE[r`5T*
-R%&92,`UTTM!I5-"b"-#"CkS[#UQMB+33,[r)(8!!&NcI((K1AL"I6qm!$Nl36PE
-rr%MR!$"#,[rm2cbJr%kk!La86b4!5S"RA#m!6VS"J&K25J"R8#!+*N!J3#mS!!`
-r2+$m2cbJr%kk!Gj86am!6VS81#",)'J!%+!I)%XJD!!BS"mJI!!!!9S`%%M!i)"
-b"V#"CJT`!#"m!!!$2##!(A`!!Irm%#lrr%cI$!"1ANje6PErk%MR(cKC6kPe)"m
-U!%KZrqLSG#!0)%!J%(+'d)%Y32rm)%"F5%2Zrq`Lf#,B@8m[2%4"9%%r2!69UD!
-J(bK!)%!N8$)U!!L5DJ!%2!%d+J!'P'S!!Mi#0LlrmNM$1#lrlNM%PS3i!8M%PS4
-U!P+$iS-p3rrf0Llrm%M$1#lrl%M%PS3i!NM%PS4U!P+$iS-p3rrd0LlrpYC"282
-rqM)Zrr653Me"rrKC6d+R5'lrp%Kk!'Cb!4m"FJ%r!A,r,`&#*d+RU4-J(bC!,`#
-SF`D&!*!$H#m-)%Y`%0(!,`LSpPP2UA8J(l#&C!*Jp&92UA33(fB#B2C`rcm!3QF
-J(k!b,`ZT&#m-UD-[,[rSU(0-haci6Pj1G3!#!!"19J!!51F!-#4Z!!JJ#LC!)%!
-L+!!#$)&"6%&%CKBL+!!'$)&%3de3CJS`+!!+FJ1`3@F%F!"J!R!"60m-!%jH6R8
-[#PP22cbSER!"(`"1ZK*i)&mN5&P22cbUER!"(`"1ZK*Q)PmJ5V(*CJB`2!)!B!3
-`2!3!*&p1G8j@!!![!cBZ!!J`!dM!!S!!!!J!5S"["(!"B!*`!#BI6Pj1G8j@rra
-)ja`!0Li!#$m$6VVrc&42(8$rr()"X!&Q%!*$"rp1Z[q!X%0Z"(!!B#KC6cmmU*p
-`!4m!6VS4m#!I+J"C6cm$(blrr%kk%H!J(bJ!X)9Q!R!!60m!1%jH6R919J!!51F
-B-$JZ!!JNEJ!+)%SJ%#C!)%!b%!a"384Q+$)S!!)-3805CKif"(,rYN&R'L!S!!4
-b'1+S!S!!N!2r-J0)`E#"C`4`!'!#F!%G3!!160m-'%jH)&pF6dl36PB!!&925'i
-!#($r2`"1Z[q5%"pR%L"Z!!JJ+!!%FKMLU!*!!2pJ!R$r6Pj1G8j@!!"96dKZ!!K
-`rcm!6VVrC"!ICa!JEJ!))#J!"!+!!2q3!f!#F2p1ANje6PB!!%MR'$JQEJ!)+'i
-!$#",-,`$!A!!*%`NJ#Bm!!!"*0H5"T)!!!*)"T)!N!-J+$`!N!1!fC,CNLJm!!!
-%N!$CNYH5fC)'NJ#3!h`'NJ!!J!"`!#4Z!"!NJ!D5!*!$*!D5!*!$)!D5!*!$5!D
-5!*!$2N*!60mF'%jH6R919[rN51FI1#CZ!!JU,J!-)!XS3#e!rqK`*0R!,8crl(!
-JfF!Y62r`F%MC`#e-rr4`2YR!)!b3!)Z`K@-'F'91qJ#b3N!q!%*!28$rj$B(F#5
-f3'4)F!5f3'3%F!"J$(!!-!0CJ'S#9S$NJ(J!1!-Y42rif+lrk#4%&)!J,[rid)$
-3V[r`)%!`V[rNF!%8%R)!%J,MB0&Zrq454f#`3N!q!(!"2!!f"h!IYN"N4(!"YN"
-N"(!!B!a`!$!$8i"U!P+!iS"i!$J$,86rr0LZrq`N4"5!)#lrr0#!d+lrp#"!-)C
-`!435FJ!5!Z0Jh%"54f#d3N"-haci6Pj1G8j@rr")jami*'i!##CZ!!`k,J!3+'i
-!%N*!2!!b"A!!-!(3J$3'FJ!b!V#"Ea4#3$3'FJ!b!Y+"dS`J36#!8NCJfN*!2!"
-`!Me!rr)f"VC&C!!!Z%*!2J"#3$e!rr"`!$!$jB$3LL"!)"!Y32rd-JC`!$!"d)X
-J3"J3GJ!@",C(B`!!JM!ZrrCb!F""d@lrm(!!-!06J$3(FJ!b!V#"Ecii,[r`GJ!
-f"#e$rrc@JpD-)%0+8'B5)#lrr0#!d)`J3$#Zrr*8E[rb-Llrm(!!-!(3J0#-)%!
-`%$e!rr"J&M!&d%$34M3Zrr"b!$)#dS(5M#""-)"54b!Zrr6LL#e!rr4J!2pX8NC
-J!2p%60mFq%jH6R919[rm51FF-#4Z!!Jf,J!-*Qi!$M)$F!!`!HD!1!!`!h)(`%%
-k!(!!,8$rr$3%FJ!b!Y++)%%5%(!!%!%d"A)!-J,LS()"`)(4V[rm)Llrr11*dSX
-J36)3F!!`!5e!rra546!&FJL`3@B'3N!k!&*%-Li!%R!!-!(3J,#ZrraM!Q#U%#l
-rra)Z!"25!C!!!8cI$$K1ANje6PErr%MR(b!NEJ!)1#i!$$SZ!!ib"(!!-!(QJ$`
-!-J4d"m*#2J&f!$B!eSSJ3a!3G!!8!#e#rra`!$!"0!9b!$)#d)(QJ()#X)&R$()
-"X)&R)%U!Cc4J-M3'FJ!b!P5"dSSJ34)3F!!3!A)3ikL"V[rm0!Cb!$)#8S(5LL"
-"%K"`!"!"iBL"V[rm)#lrr$3(FJ!b!Z+S,8$rr($rFL!f"A3!0!15JZ+S`'lrrNc
-I"2K1ANje6PErf%MR(cJQEJ!)+'i!$L!m!!!"*0'Z!")J2!!!!NM4VJ!5)#i!%Le
-!rqab)01Z!")L,J!5,8(rm#3m!*!$J0@Z!")N,J!5,8,rp#4,'"*f!"B%,82rq1D
-$HJI'49*$282rh#BZrrMLJhS$aN983ce$rqCf!6SZrqEVBce$rqKq3-J(I!!F"$e
-'rq*i!HYN8d3p42rJ+Llrq(i"bSGR#(S!1J46K@!#H[mp4IrHH!Jp42rN5NCR4Lm
-Z!")[!$m$8NS[#NkkrcT2l`!1jd$4E[rN,bi!%LmZrr!r!bmZrqa1ZJX)6qm!$Lm
-Zrr3r!bmZrq`[,[r`6VVmV%r[!!j#3$e!rpJ`,[rBX'i!$'3!!6S`,[rLCcSN3$m
-ZrqJ[,[rd2blrj#m,6VVpMNr[!!`5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!")
-!dflrj'!F2blrjMmZrq3[#dkkrI"36ce!rpS`,[rQd@lrj$!ZrpU`E[rHCKBb,[r
-B8Qlrf(!!-!(3M#"!3K"J!2pk-#lrfV"Zrq"Q!!#8-#lriQFk*%!r,[rS,blrp$m
-Zrq3[#dkkr3C2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($m
-ZrqBr,[rN,`Y1Z[eS8%mp32rD-#lrjY&Zrq4@E[rD-#lrfP0ZrpT+3'F!r`!i,[r
-BGJ!f"#e$rra6JpD-)%-3%#)Zrrc5M#""%)"5E[rBB-i3,[rGd#lrfc3ZrpK5E[r
-BFJ!b!Y+-)%%3J'!!rVib,[rNF!!`!9k!jS"-haci6Pj1G8j@ria)jami*Qi!##S
-Z!!`SEJ!3,#i!&#e,rmK`*0I!,8[ri(!Jem!Y5rr-F%MA`#e,rq3Y62q8*M`!!!%
-NeklrP#!m!!!#50'Zrj4`)0'Zrj3S2!#3!i$CV[q8fDlrP#eZrj6rY#Jm!!!%N!$
-CV[q8,@lrP2qieklrP#eZrj6r[0QZrj3YE[q8rp4`I0'Zrj3YE[q8rk3J2!!!J!$
-4V[q8)#lrP*!!M,#&B`T`C6e!!#K1qJCkF!!Z!%*!28$rM#4Zrk69r!!!J!!Y5[q
-S,@lrT2q3!#em!!#!!2rS5'lrk#mZrk3JEJ!N6T!!8%mJ,[rSCJT`Cce!!#K1qJB
-d*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHl
-rN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"
-Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJA!)'lrN!"5V[q3!"!3(8$rS()!%J$
-5390"28(rd$!Zrp$33$e!rp)JEJ!F)"$3VJ!J,8$rX#4!,``[,[qi2c`"*#mZrj!
-!6VVlmNr[!!ib!#!+F!!`!G'Zrj!!,``[,[qd2c`"*#mZrlK1ZJHk6qm!$LmZrl`
-r2!%N,blrZ#mZrl41Z[PF6qm!$L4!,``[,[qi2blrd#mZrj!!6VVlS%r[!!ib!#!
-+F!!`!G'Zrj!!,``[,[qd2blrd#mZrlK1ZJGS6qm!$LmZrp3r,[r3,blrZ#mZrl4
-1Z[N+6qm!$R!!,J"#3$e!ri`YEJ!Jrk`JE[qXXHlrX'3!"+K#3$e!rjJ-EJ*)rjK
-N!!$#-#lrM'B!!)`NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[q
-N,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q
-3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk"%)JE[q3!&+Zrj!
-!%K"`!"!",J"`#$e!ri``"h)"`%(4E[qB-LlrQ(!!-!(3J0#Zrl`J3$!328$rQ#!
-(iSJZ!&0ZriaJ!2mi"'i#52qB$'i"!2qBC"!JE[qX8UlrV"#ZrjPJ!2m)"'i"!2q
-B1#lrQ(B!0J3Y3rrieS2@V[r-)%-`%$e!rjSL,[ridUlrb#""%K"`!"!"28$rR%T
-!C`!!`JaZ!"MrM')!!*JNE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#
-4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`
-Y5[q3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!bJJE[q3!&+
-Zrj!!%K"`!"!"0#lrM()!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I
-4E[qD)!IQU#i!Q@lrM%*!28$rQ$!ZrjL`E[r5C!!!`M!ZriaQ!!#-*'lrN!"55VA
-ZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!K
-R$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!
-Zrr#`V[rdC!T`Cce!!#K1qJ*B)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F"
-"d@lrQ$)ZrjK`!$!"d)$3V[r8)%!`%$e!rjJJ"q+),J"6E[q-B!$r0M!Zrp+4E[q
-B1#lrQ(B!0J3Y3rrmeS2@V[rN)%-`%$e!rjiL,[rmdUlri#""%K"`!"!"28$rR%T
-!C`!!`JaZ!"MrM')!!*JNE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#
-4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`
-Y5[q3!%KZrr![,[qN)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!9SJE[q3!&+
-Zrj!!%K"`!"!"0#lrM()!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I
-4E[qH)!IQU#i!Q@lrM#"Zrk`b,[qHF!!`!C(!,8MrP,(Z!#"PB#"Zrj45V[q8%"!
-JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk`
-3J$!ZrjT6E[qD5N"R!2[H)'lrP&+Zrj33%#"Zrka5V[qX%)"Jh&CZrjSJEJ!BdFB
-b,[qHF!!`!5*Zrkb6lJ!JN!#*NF!Y52q8-#lrQQFQ)'i!'0('XHlrP'-D)'lrP&+
-Zrj33%#"Zrka5V[qX%)"6E[qDB03YEJ!Jrj3`,[qD8flrQNT!C`$lCL"Zrj45V[q
-8%"!JE[qX8UlrV"#!B0`JE[qXXHlrX'F)F'Fp3!!SB"3JE[qXNHi!)#*Z!"`LL%*
-!28!!+%cI(2K1AL"I6qm!)%l3!(!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"
-bCA0cD@pZ1N4PBfpYF(*PFh0TEfi`-c!a,Q-!!$`!2L!!!(JJ2M!J*LBJH#!m26-
-b!!!k3fpYF(*PFh0TEfik4'9MEfe`FQ9cFfP[EM!c-$%ZB`!!6PErk%MR(cJq,J!
-)+'i!$$BZ!!T`!$!$1!Gb!$)%N!#"FJ'`J@m!!E3p42rS282rkP*ZrqJ`,[rSX'i
-!#Q3FFJ!b!0+-)%%3%$3(FJ!b!Y+-)%%5%,!"C!*JeP0ZrqS`,[rUX%GM(()!-J$
-5M#""%"!d"h)!-J,5M#""%K#`!@-#B0J`,[rSX'lrkQ8#B()i,[rSGJ!f"#e$rr$
-@M#4$%K*`!"!"28$rl$SZrqTi!$J&,86rp0L-*N33%a5!&Ulrl5!Zrr$3J0#Z!"!
-J3$!328$rl#)Zrr65JG+Z!"!J36)3*#lrm05#e+i!%#"#-)%L,[rddS(5VJ!3)%%
-`J'!!rc)`,[rUX%GQ"P*(B!$r"$J(GJ!f"#e$rrM@M#4$%K*`!"!"28$rl$`ZrqT
-k!$S',8Arr0U-*N83%a5!&Ulrl5!ZrrM3J0#Z!"!J3$!328$rl#)Zrrc5JG+Z!"!
-J36)3*#lrq05#e+i!%#"#-)%L,[rmdS(5VJ!3)%%`J#!Zrr`L,[riN!#"0#i!#R)
-!-J)N,[rm8S+5JV#"E"i[,J!3,``r"Mm%6VVqA%r[!!``,[rU8N!q!'!!rP`[,J!
-3,``r,J!+-#lrkP*!2`"1Z[if6qm!$$eZrqS!#Q!!rMK-haci6Pj1G8j@rq4)jam
-i*'i!#$SZ!!`QEJ!1+'i!%Le-rr!J2!!!!56C`#e-rr4#3$`!0JDf4@3XH!!i!be
-%rrMBLL"%%"!L,[ridUlrm#""%)!J,[rid)$3V[rd)%!`Je*'B-i[,[rd,blrm$m
-&3QG1Z[fb6qm!$%*!2!!f"VC&C"*`!$!$d+lrm#"!5K"Q"&*'B1K`!#e!rq3f"VC
-&C!!!U%T$Cc)J,[rNH!!i!be%rrcBV[r`)%38%()!%J)Q,[rm8i2@V[r`)%-@%(3
-!&!15JZ1S,8$rj$3'FJ!b!Y+Zrr!J34)3F!!3!6i!,@lrj2rXF!!Y32rS-!G64dT
-!Cb!J,[rSiiJL,[rXG!(#JS#",8$rk#!ZrqcLL#e!rqaJf$3'FJ!b!Y+"dUlrp#"
-"-K"`!$!"jB$3Lb"!)+lrk&*'8Ulrj'!!re4-haci6Pj1G5*I)&qJ*5k!DJ*#Pdl
-4)Pm5(c!I5J&R"+G'B!+M4Lk)6Y%LAa)I-"mJAdS"C`5Q4f!#SNG1d3#3!`S!1+!
-"!!8!N!B"!!!"MdN!!Bj*!!!%E&028P3!GJ#!!"`$dJ!838a59!!+!+T"9A-b!!!
-",N*14%`!!3%k3dp%43!(!9*%394"!!!"XN4*9%`!$3'q4%a24`!#!QC'8N9'!!3
-#LNCPBA3!!!,'5801)`!%!Y**3dp1!!!$$P"*3e3!!!-D8(0PG!!!!bC659T&!!!
-$-P088L!!!3-q8e45)`!!!eCKGA0d!!%$BQ0TBfi!!!0kD@0X1!!!!iCVD@jN!!!
-$NRCPFR-!!31H!)$rrb!!",-!N!@"rrmJ!!6$!*!&J[rr)!!%F`#3"BArrb3!")-
--mE"B!)Errb3!"+--mJ"`!)Irrb!!"*-!N!@)rrmJ!!66!*!%!J$rrb!!"18!N!3
-#!Irr)!!%p3#3"!3"rrmJ!!4M!*!%"+rrr`!!&"`!N!G!!!!Cc`#3"B$rr`!!'CF
-!N!3"!2rr!!!CG`#3"[rr+!&cE3#3"3%!AK`!(PB-mjFF!!)!D"`!N!!I$21A#!!
-$!()F!+`d$21A$!!%!(`F!21L$2(rm!!&!)BF!58[$1raR!!'!*!!(!&)6JccP`!
-!"rrr!!&cb3#3"[rr+!"J'!#3"B$rr`!!!DF!N!@#rrm!!!*h!*!&KIrr*!!!J!c
-aX%!!K[rr*!!"*JcY6C`!Krrr!*!$eJ#3"BMrr`!!!`%!N!@errmJ!!)&!*!%!3F
-!0#!!%fi!N!3#!2rr!!!$f3#3"!)"rrm!!!3A!*!%!qMrrb!!!Y8!N!3%!Irr)!#
-3"`4,!#J%!",J$2'[d!5[rrm!!"-`!*!%!3F!(#!!%5-!N!3$k2rr)!!*@!#3"!4
-,!"!%!"%+$2)!R!#!rrm!!"P!!*!&JIrr!!!C5`#3"B,rr`!!'9B!N!@$rrm!!"P
-K!*!&K2rr!!!CE!#3"[rr!!'11`#3"B$rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!!
-@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!%"%[rr`3!%Q8-mDr8!qMrr`!!#E3!N!@
-!rrm!!!8K!*!%rj!%!!&cL3#3"!)!N!-J!!8&!*!%!J%!"b!!"48!N!@!rrm!!!P
-d!*!(6`!!'IF!N!@%rrm!!"Rc!*!%"%[rr`3!%6m-mJ!)!)6rr`!!'P)!N!@!rrm
-!!A1A!*!&!Irr)!!3q!#3"3,rrb!!%0S!N!3'F(*[EA"d#-3JFh9QCQPi#dPZFf9
-bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$NphEQ9
-b)(*PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9
-RE@9ZG#!c#90PCfePER3J03P6C@GYC@jd)$B*8f9RE@9ZG#!f*-d:
diff --git a/mac/tkMacRegion.c b/mac/tkMacRegion.c
deleted file mode 100644
index ae63ff2..0000000
--- a/mac/tkMacRegion.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * tkMacRegion.c --
- *
- * Implements X window calls for manipulating regions
- *
- * Copyright (c) 1995-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include "tkInt.h"
-#include "tkMacInt.h"
-#include "X.h"
-#include "Xlib.h"
-
-#include <Windows.h>
-#include <QDOffscreen.h>
-
-/*
- * Temporary region that can be reused.
- */
-static RgnHandle tmpRgn = NULL;
-
-
-/*
- *----------------------------------------------------------------------
- *
- * TkCreateRegion --
- *
- * Implements the equivelent of the X window function
- * XCreateRegion. See X window documentation for more details.
- *
- * Results:
- * Returns an allocated region handle.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkRegion
-TkCreateRegion()
-{
- RgnHandle rgn;
-
- rgn = NewRgn();
- return (TkRegion) rgn;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkDestroyRegion --
- *
- * Implements the equivelent of the X window function
- * XDestroyRegion. See X window documentation for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Memory is freed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkDestroyRegion(
- TkRegion r)
-{
- RgnHandle rgn = (RgnHandle) r;
-
- DisposeRgn(rgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkIntersectRegion --
- *
- * Implements the equivilent of the X window function
- * XIntersectRegion. See X window documentation for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkIntersectRegion(
- TkRegion sra,
- TkRegion srb,
- TkRegion dr_return)
-{
- RgnHandle srcRgnA = (RgnHandle) sra;
- RgnHandle srcRgnB = (RgnHandle) srb;
- RgnHandle destRgn = (RgnHandle) dr_return;
-
- SectRgn(srcRgnA, srcRgnB, destRgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkUnionRectWithRegion --
- *
- * Implements the equivelent of the X window function
- * XUnionRectWithRegion. See X window documentation for more
- * details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkUnionRectWithRegion(
- XRectangle* rectangle,
- TkRegion src_region,
- TkRegion dest_region_return)
-{
- RgnHandle srcRgn = (RgnHandle) src_region;
- RgnHandle destRgn = (RgnHandle) dest_region_return;
-
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
- SetRectRgn(tmpRgn, rectangle->x, rectangle->y,
- rectangle->x + rectangle->width, rectangle->y + rectangle->height);
- UnionRgn(srcRgn, tmpRgn, destRgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkRectInRegion --
- *
- * Implements the equivelent of the X window function
- * XRectInRegion. See X window documentation for more details.
- *
- * Results:
- * Returns one of: RectangleOut, RectangleIn, RectanglePart.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkRectInRegion(
- TkRegion region,
- int x,
- int y,
- unsigned int width,
- unsigned int height)
-{
- RgnHandle rgn = (RgnHandle) region;
- RgnHandle rectRgn, destRgn;
- int result;
-
- rectRgn = NewRgn();
- destRgn = NewRgn();
- SetRectRgn(rectRgn, x, y, x + width, y + height);
- SectRgn(rgn, rectRgn, destRgn);
- if (EmptyRgn(destRgn)) {
- result = RectangleOut;
- } else if (EqualRgn(rgn, destRgn)) {
- result = RectangleIn;
- } else {
- result = RectanglePart;
- }
- DisposeRgn(rectRgn);
- DisposeRgn(destRgn);
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkClipBox --
- *
- * Implements the equivelent of the X window function XClipBox.
- * See X window documentation for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkClipBox(
- TkRegion r,
- XRectangle* rect_return)
-{
- RgnHandle rgn = (RgnHandle) r;
-
- rect_return->x = (**rgn).rgnBBox.left;
- rect_return->y = (**rgn).rgnBBox.top;
- rect_return->width = (**rgn).rgnBBox.right - (**rgn).rgnBBox.left;
- rect_return->height = (**rgn).rgnBBox.bottom - (**rgn).rgnBBox.top;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSubtractRegion --
- *
- * Implements the equivilent of the X window function
- * XSubtractRegion. See X window documentation for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkSubtractRegion(
- TkRegion sra,
- TkRegion srb,
- TkRegion dr_return)
-{
- RgnHandle srcRgnA = (RgnHandle) sra;
- RgnHandle srcRgnB = (RgnHandle) srb;
- RgnHandle destRgn = (RgnHandle) dr_return;
-
- DiffRgn(srcRgnA, srcRgnB, destRgn);
-}
diff --git a/mac/tkMacResource.r b/mac/tkMacResource.r
deleted file mode 100644
index 9d49f74..0000000
--- a/mac/tkMacResource.r
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * tkMacResources.r --
- *
- * This file creates resources for use in a simple shell.
- * This is designed to be an example of using the Tcl/Tk
- * libraries in a Macintosh Application.
- *
- * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
- * 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.
- */
-
-/*
- * We define SystemSevenOrLater so that our dialogs may use the
- * auto center feature.
- */
-#define SystemSevenOrLater 1
-
-#include <Types.r>
-#include <SysTypes.r>
-
-/*
- * The folowing include and defines help construct
- * the version string for Tcl.
- */
-
-#define RC_INVOKED
-#include "tcl.h"
-#include "tk.h"
-
-/*
- * The mechanisim below loads Tcl source into the resource fork of the
- * application. The example below creates a TEXT resource named
- * "Init" from the file "init.tcl". This allows applications to use
- * Tcl to define the behavior of the application without having to
- * require some predetermined file structure - all needed Tcl "files"
- * are located within the application. To source a file for the
- * resource fork the source command has been modified to support
- * sourcing from resources. In the below case "source -rsrc {Init}"
- * will load the TEXT resource named "Init".
- */
-
-#ifndef TCLTK_NO_LIBRARY_TEXT_RESOURCES
-#include "tkMacTclCode.r"
-#endif
-
-/*
- * The following two resources define the default "About Box" for Mac Tk.
- * This dialog appears if the "About Tk..." menu item is selected from
- * the Apple menu. This dialog may be overridden by defining a Tcl procedure
- * with the name of "tkAboutDialog". If this procedure is defined the
- * default dialog will not be shown and the Tcl procedure is expected to
- * create and manage an About Dialog box.
- */
-
-resource 'DLOG' (128, "Default About Box", purgeable) {
- {85, 107, 260, 412}, dBoxProc, visible, goAway, 0,
- 128, "", centerMainScreen
-};
-
-resource 'DITL' (128, "About Box", purgeable) {
- {
- {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"
- "Jim Ingham & Ray Johnson" "\n"
- "© 2001 Tcl Core Team" "\n"
- "jingham@apple.com"},
- { 19, 24, 119, 92}, Picture {enabled, 128}
- }
-};
-
-data 'PICT' (128) {
- $"13A4 0000 0000 0064 0044 0011 02FF 0C00"
- $"FFFE 0000 0048 0000 0048 0000 0000 0000"
- $"0064 0044 0000 0000 0001 000A 0000 0000"
- $"0064 0044 0099 8044 0000 0000 0064 0044"
- $"0000 0000 0000 0000 0048 0000 0048 0000"
- $"0000 0008 0001 0008 0000 0000 0108 00D8"
- $"0000 0000 0001 5A5A 8000 00FF 3736 FF00"
- $"FF00 FF00 3535 FF00 FF00 CC00 3434 FF00"
- $"FF00 9900 3333 FF00 FF00 6600 3736 FF00"
- $"FF00 3300 3535 FF00 FF00 0000 3434 FF00"
- $"CC00 FF00 3333 FF00 CC00 CC00 3736 FF00"
- $"CC00 9900 3535 FF00 CC00 6600 FAFA FF00"
- $"CC00 3300 3333 FF00 CC00 0000 3130 FF00"
- $"9900 FF00 2F2F FF00 9900 CC00 FAFA FF00"
- $"9900 9900 F9F9 FF00 9900 6600 3130 FF00"
- $"9900 3300 2F2F FF00 9900 0000 2E2E FF00"
- $"6600 FF00 F9F9 FF00 6600 CC00 3130 FF00"
- $"6600 9900 2F2F FF00 6600 6600 2E2E FF00"
- $"6600 3300 2D2D FF00 6600 0000 3130 FF00"
- $"3300 FF00 2F2F FF00 3300 CC00 2E2E FF00"
- $"3300 9900 2D2D FF00 3300 6600 3130 FF00"
- $"3300 3300 2F2F FF00 3300 0000 2E2E FF00"
- $"0000 FF00 2D2D FF00 0000 CC00 3130 FF00"
- $"0000 9900 2F2F FF00 0000 6600 2E2E FF00"
- $"0000 3300 2DF8 FF00 0000 0000 2B2A CC00"
- $"FF00 FF00 2929 CC00 FF00 CC00 2828 CC00"
- $"FF00 9900 27F8 CC00 FF00 6600 2B2A CC00"
- $"FF00 3300 2929 CC00 FF00 0000 2828 CC00"
- $"CC00 FF00 2727 CC00 CC00 CC00 2B2A CC00"
- $"CC00 9900 2929 CC00 CC00 6600 2828 CC00"
- $"CC00 3300 2727 CC00 CC00 0000 2B2A CC00"
- $"9900 FF00 2929 CC00 9900 CC00 2828 CC00"
- $"9900 9900 2727 CC00 9900 6600 DBDB CC00"
- $"9900 3300 4747 CC00 9900 0000 4646 CC00"
- $"6600 FF00 4545 CC00 6600 CC00 DBDB CC00"
- $"6600 9900 4747 CC00 6600 6600 4646 CC00"
- $"6600 3300 4545 CC00 6600 0000 DBDB CC00"
- $"3300 FF00 4747 CC00 3300 CC00 4646 CC00"
- $"3300 9900 4545 CC00 3300 6600 DBDB CC00"
- $"3300 3300 4141 CC00 3300 0000 4040 CC00"
- $"0000 FF00 3F3F CC00 0000 CC00 4342 CC00"
- $"0000 9900 4141 CC00 0000 6600 4040 CC00"
- $"0000 3300 3F3F CC00 0000 0000 4342 9900"
- $"FF00 FF00 4141 9900 FF00 CC00 4040 9900"
- $"FF00 9900 3F3F 9900 FF00 6600 4342 9900"
- $"FF00 3300 4141 9900 FF00 0000 4040 9900"
- $"CC00 FF00 3F3F 9900 CC00 CC00 4342 9900"
- $"CC00 9900 4141 9900 CC00 6600 4040 9900"
- $"CC00 3300 3F3F 9900 CC00 0000 4342 9900"
- $"9900 FF00 4141 9900 9900 CC00 4040 9900"
- $"9900 9900 3F3F 9900 9900 6600 3D3C 9900"
- $"9900 3300 3B3B 9900 9900 0000 3A3A 9900"
- $"6600 FF00 3939 9900 6600 CC00 3D3C 9900"
- $"6600 9900 3B3B 9900 6600 6600 3A3A 9900"
- $"6600 3300 3939 9900 6600 0000 3D3C 9900"
- $"3300 FF00 3B3B 9900 3300 CC00 3A3A 9900"
- $"3300 9900 3939 9900 3300 6600 3D3C 9900"
- $"3300 3300 3B3B 9900 3300 0000 3A3A 9900"
- $"0000 FF00 3939 9900 0000 CC00 3D3C 9900"
- $"0000 9900 3B3B 9900 0000 6600 3A3A 9900"
- $"0000 3300 3939 9900 0000 0000 3D3C 6600"
- $"FF00 FF00 3B3B 6600 FF00 CC00 3A3A 6600"
- $"FF00 9900 3939 6600 FF00 6600 3D3C 6600"
- $"FF00 3300 3B3B 6600 FF00 0000 3A3A 6600"
- $"CC00 FF00 3939 6600 CC00 CC00 3736 6600"
- $"CC00 9900 3535 6600 CC00 6600 3434 6600"
- $"CC00 3300 3333 6600 CC00 0000 3736 6600"
- $"9900 FF00 3535 6600 9900 CC00 3434 6600"
- $"9900 9900 3333 6600 9900 6600 3736 6600"
- $"9900 3300 3535 6600 9900 0000 3434 6600"
- $"6600 FF00 3333 6600 6600 CC00 3736 6600"
- $"6600 9900 3535 6600 6600 6600 3434 6600"
- $"6600 3300 3333 6600 6600 0000 3736 6600"
- $"3300 FF00 3535 6600 3300 CC00 3434 6600"
- $"3300 9900 3333 6600 3300 6600 3736 6600"
- $"3300 3300 3535 6600 3300 0000 3434 6600"
- $"0000 FF00 3333 6600 0000 CC00 3130 6600"
- $"0000 9900 2F2F 6600 0000 6600 2E2E 6600"
- $"0000 3300 F9F9 6600 0000 0000 3130 3300"
- $"FF00 FF00 2F2F 3300 FF00 CC00 2E2E 3300"
- $"FF00 9900 F9F9 3300 FF00 6600 3130 3300"
- $"FF00 3300 2F2F 3300 FF00 0000 2E2E 3300"
- $"CC00 FF00 2D2D 3300 CC00 CC00 3130 3300"
- $"CC00 9900 2F2F 3300 CC00 6600 2E2E 3300"
- $"CC00 3300 2D2D 3300 CC00 0000 3130 3300"
- $"9900 FF00 2F2F 3300 9900 CC00 2E2E 3300"
- $"9900 9900 2D2D 3300 9900 6600 3130 3300"
- $"9900 3300 2F2F 3300 9900 0000 2E2E 3300"
- $"6600 FF00 2DF8 3300 6600 CC00 2B2A 3300"
- $"6600 9900 2929 3300 6600 6600 2828 3300"
- $"6600 3300 27F8 3300 6600 0000 2B2A 3300"
- $"3300 FF00 2929 3300 3300 CC00 2828 3300"
- $"3300 9900 2727 3300 3300 6600 2B2A 3300"
- $"3300 3300 2929 3300 3300 0000 2828 3300"
- $"0000 FF00 2727 3300 0000 CC00 2B2A 3300"
- $"0000 9900 2929 3300 0000 6600 2828 3300"
- $"0000 3300 2727 3300 0000 0000 4948 0000"
- $"FF00 FF00 4747 0000 FF00 CC00 4646 0000"
- $"FF00 9900 4545 0000 FF00 6600 4948 0000"
- $"FF00 3300 4747 0000 FF00 0000 4646 0000"
- $"CC00 FF00 4545 0000 CC00 CC00 4948 0000"
- $"CC00 9900 4747 0000 CC00 6600 4646 0000"
- $"CC00 3300 4545 0000 CC00 0000 4342 0000"
- $"9900 FF00 4141 0000 9900 CC00 4040 0000"
- $"9900 9900 3F3F 0000 9900 6600 4342 0000"
- $"9900 3300 4141 0000 9900 0000 4040 0000"
- $"6600 FF00 3F3F 0000 6600 CC00 4342 0000"
- $"6600 9900 4141 0000 6600 6600 4040 0000"
- $"6600 3300 3F3F 0000 6600 0000 4342 0000"
- $"3300 FF00 4141 0000 3300 CC00 4040 0000"
- $"3300 9900 3F3F 0000 3300 6600 4342 0000"
- $"3300 3300 4141 0000 3300 0000 4040 0000"
- $"0000 FF00 3F3F 0000 0000 CC00 4342 0000"
- $"0000 9900 4141 0000 0000 6600 4040 0000"
- $"0000 3300 3F3F EE00 0000 0000 3D3C DD00"
- $"0000 0000 3B3B BB00 0000 0000 3A3A AA00"
- $"0000 0000 3939 8800 0000 0000 3D3C 7700"
- $"0000 0000 3B3B 5500 0000 0000 3A3A 4400"
- $"0000 0000 3939 2200 0000 0000 3D3C 1100"
- $"0000 0000 3B3B 0000 EE00 0000 3A3A 0000"
- $"DD00 0000 3939 0000 BB00 0000 3D3C 0000"
- $"AA00 0000 3B3B 0000 8800 0000 3A3A 0000"
- $"7700 0000 3939 0000 5500 0000 3D3C 0000"
- $"4400 0000 3B3B 0000 2200 0000 3A3A 0000"
- $"1100 0000 3939 0000 0000 EE00 3D3C 0000"
- $"0000 DD00 3B3B 0000 0000 BB00 3A3A 0000"
- $"0000 AA00 3939 0000 0000 8800 3D3C 0000"
- $"0000 7700 3B3B 0000 0000 5500 3A3A 0000"
- $"0000 4400 3939 0000 0000 2200 3736 0000"
- $"0000 1100 3535 EE00 EE00 EE00 3434 DD00"
- $"DD00 DD00 3333 BB00 BB00 BB00 3736 AA00"
- $"AA00 AA00 3535 8800 8800 8800 3434 7700"
- $"7700 7700 3333 5500 5500 5500 3736 4400"
- $"4400 4400 3535 2200 2200 2200 3434 1100"
- $"1100 1100 3333 0000 0000 0000 0000 0000"
- $"0064 0044 0000 0000 0064 0044 0000 000A"
- $"0000 0000 0064 0044 02BD 0013 E800 01F5"
- $"F6FE 07FE 0E02 3232 33FD 3900 0EE6 001D"
- $"FC00 01F5 F5FE 0700 08FE 0E02 3232 33FE"
- $"3900 3AFC 40F2 4102 4033 07E9 0017 0100"
- $"0EFC 40DC 4102 390E F5F5 0002 F5F5 F6FE"
- $"0702 0E07 0016 0100 32D5 4104 4039 0E32"
- $"33FD 3900 3AFC 40FC 4101 3200 0801 000E"
- $"C141 010E 0008 0100 0EC1 4101 0800 0801"
- $"000E C141 0107 0008 0100 0EC1 4101 0700"
- $"0901 0007 C241 0240 F500 0E01 0007 E841"
- $"0147 47DD 4102 4000 0012 0100 07F0 4100"
- $"47FA 4101 3B3B DD41 0240 0000 1901 0007"
- $"F141 0C47 3B0B 3B47 4141 4711 0505 3B47"
- $"DF41 023A 0000 1701 00F6 F041 010B 0BFE"
- $"4105 473B 0505 113B DE41 0239 0000 1A02"
- $"00F5 40F3 410C 473B 053B 4741 4741 0B0B"
- $"3B47 47DE 4102 3900 0018 0200 F540 F341"
- $"0247 110B FE41 0447 1105 4147 DC41 0233"
- $"0000 1B02 0000 40F3 4103 4711 1147 FE41"
- $"0205 3547 F741 FD47 E941 0232 0000 1E02"
- $"0000 40F2 4106 113B 4741 4735 0BF7 4106"
- $"4741 390E 0E40 47EA 4102 0E00 0021 0200"
- $"0040 F241 0711 3B47 4141 0B35 47F9 4102"
- $"4740 07FE 0002 F640 47EB 4102 0E00 0023"
- $"0200 0040 F341 0847 3541 4147 3B05 4147"
- $"FA41 0947 3AF6 00F5 4F55 F50E 47EB 4102"
- $"0700 0022 0200 003A F341 0147 3BFE 4101"
- $"0B0B F941 0547 3AF5 0055 C8FE CE01 5640"
- $"EB41 0207 0000 1F02 0000 39F0 4104 4741"
- $"053B 47FB 4104 4740 F5F5 A4FC CE01 C85D"
- $"EB41 02F6 0000 1F02 0000 39F0 4104 473B"
- $"0541 47FC 4104 4740 07F6 C8FA CE00 64EC"
- $"4103 40F5 0000 1C02 0000 39F0 4102 4711"
- $"0BFA 4103 4708 2AC8 FACE 0164 D8EC 4100"
- $"40FE 0025 0200 0039 EF41 020B 3B47 FC41"
- $"0347 0FF5 A4FB CE02 C887 D8FC 41FE 47FC"
- $"4100 47F9 4100 3AFE 0028 0200 0039 EF41"
- $"020B 3B47 FD41 0347 3900 A4FA CE00 ABFA"
- $"4109 3B11 3B41 4147 3B0B 3B47 FA41 0039"
- $"FE00 2402 0000 33F1 4102 4741 0BFA 4101"
- $"0779 F9CE 0064 FA41 0235 050B FD41 010B"
- $"0BF9 4100 39FE 0028 0200 0032 F141 0247"
- $"3B0B FC41 0247 39F6 F9CE 0187 D8FB 4103"
- $"4741 050B FE41 0247 110B F941 0039 FE00"
- $"2C02 0000 32F1 4102 473B 11FB 4101 0879"
- $"FACE 05AA 4041 4147 47FE 410A 4741 0511"
- $"4741 4147 3511 47FA 4100 32FE 002F 0200"
- $"000E F141 0347 3B11 47FE 4103 4740 F6C8"
- $"FACE 0564 D841 4039 39FE 4104 473B 053B"
- $"47FE 4102 3541 47FA 4100 0EFE 0027 0200"
- $"000E F141 0347 3B3B 47FE 4102 470F 79FA"
- $"CE0C 8741 4032 F500 003A 4741 473B 05F2"
- $"4100 0EFE 0027 0200 000E F141 0347 3B3B"
- $"47FD 4101 0EA4 FACE 01AB AAFE C808 7900"
- $"3947 4147 110B 47F3 4100 07FE 001C 0200"
- $"000E EA41 0240 2BC8 F5CE 0881 0033 4741"
- $"410B 3B47 F341 0007 FE00 1A02 0000 08EB"
- $"4102 473A 55F4 CE06 5D00 3947 4741 0BF1"
- $"4100 F6FE 001C 0200 0007 EB41 0247 3979"
- $"F4CE 0739 0039 4747 3511 47F3 4101 40F5"
- $"FE00 1C02 0000 07EB 4102 4739 A4F5 CE08"
- $"AB0E 0040 4741 1141 47F3 4100 40FD 001B"
- $"0200 0007 EB41 0247 39A4 F5CE 0787 0707"
- $"4147 4111 47F2 4100 40FD 001B 0200 0007"
- $"EB41 0247 39C8 F5CE 0763 F532 4747 3B3B"
- $"47F2 4100 3AFD 001A 0300 00F6 40EC 4102"
- $"4739 C8F5 CE05 39F5 4047 413B F041 0039"
- $"FD00 1C03 0000 F540 EB41 0140 C8FD CE01"
- $"C8A4 FCCE 03AB 080E 47ED 4100 39FD 001A"
- $"FE00 0040 EB41 0040 FCCE 01A4 C8FC CE03"
- $"FA07 4047 ED41 0032 FD00 1AFE 0000 40EA"
- $"4100 AAFE CE02 87F9 C8FC CE02 560F 47EC"
- $"4100 32FD 0019 FE00 0040 EA41 00AB FECE"
- $"0264 56C8 FDCE 01C8 32EA 4100 0EFD 001B"
- $"FE00 0040 ED41 030E 4047 87FE CE01 4055"
- $"FCCE 01FA 40EA 4100 08FD 001A FE00 003A"
- $"ED41 0807 0740 FBCE CEAB 3979 FDCE 00AB"
- $"E841 0007 FD00 1CFE 0000 3AED 4108 0700"
- $"F6A4 CECE 8733 79FD CE02 4147 47EA 4100"
- $"07FD 001E FE00 0039 ED41 0807 2AA4 C8CE"
- $"CE88 0E9D FECE 0364 1C39 39EB 4101 40F5"
- $"FD00 1CFE 0000 39ED 4101 074F FDCE 0264"
- $"F7A4 FECE 03AB 80F6 07EB 4100 40FC 001C"
- $"FE00 0039 ED41 0108 79FE CE03 AB40 2BA4"
- $"FCCE 02F7 0E47 EC41 0040 FC00 1CFE 0000"
- $"39ED 4101 0879 FECE 03AB 40F6 C8FC CE02"
- $"F615 47EC 4100 40FC 001E FE00 003A EE41"
- $"0247 0E79 FECE 03AB 40F5 C8FD CE03 A4F5"
- $"3A47 EC41 0040 FC00 1EFE 0000 3AEE 4102"
- $"470E 56FE CE03 FB3A F6C8 FDCE 0280 F540"
- $"EB41 0140 F5FD 001E FE00 0040 EE41 0947"
- $"0F56 CECE C888 39F6 C8FD CE02 5601 40EB"
- $"4101 40F5 FD00 1CFE 0000 40EE 4109 4739"
- $"32CE CEC8 8839 2AC8 FDCE 0156 07E9 4100"
- $"F6FD 001B FE00 0040 EE41 0847 3A32 CECE"
- $"C864 152A FCCE 0132 07E9 4100 07FD 001A"
- $"FE00 0040 ED41 0740 32AB CEC8 6439 4EFC"
- $"CE01 3A07 E941 0007 FD00 1D03 0000 F540"
- $"ED41 0740 0EAB CECE 640F 4EFD CE03 AB40"
- $"0840 EA41 0007 FD00 1B03 0000 F540 EC41"
- $"060F 81CE CE64 334E FDCE 02AB 400E E941"
- $"000E FD00 1C02 0000 F6EC 4107 4715 FACE"
- $"CE64 334E FDCE 0387 0F0E 47EA 4100 0EFD"
- $"001C 0200 0007 EC41 0747 16F9 CEC8 6433"
- $"4EFD CE03 6308 4047 EA41 000E FD00 1A02"
- $"0000 07EB 4106 40F9 CEC8 6439 4EFD CE02"
- $"3940 47E9 4100 32FD 001B 0200 0007 EA41"
- $"0539 CECE 8839 F6FE CE04 AB41 4139 40EA"
- $"4100 32FD 001C 0200 0007 EB41 0E47 3AC8"
- $"CE88 39F6 C8CE CE64 15F6 F540 EA41 0033"
- $"FD00 1A02 0000 07EA 410C 40A4 CE87 392A"
- $"C8CE AB41 40F8 F6E9 4100 39FD 001B 0200"
- $"000E EB41 0D47 41AB C887 39F5 C8CE ABAB"
- $"CEA4 07E9 4100 39FD 001C 0200 000E ED41"
- $"0947 3939 4787 C8AB 40F5 C8FD CE01 A40E"
- $"E941 0039 FD00 1D02 0000 0EED 4109 473A"
- $"0007 80CE AB40 F5C8 FDCE 0255 0E47 EA41"
- $"0039 FD00 1B02 0000 0EEB 4107 0779 C8CE"
- $"CE40 F6A4 FDCE 022B 3947 EA41 003A FD00"
- $"1C02 0000 0EEC 4102 4739 79FE CE02 6407"
- $"A4FE CE02 A407 40E9 4100 40FD 001A 0200"
- $"0032 EA41 0632 A4CE CE88 0879 FECE 02F9"
- $"0F47 E941 0040 FD00 1A02 0000 32EB 4107"
- $"4740 F7C8 CE87 0E79 FECE 0132 40E8 4100"
- $"40FD 0019 0200 0033 EA41 0B47 40F8 C8AB"
- $"0E55 CECE 8015 47E8 4100 40FD 0017 0200"
- $"0033 E941 0847 40F9 A439 4FCE CE5D E641"
- $"0140 F5FE 0014 0200 0039 E841 0647 64FB"
- $"392B C8AB E441 00F6 FE00 1102 0000 39E5"
- $"4103 40F6 8764 E441 0007 FE00 1E02 0000"
- $"39EB 4102 3A0E 0EFD 4102 0740 47F6 4104"
- $"400F 0839 47F4 4100 07FE 0027 0200 0039"
- $"FB41 0147 47F2 4102 0800 40FE 4102 0839"
- $"47FC 4101 4747 FC41 0339 0039 47F4 4100"
- $"07FE 0029 0200 0039 FB41 0140 39F3 4109"
- $"470E F540 4141 470E 3347 FC41 0139 3AFD"
- $"4104 4739 0039 47F4 4100 08FE 0036 0200"
- $"003A FC41 0347 0E00 40FC 4102 4741 40FC"
- $"4109 470E F540 4141 4733 0E47 FE41 0447"
- $"4000 0E47 FE41 0447 3900 3941 FE40 F741"
- $"000E FE00 3A02 0000 3AFD 410E 4740 0700"
- $"0E40 4741 4147 390E 390E 40FE 4108 470E"
- $"F540 4141 4739 0EFC 4103 0F00 0739 FE41"
- $"0747 3900 3940 080F 39F7 4100 0EFE 0035"
- $"0200 0040 FB41 020E 0040 FE41 0D47 4000"
- $"3941 0032 4741 4147 0EF5 40FE 4101 4008"
- $"FC41 023A 000E FD41 0547 3900 3939 33F5"
- $"4100 0EFE 0039 0200 0040 FC41 0347 0E00"
- $"40FE 4106 4732 0040 4139 40FE 4103 470E"
- $"F540 FD41 0108 40FE 4104 4740 000E 47FE"
- $"4106 4739 0007 F540 47F6 4100 32FE 003A"
- $"0200 0040 FC41 0C47 0E00 4047 4141 470E"
- $"0040 4747 FD41 0347 0EF5 40FE 410A 470E"
- $"3947 4141 4740 000E 47FE 4107 4739 000E"
- $"0007 4147 F741 0032 FE00 3802 0000 40FC"
- $"4102 470E 00FD 4106 4739 003A 4740 39FE"
- $"4102 470E F5FD 410A 4733 3347 4141 4740"
- $"000E 47FE 4106 4739 0039 3900 0EF6 4100"
- $"33FE 003A 0200 F540 FC41 0447 3200 0E39"
- $"FD41 0B0E 0E40 333A 4741 413A 07F5 39FE"
- $"4102 473A 0EFD 410F 40F5 0733 4041 4140"
- $"0E00 0E40 0700 0E40 F841 0039 FE00 2902"
- $"00F5 40FA 4101 3939 FB41 023A 3A40 FD41"
- $"FD40 FD41 0240 0E40 FD41 0240 3940 FD41"
- $"FA40 F741 0039 FE00 2A01 00F6 F941 0147"
- $"47FB 4101 4747 FB41 0147 47FB 4101 3940"
- $"FD41 0147 47FB 4100 47FE 4100 47F6 4100"
- $"39FE 000D 0100 07E1 4100 40E4 4100 3AFE"
- $"0009 0100 07C3 4100 3AFE 0009 0100 07C3"
- $"4100 40FE 0009 0100 07C3 4100 40FE 0009"
- $"0100 07C3 4100 40FE 000A 0100 0EC3 4103"
- $"40F5 0000 0901 000E C241 02F6 0000 0901"
- $"000E C241 0207 0000 0901 000E C241 0207"
- $"0000 1101 000E ED41 FE40 003A F940 E241"
- $"0207 0000 2B01 0032 F941 FE40 FE39 0632"
- $"0E0E 0707 F6F5 F800 02F5 F5F6 FB07 FB0E"
- $"0332 3233 33FB 3901 3A3A FB40 0207 0000"
- $"0E0A 000E 3939 320E 0E07 07F6 F5C8 0002"
- $"BD00 00FF"
-};
-
-/*
- * Here is the custom file open dialog. This dialog is used instead of
- * the default file dialog if the -filetypes flag is specified.
- */
-
-resource 'DLOG' (130, purgeable) {
- {0, 0, 195, 344}, dBoxProc, invisible, noGoAway, 0,
- 130, "", noAutoCenter
-};
-
-resource 'DITL' (130, "File Open Box", purgeable) {
- {
- {135, 252, 155, 332}, Button {enabled, "Open"},
- {104, 252, 124, 332}, Button {enabled, "Cancel"},
- { 0, 0, 0, 0}, HelpItem {disabled, HMScanhdlg {130}},
- { 8, 235, 24, 337}, UserItem {enabled},
- { 32, 252, 52, 332}, Button {enabled, "Eject"},
- { 60, 252, 80, 332}, Button {enabled, "Desktop"},
- { 29, 12, 159, 230}, UserItem {enabled},
- { 6, 12, 25, 230}, UserItem {enabled},
- { 91, 251, 92, 333}, Picture {disabled, 11},
- {168, 20, 187, 300}, Control {enabled, 131}
- }
-};
-
-resource 'CNTL' (131, "File Types menu", purgeable) {
- {168, 20, 187, 300},
- popupTitleLeftJust,
- visible,
- 80,
- 132,
- popupMenuCDEFProc,
- 0,
- "File Type:"
-};
-
-
-resource 'MENU' (132, preload) {
- 132,
- textMenuProc,
- 0xFFFF, enabled, "", {}
-};
diff --git a/mac/tkMacScale.c b/mac/tkMacScale.c
deleted file mode 100644
index 1e24674..0000000
--- a/mac/tkMacScale.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * tkMacScale.c --
- *
- * This file implements the Macintosh specific portion of the
- * scale widget.
- *
- * Copyright (c) 1996 by Sun Microsystems, Inc.
- * Copyright (c) 1998-2000 by Scriptics Corporation.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include "tkScale.h"
-#include "tkInt.h"
-#include <Controls.h>
-#include "tkMacInt.h"
-
-/*
- * Defines used in this file.
- */
-#define slider 1110
-#define inSlider 1
-#define inInc 2
-#define inDecr 3
-
-/*
- * Declaration of Macintosh specific scale structure.
- */
-
-typedef struct MacScale {
- TkScale info; /* Generic scale info. */
- int flags; /* Flags. */
- ControlRef scaleHandle; /* Handle to the Scale control struct. */
-} MacScale;
-
-/*
- * Globals uses locally in this file.
- */
-static ControlActionUPP scaleActionProc = NULL; /* Pointer to func. */
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static void MacScaleEventProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static pascal void ScaleActionProc _ANSI_ARGS_((ControlRef theControl,
- ControlPartCode partCode));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCreateScale --
- *
- * Allocate a new TkScale structure.
- *
- * Results:
- * Returns a newly allocated TkScale structure.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkScale *
-TkpCreateScale(tkwin)
- Tk_Window tkwin;
-{
- MacScale *macScalePtr;;
-
- macScalePtr = (MacScale *) ckalloc(sizeof(MacScale));
- macScalePtr->scaleHandle = NULL;
- if (scaleActionProc == NULL) {
- scaleActionProc = NewControlActionProc(ScaleActionProc);
- }
-
- Tk_CreateEventHandler(tkwin, ButtonPressMask,
- MacScaleEventProc, (ClientData) macScalePtr);
-
- return (TkScale *) macScalePtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyScale --
- *
- * Free Macintosh specific resources.
- *
- * Results:
- * None
- *
- * Side effects:
- * The slider control is destroyed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyScale(scalePtr)
- TkScale *scalePtr;
-{
- MacScale *macScalePtr = (MacScale *) scalePtr;
-
- /*
- * Free Macintosh control.
- */
- if (macScalePtr->scaleHandle != NULL) {
- DisposeControl(macScalePtr->scaleHandle);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDisplayScale --
- *
- * This procedure is invoked as an idle handler to redisplay
- * the contents of a scale widget.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The scale gets redisplayed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDisplayScale(clientData)
- ClientData clientData; /* Widget record for scale. */
-{
- TkScale *scalePtr = (TkScale *) clientData;
- Tk_Window tkwin = scalePtr->tkwin;
- Tcl_Interp *interp = scalePtr->interp;
- int result;
- char string[PRINT_CHARS];
- MacScale *macScalePtr = (MacScale *) clientData;
- Rect r;
- WindowRef windowRef;
- GWorldPtr destPort;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- MacDrawable *macDraw;
-
- scalePtr->flags &= ~REDRAW_PENDING;
- if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) {
- goto done;
- }
-
- /*
- * Invoke the scale's command if needed.
- */
-
- Tcl_Preserve((ClientData) scalePtr);
- if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) {
- Tcl_Preserve((ClientData) interp);
- sprintf(string, scalePtr->format, scalePtr->value);
- result = Tcl_VarEval(interp, scalePtr->command, " ", string,
- (char *) NULL);
- if (result != TCL_OK) {
- Tcl_AddErrorInfo(interp, "\n (command executed by scale)");
- Tcl_BackgroundError(interp);
- }
- Tcl_Release((ClientData) interp);
- }
- scalePtr->flags &= ~INVOKE_COMMAND;
- if (scalePtr->flags & SCALE_DELETED) {
- Tcl_Release((ClientData) scalePtr);
- return;
- }
- Tcl_Release((ClientData) scalePtr);
-
- /*
- * Now handle the part of redisplay that is the same for
- * horizontal and vertical scales: border and traversal
- * highlight.
- */
-
- if (scalePtr->highlightWidth != 0) {
- GC gc;
-
- gc = Tk_GCForColor(scalePtr->highlightColorPtr, Tk_WindowId(tkwin));
- Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth,
- Tk_WindowId(tkwin));
- }
- Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), scalePtr->bgBorder,
- scalePtr->highlightWidth, scalePtr->highlightWidth,
- Tk_Width(tkwin) - 2*scalePtr->highlightWidth,
- Tk_Height(tkwin) - 2*scalePtr->highlightWidth,
- scalePtr->borderWidth, scalePtr->relief);
-
- /*
- * Set up port for drawing Macintosh control.
- */
- macDraw = (MacDrawable *) Tk_WindowId(tkwin);
- destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin));
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(Tk_WindowId(tkwin));
-
- /*
- * Create Macintosh control.
- */
- if (macScalePtr->scaleHandle == NULL) {
- r.left = r.top = 0;
- r.right = r.bottom = 1;
- /* TODO: initial value. */
- /* 16*slider+4 */
- macScalePtr->scaleHandle = NewControl((WindowRef) destPort,
- &r, "\p", false, (short) 35, 0, 1000,
- 16*slider, (SInt32) macScalePtr);
-
- /*
- * If we are foremost than make us active.
- */
- if ((WindowPtr) destPort == FrontWindow()) {
- macScalePtr->flags |= ACTIVE;
- }
- }
- windowRef = (**macScalePtr->scaleHandle).contrlOwner;
-
- /*
- * We can't use the Macintosh commands SizeControl and MoveControl as these
- * calls will also cause a redraw which in our case will also cause
- * flicker. To avoid this we adjust the control record directly. The
- * Draw1Control command appears to just draw where ever the control says to
- * draw so this seems right.
- *
- * NOTE: changing the control record directly may not work when
- * Apple releases the Copland version of the MacOS in late 1996.
- */
-
- (**macScalePtr->scaleHandle).contrlRect.left = macDraw->xOff
- + scalePtr->inset;
- (**macScalePtr->scaleHandle).contrlRect.top = macDraw->yOff
- + scalePtr->inset;
- (**macScalePtr->scaleHandle).contrlRect.right = macDraw->xOff
- + Tk_Width(tkwin) - scalePtr->inset;
- (**macScalePtr->scaleHandle).contrlRect.bottom = macDraw->yOff
- + Tk_Height(tkwin) - scalePtr->inset;
-
- /*
- * Set the thumb and resolution etc.
- */
- (**macScalePtr->scaleHandle).contrlMin = (SInt16) scalePtr->toValue;
- (**macScalePtr->scaleHandle).contrlMax = (SInt16) scalePtr->fromValue;
- (**macScalePtr->scaleHandle).contrlValue = (SInt16) scalePtr->value;
-
- /*
- * Finally draw the control.
- */
- (**macScalePtr->scaleHandle).contrlVis = 255;
- (**macScalePtr->scaleHandle).contrlHilite = 0;
- Draw1Control(macScalePtr->scaleHandle);
-
- SetGWorld(saveWorld, saveDevice);
-
- done:
- scalePtr->flags &= ~REDRAW_ALL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpScaleElement --
- *
- * Determine which part of a scale widget lies under a given
- * point.
- *
- * Results:
- * The return value is either TROUGH1, SLIDER, TROUGH2, or
- * OTHER, depending on which of the scale's active elements
- * (if any) is under the point at (x,y).
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpScaleElement(scalePtr, x, y)
- TkScale *scalePtr; /* Widget record for scale. */
- int x, y; /* Coordinates within scalePtr's window. */
-{
- MacScale *macScalePtr = (MacScale *) scalePtr;
- ControlPartCode part;
- Point where;
- Rect bounds;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(Tk_WindowId(scalePtr->tkwin));
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
-
- /*
- * All of the calculations in this procedure mirror those in
- * DisplayScrollbar. Be sure to keep the two consistent.
- */
-
- TkMacWinBounds((TkWindow *) scalePtr->tkwin, &bounds);
- where.h = x + bounds.left;
- where.v = y + bounds.top;
- part = TestControl(macScalePtr->scaleHandle, where);
-
- SetGWorld(saveWorld, saveDevice);
-
- switch (part) {
- case inSlider:
- return SLIDER;
- case inInc:
- if (scalePtr->orient == ORIENT_VERTICAL) {
- return TROUGH1;
- } else {
- return TROUGH2;
- }
- case inDecr:
- if (scalePtr->orient == ORIENT_VERTICAL) {
- return TROUGH2;
- } else {
- return TROUGH1;
- }
- default:
- return OTHER;
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * MacScaleEventProc --
- *
- * This procedure is invoked by the Tk dispatcher for
- * ButtonPress events on scales.
- *
- * Results:
- * None.
- *
- * Side effects:
- * When the window gets deleted, internal structures get
- * cleaned up. When it gets exposed, it is redisplayed.
- *
- *--------------------------------------------------------------
- */
-
-static void
-MacScaleEventProc(clientData, eventPtr)
- ClientData clientData; /* Information about window. */
- XEvent *eventPtr; /* Information about event. */
-{
- MacScale *macScalePtr = (MacScale *) clientData;
- Point where;
- Rect bounds;
- int part, x, y, dummy;
- unsigned int state;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- Window dummyWin;
-
- /*
- * To call Macintosh control routines we must have the port
- * set to the window containing the control. We will then test
- * which part of the control was hit and act accordingly.
- */
- destPort = TkMacGetDrawablePort(Tk_WindowId(macScalePtr->info.tkwin));
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(Tk_WindowId(macScalePtr->info.tkwin));
-
- TkMacWinBounds((TkWindow *) macScalePtr->info.tkwin, &bounds);
- where.h = eventPtr->xbutton.x + bounds.left;
- where.v = eventPtr->xbutton.y + bounds.top;
- part = TestControl(macScalePtr->scaleHandle, where);
- if (part == 0) {
- return;
- }
-
- part = TrackControl(macScalePtr->scaleHandle, where, scaleActionProc);
-
- /*
- * Update the value for the widget.
- */
- macScalePtr->info.value = (**macScalePtr->scaleHandle).contrlValue;
- /* TkScaleSetValue(&macScalePtr->info, macScalePtr->info.value, 1, 0); */
-
- /*
- * The TrackControl call will "eat" the ButtonUp event. We now
- * generate a ButtonUp event so Tk will unset implicit grabs etc.
- */
- GetMouse(&where);
- XQueryPointer(NULL, None, &dummyWin, &dummyWin, &x,
- &y, &dummy, &dummy, &state);
- TkGenerateButtonEvent(x, y, Tk_WindowId(macScalePtr->info.tkwin), state);
-
- SetGWorld(saveWorld, saveDevice);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ScaleActionProc --
- *
- * Callback procedure used by the Macintosh toolbox call
- * TrackControl. This call will update the display while
- * the scrollbar is being manipulated by the user.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May change the display.
- *
- *--------------------------------------------------------------
- */
-
-static pascal void
-ScaleActionProc(ControlRef theControl, ControlPartCode partCode)
- /* ControlRef theControl; /* Handle to scrollbat control */
- /* ControlPartCode partCode; /* Part of scrollbar that was "hit" */
-{
- register int value;
- register TkScale *scalePtr = (TkScale *) GetCRefCon(theControl);
-
- value = (**theControl).contrlValue;
- TkScaleSetValue(scalePtr, value, 1, 1);
- Tcl_Preserve((ClientData) scalePtr);
- Tcl_DoOneEvent(TCL_IDLE_EVENTS);
- Tcl_Release((ClientData) scalePtr);
-}
-
diff --git a/mac/tkMacScrlbr.c b/mac/tkMacScrlbr.c
deleted file mode 100644
index 62523d2..0000000
--- a/mac/tkMacScrlbr.c
+++ /dev/null
@@ -1,1067 +0,0 @@
-/*
- * tkMacScrollbar.c --
- *
- * This file implements the Macintosh specific portion of the scrollbar
- * widget. The Macintosh scrollbar may also draw a windows grow
- * region under certain cases.
- *
- * Copyright (c) 1996 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.
- */
-
-#include "tkScrollbar.h"
-#include "tkMacInt.h"
-#include <Controls.h>
-#include <ControlDefinitions.h>
-
-/*
- * The following definitions should really be in MacOS
- * header files. They are included here as this is the only
- * file that needs the declarations.
- */
-typedef pascal void (*ThumbActionFunc)(void);
-
-#if GENERATINGCFM
-typedef UniversalProcPtr ThumbActionUPP;
-#else
-typedef ThumbActionFunc ThumbActionUPP;
-#endif
-
-enum {
- uppThumbActionProcInfo = kPascalStackBased
-};
-
-#if GENERATINGCFM
-#define NewThumbActionProc(userRoutine) \
- (ThumbActionUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppThumbActionProcInfo, GetCurrentArchitecture())
-#else
-#define NewThumbActionProc(userRoutine) \
- ((ThumbActionUPP) (userRoutine))
-#endif
-
-/*
- * Minimum slider length, in pixels (designed to make sure that the slider
- * is always easy to grab with the mouse).
- */
-
-#define MIN_SLIDER_LENGTH 5
-
-/*
- * Declaration of Windows specific scrollbar structure.
- */
-
-typedef struct MacScrollbar {
- TkScrollbar info; /* Generic scrollbar info. */
- ControlRef sbHandle; /* Handle to the Scrollbar control struct. */
- int macFlags; /* Various flags; see below. */
-} MacScrollbar;
-
-/*
- * Flag bits for scrollbars on the Mac:
- *
- * ALREADY_DEAD: Non-zero means this scrollbar has been
- * destroyed, but has not been cleaned up.
- * IN_MODAL_LOOP: Non-zero means this scrollbar is in the middle
- * of a modal loop.
- * ACTIVE: Non-zero means this window is currently
- * active (in the foreground).
- * FLUSH_TOP: Flush with top of Mac window.
- * FLUSH_BOTTOM: Flush with bottom of Mac window.
- * FLUSH_RIGHT: Flush with right of Mac window.
- * FLUSH_LEFT: Flush with left of Mac window.
- * SCROLLBAR_GROW: Non-zero means this window draws the grow
- * region for the toplevel window.
- * AUTO_ADJUST: Non-zero means we automatically adjust
- * the size of the widget to align correctly
- * along a Mac window.
- * DRAW_GROW: Non-zero means we draw the grow region.
- */
-
-#define ALREADY_DEAD 1
-#define IN_MODAL_LOOP 2
-#define ACTIVE 4
-#define FLUSH_TOP 8
-#define FLUSH_BOTTOM 16
-#define FLUSH_RIGHT 32
-#define FLUSH_LEFT 64
-#define SCROLLBAR_GROW 128
-#define AUTO_ADJUST 256
-#define DRAW_GROW 512
-
-/*
- * Globals uses locally in this file.
- */
-static ControlActionUPP scrollActionProc = NULL; /* Pointer to func. */
-static ThumbActionUPP thumbActionProc = NULL; /* Pointer to func. */
-static TkScrollbar *activeScrollPtr = NULL; /* Non-null when in thumb */
- /* proc. */
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static pascal void ScrollbarActionProc _ANSI_ARGS_((ControlRef theControl,
- ControlPartCode partCode));
-static int ScrollbarBindProc _ANSI_ARGS_((ClientData clientData,
- Tcl_Interp *interp, XEvent *eventPtr,
- Tk_Window tkwin, KeySym keySym));
-static void ScrollbarEventProc _ANSI_ARGS_((
- ClientData clientData, XEvent *eventPtr));
-static pascal void ThumbActionProc _ANSI_ARGS_((void));
-static void UpdateControlValues _ANSI_ARGS_((MacScrollbar *macScrollPtr));
-
-/*
- * The class procedure table for the scrollbar widget. Leave the proc fields
- * initialized to NULL, which should happen automatically because of the scope
- * at which the variable is declared.
- */
-
-Tk_ClassProcs tkpScrollbarProcs = {
- sizeof(Tk_ClassProcs) /* size */
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCreateScrollbar --
- *
- * Allocate a new TkScrollbar structure.
- *
- * Results:
- * Returns a newly allocated TkScrollbar structure.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkScrollbar *
-TkpCreateScrollbar(
- Tk_Window tkwin) /* New Tk Window. */
-{
- MacScrollbar * macScrollPtr;
- TkWindow *winPtr = (TkWindow *)tkwin;
-
- if (scrollActionProc == NULL) {
- scrollActionProc = NewControlActionProc(ScrollbarActionProc);
- thumbActionProc = NewThumbActionProc(ThumbActionProc);
- }
-
- macScrollPtr = (MacScrollbar *) ckalloc(sizeof(MacScrollbar));
- macScrollPtr->sbHandle = NULL;
- macScrollPtr->macFlags = 0;
-
- Tk_CreateEventHandler(tkwin, ActivateMask|ExposureMask|
- StructureNotifyMask|FocusChangeMask,
- ScrollbarEventProc, (ClientData) macScrollPtr);
-
- if (!Tcl_GetAssocData(winPtr->mainPtr->interp, "TkScrollbar", NULL)) {
- Tcl_SetAssocData(winPtr->mainPtr->interp, "TkScrollbar", NULL,
- (ClientData)1);
- TkCreateBindingProcedure(winPtr->mainPtr->interp,
- winPtr->mainPtr->bindingTable,
- (ClientData)Tk_GetUid("Scrollbar"), "<ButtonPress>",
- ScrollbarBindProc, NULL, NULL);
- }
-
- return (TkScrollbar *) macScrollPtr;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpDisplayScrollbar --
- *
- * This procedure redraws the contents of a scrollbar window.
- * It is invoked as a do-when-idle handler, so it only runs
- * when there's nothing else for the application to do.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Information appears on the screen.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkpDisplayScrollbar(
- ClientData clientData) /* Information about window. */
-{
- register TkScrollbar *scrollPtr = (TkScrollbar *) clientData;
- register MacScrollbar *macScrollPtr = (MacScrollbar *) clientData;
- register Tk_Window tkwin = scrollPtr->tkwin;
-
- MacDrawable *macDraw;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- WindowRef windowRef;
-
- if ((scrollPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
- goto done;
- }
-
- /*
- * Draw the focus or any 3D relief we may have.
- */
- if (scrollPtr->highlightWidth != 0) {
- GC fgGC, bgGC;
-
- bgGC = Tk_GCForColor(scrollPtr->highlightBgColorPtr,
- Tk_WindowId(tkwin));
-
- if (scrollPtr->flags & GOT_FOCUS) {
- fgGC = Tk_GCForColor(scrollPtr->highlightColorPtr,
- Tk_WindowId(tkwin));
- TkpDrawHighlightBorder(tkwin, fgGC, bgGC, scrollPtr->highlightWidth,
- Tk_WindowId(tkwin));
- } else {
- TkpDrawHighlightBorder(tkwin, bgGC, bgGC, scrollPtr->highlightWidth,
- Tk_WindowId(tkwin));
- }
- }
- Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), scrollPtr->bgBorder,
- scrollPtr->highlightWidth, scrollPtr->highlightWidth,
- Tk_Width(tkwin) - 2*scrollPtr->highlightWidth,
- Tk_Height(tkwin) - 2*scrollPtr->highlightWidth,
- scrollPtr->borderWidth, scrollPtr->relief);
-
- /*
- * Set up port for drawing Macintosh control.
- */
- macDraw = (MacDrawable *) Tk_WindowId(tkwin);
- destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin));
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(Tk_WindowId(tkwin));
-
- if (macScrollPtr->sbHandle == NULL) {
- Rect r;
- WindowRef frontNonFloating;
-
- r.left = r.top = 0;
- r.right = r.bottom = 1;
- macScrollPtr->sbHandle = NewControl((WindowRef) destPort, &r, "\p",
- false, (short) 500, 0, 1000,
- scrollBarProc, (SInt32) scrollPtr);
-
- /*
- * If we are foremost than make us active.
- */
-
- if (TkMacHaveAppearance() >= 0x110) {
- frontNonFloating = FrontNonFloatingWindow();
- } else {
- frontNonFloating = FrontWindow();
- }
-
- if ((WindowPtr) destPort == FrontWindow() || TkpIsWindowFloating((WindowPtr) destPort)) {
- macScrollPtr->macFlags |= ACTIVE;
- }
- }
-
- /*
- * Update the control values before we draw.
- */
- windowRef = (**macScrollPtr->sbHandle).contrlOwner;
- UpdateControlValues(macScrollPtr);
-
- if (macScrollPtr->macFlags & ACTIVE) {
- Draw1Control(macScrollPtr->sbHandle);
- if (macScrollPtr->macFlags & DRAW_GROW) {
- DrawGrowIcon(windowRef);
- }
- } else {
- (**macScrollPtr->sbHandle).contrlHilite = 255;
- Draw1Control(macScrollPtr->sbHandle);
- if (macScrollPtr->macFlags & DRAW_GROW) {
- DrawGrowIcon(windowRef);
- Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), scrollPtr->bgBorder,
- Tk_Width(tkwin) - 13, Tk_Height(tkwin) - 13,
- Tk_Width(tkwin), Tk_Height(tkwin),
- 0, TK_RELIEF_FLAT);
- }
- }
-
- SetGWorld(saveWorld, saveDevice);
-
- done:
- scrollPtr->flags &= ~REDRAW_PENDING;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpConfigureScrollbar --
- *
- * This procedure is called after the generic code has finished
- * processing configuration options, in order to configure
- * platform specific options.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpConfigureScrollbar(scrollPtr)
- register TkScrollbar *scrollPtr; /* Information about widget; may or
- * may not already have values for
- * some fields. */
-{
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpComputeScrollbarGeometry --
- *
- * After changes in a scrollbar's size or configuration, this
- * procedure recomputes various geometry information used in
- * displaying the scrollbar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The scrollbar will be displayed differently.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpComputeScrollbarGeometry(
- register TkScrollbar *scrollPtr) /* Scrollbar whose geometry may
- * have changed. */
-{
- MacScrollbar *macScrollPtr = (MacScrollbar *) scrollPtr;
- int width, fieldLength, adjust = 0;
-
- if (scrollPtr->highlightWidth < 0) {
- scrollPtr->highlightWidth = 0;
- }
- scrollPtr->inset = scrollPtr->highlightWidth + scrollPtr->borderWidth;
- width = (scrollPtr->vertical) ? Tk_Width(scrollPtr->tkwin)
- : Tk_Height(scrollPtr->tkwin);
- scrollPtr->arrowLength = width - 2*scrollPtr->inset + 1;
- fieldLength = (scrollPtr->vertical ? Tk_Height(scrollPtr->tkwin)
- : Tk_Width(scrollPtr->tkwin))
- - 2*(scrollPtr->arrowLength + scrollPtr->inset);
- if (fieldLength < 0) {
- fieldLength = 0;
- }
- scrollPtr->sliderFirst = fieldLength*scrollPtr->firstFraction;
- scrollPtr->sliderLast = fieldLength*scrollPtr->lastFraction;
-
- /*
- * Adjust the slider so that some piece of it is always
- * displayed in the scrollbar and so that it has at least
- * a minimal width (so it can be grabbed with the mouse).
- */
-
- if (scrollPtr->sliderFirst > (fieldLength - 2*scrollPtr->borderWidth)) {
- scrollPtr->sliderFirst = fieldLength - 2*scrollPtr->borderWidth;
- }
- if (scrollPtr->sliderFirst < 0) {
- scrollPtr->sliderFirst = 0;
- }
- if (scrollPtr->sliderLast < (scrollPtr->sliderFirst
- + MIN_SLIDER_LENGTH)) {
- scrollPtr->sliderLast = scrollPtr->sliderFirst + MIN_SLIDER_LENGTH;
- }
- if (scrollPtr->sliderLast > fieldLength) {
- scrollPtr->sliderLast = fieldLength;
- }
- scrollPtr->sliderFirst += scrollPtr->arrowLength + scrollPtr->inset;
- scrollPtr->sliderLast += scrollPtr->arrowLength + scrollPtr->inset;
-
- /*
- * Register the desired geometry for the window (leave enough space
- * for the two arrows plus a minimum-size slider, plus border around
- * the whole window, if any). Then arrange for the window to be
- * redisplayed.
- */
-
- if (scrollPtr->vertical) {
- if ((macScrollPtr->macFlags & AUTO_ADJUST) &&
- (macScrollPtr->macFlags & (FLUSH_RIGHT|FLUSH_LEFT))) {
- adjust--;
- }
- Tk_GeometryRequest(scrollPtr->tkwin,
- scrollPtr->width + 2*scrollPtr->inset + adjust,
- 2*(scrollPtr->arrowLength + scrollPtr->borderWidth
- + scrollPtr->inset));
- } else {
- if ((macScrollPtr->macFlags & AUTO_ADJUST) &&
- (macScrollPtr->macFlags & (FLUSH_TOP|FLUSH_BOTTOM))) {
- adjust--;
- }
- Tk_GeometryRequest(scrollPtr->tkwin,
- 2*(scrollPtr->arrowLength + scrollPtr->borderWidth
- + scrollPtr->inset), scrollPtr->width + 2*scrollPtr->inset + adjust);
- }
- Tk_SetInternalBorder(scrollPtr->tkwin, scrollPtr->inset);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpDestroyScrollbar --
- *
- * Free data structures associated with the scrollbar control.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpDestroyScrollbar(
- TkScrollbar *scrollPtr) /* Scrollbar to destroy. */
-{
- MacScrollbar *macScrollPtr = (MacScrollbar *)scrollPtr;
-
- if (macScrollPtr->sbHandle != NULL) {
- if (!(macScrollPtr->macFlags & IN_MODAL_LOOP)) {
- DisposeControl(macScrollPtr->sbHandle);
- macScrollPtr->sbHandle = NULL;
- }
- }
- macScrollPtr->macFlags |= ALREADY_DEAD;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkpScrollbarPosition --
- *
- * Determine the scrollbar element corresponding to a
- * given position.
- *
- * Results:
- * One of TOP_ARROW, TOP_GAP, etc., indicating which element
- * of the scrollbar covers the position given by (x, y). If
- * (x,y) is outside the scrollbar entirely, then OUTSIDE is
- * returned.
- *
- * Side effects:
- * None.
- *
- *--------------------------------------------------------------
- */
-
-int
-TkpScrollbarPosition(
- TkScrollbar *scrollPtr, /* Scrollbar widget record. */
- int x, int y) /* Coordinates within scrollPtr's
- * window. */
-{
- MacScrollbar *macScrollPtr = (MacScrollbar *) scrollPtr;
- GWorldPtr destPort;
- int length, width, tmp, inactive = false;
- ControlPartCode part;
- Point where;
- Rect bounds;
-
- if (scrollPtr->vertical) {
- length = Tk_Height(scrollPtr->tkwin);
- width = Tk_Width(scrollPtr->tkwin);
- } else {
- tmp = x;
- x = y;
- y = tmp;
- length = Tk_Width(scrollPtr->tkwin);
- width = Tk_Height(scrollPtr->tkwin);
- }
-
- if ((x < scrollPtr->inset) || (x >= (width - scrollPtr->inset))
- || (y < scrollPtr->inset) || (y >= (length - scrollPtr->inset))) {
- return OUTSIDE;
- }
-
- /*
- * All of the calculations in this procedure mirror those in
- * DisplayScrollbar. Be sure to keep the two consistent. On the
- * Macintosh we use the OS call TestControl to do this mapping.
- * For TestControl to work, the scrollbar must be active and must
- * be in the current port.
- */
-
- destPort = TkMacGetDrawablePort(Tk_WindowId(scrollPtr->tkwin));
- SetGWorld(destPort, NULL);
- UpdateControlValues(macScrollPtr);
- if ((**macScrollPtr->sbHandle).contrlHilite == 255) {
- inactive = true;
- (**macScrollPtr->sbHandle).contrlHilite = 0;
- }
-
- TkMacWinBounds((TkWindow *) scrollPtr->tkwin, &bounds);
- where.h = x + bounds.left;
- where.v = y + bounds.top;
- part = TestControl(((MacScrollbar *) scrollPtr)->sbHandle, where);
- if (inactive) {
- (**macScrollPtr->sbHandle).contrlHilite = 255;
- }
- switch (part) {
- case kControlUpButtonPart:
- return TOP_ARROW;
- case kControlPageUpPart:
- return TOP_GAP;
- case kControlIndicatorPart:
- return SLIDER;
- case kControlPageDownPart:
- return BOTTOM_GAP;
- case kControlDownButtonPart:
- return BOTTOM_ARROW;
- default:
- return OUTSIDE;
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ThumbActionProc --
- *
- * Callback procedure used by the Macintosh toolbox call
- * TrackControl. This call is used to track the thumb of
- * the scrollbar. Unlike the ScrollbarActionProc function
- * this function is called once and basically takes over
- * tracking the scrollbar from the control. This is done
- * to avoid conflicts with what the control plans to draw.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May change the display.
- *
- *--------------------------------------------------------------
- */
-
-static pascal void
-ThumbActionProc()
-{
- register TkScrollbar *scrollPtr = activeScrollPtr;
- register MacScrollbar *macScrollPtr = (MacScrollbar *) activeScrollPtr;
- Tcl_DString cmdString;
- Rect nullRect = {0,0,0,0};
- int origValue, trackBarPin;
- double thumbWidth, newFirstFraction, trackBarSize;
- char vauleString[40];
- Point currentPoint = { 0, 0 };
- Point lastPoint = { 0, 0 };
- Rect trackRect;
- Tcl_Interp *interp;
-
- if (scrollPtr == NULL) {
- return;
- }
-
- Tcl_DStringInit(&cmdString);
-
- /*
- * First compute values that will remain constant during the tracking
- * of the thumb. The variable trackBarSize is the length of the scrollbar
- * minus the 2 arrows and half the width of the thumb on both sides
- * (3 * arrowLength). The variable trackBarPin is the lower starting point
- * of the drag region.
- *
- * Note: the arrowLength is equal to the thumb width of a Mac scrollbar.
- */
- origValue = GetControlValue(macScrollPtr->sbHandle);
- trackRect = (**macScrollPtr->sbHandle).contrlRect;
- if (scrollPtr->vertical == true) {
- trackBarSize = (double) (trackRect.bottom - trackRect.top
- - (scrollPtr->arrowLength * 3));
- trackBarPin = trackRect.top + scrollPtr->arrowLength
- + (scrollPtr->arrowLength / 2);
- InsetRect(&trackRect, -25, -113);
-
- } else {
- trackBarSize = (double) (trackRect.right - trackRect.left
- - (scrollPtr->arrowLength * 3));
- trackBarPin = trackRect.left + scrollPtr->arrowLength
- + (scrollPtr->arrowLength / 2);
- InsetRect(&trackRect, -113, -25);
- }
-
- /*
- * Track the mouse while the button is held down. If the mouse is moved,
- * we calculate the value that should be passed to the "command" part of
- * the scrollbar.
- */
- while (StillDown()) {
- GetMouse(&currentPoint);
- if (EqualPt(currentPoint, lastPoint)) {
- continue;
- }
- lastPoint = currentPoint;
-
- /*
- * Calculating this value is a little tricky. We need to calculate a
- * value for where the thumb would be in a Motif widget (variable
- * thumb). This value is what the "command" expects and is what will
- * be resent to the scrollbar to update its value.
- */
- thumbWidth = scrollPtr->lastFraction - scrollPtr->firstFraction;
- if (PtInRect(currentPoint, &trackRect)) {
- if (scrollPtr->vertical == true) {
- newFirstFraction = (1.0 - thumbWidth) *
- ((double) (currentPoint.v - trackBarPin) / trackBarSize);
- } else {
- newFirstFraction = (1.0 - thumbWidth) *
- ((double) (currentPoint.h - trackBarPin) / trackBarSize);
- }
- } else {
- newFirstFraction = ((double) origValue / 1000.0)
- * (1.0 - thumbWidth);
- }
-
- sprintf(vauleString, "%g", newFirstFraction);
-
- Tcl_DStringSetLength(&cmdString, 0);
- Tcl_DStringAppend(&cmdString, scrollPtr->command,
- scrollPtr->commandSize);
- Tcl_DStringAppendElement(&cmdString, "moveto");
- Tcl_DStringAppendElement(&cmdString, vauleString);
-
- interp = scrollPtr->interp;
- Tcl_Preserve((ClientData) interp);
- Tcl_GlobalEval(interp, cmdString.string);
- Tcl_Release((ClientData) interp);
-
- Tcl_DStringSetLength(&cmdString, 0);
- Tcl_DStringAppend(&cmdString, "update idletasks",
- strlen("update idletasks"));
- Tcl_Preserve((ClientData) interp);
- Tcl_GlobalEval(interp, cmdString.string);
- Tcl_Release((ClientData) interp);
- }
-
- /*
- * This next bit of code is a bit of a hack - but needed. The problem is
- * that the control wants to draw the drag outline if the control value
- * changes during the drag (which it does). What we do here is change the
- * clip region to hide this drawing from the user.
- */
- ClipRect(&nullRect);
-
- Tcl_DStringFree(&cmdString);
- return;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ScrollbarActionProc --
- *
- * Callback procedure used by the Macintosh toolbox call
- * TrackControl. This call will update the display while
- * the scrollbar is being manipulated by the user.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May change the display.
- *
- *--------------------------------------------------------------
- */
-
-static pascal void
-ScrollbarActionProc(
- ControlRef theControl, /* Handle to scrollbat control */
- ControlPartCode partCode) /* Part of scrollbar that was "hit" */
-{
- register TkScrollbar *scrollPtr = (TkScrollbar *) GetControlReference(theControl);
- Tcl_DString cmdString;
-
- Tcl_DStringInit(&cmdString);
- Tcl_DStringAppend(&cmdString, scrollPtr->command,
- scrollPtr->commandSize);
-
- if (partCode == kControlUpButtonPart || partCode == kControlDownButtonPart) {
- Tcl_DStringAppendElement(&cmdString, "scroll");
- Tcl_DStringAppendElement(&cmdString,
- (partCode == kControlUpButtonPart ) ? "-1" : "1");
- Tcl_DStringAppendElement(&cmdString, "unit");
- } else if (partCode == kControlPageUpPart || partCode == kControlPageDownPart) {
- Tcl_DStringAppendElement(&cmdString, "scroll");
- Tcl_DStringAppendElement(&cmdString,
- (partCode == kControlPageUpPart ) ? "-1" : "1");
- Tcl_DStringAppendElement(&cmdString, "page");
- }
- Tcl_Preserve((ClientData) scrollPtr->interp);
- Tcl_DStringAppend(&cmdString, "; update idletasks",
- strlen("; update idletasks"));
- Tcl_GlobalEval(scrollPtr->interp, cmdString.string);
- Tcl_Release((ClientData) scrollPtr->interp);
-
- Tcl_DStringFree(&cmdString);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ScrollbarBindProc --
- *
- * This procedure is invoked when the default <ButtonPress>
- * binding on the Scrollbar bind tag fires.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The event enters a modal loop.
- *
- *--------------------------------------------------------------
- */
-
-static int
-ScrollbarBindProc(
- ClientData clientData, /* Not used. */
- Tcl_Interp *interp, /* Interp with binding. */
- XEvent *eventPtr, /* X event that triggered binding. */
- Tk_Window tkwin, /* Target window for event. */
- KeySym keySym) /* The KeySym if a key event. */
-{
- TkWindow *winPtr = (TkWindow*)tkwin;
- TkScrollbar *scrollPtr = (TkScrollbar *) winPtr->instanceData;
- MacScrollbar *macScrollPtr = (MacScrollbar *) winPtr->instanceData;
-
- Tcl_Preserve((ClientData)scrollPtr);
- macScrollPtr->macFlags |= IN_MODAL_LOOP;
-
- if (eventPtr->type == ButtonPress) {
- Point where;
- Rect bounds;
- int part, x, y, dummy;
- unsigned int state;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- Window window;
-
- /*
- * To call Macintosh control routines we must have the port
- * set to the window containing the control. We will then test
- * which part of the control was hit and act accordingly.
- */
- destPort = TkMacGetDrawablePort(Tk_WindowId(scrollPtr->tkwin));
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacSetUpClippingRgn(Tk_WindowId(scrollPtr->tkwin));
-
- TkMacWinBounds((TkWindow *) scrollPtr->tkwin, &bounds);
- where.h = eventPtr->xbutton.x + bounds.left;
- where.v = eventPtr->xbutton.y + bounds.top;
- part = TestControl(macScrollPtr->sbHandle, where);
- if (part == kControlIndicatorPart && scrollPtr->jump == false) {
- /*
- * Case 1: In thumb, no jump scrolling. Call track control
- * with the thumb action proc which will do most of the work.
- * Set the global activeScrollPtr to the current control
- * so the callback may have access to it.
- */
- activeScrollPtr = scrollPtr;
- part = TrackControl(macScrollPtr->sbHandle, where,
- (ControlActionUPP) thumbActionProc);
- activeScrollPtr = NULL;
- } else if (part == kControlIndicatorPart) {
- /*
- * Case 2: in thumb with jump scrolling. Call TrackControl
- * with a NULL action proc. Use the new value of the control
- * to set update the control.
- */
- part = TrackControl(macScrollPtr->sbHandle, where, NULL);
- if (part == kControlIndicatorPart) {
- double newFirstFraction, thumbWidth;
- Tcl_DString cmdString;
- char vauleString[TCL_DOUBLE_SPACE];
-
- /*
- * The following calculation takes the new control
- * value and maps it to what Tk needs for its variable
- * thumb size representation.
- */
- thumbWidth = scrollPtr->lastFraction
- - scrollPtr->firstFraction;
- newFirstFraction = (1.0 - thumbWidth) *
- ((double) GetControlValue(macScrollPtr->sbHandle) / 1000.0);
- sprintf(vauleString, "%g", newFirstFraction);
-
- Tcl_DStringInit(&cmdString);
- Tcl_DStringAppend(&cmdString, scrollPtr->command,
- strlen(scrollPtr->command));
- Tcl_DStringAppendElement(&cmdString, "moveto");
- Tcl_DStringAppendElement(&cmdString, vauleString);
- Tcl_DStringAppend(&cmdString, "; update idletasks",
- strlen("; update idletasks"));
-
- interp = scrollPtr->interp;
- Tcl_Preserve((ClientData) interp);
- Tcl_GlobalEval(interp, cmdString.string);
- Tcl_Release((ClientData) interp);
- Tcl_DStringFree(&cmdString);
- }
- } else if (part != 0) {
- /*
- * Case 3: in any other part of the scrollbar. We call
- * TrackControl with the scrollActionProc which will do
- * most all the work.
- */
- TrackControl(macScrollPtr->sbHandle, where, scrollActionProc);
- HiliteControl(macScrollPtr->sbHandle, 0);
- }
-
- /*
- * The TrackControl call will "eat" the ButtonUp event. We now
- * generate a ButtonUp event so Tk will unset implicit grabs etc.
- */
- GetMouse(&where);
- XQueryPointer(NULL, None, &window, &window, &x,
- &y, &dummy, &dummy, &state);
- window = Tk_WindowId(scrollPtr->tkwin);
- TkGenerateButtonEvent(x, y, window, state);
-
- SetGWorld(saveWorld, saveDevice);
- }
-
- if (macScrollPtr->sbHandle && (macScrollPtr->macFlags & ALREADY_DEAD)) {
- DisposeControl(macScrollPtr->sbHandle);
- macScrollPtr->sbHandle = NULL;
- }
- macScrollPtr->macFlags &= ~IN_MODAL_LOOP;
- Tcl_Release((ClientData)scrollPtr);
-
- return TCL_OK;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ScrollbarEventProc --
- *
- * This procedure is invoked by the Tk dispatcher for various
- * events on scrollbars.
- *
- * Results:
- * None.
- *
- * Side effects:
- * When the window gets deleted, internal structures get
- * cleaned up. When it gets exposed, it is redisplayed.
- *
- *--------------------------------------------------------------
- */
-
-static void
-ScrollbarEventProc(
- ClientData clientData, /* Information about window. */
- XEvent *eventPtr) /* Information about event. */
-{
- TkScrollbar *scrollPtr = (TkScrollbar *) clientData;
- MacScrollbar *macScrollPtr = (MacScrollbar *) clientData;
-
- if (eventPtr->type == UnmapNotify) {
- TkMacSetScrollbarGrow((TkWindow *) scrollPtr->tkwin, false);
- } else if (eventPtr->type == ActivateNotify) {
- macScrollPtr->macFlags |= ACTIVE;
- TkScrollbarEventuallyRedraw((ClientData) scrollPtr);
- } else if (eventPtr->type == DeactivateNotify) {
- macScrollPtr->macFlags &= ~ACTIVE;
- TkScrollbarEventuallyRedraw((ClientData) scrollPtr);
- } else {
- TkScrollbarEventProc(clientData, eventPtr);
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * UpdateControlValues --
- *
- * This procedure updates the Macintosh scrollbar control
- * to display the values defined by the Tk scrollbar.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The Macintosh control is updated.
- *
- *--------------------------------------------------------------
- */
-
-static void
-UpdateControlValues(
- MacScrollbar *macScrollPtr) /* Scrollbar data struct. */
-{
- TkScrollbar *scrollPtr = (TkScrollbar *) macScrollPtr;
- Tk_Window tkwin = scrollPtr->tkwin;
- MacDrawable * macDraw = (MacDrawable *) Tk_WindowId(scrollPtr->tkwin);
- WindowRef windowRef = (**macScrollPtr->sbHandle).contrlOwner;
- double middle;
- int drawGrowRgn = false;
- int flushRight = false;
- int flushBottom = false;
-
- /*
- * We can't use the Macintosh commands SizeControl and MoveControl as these
- * calls will also cause a redraw which in our case will also cause
- * flicker. To avoid this we adjust the control record directly. The
- * Draw1Control command appears to just draw where ever the control says to
- * draw so this seems right.
- *
- * NOTE: changing the control record directly may not work when
- * Apple releases the Copland version of the MacOS (or when hell is cold).
- */
-
- (**macScrollPtr->sbHandle).contrlRect.left = macDraw->xOff + scrollPtr->inset;
- (**macScrollPtr->sbHandle).contrlRect.top = macDraw->yOff + scrollPtr->inset;
- (**macScrollPtr->sbHandle).contrlRect.right = macDraw->xOff + Tk_Width(tkwin)
- - scrollPtr->inset;
- (**macScrollPtr->sbHandle).contrlRect.bottom = macDraw->yOff +
- Tk_Height(tkwin) - scrollPtr->inset;
-
- /*
- * To make Tk applications look more like Macintosh applications without
- * requiring additional work by the Tk developer we do some cute tricks.
- * The first trick plays with the size of the widget to get it to overlap
- * with the side of the window by one pixel (we don't do this if the placer
- * is the geometry manager). The second trick shrinks the scrollbar if it
- * it covers the area of the grow region ao the scrollbar can also draw
- * the grow region if need be.
- */
- if (!strcmp(macDraw->winPtr->geomMgrPtr->name, "place")) {
- macScrollPtr->macFlags &= AUTO_ADJUST;
- } else {
- macScrollPtr->macFlags |= AUTO_ADJUST;
- }
- /* TODO: use accessor function!!! */
- if (windowRef->portRect.left == (**macScrollPtr->sbHandle).contrlRect.left) {
- if (macScrollPtr->macFlags & AUTO_ADJUST) {
- (**macScrollPtr->sbHandle).contrlRect.left--;
- }
- if (!(macScrollPtr->macFlags & FLUSH_LEFT)) {
- macScrollPtr->macFlags |= FLUSH_LEFT;
- if (scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
- } else if (macScrollPtr->macFlags & FLUSH_LEFT) {
- macScrollPtr->macFlags &= ~FLUSH_LEFT;
- if (scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
-
- if (windowRef->portRect.top == (**macScrollPtr->sbHandle).contrlRect.top) {
- if (macScrollPtr->macFlags & AUTO_ADJUST) {
- (**macScrollPtr->sbHandle).contrlRect.top--;
- }
- if (!(macScrollPtr->macFlags & FLUSH_TOP)) {
- macScrollPtr->macFlags |= FLUSH_TOP;
- if (! scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
- } else if (macScrollPtr->macFlags & FLUSH_TOP) {
- macScrollPtr->macFlags &= ~FLUSH_TOP;
- if (! scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
-
- if (windowRef->portRect.right == (**macScrollPtr->sbHandle).contrlRect.right) {
- flushRight = true;
- if (macScrollPtr->macFlags & AUTO_ADJUST) {
- (**macScrollPtr->sbHandle).contrlRect.right++;
- }
- if (!(macScrollPtr->macFlags & FLUSH_RIGHT)) {
- macScrollPtr->macFlags |= FLUSH_RIGHT;
- if (scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
- } else if (macScrollPtr->macFlags & FLUSH_RIGHT) {
- macScrollPtr->macFlags &= ~FLUSH_RIGHT;
- if (scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
-
- if (windowRef->portRect.bottom == (**macScrollPtr->sbHandle).contrlRect.bottom) {
- flushBottom = true;
- if (macScrollPtr->macFlags & AUTO_ADJUST) {
- (**macScrollPtr->sbHandle).contrlRect.bottom++;
- }
- if (!(macScrollPtr->macFlags & FLUSH_BOTTOM)) {
- macScrollPtr->macFlags |= FLUSH_BOTTOM;
- if (! scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
- } else if (macScrollPtr->macFlags & FLUSH_BOTTOM) {
- macScrollPtr->macFlags &= ~FLUSH_BOTTOM;
- if (! scrollPtr->vertical) {
- TkpComputeScrollbarGeometry(scrollPtr);
- }
- }
-
- /*
- * If the scrollbar is flush against the bottom right hand coner then
- * it may need to draw the grow region for the window so we let the
- * wm code know about this scrollbar. We don't actually draw the grow
- * region, however, unless we are currently resizable.
- */
- macScrollPtr->macFlags &= ~DRAW_GROW;
- if (flushBottom && flushRight) {
- TkMacSetScrollbarGrow((TkWindow *) tkwin, true);
- if (TkMacResizable(macDraw->toplevel->winPtr)) {
- if (scrollPtr->vertical) {
- (**macScrollPtr->sbHandle).contrlRect.bottom -= 14;
- } else {
- (**macScrollPtr->sbHandle).contrlRect.right -= 14;
- }
- macScrollPtr->macFlags |= DRAW_GROW;
- }
- } else {
- TkMacSetScrollbarGrow((TkWindow *) tkwin, false);
- }
-
- /*
- * Given the Tk parameters for the fractions of the start and
- * end of the thumb, the following calculation determines the
- * location for the fixed sized Macintosh thumb.
- */
- middle = scrollPtr->firstFraction / (scrollPtr->firstFraction +
- (1.0 - scrollPtr->lastFraction));
-
- (**macScrollPtr->sbHandle).contrlValue = (short) (middle * 1000);
- if ((**macScrollPtr->sbHandle).contrlHilite == 0 ||
- (**macScrollPtr->sbHandle).contrlHilite == 255) {
- if (scrollPtr->firstFraction == 0.0 &&
- scrollPtr->lastFraction == 1.0) {
- (**macScrollPtr->sbHandle).contrlHilite = 255;
- } else {
- (**macScrollPtr->sbHandle).contrlHilite = 0;
- }
- }
- if ((**macScrollPtr->sbHandle).contrlVis != 255) {
- (**macScrollPtr->sbHandle).contrlVis = 255;
- }
-}
diff --git a/mac/tkMacSend.c b/mac/tkMacSend.c
deleted file mode 100644
index 4fa0425..0000000
--- a/mac/tkMacSend.c
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * tkMacSend.c --
- *
- * This file provides procedures that implement the "send"
- * command, allowing commands to be passed from interpreter
- * 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-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.
- */
-
-#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.
- */
-
-typedef struct RegisteredInterp {
- char *name; /* Interpreter's name (malloc-ed). */
- Tcl_Interp *interp; /* Interpreter associated with
- * name. */
- struct RegisteredInterp *nextPtr;
- /* Next in list of names associated
- * with interps in this process.
- * NULL means end of list. */
-} RegisteredInterp;
-
-/*
- * A registry of all interpreters for a display is kept in a
- * property "InterpRegistry" on the root window of the display.
- * It is organized as a series of zero or more concatenated strings
- * (in no particular order), each of the form
- * window space name '\0'
- * where "window" is the hex id of the comm. window to use to talk
- * to an interpreter named "name".
- *
- * When the registry is being manipulated by an application (e.g. to
- * add or remove an entry), it is loaded into memory using a structure
- * of the following type:
- */
-
-typedef struct NameRegistry {
- TkDisplay *dispPtr; /* Display from which the registry was
- * read. */
- int locked; /* Non-zero means that the display was
- * locked when the property was read in. */
- int modified; /* Non-zero means that the property has
- * 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, 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;
-
-static initialized = false; /* A flag to denote if we have initialized yet. */
-
-static RegisteredInterp *interpListPtr = NULL;
-/* List of all interpreters
- * registered by this process. */
-
- /*
- * The information below is used for communication between processes
- * during "send" commands. Each process keeps a private window, never
- * even mapped, with one property, "Comm". When a command is sent to
- * an interpreter, the command is appended to the comm property of the
- * communication window associated with the interp's process. Similarly,
- * when a result is returned from a sent command, it is also appended
- * to the comm property.
- *
- * Each command and each result takes the form of ASCII text. For a
- * command, the text consists of a zero character followed by several
- * null-terminated ASCII strings. The first string consists of the
- * single letter "c". Subsequent strings have the form "option value"
- * where the following options are supported:
- *
- * -r commWindow serial
- *
- * This option means that a response should be sent to the window
- * whose X identifier is "commWindow" (in hex), and the response should
- * be identified with the serial number given by "serial" (in decimal).
- * If this option isn't specified then the send is asynchronous and
- * no response is sent.
- *
- * -n name
- * "Name" gives the name of the application for which the command is
- * intended. This option must be present.
- *
- * -s script
- *
- * "Script" is the script to be executed. This option must be present.
- *
- * The options may appear in any order. The -n and -s options must be
- * present, but -r may be omitted for asynchronous RPCs. For compatibility
- * with future releases that may add new features, there may be additional
- * options present; as long as they start with a "-" character, they will
- * be ignored.
- *
- * A result also consists of a zero character followed by several null-
- * terminated ASCII strings. The first string consists of the single
- * letter "r". Subsequent strings have the form "option value" where
- * the following options are supported:
- *
- * -s serial
- *
- * Identifies the command for which this is the result. It is the
- * same as the "serial" field from the -s option in the command. This
- * option must be present.
- *
- * -c code
- *
- * "Code" is the completion code for the script, in decimal. If the
- * code is omitted it defaults to TCL_OK.
- *
- * -r result
- *
- * "Result" is the result string for the script, which may be either
- * a result or an error message. If this field is omitted then it
- * defaults to an empty string.
- *
- * -i errorInfo
- *
- * "ErrorInfo" gives a string with which to initialize the errorInfo
- * variable. This option may be omitted; it is ignored unless the
- * completion code is TCL_ERROR.
- *
- * -e errorCode
- *
- * "ErrorCode" gives a string with with to initialize the errorCode
- * variable. This option may be omitted; it is ignored unless the
- * completion code is TCL_ERROR.
- *
- * Options may appear in any order, and only the -s option must be
- * present. As with commands, there may be additional options besides
- * these; unknown options are ignored.
- */
-
- /*
- * The following variable is the serial number that was used in the
- * last "send" command. It is exported only for testing purposes.
- */
-
-int tkSendSerial = 0;
-
- /*
- * Maximum size property that can be read at one time by
- * this module:
- */
-
-#define MAX_PROP_WORDS 100000
-
-/*
- * Forward declarations for procedures defined later in this file:
- */
-
-static int AppendErrorProc _ANSI_ARGS_((ClientData clientData,
- XErrorEvent *errorPtr));
-static void DeleteProc _ANSI_ARGS_((ClientData clientData));
-static void RegAddName _ANSI_ARGS_((NameRegistry *regPtr,
- char *name, Window commWindow));
-static void RegClose _ANSI_ARGS_((NameRegistry *regPtr));
-static void RegDeleteName _ANSI_ARGS_((NameRegistry *regPtr,
- char *name));
-static Window RegFindName _ANSI_ARGS_((NameRegistry *regPtr,
- char *name));
-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));
-static Bool SendRestrictProc _ANSI_ARGS_((Display *display,
- XEvent *eventPtr, char *arg));
-static int ServerSecure _ANSI_ARGS_((TkDisplay *dispPtr));
-static void TimeoutProc _ANSI_ARGS_((ClientData clientData));
-static int ValidateName _ANSI_ARGS_((TkDisplay *dispPtr,
- char *name, Window commWindow, int oldOK));
-
-/*
- *--------------------------------------------------------------
- *
- * Tk_SetAppName --
- *
- * This procedure is called to associate an ASCII name with a Tk
- * application. If the application has already been named, the
- * name replaces the old one.
- *
- * Results:
- * The return value is the name actually given to the application.
- * This will normally be the same as name, but if name was already
- * in use for an application then a name of the form "name #2" will
- * be chosen, with a high enough number to make the name unique.
- *
- * Side effects:
- * Registration info is saved, thereby allowing the "send" command
- * to be used later to invoke commands in the application. In
- * addition, the "send" command is created in the application's
- * interpreter. The registration will be removed automatically
- * if the interpreter is deleted or the "send" command is removed.
- *
- *--------------------------------------------------------------
- */
-
-CONST char *
-Tk_SetAppName(
- Tk_Window tkwin, /* Token for any window in the application
- * to be named: it is just used to identify
- * the application and the display. */
- CONST char *name) /* The name that will be used to
- * refer to the interpreter in later
- * "send" commands. Must be globally
- * unique. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- Tcl_Interp *interp = winPtr->mainPtr->interp;
- int i, suffix, offset, result;
- int createCommand = 0;
- RegisteredInterp *riPtr, *prevPtr;
- CONST 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(Tcl_DStringValue(&dString) + 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_SendObjCmd --
- *
- * This procedure is invoked to process the "send" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *--------------------------------------------------------------
- */
-
-int
-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 */
-{
- static CONST 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_EvalObjEx(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_EvalObjEx(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;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetInterpNames --
- *
- * This procedure is invoked to fetch a list of all the
- * interpreter names currently registered for the display
- * of a particular window.
- *
- * Results:
- * A standard Tcl return value. Interp->result will be set
- * to hold a list of all the interpreter names defined for
- * tkwin's display. If an error occurs, then TCL_ERROR
- * is returned and interp->result will hold an error message.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkGetInterpNames(
- Tcl_Interp *interp, /* Interpreter for returning a result. */
- Tk_Window tkwin) /* Window whose display is to be used
- * for the lookup. */
-{
- 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;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * SendInit --
- *
- * This procedure is called to initialize the
- * communication channels for sending commands and
- * receiving results.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Sets up various data structures and windows.
- *
- *--------------------------------------------------------------
- */
-
-static int
-SendInit(
- Tcl_Interp *interp) /* Interpreter to use for error reporting
- * (no errors are ever returned, but the
- * interpreter is needed anyway). */
-{
- return TCL_OK;
-}
diff --git a/mac/tkMacSubwindows.c b/mac/tkMacSubwindows.c
deleted file mode 100644
index 80bfdaa..0000000
--- a/mac/tkMacSubwindows.c
+++ /dev/null
@@ -1,1256 +0,0 @@
-/*
- * tkMacSubwindows.c --
- *
- * Implements subwindows for the macintosh version of Tk.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include "X.h"
-#include "Xlib.h"
-#include <stdio.h>
-
-#include <Windows.h>
-#include <QDOffscreen.h>
-#include "tkMacInt.h"
-
-/*
- * Temporary region that can be reused.
- */
-static RgnHandle tmpRgn = NULL;
-
-static void UpdateOffsets _ANSI_ARGS_((TkWindow *winPtr, int deltaX, int deltaY));
-
-void tkMacMoveWindow _ANSI_ARGS_((WindowRef window, int x, int y));
-
-/*
- *----------------------------------------------------------------------
- *
- * XDestroyWindow --
- *
- * Dealocates the given X Window.
- *
- * Results:
- * The window id is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XDestroyWindow(
- Display* display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
- GWorldPtr destPort;
-
- /*
- * Remove any dangling pointers that may exist if
- * the window we are deleting is being tracked by
- * the grab code.
- */
-
- TkPointerDeadWindow(macWin->winPtr);
- macWin->toplevel->referenceCount--;
-
-
- if (Tk_IsTopLevel(macWin->winPtr)) {
- DisposeRgn(macWin->clipRgn);
- DisposeRgn(macWin->aboveClipRgn);
-
- /*
- * Delete the Mac window and remove it from the windowTable.
- * The window could be NULL if the window was never mapped.
- * However, we don't do this for embedded windows, they don't
- * go in the window list, and they do not own their portPtr's.
- */
-
- if (!(Tk_IsEmbedded(macWin->winPtr))) {
- destPort = TkMacGetDrawablePort(window);
- if (destPort != NULL) {
- TkMacWindowList *listPtr, *prevPtr;
-
- TkMacUnregisterMacWindow(destPort);
- DisposeWindow((WindowRef) destPort);
-
- for (listPtr = tkMacWindowListPtr, prevPtr = NULL;
- tkMacWindowListPtr != NULL;
- prevPtr = listPtr, listPtr = listPtr->nextPtr) {
- if (listPtr->winPtr == macWin->winPtr) {
- if (prevPtr == NULL) {
- tkMacWindowListPtr = listPtr->nextPtr;
- } else {
- prevPtr->nextPtr = listPtr->nextPtr;
- }
- ckfree((char *) listPtr);
- break;
- }
- }
- }
- }
-
- macWin->portPtr = NULL;
-
- /*
- * Delay deletion of a toplevel data structure untill all
- * children have been deleted.
- */
- if (macWin->toplevel->referenceCount == 0) {
- ckfree((char *) macWin->toplevel);
- }
- } else {
- destPort = TkMacGetDrawablePort(window);
- if (destPort != NULL) {
- SetGWorld(destPort, NULL);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
- }
- if (macWin->winPtr->parentPtr != NULL) {
- TkMacInvalClipRgns(macWin->winPtr->parentPtr);
- }
- DisposeRgn(macWin->clipRgn);
- DisposeRgn(macWin->aboveClipRgn);
-
- if (macWin->toplevel->referenceCount == 0) {
- ckfree((char *) macWin->toplevel);
- }
- ckfree((char *) macWin);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMapWindow --
- *
- * Map the given X Window to the screen. See X window documentation
- * for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The subwindow or toplevel may appear on the screen.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMapWindow(
- Display* display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
- XEvent event;
- GWorldPtr destPort;
-
- /*
- * Under certain situations it's possible for this function to be
- * called before the toplevel window it's associated with has actually
- * been mapped. In that case we need to create the real Macintosh
- * window now as this function as well as other X functions assume that
- * the portPtr is valid.
- */
- if (!TkMacHostToplevelExists(macWin->toplevel->winPtr)) {
- TkMacMakeRealWindowExist(macWin->toplevel->winPtr);
- }
- destPort = TkMacGetDrawablePort(window);
-
- display->request++;
- macWin->winPtr->flags |= TK_MAPPED;
- if (Tk_IsTopLevel(macWin->winPtr)) {
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- ShowWindow((WindowRef) destPort);
- }
-
- /*
- * We only need to send the MapNotify event
- * for toplevel windows.
- */
- event.xany.serial = display->request;
- event.xany.send_event = False;
- event.xany.display = display;
-
- event.xmap.window = window;
- event.xmap.type = MapNotify;
- event.xmap.event = window;
- event.xmap.override_redirect = macWin->winPtr->atts.override_redirect;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- } else {
- TkMacInvalClipRgns(macWin->winPtr->parentPtr);
- }
-
- /*
- * Generate damage for that area of the window
- */
- SetGWorld(destPort, NULL);
- TkMacUpdateClipRgn(macWin->winPtr);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XUnmapWindow --
- *
- * Unmap the given X Window to the screen. See X window
- * documentation for more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The subwindow or toplevel may be removed from the screen.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XUnmapWindow(
- Display* display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
- XEvent event;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(window);
-
- display->request++;
- macWin->winPtr->flags &= ~TK_MAPPED;
- if (Tk_IsTopLevel(macWin->winPtr)) {
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- HideWindow((WindowRef) destPort);
- }
-
- /*
- * We only need to send the UnmapNotify event
- * for toplevel windows.
- */
- event.xany.serial = display->request;
- event.xany.send_event = False;
- event.xany.display = display;
-
- event.xunmap.type = UnmapNotify;
- event.xunmap.window = window;
- event.xunmap.event = window;
- event.xunmap.from_configure = false;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- } else {
- /*
- * Generate damage for that area of the window.
- */
- SetGWorld(destPort, NULL);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW); /* TODO: may not be valid */
- TkMacInvalClipRgns(macWin->winPtr->parentPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XResizeWindow --
- *
- * Resize a given X window. See X windows documentation for
- * further details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XResizeWindow(
- Display* display, /* Display. */
- Window window, /* Window. */
- unsigned int width,
- unsigned int height)
-{
- MacDrawable *macWin = (MacDrawable *) window;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(window);
- if (destPort == NULL) {
- return;
- }
-
- display->request++;
- SetPort((GrafPtr) destPort);
- if (Tk_IsTopLevel(macWin->winPtr)) {
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- /*
- * NOTE: we are not adding the new space to the update
- * region. It is currently assumed that Tk will need
- * to completely redraw anway.
- */
- SizeWindow((WindowRef) destPort,
- (short) width, (short) height, false);
- TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY);
- TkMacInvalClipRgns(macWin->winPtr);
- } else {
- int deltaX, deltaY;
-
- /*
- * Find the Parent window -
- * For an embedded window this will be its container.
- */
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(macWin->winPtr);
-
- if (contWinPtr != NULL) {
- MacDrawable *macParent = contWinPtr->privatePtr;
-
- TkMacInvalClipRgns(macParent->winPtr);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
-
- deltaX = macParent->xOff +
- macWin->winPtr->changes.x - macWin->xOff;
- deltaY = macParent->yOff +
- macWin->winPtr->changes.y - macWin->yOff;
-
- UpdateOffsets(macWin->winPtr, deltaX, deltaY);
- } else {
- /*
- * This is the case where we are embedded in
- * another app. At this point, we are assuming that
- * the changes.x,y is not maintained, if you need
- * the info get it from Tk_GetRootCoords,
- * and that the toplevel sits at 0,0 when it is drawn.
- */
-
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
- UpdateOffsets(macWin->winPtr, 0, 0);
- }
-
- }
- } else {
- /* TODO: update all xOff & yOffs */
- int deltaX, deltaY, parentBorderwidth;
- MacDrawable *macParent = macWin->winPtr->parentPtr->privatePtr;
-
- if (macParent == NULL) {
- return; /* TODO: Probably should be a panic */
- }
-
- TkMacInvalClipRgns(macParent->winPtr);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
-
- deltaX = - macWin->xOff;
- deltaY = - macWin->yOff;
-
- parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width;
-
- deltaX += macParent->xOff + parentBorderwidth +
- macWin->winPtr->changes.x;
- deltaY += macParent->yOff + parentBorderwidth +
- macWin->winPtr->changes.y;
-
- UpdateOffsets(macWin->winPtr, deltaX, deltaY);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveResizeWindow --
- *
- * Move or resize a given X window. See X windows documentation
- * for further details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveResizeWindow(
- Display* display, /* Display. */
- Window window, /* Window. */
- int x, int y,
- unsigned int width,
- unsigned int height)
-{
- MacDrawable *macWin = (MacDrawable *) window;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(window);
- if (destPort == NULL) {
- return;
- }
-
- SetPort((GrafPtr) destPort);
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- /*
- * NOTE: we are not adding the new space to the update
- * region. It is currently assumed that Tk will need
- * to completely redraw anway.
- */
-
- SizeWindow((WindowRef) destPort,
- (short) width, (short) height, false);
- tkMacMoveWindow((WindowRef) destPort, x, y);
-
- /* TODO: is the following right? */
- TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY);
- TkMacInvalClipRgns(macWin->winPtr);
- } else {
- int deltaX, deltaY, parentBorderwidth;
- Rect bounds;
- MacDrawable *macParent;
-
- /*
- * Find the Parent window -
- * For an embedded window this will be its container.
- */
-
- if (Tk_IsEmbedded(macWin->winPtr)) {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(macWin->winPtr);
- if (contWinPtr == NULL) {
- panic("XMoveResizeWindow could not find container");
- }
- macParent = contWinPtr->privatePtr;
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
-
- } else {
- macParent = macWin->winPtr->parentPtr->privatePtr;
- if (macParent == NULL) {
- return; /* TODO: Probably should be a panic */
- }
- }
-
- TkMacInvalClipRgns(macParent->winPtr);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
-
- deltaX = - macWin->xOff;
- deltaY = - macWin->yOff;
-
- /*
- * If macWin->winPtr is an embedded window, don't offset by its
- * parent's borderwidth...
- */
-
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width;
- } else {
- parentBorderwidth = 0;
- }
- deltaX += macParent->xOff + parentBorderwidth +
- macWin->winPtr->changes.x;
- deltaY += macParent->yOff + parentBorderwidth +
- macWin->winPtr->changes.y;
-
- UpdateOffsets(macWin->winPtr, deltaX, deltaY);
- TkMacWinBounds(macWin->winPtr, &bounds);
- InvalRect(&bounds);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveWindow --
- *
- * Move a given X window. See X windows documentation for further
- * details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveWindow(
- Display* display, /* Display. */
- Window window, /* Window. */
- int x,
- int y)
-{
- MacDrawable *macWin = (MacDrawable *) window;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(window);
- if (destPort == NULL) {
- return;
- }
-
- SetPort((GrafPtr) destPort);
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- /*
- * NOTE: we are not adding the new space to the update
- * region. It is currently assumed that Tk will need
- * to completely redraw anway.
- */
- tkMacMoveWindow((WindowRef) destPort, x, y);
-
- /* TODO: is the following right? */
- TkMacInvalidateWindow(macWin, TK_WINDOW_ONLY);
- TkMacInvalClipRgns(macWin->winPtr);
- } else {
- int deltaX, deltaY, parentBorderwidth;
- Rect bounds;
- MacDrawable *macParent;
-
- /*
- * Find the Parent window -
- * For an embedded window this will be its container.
- */
-
- if (Tk_IsEmbedded(macWin->winPtr)) {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(macWin->winPtr);
- if (contWinPtr == NULL) {
- panic("XMoveWindow could not find container");
- }
- macParent = contWinPtr->privatePtr;
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- } else {
- macParent = macWin->winPtr->parentPtr->privatePtr;
- if (macParent == NULL) {
- return; /* TODO: Probably should be a panic */
- }
- }
-
- TkMacInvalClipRgns(macParent->winPtr);
- TkMacInvalidateWindow(macWin, TK_PARENT_WINDOW);
-
- deltaX = - macWin->xOff;
- deltaY = - macWin->yOff;
-
- /*
- * If macWin->winPtr is an embedded window, don't offset by its
- * parent's borderwidth...
- */
-
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width;
- } else {
- parentBorderwidth = 0;
- }
- deltaX += macParent->xOff + parentBorderwidth +
- macWin->winPtr->changes.x;
- deltaY += macParent->yOff + parentBorderwidth +
- macWin->winPtr->changes.y;
-
- UpdateOffsets(macWin->winPtr, deltaX, deltaY);
- TkMacWinBounds(macWin->winPtr, &bounds);
- InvalRect(&bounds);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XRaiseWindow --
- *
- * Change the stacking order of a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the stacking order of the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XRaiseWindow(
- Display* display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
-
- display->request++;
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- TkWmRestackToplevel(macWin->winPtr, Above, NULL);
- } else {
- /* TODO: this should generate damage */
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XConfigureWindow --
- *
- * Change the size, position, stacking, or border of the specified
- * window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the attributes of the specified window. Note that we
- * ignore the passed in values and use the values stored in the
- * TkWindow data structure.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XConfigureWindow(
- Display* display, /* Display. */
- Window w, /* Window. */
- unsigned int value_mask,
- XWindowChanges* values)
-{
- MacDrawable *macWin = (MacDrawable *) w;
- TkWindow *winPtr = macWin->winPtr;
-
- display->request++;
-
- /*
- * Change the shape and/or position of the window.
- */
-
- if (value_mask & (CWX|CWY|CWWidth|CWHeight)) {
- XMoveResizeWindow(display, w, winPtr->changes.x, winPtr->changes.y,
- winPtr->changes.width, winPtr->changes.height);
- }
-
- /*
- * Change the stacking order of the window. Tk actuall keeps all
- * the information we need for stacking order. All we need to do
- * is make sure the clipping regions get updated and generate damage
- * that will ensure things get drawn correctly.
- */
-
- if (value_mask & CWStackMode) {
- Rect bounds;
- GWorldPtr destPort;
-
- destPort = TkMacGetDrawablePort(w);
- if (destPort != NULL) {
- SetPort((GrafPtr) destPort);
- TkMacInvalClipRgns(winPtr->parentPtr);
- TkMacWinBounds(winPtr, &bounds);
- InvalRect(&bounds);
- }
- }
-
- /* TkGenWMMoveRequestEvent(macWin->winPtr,
- macWin->winPtr->changes.x, macWin->winPtr->changes.y); */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacUpdateClipRgn --
- *
- * This function updates the cliping regions for a given window
- * and all of its children. Once updated the TK_CLIP_INVALID flag
- * in the subwindow data structure is unset. The TK_CLIP_INVALID
- * flag should always be unset before any drawing is attempted.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The clip regions for the window and its children are updated.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacUpdateClipRgn(
- TkWindow *winPtr)
-{
- RgnHandle rgn;
- int x, y;
- TkWindow *win2Ptr;
-
- if (winPtr == NULL) {
- return;
- }
-
- if (winPtr->privatePtr->flags & TK_CLIP_INVALID) {
- rgn = winPtr->privatePtr->aboveClipRgn;
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
-
- /*
- * Start with a region defined by the window bounds.
- */
-
- x = winPtr->privatePtr->xOff;
- y = winPtr->privatePtr->yOff;
- SetRectRgn(rgn, (short) x, (short) y,
- (short) (winPtr->changes.width + x),
- (short) (winPtr->changes.height + y));
-
- /*
- * Clip away the area of any windows that may obscure this
- * window.
- * For a non-toplevel window, first, clip to the parents visable
- * clip region.
- * Second, clip away any siblings that are higher in the
- * stacking order.
- * For an embedded toplevel, just clip to the container's visible
- * clip region. Remember, we only allow one contained window
- * in a frame, and don't support any other widgets in the frame either.
- * This is not currently enforced, however.
- */
-
- if (!Tk_TopWinHierarchy(winPtr)) {
- TkMacUpdateClipRgn(winPtr->parentPtr);
- SectRgn(rgn,
- winPtr->parentPtr->privatePtr->aboveClipRgn, rgn);
-
- win2Ptr = winPtr->nextPtr;
- while (win2Ptr != NULL) {
- if (Tk_TopWinHierarchy(win2Ptr) || !Tk_IsMapped(win2Ptr)) {
- win2Ptr = win2Ptr->nextPtr;
- continue;
- }
- x = win2Ptr->privatePtr->xOff;
- y = win2Ptr->privatePtr->yOff;
- SetRectRgn(tmpRgn, (short) x, (short) y,
- (short) (win2Ptr->changes.width + x),
- (short) (win2Ptr->changes.height + y));
- DiffRgn(rgn, tmpRgn, rgn);
-
- win2Ptr = win2Ptr->nextPtr;
- }
- } else if (Tk_IsEmbedded(winPtr)) {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(winPtr);
-
- if (contWinPtr != NULL) {
- TkMacUpdateClipRgn(contWinPtr);
- SectRgn(rgn,
- contWinPtr->privatePtr->aboveClipRgn, rgn);
- } else if (gMacEmbedHandler != NULL) {
- gMacEmbedHandler->getClipProc((Tk_Window) winPtr, tmpRgn);
- SectRgn(rgn, tmpRgn, rgn);
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-
- /*
- * The final clip region is the aboveClip region (or visable
- * region) minus all the children of this window.
- * Alternatively, if the window is a container, we must also
- * subtract the region of the embedded window.
- */
-
- rgn = winPtr->privatePtr->clipRgn;
- CopyRgn(winPtr->privatePtr->aboveClipRgn, rgn);
-
- win2Ptr = winPtr->childList;
- while (win2Ptr != NULL) {
- if (Tk_TopWinHierarchy(win2Ptr) || !Tk_IsMapped(win2Ptr)) {
- win2Ptr = win2Ptr->nextPtr;
- continue;
- }
- x = win2Ptr->privatePtr->xOff;
- y = win2Ptr->privatePtr->yOff;
- SetRectRgn(tmpRgn, (short) x, (short) y,
- (short) (win2Ptr->changes.width + x),
- (short) (win2Ptr->changes.height + y));
- DiffRgn(rgn, tmpRgn, rgn);
-
- win2Ptr = win2Ptr->nextPtr;
- }
-
- if (Tk_IsContainer(winPtr)) {
- win2Ptr = TkpGetOtherWindow(winPtr);
- if (win2Ptr != NULL) {
- if (Tk_IsMapped(win2Ptr)) {
- x = win2Ptr->privatePtr->xOff;
- y = win2Ptr->privatePtr->yOff;
- SetRectRgn(tmpRgn, (short) x, (short) y,
- (short) (win2Ptr->changes.width + x),
- (short) (win2Ptr->changes.height + y));
- DiffRgn(rgn, tmpRgn, rgn);
- }
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-
- winPtr->privatePtr->flags &= ~TK_CLIP_INVALID;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacVisableClipRgn --
- *
- * This function returnd the Macintosh cliping region for the
- * given window. A NULL Rgn means the window is not visable.
- *
- * Results:
- * The region.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-RgnHandle
-TkMacVisableClipRgn(
- TkWindow *winPtr)
-{
- if (winPtr->privatePtr->flags & TK_CLIP_INVALID) {
- TkMacUpdateClipRgn(winPtr);
- }
-
- return winPtr->privatePtr->clipRgn;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacInvalidateWindow --
- *
- * This function makes the window as invalid will generate damage
- * for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Damage is created.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacInvalidateWindow(
- MacDrawable *macWin, /* Make window that's causing damage. */
- int flag) /* Should be TK_WINDOW_ONLY or
- * TK_PARENT_WINDOW */
-{
-
- if (flag == TK_WINDOW_ONLY) {
- InvalRgn(macWin->clipRgn);
- } else {
- if (!EmptyRgn(macWin->aboveClipRgn)) {
- InvalRgn(macWin->aboveClipRgn);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGetDrawablePort --
- *
- * This function returns the Graphics Port for a given X drawable.
- *
- * Results:
- * A GWorld pointer. Either an off screen pixmap or a Window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-GWorldPtr
-TkMacGetDrawablePort(
- Drawable drawable)
-{
- MacDrawable *macWin = (MacDrawable *) drawable;
- GWorldPtr resultPort = NULL;
-
- if (macWin == NULL) {
- return NULL;
- }
-
- /*
- * This is NULL for off-screen pixmaps. Then the portPtr
- * always points to the off-screen port, and we don't
- * have to worry about containment
- */
-
- if (macWin->clipRgn == NULL) {
- return macWin->portPtr;
- }
-
- /*
- * If the Drawable is in an embedded window, use the Port of its container.
- *
- * TRICKY POINT: we can have cases when a toplevel is being destroyed
- * where the winPtr for the toplevel has been freed, but the children
- * are not all the way destroyed. The children will call this function
- * as they are being destroyed, but Tk_IsEmbedded will return garbage.
- * So we check the copy of the TK_EMBEDDED flag we put into the
- * toplevel's macWin flags.
- */
-
- if (!(macWin->toplevel->flags & TK_EMBEDDED)) {
- return macWin->toplevel->portPtr;
- } else {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr);
-
- if (contWinPtr != NULL) {
- resultPort = TkMacGetDrawablePort(
- (Drawable) contWinPtr->privatePtr);
- } else if (gMacEmbedHandler != NULL) {
- resultPort = gMacEmbedHandler->getPortProc(
- (Tk_Window) macWin->winPtr);
- }
-
- if (resultPort == NULL) {
- /*
- * FIXME:
- *
- * So far as I can tell, the only time that this happens is when
- * we are tearing down an embedded child interpreter, and most
- * of the time, this is harmless... However, we really need to
- * find why the embedding loses.
- */
- DebugStr("\pTkMacGetDrawablePort couldn't find container");
- return NULL;
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
- return resultPort;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacInvalClipRgns --
- *
- * This function invalidates the clipping regions for a given
- * window and all of its children. This function should be
- * called whenever changes are made to subwindows that would
- * effect the size or position of windows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The cliping regions for the window and its children are
- * mark invalid. (Make sure they are valid before drawing.)
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacInvalClipRgns(
- TkWindow *winPtr)
-{
- TkWindow *childPtr;
-
- /*
- * If already marked we can stop because all
- * decendants will also already be marked.
- */
- if (winPtr->privatePtr->flags & TK_CLIP_INVALID) {
- return;
- }
-
- winPtr->privatePtr->flags |= TK_CLIP_INVALID;
-
- /*
- * Invalidate clip regions for all children &
- * their decendants - unless the child is a toplevel.
- */
- childPtr = winPtr->childList;
- while (childPtr != NULL) {
- if (!Tk_TopWinHierarchy(childPtr) && Tk_IsMapped(childPtr)) {
- TkMacInvalClipRgns(childPtr);
- }
- childPtr = childPtr->nextPtr;
- }
-
- /*
- * Also, if the window is a container, mark its embedded window
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
-
- if (childPtr != NULL && Tk_IsMapped(childPtr)) {
- TkMacInvalClipRgns(childPtr);
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacWinBounds --
- *
- * Given a Tk window this function determines the windows
- * bounds in relation to the Macintosh window's coordinate
- * system. This is also the same coordinate system as the
- * Tk toplevel window in which this window is contained.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacWinBounds(
- TkWindow *winPtr,
- Rect *bounds)
-{
- bounds->left = (short) winPtr->privatePtr->xOff;
- bounds->top = (short) winPtr->privatePtr->yOff;
- bounds->right = (short) (winPtr->privatePtr->xOff +
- winPtr->changes.width);
- bounds->bottom = (short) (winPtr->privatePtr->yOff +
- winPtr->changes.height);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * tkMacMoveWindow --
- *
- * A replacement for the Macintosh MoveWindow function. This
- * function adjusts the inputs to MoveWindow to offset the root of
- * the window system. This has the effect of making the coords
- * refer to the window dressing rather than the top of the content.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Moves the Macintosh window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-tkMacMoveWindow(
- WindowRef window,
- int x,
- int y)
-{
- int xOffset, yOffset;
-
- if (TkMacHaveAppearance() >= 0x110) {
- MoveWindowStructure((WindowRef) window, (short) x, (short) y);
- } else {
- TkMacWindowOffset(window, &xOffset, &yOffset);
- MoveWindow((WindowRef) window,
- (short) (x + xOffset), (short) (y + yOffset), false);
-}
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * UpdateOffsets --
- *
- * Updates the X & Y offsets of the given TkWindow from the
- * TopLevel it is a decendant of.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The xOff & yOff fields for the Mac window datastructure
- * is updated to the proper offset.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-UpdateOffsets(
- TkWindow *winPtr,
- int deltaX,
- int deltaY)
-{
- TkWindow *childPtr;
-
- if (winPtr->privatePtr == NULL) {
- /*
- * We havn't called Tk_MakeWindowExist for this window yet. The
- * offset information will be postponed and calulated at that
- * time. (This will usually only happen when a mapped parent is
- * being moved but has child windows that have yet to be mapped.)
- */
- return;
- }
-
- winPtr->privatePtr->xOff += deltaX;
- winPtr->privatePtr->yOff += deltaY;
-
- childPtr = winPtr->childList;
- while (childPtr != NULL) {
- if (!Tk_TopWinHierarchy(childPtr)) {
- UpdateOffsets(childPtr, deltaX, deltaY);
- }
- childPtr = childPtr->nextPtr;
- }
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL) {
- UpdateOffsets(childPtr,deltaX,deltaY);
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetPixmap --
- *
- * Creates an in memory drawing surface.
- *
- * Results:
- * Returns a handle to a new pixmap.
- *
- * Side effects:
- * Allocates a new Macintosh GWorld.
- *
- *----------------------------------------------------------------------
- */
-
-Pixmap
-Tk_GetPixmap(
- Display *display, /* Display for new pixmap (can be null). */
- Drawable d, /* Drawable where pixmap will be used (ignored). */
- int width, /* Dimensions of pixmap. */
- int height,
- int depth) /* Bits per pixel for pixmap. */
-{
- QDErr err;
- GWorldPtr gWorld;
- Rect bounds;
- MacDrawable *macPix;
- PixMapHandle pixels;
-
- if (display != NULL) {
- display->request++;
- }
- macPix = (MacDrawable *) ckalloc(sizeof(MacDrawable));
- macPix->winPtr = NULL;
- macPix->xOff = 0;
- macPix->yOff = 0;
- macPix->clipRgn = NULL;
- macPix->aboveClipRgn = NULL;
- macPix->referenceCount = 0;
- macPix->toplevel = NULL;
- macPix->flags = 0;
-
- bounds.top = bounds.left = 0;
- bounds.right = (short) width;
- bounds.bottom = (short) height;
- if (depth != 1) {
- depth = 0;
- }
-
- /*
- * Allocate memory for the off screen pixmap. If we fail
- * try again from system memory. Eventually, we may have
- * to panic.
- */
- err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, 0);
- if (err != noErr) {
- err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, useTempMem);
- }
- if (err != noErr) {
- panic("Out of memory: NewGWorld failed in Tk_GetPixmap");
- }
-
- /*
- * Lock down the pixels so they don't move out from under us.
- */
- pixels = GetGWorldPixMap(gWorld);
- LockPixels(pixels);
- macPix->portPtr = gWorld;
-
- return (Pixmap) macPix;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_FreePixmap --
- *
- * Release the resources associated with a pixmap.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Deletes the Macintosh GWorld created by Tk_GetPixmap.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_FreePixmap(
- Display *display, /* Display. */
- Pixmap pixmap) /* Pixmap to destroy */
-{
- MacDrawable *macPix = (MacDrawable *) pixmap;
- PixMapHandle pixels;
-
- display->request++;
- pixels = GetGWorldPixMap(macPix->portPtr);
- UnlockPixels(pixels);
- DisposeGWorld(macPix->portPtr);
- ckfree((char *) macPix);
-}
-
diff --git a/mac/tkMacTclCode.r b/mac/tkMacTclCode.r
deleted file mode 100644
index 53d427f..0000000
--- a/mac/tkMacTclCode.r
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * tkMacTclCode.r --
- *
- * This file creates resources from the Tcl code that is
- * usually stored in the TCL_LIBRARY
- *
- * 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.
- */
-
-#include <Types.r>
-#include <SysTypes.r>
-
-#define TK_LIBRARY_RESOURCES 3000
-
-/*
- * The mechanisim below loads Tcl source into the resource fork of the
- * application. The example below creates a TEXT resource named
- * "Init" from the file "init.tcl". This allows applications to use
- * Tcl to define the behavior of the application without having to
- * require some predetermined file structure - all needed Tcl "files"
- * are located within the application. To source a file for the
- * resource fork the source command has been modified to support
- * sourcing from resources. In the below case "source -rsrc {Init}"
- * will load the TEXT resource named "Init".
- */
-
-read 'TEXT' (TK_LIBRARY_RESOURCES+1, "tk", purgeable,preload)
- "::library:tk.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+2, "button", purgeable)
- "::library:button.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+3, "dialog", purgeable)
- "::library:dialog.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+4, "entry", purgeable)
- "::library:entry.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+5, "focus", purgeable)
- "::library:focus.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+6, "listbox", purgeable)
- "::library:listbox.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+7, "menu", purgeable)
- "::library:menu.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+8, "optMenu", purgeable)
- "::library:optMenu.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+9, "palette", purgeable)
- "::library:palette.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+10, "scale", purgeable)
- "::library:scale.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+11, "scrlbar", purgeable)
- "::library:scrlbar.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+12, "tearoff", purgeable)
- "::library:tearoff.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+13, "text", purgeable)
- "::library:text.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+14, "bgerror", purgeable)
- "::library:bgerror.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+15, "console", purgeable)
- "::library:console.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+16, "msgbox", purgeable)
- "::library:msgbox.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+17, "comdlg", purgeable)
- "::library:comdlg.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+18, "spinbox", purgeable)
- "::library:spinbox.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+19, "panedwindow", purgeable)
- "::library:panedwindow.tcl";
-read 'TEXT' (TK_LIBRARY_RESOURCES+20, "msgcat", purgeable)
- ":::tcl:library:msgcat:msgcat.tcl";
diff --git a/mac/tkMacTest.c b/mac/tkMacTest.c
deleted file mode 100644
index 3ee3f11..0000000
--- a/mac/tkMacTest.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * tkMacTest.c --
- *
- * Contains commands for platform specific tests for
- * the Macintosh platform.
- *
- * Copyright (c) 1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-#include <Types.h>
-#include <tcl.h>
-
-/*
- * Forward declarations of procedures defined later in this file:
- */
-
-int TkplatformtestInit _ANSI_ARGS_((Tcl_Interp *interp));
-static int DebuggerCmd _ANSI_ARGS_((ClientData dummy,
- Tcl_Interp *interp, int argc, CONST char **argv));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkplatformtestInit --
- *
- * Defines commands that test platform specific functionality for
- * Unix platforms.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * Defines new commands.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkplatformtestInit(
- Tcl_Interp *interp) /* Interpreter to add commands to. */
-{
- /*
- * Add commands for platform specific tests on MacOS here.
- */
-
- Tcl_CreateCommand(interp, "debugger", DebuggerCmd,
- (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DebuggerCmd --
- *
- * This procedure simply calls the low level debugger.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-DebuggerCmd(
- ClientData clientData, /* Not used. */
- Tcl_Interp *interp, /* Not used. */
- int argc, /* Not used. */
- CONST char **argv) /* Not used. */
-{
- Debugger();
- return TCL_OK;
-}
diff --git a/mac/tkMacWindowMgr.c b/mac/tkMacWindowMgr.c
deleted file mode 100644
index 68019c0..0000000
--- a/mac/tkMacWindowMgr.c
+++ /dev/null
@@ -1,1789 +0,0 @@
-/*
- * tkMacWindowMgr.c --
- *
- * Implements common window manager functions for the Macintosh.
- *
- * 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.
- */
-
-#include <Events.h>
-#include <Dialogs.h>
-#include <EPPC.h>
-#include <Windows.h>
-#include <ToolUtils.h>
-#include <DiskInit.h>
-#include <LowMem.h>
-#include <Timer.h>
-#include <Sound.h>
-
-#include "tkInt.h"
-#include "tkPort.h"
-#include "tkMacInt.h"
-
-#define TK_DEFAULT_ABOUT 128
-
-/*
- * Declarations of global variables defined in this file.
- */
-
-int tkMacAppInFront = true; /* Boolean variable for determining
- * if we are the frontmost app. */
-
-/*
- * Non-standard event types that can be passed to HandleEvent.
- * These are defined and used by Netscape's plugin architecture.
- */
-#define getFocusEvent (osEvt + 16)
-#define loseFocusEvent (osEvt + 17)
-#define adjustCursorEvent (osEvt + 18)
-
-/*
- * Declarations of static variables used in this file.
- */
-
-static int gEatButtonUp = 0; /* 1 if we need to eat the next
- * up event */
-static Tk_Window gGrabWinPtr = NULL; /* Current grab window, NULL if no grab. */
-static Tk_Window gKeyboardWinPtr = NULL; /* Current keyboard grab window. */
-static RgnHandle gDamageRgn = NULL; /* Damage region used for handling
- * screen updates. */
-/*
- * Forward declarations of procedures used in this file.
- */
-
-static void BringWindowForward _ANSI_ARGS_((WindowRef wRef));
-static int CheckEventsAvail _ANSI_ARGS_((void));
-static int GenerateActivateEvents _ANSI_ARGS_((EventRecord *eventPtr,
- Window window));
-static int GenerateFocusEvent _ANSI_ARGS_((EventRecord *eventPtr,
- Window window));
-static int GenerateKeyEvent _ANSI_ARGS_((EventRecord *eventPtr,
- Window window, UInt32 savedCode));
-static int GenerateUpdateEvent _ANSI_ARGS_((EventRecord *eventPtr,
- Window window));
-static void GenerateUpdates _ANSI_ARGS_((RgnHandle updateRgn,
- TkWindow *winPtr));
-static int GeneratePollingEvents _ANSI_ARGS_((void));
-static int GeneratePollingEvents2 _ANSI_ARGS_((Window window,
- int adjustCursor));
-static OSErr TellWindowDefProcToCalcRegions _ANSI_ARGS_((WindowRef wRef));
-static int WindowManagerMouse _ANSI_ARGS_((EventRecord *theEvent,
- Window window));
-
-
-/*
- *----------------------------------------------------------------------
- *
- * WindowManagerMouse --
- *
- * This function determines if a button event is a "Window Manager"
- * function or an event that should be passed to Tk's event
- * queue.
- *
- * Results:
- * Return true if event was placed on Tk's event queue.
- *
- * Side effects:
- * Depends on where the button event occurs.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WindowManagerMouse(
- EventRecord *eventPtr, /* Macintosh event record. */
- Window window) /* Window pointer. */
-{
- WindowRef whichWindow, frontWindow, frontNonFloating;
- Tk_Window tkwin;
- Point where, where2;
- int xOffset, yOffset;
- short windowPart;
- TkDisplay *dispPtr;
-
- frontWindow = FrontWindow();
- if (TkMacHaveAppearance() >= 0x110) {
- frontNonFloating = FrontNonFloatingWindow();
- } else {
- frontNonFloating = frontWindow;
- }
-
- /*
- * The window manager only needs to know about mouse down events
- * and sometimes we need to "eat" the mouse up. Otherwise, we
- * just pass the event to Tk.
- */
- if (eventPtr->what == mouseUp) {
- if (gEatButtonUp) {
- gEatButtonUp = false;
- return false;
- }
- return TkGenerateButtonEvent(eventPtr->where.h, eventPtr->where.v,
- window, TkMacButtonKeyState());
- }
-
- windowPart = FindWindow(eventPtr->where, &whichWindow);
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- switch (windowPart) {
- case inSysWindow:
- SystemClick(eventPtr, (GrafPort *) whichWindow);
- return false;
- case inDrag:
- if (!(TkpIsWindowFloating(whichWindow)) && (whichWindow != frontNonFloating)) {
- if (!(eventPtr->modifiers & cmdKey)) {
- if ((gGrabWinPtr != NULL) && (gGrabWinPtr != tkwin)) {
- SysBeep(1);
- return false;
- }
- }
- }
-
- /*
- * Call DragWindow to move the window around. It will
- * also eat the mouse up event.
- */
- SetPort((GrafPort *) whichWindow);
- where.h = where.v = 0;
- LocalToGlobal(&where);
- DragWindow(whichWindow, eventPtr->where,
- &tcl_macQdPtr->screenBits.bounds);
- gEatButtonUp = false;
-
- where2.h = where2.v = 0;
- LocalToGlobal(&where2);
- if (EqualPt(where, where2)) {
- return false;
- }
-
- TkMacWindowOffset(whichWindow, &xOffset, &yOffset);
- where2.h -= xOffset;
- where2.v -= yOffset;
- TkGenWMConfigureEvent(tkwin, where2.h, where2.v,
- -1, -1, TK_LOCATION_CHANGED);
- return true;
- case inGrow:
- case inContent:
- if (!(TkpIsWindowFloating(whichWindow))
- && (whichWindow != frontNonFloating)) {
- /*
- * This click moves the window forward. We don't want
- * the corasponding mouse-up to be reported to the application
- * or else it will mess up some Tk scripts.
- */
- if ((gGrabWinPtr != NULL) && (gGrabWinPtr != tkwin)) {
- SysBeep(1);
- return false;
- }
- gEatButtonUp = true;
- SetPort((GrafPort *) whichWindow);
- BringWindowForward(whichWindow);
- return false;
- } else {
- /*
- * Generally the content region is the domain of Tk
- * sub-windows. However, one exception is the grow
- * region. A button down in this area will be handled
- * by the window manager. Note: this means that Tk
- * may not get button down events in this area!
- */
-
- if (TkMacGrowToplevel(whichWindow, eventPtr->where) == true) {
- return true;
- } else {
- return TkGenerateButtonEvent(eventPtr->where.h,
- eventPtr->where.v, window, TkMacButtonKeyState());
- }
- }
- case inGoAway:
- if (TrackGoAway( whichWindow, eventPtr->where)) {
- if (tkwin == NULL) {
- return false;
- }
- TkGenWMDestroyEvent(tkwin);
- return true;
- }
- return false;
- case inMenuBar:
- {
- int oldMode;
- KeyMap theKeys;
-
- GetKeys(theKeys);
- oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
- TkMacClearMenubarActive();
- /*
- * Handle -postcommand
- */
- TkMacPreprocessMenu();
- TkMacHandleMenuSelect(MenuSelect(eventPtr->where),
- theKeys[1] & 4);
- Tcl_SetServiceMode(oldMode);
- return true; /* TODO: may not be on event on queue. */
- }
- case inZoomIn:
- case inZoomOut:
- if (TkMacZoomToplevel(whichWindow, eventPtr->where, windowPart)
- == true) {
- return true;
- } else {
- return false;
- }
- default:
- return false;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkAboutDlg --
- *
- * Displays the default Tk About box. This code uses Macintosh
- * resources to define the content of the About Box.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkAboutDlg()
-{
- DialogPtr aboutDlog;
- short itemHit = -9;
-
- aboutDlog = GetNewDialog(128, NULL, (void*)(-1));
-
- if (!aboutDlog) {
- return;
- }
-
- SelectWindow((WindowRef) aboutDlog);
-
- while (itemHit != 1) {
- ModalDialog( NULL, &itemHit);
- }
- DisposeDialog(aboutDlog);
- aboutDlog = NULL;
-
- if (TkMacHaveAppearance() >= 0x110) {
- SelectWindow(FrontNonFloatingWindow());
- } else {
- SelectWindow(FrontWindow());
- }
-
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateUpdateEvent --
- *
- * Given a Macintosh update event this function generates all the
- * X update events needed by Tk.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateUpdateEvent(
- EventRecord *eventPtr, /* Incoming Mac event */
- Window window) /* Root X window for event. */
-{
- WindowRef macWindow;
- register TkWindow *winPtr;
- TkDisplay *dispPtr;
-
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
-
- if (winPtr == NULL) {
- return false;
- }
-
- if (gDamageRgn == NULL) {
- gDamageRgn = NewRgn();
- }
-
- /*
- * After the call to BeginUpdate the visable region (visRgn) of the
- * window is equal to the intersection of the real visable region and
- * the update region for this event. We use this region in all of our
- * calculations.
- */
-
- if (eventPtr->message != NULL) {
- macWindow = (WindowRef) TkMacGetDrawablePort(window);
- BeginUpdate(macWindow);
- GenerateUpdates(macWindow->visRgn, winPtr);
- EndUpdate(macWindow);
- return true;
- } else {
- /*
- * This event didn't come from the system. This might
- * occur if we are running from inside of Netscape.
- * In this we shouldn't call BeginUpdate as the vis region
- * may be NULL.
- */
- RgnHandle rgn;
- Rect bounds;
-
- rgn = NewRgn();
- TkMacWinBounds(winPtr, &bounds);
- RectRgn(rgn, &bounds);
- GenerateUpdates(rgn, winPtr);
- DisposeRgn(rgn);
- return true;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateUpdates --
- *
- * Given a Macintosh update region and a Tk window this function
- * geneates a X damage event for the window if it is within the
- * update region. The function will then recursivly have each
- * damaged window generate damage events for its child windows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-GenerateUpdates(
- RgnHandle updateRgn,
- TkWindow *winPtr)
-{
- TkWindow *childPtr;
- XEvent event;
- Rect bounds;
-
- TkMacWinBounds(winPtr, &bounds);
-
- if (bounds.top > (*updateRgn)->rgnBBox.bottom ||
- (*updateRgn)->rgnBBox.top > bounds.bottom ||
- bounds.left > (*updateRgn)->rgnBBox.right ||
- (*updateRgn)->rgnBBox.left > bounds.right ||
- !RectInRgn(&bounds, updateRgn)) {
- return;
- }
-
- event.xany.serial = Tk_Display(winPtr)->request;
- event.xany.send_event = false;
- event.xany.window = Tk_WindowId(winPtr);
- event.xany.display = Tk_Display(winPtr);
-
- event.type = Expose;
-
- /*
- * Compute the bounding box of the area that the damage occured in.
- */
-
- /*
- * CopyRgn(TkMacVisableClipRgn(winPtr), rgn);
- * TODO: this call doesn't work doing resizes!!!
- */
- RectRgn(gDamageRgn, &bounds);
- SectRgn(gDamageRgn, updateRgn, gDamageRgn);
- OffsetRgn(gDamageRgn, -bounds.left, -bounds.top);
- event.xexpose.x = (**gDamageRgn).rgnBBox.left;
- event.xexpose.y = (**gDamageRgn).rgnBBox.top;
- event.xexpose.width = (**gDamageRgn).rgnBBox.right -
- (**gDamageRgn).rgnBBox.left;
- event.xexpose.height = (**gDamageRgn).rgnBBox.bottom -
- (**gDamageRgn).rgnBBox.top;
- event.xexpose.count = 0;
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- /*
- * Generate updates for the children of this window
- */
-
- for (childPtr = winPtr->childList; childPtr != NULL;
- childPtr = childPtr->nextPtr) {
- if (!Tk_IsMapped(childPtr) || Tk_TopWinHierarchy(childPtr)) {
- continue;
- }
-
- GenerateUpdates(updateRgn, childPtr);
- }
-
- /*
- * Generate updates for any contained windows
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL && Tk_IsMapped(childPtr)) {
- GenerateUpdates(updateRgn, childPtr);
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGenerateButtonEvent --
- *
- * Given a global x & y position and the button key status this
- * procedure generates the appropiate X button event. It also
- * handles the state changes needed to implement implicit grabs.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- * Grab state may also change.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkGenerateButtonEvent(
- int x, /* X location of mouse */
- int y, /* Y location of mouse */
- Window window, /* X Window containing button event. */
- unsigned int state) /* Button Key state suitable for X event */
-{
- WindowRef whichWin, frontWin;
- Point where;
- Tk_Window tkwin;
- int dummy;
- TkDisplay *dispPtr;
-
- /*
- * ButtonDown events will always occur in the front
- * window. ButtonUp events, however, may occur anywhere
- * on the screen. ButtonUp events should only be sent
- * to Tk if in the front window or during an implicit grab.
- */
- where.h = x;
- where.v = y;
- FindWindow(where, &whichWin);
- if (TkMacHaveAppearance() >= 0x110) {
- frontWin = FrontNonFloatingWindow();
- } else {
- frontWin = FrontWindow();
- }
-
- if ((frontWin == NULL) || ((!(TkpIsWindowFloating(whichWin)) && (frontWin != whichWin))
- && gGrabWinPtr == NULL)) {
- return false;
- }
-
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
-
- GlobalToLocal(&where);
- if (tkwin != NULL) {
- tkwin = Tk_TopCoordsToWindow(tkwin, where.h, where.v, &dummy, &dummy);
- }
-
- Tk_UpdatePointer(tkwin, x, y, state);
-
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateActivateEvents --
- *
- * Generate Activate/Deactivate events from a Macintosh Activate
- * event. Note, the activate-on-foreground bit must be set in the
- * SIZE flags to ensure we get Activate/Deactivate in addition to
- * Susspend/Resume events.
- *
- * Results:
- * Returns true if events were generate.
- *
- * Side effects:
- * Queue events on Tk's event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateActivateEvents(
- EventRecord *eventPtr, /* Incoming Mac event */
- Window window) /* Root X window for event. */
-{
- TkWindow *winPtr;
- TkDisplay *dispPtr;
-
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
- if (winPtr == NULL || winPtr->window == None) {
- return false;
- }
-
- TkGenerateActivateEvents(winPtr,
- (eventPtr->modifiers & activeFlag) ? 1 : 0);
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XSetInputFocus --
- *
- * Change the focus window for the application.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XSetInputFocus(
- Display* display,
- Window focus,
- int revert_to,
- Time time)
-{
- /*
- * Don't need to do a thing. Tk manages the focus for us.
- */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpChangeFocus --
- *
- * This procedure is a stub on the Mac because we always own the
- * focus if we are a front most application.
- *
- * Results:
- * The return value is the serial number of the command that
- * changed the focus. It may be needed by the caller to filter
- * out focus change events that were queued before the command.
- * If the procedure doesn't actually change the focus then
- * it returns 0.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpChangeFocus(winPtr, force)
- TkWindow *winPtr; /* Window that is to receive the X focus. */
- int force; /* Non-zero means claim the focus even
- * if it didn't originally belong to
- * topLevelPtr's application. */
-{
- /*
- * We don't really need to do anything on the Mac. Tk will
- * keep all this state for us.
- */
-
- if (winPtr->atts.override_redirect) {
- return 0;
- }
-
- /*
- * Remember the current serial number for the X server and issue
- * a dummy server request. This marks the position at which we
- * changed the focus, so we can distinguish FocusIn and FocusOut
- * events on either side of the mark.
- */
-
- return NextRequest(winPtr->display);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateFocusEvent --
- *
- * Generate FocusIn/FocusOut events from a Macintosh Activate
- * event. Note, the activate-on-foreground bit must be set in
- * the SIZE flags to ensure we get Activate/Deactivate in addition
- * to Susspend/Resume events.
- *
- * Results:
- * Returns true if events were generate.
- *
- * Side effects:
- * Queue events on Tk's event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateFocusEvent(
- EventRecord *eventPtr, /* Incoming Mac event */
- Window window) /* Root X window for event. */
-{
- XEvent event;
- Tk_Window tkwin;
- TkDisplay *dispPtr;
-
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- if (tkwin == NULL) {
- return false;
- }
-
- /*
- * Generate FocusIn and FocusOut events. This event
- * is only sent to the toplevel window.
- */
-
- if (eventPtr->modifiers & activeFlag) {
- event.xany.type = FocusIn;
- } else {
- event.xany.type = FocusOut;
- }
-
- event.xany.serial = dispPtr->display->request;
- event.xany.send_event = False;
- event.xfocus.display = dispPtr->display;
- event.xfocus.window = window;
- event.xfocus.mode = NotifyNormal;
- event.xfocus.detail = NotifyDetailNone;
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateKeyEvent --
- *
- * Given Macintosh keyUp, keyDown & autoKey events this function
- * generates the appropiate X key events. The window that is passed
- * should represent the frontmost window - which will recieve the
- * event.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateKeyEvent(
- EventRecord *eventPtr, /* Incoming Mac 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.
- */
-
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
-
- if (tkwin == NULL) {
- return false;
- }
- 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;
-
- event.xany.send_event = False;
- event.xkey.same_screen = true;
- event.xkey.subwindow = None;
- event.xkey.time = TkpGetMS();
-
- event.xkey.x_root = where.h;
- event.xkey.y_root = where.v;
- GlobalToLocal(&where);
- Tk_TopCoordsToWindow(tkwin, where.h, where.v,
- &event.xkey.x, &event.xkey.y);
-
- event.xkey.keycode = byte |
- ((savedKeyCode & charCodeMask) << 8) |
- ((eventPtr->message & keyCodeMask) << 8);
-
- event.xany.serial = Tk_Display(tkwin)->request;
- event.xkey.window = Tk_WindowId(tkwin);
- event.xkey.display = Tk_Display(tkwin);
- event.xkey.root = XRootWindow(Tk_Display(tkwin), 0);
- event.xkey.state = TkMacButtonKeyState();
-
- if (eventPtr->what == keyDown) {
- event.xany.type = KeyPress;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- } else if (eventPtr->what == keyUp) {
- event.xany.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- } else {
- /*
- * Autokey events send multiple XKey events.
- *
- * Note: the last KeyRelease will always be missed with
- * this scheme. However, most Tk scripts don't look for
- * KeyUp events so we should be OK.
- */
- event.xany.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.xany.type = KeyPress;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- }
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GeneratePollingEvents --
- *
- * This function polls the mouse position and generates X Motion,
- * Enter & Leave events. The cursor is also updated at this
- * time.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- * The cursor may be changed.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GeneratePollingEvents()
-{
- Tk_Window tkwin, rootwin;
- Window window;
- WindowRef whichWindow, frontWin, frontNonFloating;
- Point whereLocal, whereGlobal;
- Boolean inContentRgn;
- 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).
- */
- frontWin = FrontWindow();
- if (frontWin == NULL) {
- return false;
- }
- SetPort((GrafPort *) frontWin);
-
- GetMouse(&whereLocal);
- whereGlobal = whereLocal;
- LocalToGlobal(&whereGlobal);
-
- part = FindWindow(whereGlobal, &whichWindow);
- inContentRgn = (part == inContent || part == inGrow);
-
- if (TkMacHaveAppearance() >= 0x110) {
- /*
- * If the mouse is over the front non-floating window, then we
- * need to set the local coordinates relative to that window
- * rather than a possibly floating window above it.
- */
-
- frontNonFloating = FrontNonFloatingWindow();
- if (whichWindow == frontNonFloating
- && (whichWindow != frontWin)) {
- SetPort((GrafPort *) frontNonFloating);
- whereLocal = whereGlobal;
- GlobalToLocal(&whereLocal);
- }
- } else {
- frontNonFloating = frontWin;
- }
-
- if ((!TkpIsWindowFloating(whichWindow) && (frontNonFloating != whichWindow)) || !inContentRgn) {
- tkwin = NULL;
- } else {
- window = TkMacGetXWindow(whichWindow);
- dispPtr = TkGetDisplayList();
- rootwin = Tk_IdToWindow(dispPtr->display, window);
- if (rootwin == NULL) {
- tkwin = NULL;
- } else {
- tkwin = Tk_TopCoordsToWindow(rootwin, whereLocal.h, whereLocal.v,
- &local_x, &local_y);
- }
- }
-
- /*
- * The following call will generate the appropiate X events and
- * adjust any state that Tk must remember.
- */
-
- if ((tkwin == NULL) && (gGrabWinPtr != NULL)) {
- tkwin = gGrabWinPtr;
- }
- Tk_UpdatePointer(tkwin, whereGlobal.h, whereGlobal.v,
- TkMacButtonKeyState());
-
- /*
- * Finally, we make sure the proper cursor is installed. The installation
- * is polled to 1) make our resize hack work, and 2) make sure we have the
- * proper cursor even if someone else changed the cursor out from under
- * us.
- */
- if ((gGrabWinPtr == NULL) && (part == inGrow) &&
- TkMacResizable((TkWindow *) tkwin) &&
- (TkMacGetScrollbarGrowWindow((TkWindow *) tkwin) == NULL)) {
- TkMacInstallCursor(1);
- } else {
- TkMacInstallCursor(0);
- }
-
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GeneratePollingEvents2 --
- *
- * This function polls the mouse position and generates X Motion,
- * Enter & Leave events. The cursor is also updated at this
- * time. NOTE: this version is for Netscape!!!
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- * The cursor may be changed.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GeneratePollingEvents2(
- Window window,
- int adjustCursor)
-{
- Tk_Window tkwin, rootwin;
- WindowRef whichwindow, frontWin;
- Point whereLocal, whereGlobal;
- int local_x, local_y;
- int generatedEvents = false;
- Rect bounds;
- TkDisplay *dispPtr;
-
- /*
- * First we get the current mouse position and determine
- * what Tk window the mouse is over (if any).
- */
- frontWin = FrontWindow();
- if (frontWin == NULL) {
- return false;
- }
- SetPort((GrafPort *) frontWin);
-
- GetMouse(&whereLocal);
- whereGlobal = whereLocal;
- LocalToGlobal(&whereGlobal);
-
- /*
- * Determine if we are in a Tk window or not.
- */
- whichwindow = (WindowRef) TkMacGetDrawablePort(window);
- if (whichwindow != frontWin) {
- tkwin = NULL;
- } else {
- dispPtr = TkGetDisplayList();
- rootwin = Tk_IdToWindow(dispPtr->display, window);
- TkMacWinBounds((TkWindow *) rootwin, &bounds);
- if (!PtInRect(whereLocal, &bounds)) {
- tkwin = NULL;
- } else {
- tkwin = Tk_TopCoordsToWindow(rootwin, whereLocal.h, whereLocal.v,
- &local_x, &local_y);
- }
- }
-
-
- /*
- * The following call will generate the appropiate X events and
- * adjust any state that Tk must remember.
- */
-
- if ((tkwin == NULL) && (gGrabWinPtr != NULL)) {
- tkwin = gGrabWinPtr;
- }
- Tk_UpdatePointer(tkwin, whereGlobal.h, whereGlobal.v,
- TkMacButtonKeyState());
-
- /*
- * Finally, we make sure the proper cursor is installed. The installation
- * is polled to 1) make our resize hack work, and 2) make sure we have the
- * proper cursor even if someone else changed the cursor out from under
- * us.
- */
-
- if (adjustCursor) {
- TkMacInstallCursor(0);
- }
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacButtonKeyState --
- *
- * Returns the current state of the button & modifier keys.
- *
- * Results:
- * A bitwise inclusive OR of a subset of the following:
- * Button1Mask, ShiftMask, LockMask, ControlMask, Mod?Mask,
- * Mod?Mask.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-unsigned int
-TkMacButtonKeyState()
-{
- unsigned int state = 0;
- KeyMap theKeys;
-
- if (Button() & !gEatButtonUp) {
- state |= Button1Mask;
- }
-
- GetKeys(theKeys);
-
- if (theKeys[1] & 2) {
- state |= LockMask;
- }
-
- if (theKeys[1] & 1) {
- state |= ShiftMask;
- }
-
- if (theKeys[1] & 8) {
- state |= ControlMask;
- }
-
- if (theKeys[1] & 32768) {
- state |= Mod1Mask; /* command key */
- }
-
- if (theKeys[1] & 4) {
- state |= Mod2Mask; /* option key */
- }
-
- return state;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XGrabKeyboard --
- *
- * Simulates a keyboard grab by setting the focus.
- *
- * Results:
- * Always returns GrabSuccess.
- *
- * Side effects:
- * Sets the keyboard focus to the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-int
-XGrabKeyboard(
- Display* display,
- Window grab_window,
- Bool owner_events,
- int pointer_mode,
- int keyboard_mode,
- Time time)
-{
- gKeyboardWinPtr = Tk_IdToWindow(display, grab_window);
- return GrabSuccess;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XUngrabKeyboard --
- *
- * Releases the simulated keyboard grab.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Sets the keyboard focus back to the value before the grab.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XUngrabKeyboard(
- Display* display,
- Time time)
-{
- gKeyboardWinPtr = NULL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XQueryPointer --
- *
- * Check the current state of the mouse. This is not a complete
- * implementation of this function. It only computes the root
- * coordinates and the current mask.
- *
- * Results:
- * Sets root_x_return, root_y_return, and mask_return. Returns
- * true on success.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Bool
-XQueryPointer(
- Display* display,
- Window w,
- Window* root_return,
- Window* child_return,
- int* root_x_return,
- int* root_y_return,
- int* win_x_return,
- int* win_y_return,
- unsigned int* mask_return)
-{
- Point where;
-
- GetMouse(&where);
- LocalToGlobal(&where);
- *root_x_return = where.h;
- *root_y_return = where.v;
- *mask_return = TkMacButtonKeyState();
- return True;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGenerateTime --
- *
- * Returns the total number of ticks from startup This function
- * is used to generate the time of generated X events.
- *
- * Results:
- * Returns the current time (ticks from startup).
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Time
-TkMacGenerateTime()
-{
- return (Time) LMGetTicks();
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacConvertEvent --
- *
- * This function converts a Macintosh event into zero or more
- * Tcl events.
- *
- * Results:
- * Returns 1 if event added to Tcl queue, 0 otherwse.
- *
- * Side effects:
- * May add events to Tcl's event queue.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacConvertEvent(
- EventRecord *eventPtr)
-{
- WindowRef whichWindow;
- Window window;
- int eventFound = false;
- static UInt32 savedKeyCode;
-
- switch (eventPtr->what) {
- case nullEvent:
- case adjustCursorEvent:
- if (GeneratePollingEvents()) {
- eventFound = true;
- }
- break;
- case updateEvt:
- whichWindow = (WindowRef)eventPtr->message;
- window = TkMacGetXWindow(whichWindow);
- if (GenerateUpdateEvent(eventPtr, window)) {
- eventFound = true;
- }
- break;
- case mouseDown:
- case mouseUp:
- FindWindow(eventPtr->where, &whichWindow);
- window = TkMacGetXWindow(whichWindow);
- if (WindowManagerMouse(eventPtr, window)) {
- eventFound = true;
- }
- break;
- case autoKey:
- case keyDown:
- /*
- * Handle menu-key events here. If it is *not*
- * a menu key - just fall through to handle as a
- * normal key event.
- */
- if ((eventPtr->modifiers & cmdKey) == cmdKey) {
- long menuResult;
- int oldMode;
-
- oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
- menuResult = MenuKey(eventPtr->message & charCodeMask);
- Tcl_SetServiceMode(oldMode);
-
- if (HiWord(menuResult) != 0) {
- TkMacHandleMenuSelect(menuResult, false);
- break;
- }
- }
- /* fall through */
-
- case keyUp:
- if (TkMacHaveAppearance() >= 0x110) {
- whichWindow = FrontNonFloatingWindow();
- } else {
- 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);
- 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);
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case getFocusEvent:
- eventPtr->modifiers |= activeFlag;
- window = TkMacGetXWindow((WindowRef) eventPtr->message);
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case loseFocusEvent:
- eventPtr->modifiers &= ~activeFlag;
- window = TkMacGetXWindow((WindowRef) eventPtr->message);
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case kHighLevelEvent:
- TkMacDoHLEvent(eventPtr);
- /* TODO: should return true if events were placed on event queue. */
- break;
- case osEvt:
- /*
- * Do clipboard conversion.
- */
- switch ((eventPtr->message & osEvtMessageMask) >> 24) {
- case mouseMovedMessage:
- if (GeneratePollingEvents()) {
- eventFound = true;
- }
- break;
- case suspendResumeMessage:
- if (!(eventPtr->message & resumeFlag)) {
- TkSuspendClipboard();
- }
- tkMacAppInFront = (eventPtr->message & resumeFlag);
- if (TkMacHaveAppearance() >= 0x110) {
- if (tkMacAppInFront) {
- ShowFloatingWindows();
- } else {
- HideFloatingWindows();
- }
- }
- break;
- }
- break;
- case diskEvt:
- /*
- * Disk insertion.
- */
- if (HiWord(eventPtr->message) != noErr) {
- Point pt;
-
- DILoad();
- pt.v = pt.h = 120; /* parameter ignored in sys 7 */
- DIBadMount(pt, eventPtr->message);
- DIUnload();
- }
- break;
- }
-
- savedKeyCode = 0;
- return eventFound;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacConvertTkEvent --
- *
- * This function converts a Macintosh event into zero or more
- * Tcl events. It is intended for use in Netscape-style embedding.
- *
- * Results:
- * Returns 1 if event added to Tcl queue, 0 otherwse.
- *
- * Side effects:
- * May add events to Tcl's event queue.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacConvertTkEvent(
- EventRecord *eventPtr,
- Window window)
-{
- int eventFound = false;
- Point where;
- static UInt32 savedKeyCode;
-
- /*
- * By default, assume it is legal for us to set the cursor
- */
-
- Tk_MacTkOwnsCursor(1);
-
- switch (eventPtr->what) {
- case nullEvent:
- /*
- * We get NULL events only when the cursor is NOT over
- * the plugin. Otherwise we get updateCursor events.
- * We will not generate polling events or move the cursor
- * in this case.
- */
-
- eventFound = false;
- break;
- case adjustCursorEvent:
- if (GeneratePollingEvents2(window, 1)) {
- eventFound = true;
- }
- break;
- case updateEvt:
- /*
- * It is possibly not legal for us to set the cursor
- */
-
- Tk_MacTkOwnsCursor(0);
- if (GenerateUpdateEvent(eventPtr, window)) {
- eventFound = true;
- }
- break;
- case mouseDown:
- case mouseUp:
- GetMouse(&where);
- LocalToGlobal(&where);
- eventFound |= TkGenerateButtonEvent(where.h, where.v,
- window, TkMacButtonKeyState());
- break;
- case autoKey:
- case keyDown:
- /*
- * Handle menu-key events here. If it is *not*
- * a menu key - just fall through to handle as a
- * normal key event.
- */
- if ((eventPtr->modifiers & cmdKey) == cmdKey) {
- long menuResult = MenuKey(eventPtr->message & charCodeMask);
-
- if (HiWord(menuResult) != 0) {
- TkMacHandleMenuSelect(menuResult, false);
- break;
- }
- }
- /* fall through. */
-
- case keyUp:
- 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
- * here, since we don't know where the mouse is in the
- * window that is being activated.
- */
-
- Tk_MacTkOwnsCursor(0);
- eventFound |= GenerateActivateEvents(eventPtr, window);
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case getFocusEvent:
- eventPtr->modifiers |= activeFlag;
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case loseFocusEvent:
- eventPtr->modifiers &= ~activeFlag;
- eventFound |= GenerateFocusEvent(eventPtr, window);
- break;
- case kHighLevelEvent:
- TkMacDoHLEvent(eventPtr);
- /* TODO: should return true if events were placed on event queue. */
- break;
- case osEvt:
- /*
- * Do clipboard conversion.
- */
- switch ((eventPtr->message & osEvtMessageMask) >> 24) {
- /*
- * It is possibly not legal for us to set the cursor.
- * Netscape sends us these events all the time...
- */
-
- Tk_MacTkOwnsCursor(0);
-
- case mouseMovedMessage:
- /* if (GeneratePollingEvents2(window, 0)) {
- eventFound = true;
- } NEXT LINE IS TEMPORARY */
- eventFound = false;
- break;
- case suspendResumeMessage:
- if (!(eventPtr->message & resumeFlag)) {
- TkSuspendClipboard();
- }
- tkMacAppInFront = (eventPtr->message & resumeFlag);
- if (TkMacHaveAppearance() >= 0x110) {
- if (tkMacAppInFront) {
- ShowFloatingWindows();
- } else {
- HideFloatingWindows();
- }
- }
- break;
- }
- break;
- case diskEvt:
- /*
- * Disk insertion.
- */
- if (HiWord(eventPtr->message) != noErr) {
- Point pt;
-
- DILoad();
- pt.v = pt.h = 120; /* parameter ignored in sys 7 */
- DIBadMount(pt, eventPtr->message);
- DIUnload();
- }
- break;
- }
- savedKeyCode = 0;
- return eventFound;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * CheckEventsAvail --
- *
- * Checks to see if events are available on the Macintosh queue.
- * This function looks for both queued events (eg. key & button)
- * and generated events (update).
- *
- * Results:
- * True is events exist, false otherwise.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-CheckEventsAvail()
-{
- QHdrPtr evPtr;
- WindowPeek macWinPtr;
-
- evPtr = GetEvQHdr();
- if (evPtr->qHead != NULL) {
- return true;
- }
-
- macWinPtr = (WindowPeek) FrontWindow();
- while (macWinPtr != NULL) {
- if (!EmptyRgn(macWinPtr->updateRgn)) {
- return true;
- }
- macWinPtr = macWinPtr->nextWindow;
- }
- return false;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpSetCapture --
- *
- * This function captures the mouse so that all future events
- * will be reported to this window, even if the mouse is outside
- * the window. If the specified window is NULL, then the mouse
- * is released.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Sets the capture flag and captures the mouse.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpSetCapture(
- TkWindow *winPtr) /* Capture window, or NULL. */
-{
- while ((winPtr != NULL) && !Tk_TopWinHierarchy(winPtr)) {
- winPtr = winPtr->parentPtr;
- }
- gGrabWinPtr = (Tk_Window) winPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacWindowOffset --
- *
- * Determines the x and y offset from the orgin of the toplevel
- * window dressing (the structure region, ie. title bar) and the
- * orgin of the content area.
- *
- * Results:
- * The x & y offset in pixels.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacWindowOffset(
- WindowRef wRef,
- int *xOffset,
- int *yOffset)
-{
- OSErr err = noErr;
- WindowPeek wPeek = (WindowPeek) wRef;
- RgnHandle strucRgn = wPeek->strucRgn;
- RgnHandle contRgn = wPeek->contRgn;
- Rect strucRect, contRect;
-
- if (!EmptyRgn(strucRgn) && !EmptyRgn(contRgn)) {
- strucRect = (**strucRgn).rgnBBox;
- contRect = (**contRgn).rgnBBox;
- } else {
- /*
- * The current window's regions are not up to date.
- * Probably because the window isn't visable. What we
- * will do is save the old regions, have the window calculate
- * what the regions should be, and then restore it self.
- */
- strucRgn = NewRgn( );
- contRgn = NewRgn( );
-
- if (!strucRgn || !contRgn) {
- err = MemError( );
-
- } else if (TkMacHaveAppearance()) {
- GetWindowRegion(wRef, kWindowStructureRgn, strucRgn);
- GetWindowRegion(wRef, kWindowContentRgn, contRgn);
- strucRect = (**strucRgn).rgnBBox;
- contRect = (**contRgn).rgnBBox;
- } else {
- CopyRgn(wPeek->strucRgn, strucRgn);
- CopyRgn(wPeek->contRgn, contRgn);
-
- if (!(err = TellWindowDefProcToCalcRegions(wRef))) {
- strucRect = (**(wPeek->strucRgn)).rgnBBox;
- contRect = (**(wPeek->contRgn)).rgnBBox;
- }
-
- CopyRgn(strucRgn, wPeek->strucRgn);
- CopyRgn(contRgn, wPeek->contRgn);
- }
-
- if (contRgn) {
- DisposeRgn(contRgn);
- }
-
- if (strucRgn) {
- DisposeRgn(strucRgn);
- }
- }
-
- if (!err) {
- *xOffset = contRect.left - strucRect.left;
- *yOffset = contRect.top - strucRect.top;
- } else {
- *xOffset = 0;
- *yOffset = 0;
- }
-
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TellWindowDefProcToCalcRegions --
- *
- * Force a Macintosh window to recalculate it's content and
- * structure regions.
- *
- * Results:
- * An OS error.
- *
- * Side effects:
- * The windows content and structure regions may be updated.
- *
- *----------------------------------------------------------------------
- */
-
-static OSErr
-TellWindowDefProcToCalcRegions(
- WindowRef wRef)
-{
- OSErr err = noErr;
- SInt8 hState;
- Handle wdef = ((WindowPeek) wRef)->windowDefProc;
-
- /*
- * Load and lock the window definition procedure for
- * the window.
- */
- hState = HGetState(wdef);
- if (!(err = MemError())) {
- LoadResource(wdef);
- if (!(err = ResError())) {
- MoveHHi(wdef);
- err = MemError();
- if (err == memLockedErr) {
- err = noErr;
- } else if (!err) {
- HLock(wdef);
- err = MemError();
- }
- }
- }
-
- /*
- * Assuming there are no errors we now call the window definition
- * procedure to tell it to calculate the regions for the window.
- */
- if (err == noErr) {
- (void) CallWindowDefProc((UniversalProcPtr) *wdef,
- GetWVariant(wRef), wRef, wCalcRgns, 0);
-
- HSetState(wdef, hState);
- if (!err) {
- err = MemError();
- }
- }
-
- return err;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * BringWindowForward --
- *
- * Bring this background window to the front. We also set state
- * so Tk thinks the button is currently up.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The window is brought forward.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-BringWindowForward(
- WindowRef wRef)
-{
- if (!TkpIsWindowFloating(wRef)) {
- if ((TkMacHaveAppearance() < 0x110) || IsValidWindowPtr(wRef))
- SelectWindow(wRef);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetMS --
- *
- * Return a relative time in milliseconds. It doesn't matter
- * when the epoch was.
- *
- * Results:
- * Number of milliseconds.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-unsigned long
-TkpGetMS()
-{
- long long * int64Ptr;
- UnsignedWide micros;
-
- Microseconds(&micros);
- int64Ptr = (long long *) &micros;
-
- /*
- * We need 64 bit math to do this. This is available in CW 11
- * and on. Other's will need to use a different scheme.
- */
-
- *int64Ptr /= 1000;
-
- return (long) *int64Ptr;
-}
-/*
- *----------------------------------------------------------------------
- *
- * TkpIsWindowFloating --
- *
- * Returns 1 if a window is floating, 0 otherwise.
- *
- * Results:
- * 1 or 0 depending on window's floating attribute.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpIsWindowFloating(WindowRef wRef)
-{
- WindowClass class;
-
- if (TkMacHaveAppearance() < 0x110) {
- return 0;
- }
-
- GetWindowClass(wRef, &class);
-
- return (class == kFloatingWindowClass);
-
-}
diff --git a/mac/tkMacWm.c b/mac/tkMacWm.c
deleted file mode 100644
index 1af4624..0000000
--- a/mac/tkMacWm.c
+++ /dev/null
@@ -1,5785 +0,0 @@
-/*
- * tkMacWm.c --
- *
- * This module takes care of the interactions between a Tk-based
- * application and the window manager. Among other things, it
- * implements the "wm" command and passes geometry information
- * to the window manager.
- *
- * Copyright (c) 1994-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.
- */
-
-#include <Gestalt.h>
-#include <QDOffscreen.h>
-#include <Windows.h>
-#include <ToolUtils.h>
-
-#include <tclMac.h>
-#include "tkPort.h"
-#include "tkInt.h"
-#include "tkMacInt.h"
-#include <errno.h>
-#include "tkScrollbar.h"
-
-/*
- * We now require the Appearance headers. They come with CodeWarrior Pro,
- * and are on the SDK CD. However, we do not require the Appearance
- * extension
- */
-
-#include <Appearance.h>
-
-/*
- * A data structure of the following type holds information for
- * each window manager protocol (such as WM_DELETE_WINDOW) for
- * which a handler (i.e. a Tcl command) has been defined for a
- * particular top-level window.
- */
-
-typedef struct ProtocolHandler {
- Atom protocol; /* Identifies the protocol. */
- struct ProtocolHandler *nextPtr;
- /* Next in list of protocol handlers for
- * the same top-level window, or NULL for
- * end of list. */
- Tcl_Interp *interp; /* Interpreter in which to invoke command. */
- char command[4]; /* Tcl command to invoke when a client
- * message for this protocol arrives.
- * The actual size of the structure varies
- * to accommodate the needs of the actual
- * command. THIS MUST BE THE LAST FIELD OF
- * THE STRUCTURE. */
-} ProtocolHandler;
-
-#define HANDLER_SIZE(cmdLength) \
-((unsigned) (sizeof(ProtocolHandler) - 3 + cmdLength))
-
-/*
- * A data structure of the following type holds window-manager-related
- * information for each top-level window in an application.
- */
-
-typedef struct TkWmInfo {
- TkWindow *winPtr; /* Pointer to main Tk information for
- * this window. */
- Window reparent; /* If the window has been reparented, this
- * gives the ID of the ancestor of the window
- * that is a child of the root window (may
- * not be window's immediate parent). If
- * the window isn't reparented, this has the
- * value None. */
- char *title; /* Title to display in window caption. If
- * NULL, use name of widget. Malloced. */
- char *iconName; /* Name to display in icon. Malloced. */
- Window master; /* Master window for TRANSIENT_FOR property,
- * or None. */
- XWMHints hints; /* Various pieces of information for
- * window manager. */
- char *leaderName; /* Path name of leader of window group
- * (corresponds to hints.window_group).
- * Malloc-ed. Note: this field doesn't
- * get updated if leader is destroyed. */
- char *masterWindowName; /* Path name of window specified as master
- * in "wm transient" command, or NULL.
- * Malloc-ed. Note: this field doesn't
- * get updated if masterWindowName is
- * destroyed. */
- Tk_Window icon; /* Window to use as icon for this window,
- * or NULL. */
- Tk_Window iconFor; /* Window for which this window is icon, or
- * NULL if this isn't an icon for anyone. */
-
- /*
- * Information used to construct an XSizeHints structure for
- * the window manager:
- */
-
- int sizeHintsFlags; /* Flags word for XSizeHints structure.
- * If the PBaseSize flag is set then the
- * window is gridded; otherwise it isn't
- * gridded. */
- int minWidth, minHeight; /* Minimum dimensions of window, in
- * grid units, not pixels. */
- int maxWidth, maxHeight; /* Maximum dimensions of window, in
- * grid units, not pixels. */
- Tk_Window gridWin; /* Identifies the window that controls
- * gridding for this top-level, or NULL if
- * the top-level isn't currently gridded. */
- int widthInc, heightInc; /* Increments for size changes (# pixels
- * per step). */
- struct {
- int x; /* numerator */
- int y; /* denominator */
- } minAspect, maxAspect; /* Min/max aspect ratios for window. */
- int reqGridWidth, reqGridHeight;
- /* The dimensions of the window (in
- * grid units) requested through
- * the geometry manager. */
- int gravity; /* Desired window gravity. */
-
- /*
- * Information used to manage the size and location of a window.
- */
-
- int width, height; /* Desired dimensions of window, specified
- * in grid units. These values are
- * set by the "wm geometry" command and by
- * ConfigureNotify events (for when wm
- * resizes window). -1 means user hasn't
- * requested dimensions. */
- int x, y; /* Desired X and Y coordinates for window.
- * These values are set by "wm geometry",
- * plus by ConfigureNotify events (when wm
- * moves window). These numbers are
- * different than the numbers stored in
- * winPtr->changes because (a) they could be
- * measured from the right or bottom edge
- * of the screen (see WM_NEGATIVE_X and
- * WM_NEGATIVE_Y flags) and (b) if the window
- * has been reparented then they refer to the
- * parent rather than the window itself. */
- int parentWidth, parentHeight;
- /* Width and height of reparent, in pixels
- * *including border*. If window hasn't been
- * reparented then these will be the outer
- * dimensions of the window, including
- * border. */
- int xInParent, yInParent; /* Offset of window within reparent, measured
- * from upper-left outer corner of parent's
- * border to upper-left outer corner of child's
- * border. If not reparented then these are
- * zero. */
- int configWidth, configHeight;
- /* Dimensions passed to last request that we
- * issued to change geometry of window. Used
- * to eliminate redundant resize operations. */
-
- /*
- * Information about the virtual root window for this top-level,
- * if there is one.
- */
-
- Window vRoot; /* Virtual root window for this top-level,
- * or None if there is no virtual root
- * window (i.e. just use the screen's root). */
- int vRootX, vRootY; /* Position of the virtual root inside the
- * root window. If the WM_VROOT_OFFSET_STALE
- * flag is set then this information may be
- * incorrect and needs to be refreshed from
- * the X server. If vRoot is None then these
- * values are both 0. */
- unsigned int vRootWidth, vRootHeight;
- /* Dimensions of the virtual root window.
- * If vRoot is None, gives the dimensions
- * of the containing screen. This information
- * is never stale, even though vRootX and
- * vRootY can be. */
-
- /*
- * List of children of the toplevel which have private colormaps.
- */
-
- TkWindow **cmapList; /* Array of window with private colormaps. */
- int cmapCount; /* Number of windows in array. */
-
- /*
- * Miscellaneous information.
- */
-
- ProtocolHandler *protPtr; /* First in list of protocol handlers for
- * this window (NULL means none). */
- int cmdArgc; /* Number of elements in cmdArgv below. */
- CONST char **cmdArgv; /* Array of strings to store in the
- * WM_COMMAND property. NULL means nothing
- * available. */
- char *clientMachine; /* String to store in WM_CLIENT_MACHINE
- * property, or NULL. */
- int flags; /* Miscellaneous flags, defined below. */
-
- /*
- * Macintosh information.
- */
- int style; /* Native window style. */
- int macClass;
- int attributes;
- TkWindow *scrollWinPtr; /* Ptr to scrollbar handling grow widget. */
-} WmInfo;
-
-
-/*
- * Flag values for WmInfo structures:
- *
- * WM_NEVER_MAPPED - non-zero means window has never been
- * mapped; need to update all info when
- * window is first mapped.
- * WM_UPDATE_PENDING - non-zero means a call to UpdateGeometryInfo
- * has already been scheduled for this
- * window; no need to schedule another one.
- * WM_NEGATIVE_X - non-zero means x-coordinate is measured in
- * pixels from right edge of screen, rather
- * than from left edge.
- * WM_NEGATIVE_Y - non-zero means y-coordinate is measured in
- * pixels up from bottom of screen, rather than
- * down from top.
- * WM_UPDATE_SIZE_HINTS - non-zero means that new size hints need to be
- * propagated to window manager.
- * WM_SYNC_PENDING - set to non-zero while waiting for the window
- * manager to respond to some state change.
- * WM_VROOT_OFFSET_STALE - non-zero means that (x,y) offset information
- * about the virtual root window is stale and
- * needs to be fetched fresh from the X server.
- * WM_ABOUT_TO_MAP - non-zero means that the window is about to
- * be mapped by TkWmMapWindow. This is used
- * by UpdateGeometryInfo to modify its behavior.
- * WM_MOVE_PENDING - non-zero means the application has requested
- * a new position for the window, but it hasn't
- * been reflected through the window manager
- * yet.
- * WM_COLORMAPS_EXPLICIT - non-zero means the colormap windows were
- * set explicitly via "wm colormapwindows".
- * WM_ADDED_TOPLEVEL_COLORMAP - non-zero means that when "wm colormapwindows"
- * was called the top-level itself wasn't
- * specified, so we added it implicitly at
- * the end of the list.
- * WM_WIDTH_NOT_RESIZABLE - non-zero means that we're not supposed to
- * allow the user to change the width of the
- * window (controlled by "wm resizable"
- * command).
- * WM_HEIGHT_NOT_RESIZABLE - non-zero means that we're not supposed to
- * allow the user to change the height of the
- * window (controlled by "wm resizable"
- * command).
- */
-
-#define WM_NEVER_MAPPED 1
-#define WM_UPDATE_PENDING 2
-#define WM_NEGATIVE_X 4
-#define WM_NEGATIVE_Y 8
-#define WM_UPDATE_SIZE_HINTS 0x10
-#define WM_SYNC_PENDING 0x20
-#define WM_VROOT_OFFSET_STALE 0x40
-#define WM_ABOUT_TO_MAP 0x100
-#define WM_MOVE_PENDING 0x200
-#define WM_COLORMAPS_EXPLICIT 0x400
-#define WM_ADDED_TOPLEVEL_COLORMAP 0x800
-#define WM_WIDTH_NOT_RESIZABLE 0x1000
-#define WM_HEIGHT_NOT_RESIZABLE 0x2000
-
-/*
- * This is a list of all of the toplevels that have been mapped so far. It is
- * used by the menu code to inval windows that were damaged by menus, and will
- * eventually also be used to keep track of floating windows.
- */
-
-TkMacWindowList *tkMacWindowListPtr = NULL;
-
-/*
- * The variable below is used to enable or disable tracing in this
- * module. If tracing is enabled, then information is printed on
- * standard output about interesting interactions with the window
- * manager.
- */
-
-static int wmTracing = 0;
-
-/*
- * The following structure is the official type record for geometry
- * management of top-level windows.
- */
-
-static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
- Tk_Window tkwin));
-
-static Tk_GeomMgr wmMgrType = {
- "wm", /* name */
- TopLevelReqProc, /* requestProc */
- (Tk_GeomLostSlaveProc *) NULL, /* lostSlaveProc */
-};
-
-/*
- * Hash table for Mac Window -> TkWindow mapping.
- */
-
-static Tcl_HashTable windowTable;
-static int windowHashInit = false;
-
-void tkMacMoveWindow(WindowRef window, int x, int y);
-
-/*
- * Forward declarations for procedures defined in this file:
- */
-
-static void InitialWindowBounds _ANSI_ARGS_((TkWindow *winPtr,
- Rect *geometry));
-static int ParseGeometry _ANSI_ARGS_((Tcl_Interp *interp,
- char *string, TkWindow *winPtr));
-static void TopLevelEventProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static void TkWmStackorderToplevelWrapperMap _ANSI_ARGS_((
- TkWindow *winPtr,
- Tcl_HashTable *reparentTable));
-static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
- Tk_Window tkwin));
-static void UpdateGeometryInfo _ANSI_ARGS_((
- ClientData clientData));
-static void UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));
-static void UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr));
-static int WmAspectCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmAttributesCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmClientCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmColormapwindowsCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmCommandCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmDeiconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmFocusmodelCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmFrameCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGeometryCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGridCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGroupCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconbitmapCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconmaskCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconnameCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconpositionCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconwindowCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmMaxsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmMinsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmOverrideredirectCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmPositionfromCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmProtocolCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmResizableCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmSizefromCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmStackorderCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmStateCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmTitleCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmTransientCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmWithdrawCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static void WmUpdateGeom _ANSI_ARGS_((WmInfo *wmPtr,
- TkWindow *winPtr));
-
-/*
- *--------------------------------------------------------------
- *
- * TkWmNewWindow --
- *
- * This procedure is invoked whenever a new top-level
- * window is created. Its job is to initialize the WmInfo
- * structure for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A WmInfo structure gets allocated and initialized.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkWmNewWindow(
- TkWindow *winPtr) /* Newly-created top-level window. */
-{
- register WmInfo *wmPtr;
-
- wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo));
- wmPtr->winPtr = winPtr;
- wmPtr->reparent = None;
- wmPtr->title = NULL;
- wmPtr->iconName = NULL;
- wmPtr->master = None;
- wmPtr->hints.flags = InputHint | StateHint;
- wmPtr->hints.input = True;
- wmPtr->hints.initial_state = NormalState;
- wmPtr->hints.icon_pixmap = None;
- wmPtr->hints.icon_window = None;
- wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0;
- wmPtr->hints.icon_mask = None;
- wmPtr->hints.window_group = None;
- wmPtr->leaderName = NULL;
- wmPtr->masterWindowName = NULL;
- wmPtr->icon = NULL;
- wmPtr->iconFor = NULL;
- wmPtr->sizeHintsFlags = 0;
- wmPtr->minWidth = wmPtr->minHeight = 1;
-
- /*
- * Default the maximum dimensions to the size of the display, minus
- * a guess about how space is needed for window manager decorations.
- */
-
- wmPtr->maxWidth = DisplayWidth(winPtr->display, winPtr->screenNum) - 15;
- wmPtr->maxHeight = DisplayHeight(winPtr->display, winPtr->screenNum) - 30;
- wmPtr->gridWin = NULL;
- wmPtr->widthInc = wmPtr->heightInc = 1;
- wmPtr->minAspect.x = wmPtr->minAspect.y = 1;
- wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1;
- wmPtr->reqGridWidth = wmPtr->reqGridHeight = -1;
- wmPtr->gravity = NorthWestGravity;
- wmPtr->width = -1;
- wmPtr->height = -1;
- wmPtr->x = winPtr->changes.x;
- wmPtr->y = winPtr->changes.y;
- wmPtr->parentWidth = winPtr->changes.width
- + 2*winPtr->changes.border_width;
- wmPtr->parentHeight = winPtr->changes.height
- + 2*winPtr->changes.border_width;
- wmPtr->xInParent = 0;
- wmPtr->yInParent = 0;
- wmPtr->cmapList = NULL;
- wmPtr->cmapCount = 0;
- wmPtr->configWidth = -1;
- wmPtr->configHeight = -1;
- wmPtr->vRoot = None;
- wmPtr->protPtr = NULL;
- wmPtr->cmdArgv = NULL;
- wmPtr->clientMachine = NULL;
- wmPtr->flags = WM_NEVER_MAPPED;
- if (TkMacHaveAppearance() >= 0x110) {
- wmPtr->style = -1;
- } else {
- wmPtr->style = documentProc;
- }
- wmPtr->macClass = kDocumentWindowClass;
- wmPtr->attributes = kWindowStandardDocumentAttributes;
- wmPtr->scrollWinPtr = NULL;
- winPtr->wmInfoPtr = wmPtr;
-
- UpdateVRootGeometry(wmPtr);
-
- /*
- * Tk must monitor structure events for top-level windows, in order
- * to detect size and position changes caused by window managers.
- */
-
- Tk_CreateEventHandler((Tk_Window) winPtr, StructureNotifyMask,
- TopLevelEventProc, (ClientData) winPtr);
-
- /*
- * Arrange for geometry requests to be reflected from the window
- * to the window manager.
- */
-
- Tk_ManageGeometry((Tk_Window) winPtr, &wmMgrType, (ClientData) 0);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkWmMapWindow --
- *
- * This procedure is invoked to map a top-level window. This
- * module gets a chance to update all window-manager-related
- * information in properties before the window manager sees
- * the map event and checks the properties. It also gets to
- * decide whether or not to even map the window after all.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Properties of winPtr may get updated to provide up-to-date
- * information to the window manager. The window may also get
- * mapped, but it may not be if this procedure decides that
- * isn't appropriate (e.g. because the window is withdrawn).
- *
- *--------------------------------------------------------------
- */
-
-void
-TkWmMapWindow(
- TkWindow *winPtr) /* Top-level window that's about to
- * be mapped. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Point where = {0, 0};
- int xOffset, yOffset;
- int firstMap = false;
- MacDrawable *macWin;
-
- if (wmPtr->flags & WM_NEVER_MAPPED) {
- wmPtr->flags &= ~WM_NEVER_MAPPED;
- firstMap = true;
-
- /*
- * Create the underlying Mac window for this Tk window.
- */
- macWin = (MacDrawable *) winPtr->window;
- if (!TkMacHostToplevelExists(winPtr)) {
- TkMacMakeRealWindowExist(winPtr);
- }
-
- /*
- * Generate configure event when we first map the window.
- */
- LocalToGlobal(&where);
- TkMacWindowOffset((WindowRef) TkMacGetDrawablePort((Drawable) macWin),
- &xOffset, &yOffset);
- where.h -= xOffset;
- where.v -= yOffset;
- TkGenWMConfigureEvent((Tk_Window) winPtr,
- where.h, where.v, -1, -1, TK_LOCATION_CHANGED);
-
- /*
- * This is the first time this window has ever been mapped.
- * Store all the window-manager-related information for the
- * window.
- */
-
- if (!Tk_IsEmbedded(winPtr)) {
- TkSetWMName(winPtr, ((wmPtr->title != NULL) ?
- wmPtr->title : winPtr->nameUid));
- }
-
- TkWmSetClass(winPtr);
-
- if (wmPtr->iconName != NULL) {
- XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
- }
-
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- }
- if (wmPtr->hints.initial_state == WithdrawnState) {
- return;
- }
-
- /*
- * TODO: we need to display a window if it's iconic on creation.
- */
-
- if (wmPtr->hints.initial_state == IconicState) {
- return;
- }
-
- /*
- * Update geometry information.
- */
- wmPtr->flags |= WM_ABOUT_TO_MAP;
- if (wmPtr->flags & WM_UPDATE_PENDING) {
- Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
- }
- UpdateGeometryInfo((ClientData) winPtr);
- wmPtr->flags &= ~WM_ABOUT_TO_MAP;
-
- /*
- * Map the window.
- */
-
- XMapWindow(winPtr->display, winPtr->window);
-
- /*
- * Now that the window is visable we can determine the offset
- * from the window's content orgin to the window's decorative
- * orgin (structure orgin).
- */
- TkMacWindowOffset((WindowRef) TkMacGetDrawablePort(Tk_WindowId(winPtr)),
- &wmPtr->xInParent, &wmPtr->yInParent);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkWmUnmapWindow --
- *
- * This procedure is invoked to unmap a top-level window.
- * On the Macintosh all we do is call XUnmapWindow.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Unmaps the window.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkWmUnmapWindow(
- TkWindow *winPtr) /* Top-level window that's about to
- * be mapped. */
-{
- XUnmapWindow(winPtr->display, winPtr->window);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkWmDeadWindow --
- *
- * This procedure is invoked when a top-level window is
- * about to be deleted. It cleans up the wm-related data
- * structures for the window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The WmInfo structure for winPtr gets freed up.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkWmDeadWindow(winPtr)
- TkWindow *winPtr; /* Top-level window that's being deleted. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- WmInfo *wmPtr2;
-
- if (wmPtr == NULL) {
- return;
- }
- if (wmPtr->title != NULL) {
- ckfree(wmPtr->title);
- }
- if (wmPtr->iconName != NULL) {
- ckfree(wmPtr->iconName);
- }
- if (wmPtr->hints.flags & IconPixmapHint) {
- Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap);
- }
- if (wmPtr->hints.flags & IconMaskHint) {
- Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask);
- }
- if (wmPtr->leaderName != NULL) {
- ckfree(wmPtr->leaderName);
- }
- if (wmPtr->masterWindowName != NULL) {
- ckfree(wmPtr->masterWindowName);
- }
- if (wmPtr->icon != NULL) {
- wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
- wmPtr2->iconFor = NULL;
- }
- if (wmPtr->iconFor != NULL) {
- wmPtr2 = ((TkWindow *) wmPtr->iconFor)->wmInfoPtr;
- wmPtr2->icon = NULL;
- wmPtr2->hints.flags &= ~IconWindowHint;
- }
- while (wmPtr->protPtr != NULL) {
- ProtocolHandler *protPtr;
-
- protPtr = wmPtr->protPtr;
- wmPtr->protPtr = protPtr->nextPtr;
- Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC);
- }
- if (wmPtr->cmdArgv != NULL) {
- ckfree((char *) wmPtr->cmdArgv);
- }
- if (wmPtr->clientMachine != NULL) {
- ckfree((char *) wmPtr->clientMachine);
- }
- if (wmPtr->flags & WM_UPDATE_PENDING) {
- Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
- }
- ckfree((char *) wmPtr);
- winPtr->wmInfoPtr = NULL;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * TkWmSetClass --
- *
- * This procedure is invoked whenever a top-level window's
- * class is changed. If the window has been mapped then this
- * procedure updates the window manager property for the
- * class. If the window hasn't been mapped, the update is
- * deferred until just before the first mapping.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A window property may get updated.
- *
- *--------------------------------------------------------------
- */
-
-void
-TkWmSetClass(
- TkWindow *winPtr) /* Newly-created top-level window. */
-{
- return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_WmObjCmd --
- *
- * This procedure is invoked to process the "wm" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-Tk_WmObjCmd(
- ClientData clientData, /* Main window associated with
- * interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
-{
- Tk_Window tkwin = (Tk_Window) clientData;
- static CONST char *optionStrings[] = {
- "aspect", "attributes", "client", "colormapwindows",
- "command", "deiconify", "focusmodel", "frame",
- "geometry", "grid", "group", "iconbitmap",
- "iconify", "iconmask", "iconname", "iconposition",
- "iconwindow", "maxsize", "minsize", "overrideredirect",
- "positionfrom", "protocol", "resizable", "sizefrom",
- "stackorder", "state", "title", "transient",
- "withdraw", (char *) NULL };
- enum options {
- WMOPT_ASPECT, WMOPT_ATTRIBUTES, WMOPT_CLIENT, WMOPT_COLORMAPWINDOWS,
- WMOPT_COMMAND, WMOPT_DEICONIFY, WMOPT_FOCUSMODEL, WMOPT_FRAME,
- WMOPT_GEOMETRY, WMOPT_GRID, WMOPT_GROUP, WMOPT_ICONBITMAP,
- WMOPT_ICONIFY, WMOPT_ICONMASK, WMOPT_ICONNAME, WMOPT_ICONPOSITION,
- WMOPT_ICONWINDOW, WMOPT_MAXSIZE, WMOPT_MINSIZE, WMOPT_OVERRIDEREDIRECT,
- WMOPT_POSITIONFROM, WMOPT_PROTOCOL, WMOPT_RESIZABLE, WMOPT_SIZEFROM,
- WMOPT_STACKORDER, WMOPT_STATE, WMOPT_TITLE, WMOPT_TRANSIENT,
- WMOPT_WITHDRAW };
- int index, length;
- char *argv1;
- TkWindow *winPtr;
- TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
-
- if (objc < 2) {
- wrongNumArgs:
- Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg ...?");
- return TCL_ERROR;
- }
-
- argv1 = Tcl_GetStringFromObj(objv[1], &length);
- if ((argv1[0] == 't') && (strncmp(argv1, "tracing", length) == 0)
- && (length >= 3)) {
- if ((objc != 2) && (objc != 3)) {
- Tcl_WrongNumArgs(interp, 2, objv, "?boolean?");
- return TCL_ERROR;
- }
- if (objc == 2) {
- Tcl_SetResult(interp, ((wmTracing) ? "on" : "off"), TCL_STATIC);
- return TCL_OK;
- }
- return Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing);
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- if (objc < 3) {
- goto wrongNumArgs;
- }
-
- if (TkGetWindowFromObj(interp, tkwin, objv[2], (Tk_Window *) &winPtr)
- != TCL_OK) {
- return TCL_ERROR;
- }
- if (!Tk_IsTopLevel(winPtr)) {
- Tcl_AppendResult(interp, "window \"", winPtr->pathName,
- "\" isn't a top-level window", (char *) NULL);
- return TCL_ERROR;
- }
-
- switch ((enum options) index) {
- case WMOPT_ASPECT:
- return WmAspectCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ATTRIBUTES:
- return WmAttributesCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_CLIENT:
- return WmClientCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_COLORMAPWINDOWS:
- return WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_COMMAND:
- return WmCommandCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_DEICONIFY:
- return WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_FOCUSMODEL:
- return WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_FRAME:
- return WmFrameCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_GEOMETRY:
- return WmGeometryCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_GRID:
- return WmGridCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_GROUP:
- return WmGroupCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONBITMAP:
- return WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONIFY:
- return WmIconifyCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONMASK:
- return WmIconmaskCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONNAME:
- return WmIconnameCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONPOSITION:
- return WmIconpositionCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_ICONWINDOW:
- return WmIconwindowCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_MAXSIZE:
- return WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_MINSIZE:
- return WmMinsizeCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_OVERRIDEREDIRECT:
- return WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_POSITIONFROM:
- return WmPositionfromCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_PROTOCOL:
- return WmProtocolCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_RESIZABLE:
- return WmResizableCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_SIZEFROM:
- return WmSizefromCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_STACKORDER:
- return WmStackorderCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_STATE:
- return WmStateCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_TITLE:
- return WmTitleCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_TRANSIENT:
- return WmTransientCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_WITHDRAW:
- return WmWithdrawCmd(tkwin, winPtr, interp, objc, objv);
- }
-
- /* This should not happen */
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmAspectCmd --
- *
- * This procedure is invoked to process the "wm aspect" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmAspectCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int numer1, denom1, numer2, denom2;
-
- if ((objc != 3) && (objc != 7)) {
- Tcl_WrongNumArgs(interp, 2, objv,
- "window ?minNumer minDenom maxNumer maxDenom?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->sizeHintsFlags & PAspect) {
- 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;
- }
- if (*Tcl_GetString(objv[3]) == '\0') {
- wmPtr->sizeHintsFlags &= ~PAspect;
- } else {
- if ((Tcl_GetIntFromObj(interp, objv[3], &numer1) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[4], &denom1) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[5], &numer2) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[6], &denom2) != TCL_OK)) {
- return TCL_ERROR;
- }
- if ((numer1 <= 0) || (denom1 <= 0) || (numer2 <= 0) ||
- (denom2 <= 0)) {
- Tcl_SetResult(interp, "aspect number can't be <= 0",
- TCL_STATIC);
- return TCL_ERROR;
- }
- wmPtr->minAspect.x = numer1;
- wmPtr->minAspect.y = denom1;
- wmPtr->maxAspect.x = numer2;
- wmPtr->maxAspect.y = denom2;
- wmPtr->sizeHintsFlags |= PAspect;
- }
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmAttributesCmd --
- *
- * This procedure is invoked to process the "wm attributes" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmClientCmd --
- *
- * This procedure is invoked to process the "wm client" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmClientCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char *argv3;
- int length;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?name?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->clientMachine != NULL) {
- Tcl_SetResult(interp, wmPtr->clientMachine, TCL_STATIC);
- }
- return TCL_OK;
- }
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- if (argv3[0] == 0) {
- if (wmPtr->clientMachine != NULL) {
- ckfree((char *) wmPtr->clientMachine);
- wmPtr->clientMachine = NULL;
- }
- return TCL_OK;
- }
- if (wmPtr->clientMachine != NULL) {
- ckfree((char *) wmPtr->clientMachine);
- }
- wmPtr->clientMachine = (char *)
- ckalloc((unsigned) (length + 1));
- strcpy(wmPtr->clientMachine, argv3);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmColormapwindowsCmd --
- *
- * This procedure is invoked to process the "wm colormapwindows"
- * Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmColormapwindowsCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- TkWindow **cmapList;
- TkWindow *winPtr2;
- int i, windowObjc, gotToplevel = 0;
- Tcl_Obj **windowObjv;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?windowList?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- Tk_MakeWindowExist((Tk_Window) winPtr);
- for (i = 0; i < wmPtr->cmapCount; i++) {
- if ((i == (wmPtr->cmapCount-1))
- && (wmPtr->flags & WM_ADDED_TOPLEVEL_COLORMAP)) {
- break;
- }
- Tcl_AppendElement(interp, wmPtr->cmapList[i]->pathName);
- }
- return TCL_OK;
- }
- if (Tcl_ListObjGetElements(interp, objv[3], &windowObjc, &windowObjv)
- != TCL_OK) {
- return TCL_ERROR;
- }
- cmapList = (TkWindow **) ckalloc((unsigned)
- ((windowObjc+1)*sizeof(TkWindow*)));
- for (i = 0; i < windowObjc; i++) {
- if (TkGetWindowFromObj(interp, tkwin, windowObjv[i],
- (Tk_Window *) &winPtr2) != TCL_OK)
- {
- ckfree((char *) cmapList);
- return TCL_ERROR;
- }
- if (winPtr2 == winPtr) {
- gotToplevel = 1;
- }
- if (winPtr2->window == None) {
- Tk_MakeWindowExist((Tk_Window) winPtr2);
- }
- cmapList[i] = winPtr2;
- }
- if (!gotToplevel) {
- wmPtr->flags |= WM_ADDED_TOPLEVEL_COLORMAP;
- cmapList[windowObjc] = winPtr;
- windowObjc++;
- } else {
- wmPtr->flags &= ~WM_ADDED_TOPLEVEL_COLORMAP;
- }
- wmPtr->flags |= WM_COLORMAPS_EXPLICIT;
- if (wmPtr->cmapList != NULL) {
- ckfree((char *)wmPtr->cmapList);
- }
- wmPtr->cmapList = cmapList;
- wmPtr->cmapCount = windowObjc;
-
- /*
- * On the Macintosh all of this is just an excercise
- * in compatability as we don't support colormaps. If
- * we did they would be installed here.
- */
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmCommandCmd --
- *
- * This procedure is invoked to process the "wm command" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmCommandCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char *argv3;
- int cmdArgc;
- CONST char **cmdArgv;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?value?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->cmdArgv != NULL) {
- Tcl_SetResult(interp,
- Tcl_Merge(wmPtr->cmdArgc, wmPtr->cmdArgv),
- TCL_DYNAMIC);
- }
- return TCL_OK;
- }
- argv3 = Tcl_GetString(objv[3]);
- if (argv3[0] == 0) {
- if (wmPtr->cmdArgv != NULL) {
- ckfree((char *) wmPtr->cmdArgv);
- wmPtr->cmdArgv = NULL;
- }
- return TCL_OK;
- }
- if (Tcl_SplitList(interp, argv3, &cmdArgc, &cmdArgv) != TCL_OK) {
- return TCL_ERROR;
- }
- if (wmPtr->cmdArgv != NULL) {
- ckfree((char *) wmPtr->cmdArgv);
- }
- wmPtr->cmdArgc = cmdArgc;
- wmPtr->cmdArgv = cmdArgv;
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmDeiconifyCmd --
- *
- * This procedure is invoked to process the "wm deiconify" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
-
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't deiconify ", Tcl_GetString(objv[2]),
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
- if (winPtr->flags & TK_EMBEDDED) {
- Tcl_AppendResult(interp, "can't deiconify ", winPtr->pathName,
- ": it is an embedded window", (char *) NULL);
- return TCL_ERROR;
- }
-
- /*
- * TODO: may not want to call this function - look at Map events gened.
- */
-
- TkpWmSetState(winPtr, NormalState);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmFocusmodelCmd --
- *
- * This procedure is invoked to process the "wm focusmodel" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- static CONST char *optionStrings[] = {
- "active", "passive", (char *) NULL };
- enum options {
- OPT_ACTIVE, OPT_PASSIVE };
- int index;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?active|passive?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- Tcl_SetResult(interp, (wmPtr->hints.input ? "passive" : "active"),
- TCL_STATIC);
- return TCL_OK;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == OPT_ACTIVE) {
- wmPtr->hints.input = False;
- } else { /* OPT_PASSIVE */
- wmPtr->hints.input = True;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmFrameCmd --
- *
- * This procedure is invoked to process the "wm frame" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmFrameCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Window window;
- char buf[TCL_INTEGER_SPACE];
-
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- window = wmPtr->reparent;
- if (window == None) {
- window = Tk_WindowId((Tk_Window) winPtr);
- }
- sprintf(buf, "0x%x", (unsigned int) window);
- Tcl_SetResult(interp, buf, TCL_VOLATILE);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmGeometryCmd --
- *
- * This procedure is invoked to process the "wm geometry" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmGeometryCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char xSign, ySign;
- int width, height;
- char *argv3;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?newGeometry?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- char buf[16 + TCL_INTEGER_SPACE * 4];
-
- xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+';
- ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+';
- if (wmPtr->gridWin != NULL) {
- width = wmPtr->reqGridWidth + (winPtr->changes.width
- - winPtr->reqWidth)/wmPtr->widthInc;
- height = wmPtr->reqGridHeight + (winPtr->changes.height
- - winPtr->reqHeight)/wmPtr->heightInc;
- } else {
- width = winPtr->changes.width;
- height = winPtr->changes.height;
- }
- 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;
- }
- argv3 = Tcl_GetString(objv[3]);
- if (*argv3 == '\0') {
- wmPtr->width = -1;
- wmPtr->height = -1;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
- }
- return ParseGeometry(interp, argv3, winPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmGridCmd --
- *
- * This procedure is invoked to process the "wm grid" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmGridCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int reqWidth, reqHeight, widthInc, heightInc;
-
- if ((objc != 3) && (objc != 7)) {
- Tcl_WrongNumArgs(interp, 2, objv,
- "window ?baseWidth baseHeight widthInc heightInc?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->sizeHintsFlags & PBaseSize) {
- 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;
- }
- if (*Tcl_GetString(objv[3]) == '\0') {
- /*
- * Turn off gridding and reset the width and height
- * to make sense as ungridded numbers.
- */
-
- wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc);
- if (wmPtr->width != -1) {
- wmPtr->width = winPtr->reqWidth + (wmPtr->width
- - wmPtr->reqGridWidth)*wmPtr->widthInc;
- wmPtr->height = winPtr->reqHeight + (wmPtr->height
- - wmPtr->reqGridHeight)*wmPtr->heightInc;
- }
- wmPtr->widthInc = 1;
- wmPtr->heightInc = 1;
- } else {
- if ((Tcl_GetIntFromObj(interp, objv[3], &reqWidth) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[4], &reqHeight) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[5], &widthInc) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[6], &heightInc) != TCL_OK)) {
- return TCL_ERROR;
- }
- if (reqWidth < 0) {
- Tcl_SetResult(interp, "baseWidth can't be < 0", TCL_STATIC);
- return TCL_ERROR;
- }
- if (reqHeight < 0) {
- Tcl_SetResult(interp, "baseHeight can't be < 0", TCL_STATIC);
- return TCL_ERROR;
- }
- if (widthInc <= 0) {
- Tcl_SetResult(interp, "widthInc can't be <= 0", TCL_STATIC);
- return TCL_ERROR;
- }
- if (heightInc <= 0) {
- Tcl_SetResult(interp, "heightInc can't be <= 0", TCL_STATIC);
- return TCL_ERROR;
- }
- Tk_SetGrid((Tk_Window) winPtr, reqWidth, reqHeight, widthInc,
- heightInc);
- }
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmGroupCmd --
- *
- * This procedure is invoked to process the "wm group" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmGroupCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Tk_Window tkwin2;
- char *argv3;
- int length;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->hints.flags & WindowGroupHint) {
- Tcl_SetResult(interp, wmPtr->leaderName, TCL_STATIC);
- }
- return TCL_OK;
- }
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- if (*argv3 == '\0') {
- wmPtr->hints.flags &= ~WindowGroupHint;
- if (wmPtr->leaderName != NULL) {
- ckfree(wmPtr->leaderName);
- }
- wmPtr->leaderName = NULL;
- } else {
- if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) {
- return TCL_ERROR;
- }
- Tk_MakeWindowExist(tkwin2);
- if (wmPtr->leaderName != NULL) {
- ckfree(wmPtr->leaderName);
- }
- wmPtr->hints.window_group = Tk_WindowId(tkwin2);
- wmPtr->hints.flags |= WindowGroupHint;
- wmPtr->leaderName = ckalloc((unsigned) (length + 1));
- strcpy(wmPtr->leaderName, argv3);
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconbitmapCmd --
- *
- * This procedure is invoked to process the "wm iconbitmap" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconbitmapCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char *argv3;
- Pixmap pixmap;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->hints.flags & IconPixmapHint) {
- Tcl_SetResult(interp, (char *)
- Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_pixmap),
- TCL_STATIC);
- }
- return TCL_OK;
- }
- argv3 = Tcl_GetString(objv[3]);
- if (*argv3 == '\0') {
- if (wmPtr->hints.icon_pixmap != None) {
- Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap);
- wmPtr->hints.icon_pixmap = None;
- }
- wmPtr->hints.flags &= ~IconPixmapHint;
- } else {
- pixmap = Tk_GetBitmap(interp, (Tk_Window) winPtr, argv3);
- if (pixmap == None) {
- return TCL_ERROR;
- }
- wmPtr->hints.icon_pixmap = pixmap;
- wmPtr->hints.flags |= IconPixmapHint;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconifyCmd --
- *
- * This procedure is invoked to process the "wm iconify" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconifyCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) {
- Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName,
- "\": override-redirect flag is set", (char *) NULL);
- return TCL_ERROR;
- }
- if (wmPtr->master != None) {
- Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName,
- "\": it is a transient", (char *) NULL);
- return TCL_ERROR;
- }
- if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName,
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
- if (winPtr->flags & TK_EMBEDDED) {
- Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName,
- ": it is an embedded window", (char *) NULL);
- return TCL_ERROR;
- }
- TkpWmSetState(winPtr, IconicState);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconmaskCmd --
- *
- * This procedure is invoked to process the "wm iconmask" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconmaskCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Pixmap pixmap;
- char *argv3;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?bitmap?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->hints.flags & IconMaskHint) {
- Tcl_SetResult(interp, (char *)
- Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_mask),
- TCL_STATIC);
- }
- return TCL_OK;
- }
- argv3 = Tcl_GetString(objv[3]);
- if (*argv3 == '\0') {
- if (wmPtr->hints.icon_mask != None) {
- Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask);
- }
- wmPtr->hints.flags &= ~IconMaskHint;
- } else {
- pixmap = Tk_GetBitmap(interp, tkwin, argv3);
- if (pixmap == None) {
- return TCL_ERROR;
- }
- wmPtr->hints.icon_mask = pixmap;
- wmPtr->hints.flags |= IconMaskHint;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconnameCmd --
- *
- * This procedure is invoked to process the "wm iconname" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconnameCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char *argv3;
- int length;
-
- if (objc > 4) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?newName?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- Tcl_SetResult(interp,
- ((wmPtr->iconName != NULL) ? wmPtr->iconName : ""),
- TCL_STATIC);
- return TCL_OK;
- } else {
- if (wmPtr->iconName != NULL) {
- ckfree((char *) wmPtr->iconName);
- }
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- wmPtr->iconName = ckalloc((unsigned) (length + 1));
- strcpy(wmPtr->iconName, argv3);
- if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
- XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconpositionCmd --
- *
- * This procedure is invoked to process the "wm iconposition"
- * Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconpositionCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int x, y;
-
- if ((objc != 3) && (objc != 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?x y?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->hints.flags & IconPositionHint) {
- 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;
- }
- if (*Tcl_GetString(objv[3]) == '\0') {
- wmPtr->hints.flags &= ~IconPositionHint;
- } else {
- if ((Tcl_GetIntFromObj(interp, objv[3], &x) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[4], &y) != TCL_OK)){
- return TCL_ERROR;
- }
- wmPtr->hints.icon_x = x;
- wmPtr->hints.icon_y = y;
- wmPtr->hints.flags |= IconPositionHint;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmIconwindowCmd --
- *
- * This procedure is invoked to process the "wm iconwindow" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmIconwindowCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Tk_Window tkwin2;
- WmInfo *wmPtr2;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?pathName?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->icon != NULL) {
- Tcl_SetResult(interp, Tk_PathName(wmPtr->icon), TCL_STATIC);
- }
- return TCL_OK;
- }
- if (*Tcl_GetString(objv[3]) == '\0') {
- wmPtr->hints.flags &= ~IconWindowHint;
- if (wmPtr->icon != NULL) {
- wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
- wmPtr2->iconFor = NULL;
- wmPtr2->hints.initial_state = WithdrawnState;
- }
- wmPtr->icon = NULL;
- } else {
- if (TkGetWindowFromObj(interp, tkwin, objv[3], &tkwin2) != TCL_OK) {
- return TCL_ERROR;
- }
- if (!Tk_IsTopLevel(tkwin2)) {
- Tcl_AppendResult(interp, "can't use ", Tcl_GetString(objv[3]),
- " as icon window: not at top level", (char *) NULL);
- return TCL_ERROR;
- }
- wmPtr2 = ((TkWindow *) tkwin2)->wmInfoPtr;
- if (wmPtr2->iconFor != NULL) {
- Tcl_AppendResult(interp, Tcl_GetString(objv[3]),
- " is already an icon for ",
- Tk_PathName(wmPtr2->iconFor), (char *) NULL);
- return TCL_ERROR;
- }
- if (wmPtr->icon != NULL) {
- WmInfo *wmPtr3 = ((TkWindow *) wmPtr->icon)->wmInfoPtr;
- wmPtr3->iconFor = NULL;
- }
- Tk_MakeWindowExist(tkwin2);
- wmPtr->hints.icon_window = Tk_WindowId(tkwin2);
- wmPtr->hints.flags |= IconWindowHint;
- wmPtr->icon = tkwin2;
- wmPtr2->iconFor = (Tk_Window) winPtr;
- if (!(wmPtr2->flags & WM_NEVER_MAPPED)) {
- /*
- * Don't have iconwindows on the Mac. We just withdraw.
- */
-
- Tk_UnmapWindow(tkwin2);
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmMaxsizeCmd --
- *
- * This procedure is invoked to process the "wm maxsize" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmMaxsizeCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int width, height;
-
- if ((objc != 3) && (objc != 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- 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_GetIntFromObj(interp, objv[3], &width) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) {
- return TCL_ERROR;
- }
- wmPtr->maxWidth = width;
- wmPtr->maxHeight = height;
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmMinsizeCmd --
- *
- * This procedure is invoked to process the "wm minsize" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmMinsizeCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int width, height;
-
- if ((objc != 3) && (objc != 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- 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_GetIntFromObj(interp, objv[3], &width) != TCL_OK)
- || (Tcl_GetIntFromObj(interp, objv[4], &height) != TCL_OK)) {
- return TCL_ERROR;
- }
- wmPtr->minWidth = width;
- wmPtr->minHeight = height;
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmOverrideredirectCmd --
- *
- * This procedure is invoked to process the "wm overrideredirect"
- * Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmOverrideredirectCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int boolean;
- XSetWindowAttributes atts;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?boolean?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- Tcl_SetBooleanObj(Tcl_GetObjResult(interp),
- Tk_Attributes((Tk_Window) winPtr)->override_redirect);
- return TCL_OK;
- }
- if (Tcl_GetBooleanFromObj(interp, objv[3], &boolean) != TCL_OK) {
- return TCL_ERROR;
- }
- atts.override_redirect = (boolean) ? True : False;
- Tk_ChangeWindowAttributes((Tk_Window) winPtr, CWOverrideRedirect,
- &atts);
- wmPtr->style = (boolean) ? plainDBox : documentProc;
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmPositionfromCmd --
- *
- * This procedure is invoked to process the "wm positionfrom"
- * Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmPositionfromCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- static CONST char *optionStrings[] = {
- "program", "user", (char *) NULL };
- enum options {
- OPT_PROGRAM, OPT_USER };
- int index;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?user/program?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->sizeHintsFlags & USPosition) {
- Tcl_SetResult(interp, "user", TCL_STATIC);
- } else if (wmPtr->sizeHintsFlags & PPosition) {
- Tcl_SetResult(interp, "program", TCL_STATIC);
- }
- return TCL_OK;
- }
- if (*Tcl_GetString(objv[3]) == '\0') {
- wmPtr->sizeHintsFlags &= ~(USPosition|PPosition);
- } else {
- if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == OPT_USER) {
- wmPtr->sizeHintsFlags &= ~PPosition;
- wmPtr->sizeHintsFlags |= USPosition;
- } else {
- wmPtr->sizeHintsFlags &= ~USPosition;
- wmPtr->sizeHintsFlags |= PPosition;
- }
- }
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmProtocolCmd --
- *
- * This procedure is invoked to process the "wm protocol" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmProtocolCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- register ProtocolHandler *protPtr, *prevPtr;
- Atom protocol;
- char *cmd;
- int cmdLength;
-
- if ((objc < 3) || (objc > 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?name? ?command?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- /*
- * Return a list of all defined protocols for the window.
- */
- for (protPtr = wmPtr->protPtr; protPtr != NULL;
- protPtr = protPtr->nextPtr) {
- Tcl_AppendElement(interp,
- Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol));
- }
- return TCL_OK;
- }
- protocol = Tk_InternAtom((Tk_Window) winPtr, Tcl_GetString(objv[3]));
- if (objc == 4) {
- /*
- * Return the command to handle a given protocol.
- */
- for (protPtr = wmPtr->protPtr; protPtr != NULL;
- protPtr = protPtr->nextPtr) {
- if (protPtr->protocol == protocol) {
- Tcl_SetResult(interp, protPtr->command, TCL_STATIC);
- return TCL_OK;
- }
- }
- return TCL_OK;
- }
-
- /*
- * Delete any current protocol handler, then create a new
- * one with the specified command, unless the command is
- * empty.
- */
-
- for (protPtr = wmPtr->protPtr, prevPtr = NULL; protPtr != NULL;
- prevPtr = protPtr, protPtr = protPtr->nextPtr) {
- if (protPtr->protocol == protocol) {
- if (prevPtr == NULL) {
- wmPtr->protPtr = protPtr->nextPtr;
- } else {
- prevPtr->nextPtr = protPtr->nextPtr;
- }
- Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC);
- break;
- }
- }
- cmd = Tcl_GetStringFromObj(objv[4], &cmdLength);
- if (cmdLength > 0) {
- protPtr = (ProtocolHandler *) ckalloc(HANDLER_SIZE(cmdLength));
- protPtr->protocol = protocol;
- protPtr->nextPtr = wmPtr->protPtr;
- wmPtr->protPtr = protPtr;
- protPtr->interp = interp;
- strcpy(protPtr->command, cmd);
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmResizableCmd --
- *
- * This procedure is invoked to process the "wm resizable" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmResizableCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int width, height;
-
- if ((objc != 3) && (objc != 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?width height?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- 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_GetBooleanFromObj(interp, objv[3], &width) != TCL_OK)
- || (Tcl_GetBooleanFromObj(interp, objv[4], &height) != TCL_OK)) {
- return TCL_ERROR;
- }
- if (width) {
- wmPtr->flags &= ~WM_WIDTH_NOT_RESIZABLE;
- } else {
- wmPtr->flags |= WM_WIDTH_NOT_RESIZABLE;
- }
- if (height) {
- wmPtr->flags &= ~WM_HEIGHT_NOT_RESIZABLE;
- } else {
- wmPtr->flags |= WM_HEIGHT_NOT_RESIZABLE;
- }
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- if (wmPtr->scrollWinPtr != NULL) {
- TkScrollbarEventuallyRedraw(
- (TkScrollbar *) wmPtr->scrollWinPtr->instanceData);
- }
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmSizefromCmd --
- *
- * This procedure is invoked to process the "wm sizefrom" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmSizefromCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- static CONST char *optionStrings[] = {
- "program", "user", (char *) NULL };
- enum options {
- OPT_PROGRAM, OPT_USER };
- int index;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?user|program?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->sizeHintsFlags & USSize) {
- Tcl_SetResult(interp, "user", TCL_STATIC);
- } else if (wmPtr->sizeHintsFlags & PSize) {
- Tcl_SetResult(interp, "program", TCL_STATIC);
- }
- return TCL_OK;
- }
-
- if (*Tcl_GetString(objv[3]) == '\0') {
- wmPtr->sizeHintsFlags &= ~(USSize|PSize);
- } else {
- if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == OPT_USER) {
- wmPtr->sizeHintsFlags &= ~PSize;
- wmPtr->sizeHintsFlags |= USSize;
- } else { /* OPT_PROGRAM */
- wmPtr->sizeHintsFlags &= ~USSize;
- wmPtr->sizeHintsFlags |= PSize;
- }
- }
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- WmUpdateGeom(wmPtr, winPtr);
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmStackorderCmd --
- *
- * This procedure is invoked to process the "wm stackorder" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmStackorderCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- TkWindow **windows, **window_ptr;
- static CONST char *optionStrings[] = {
- "isabove", "isbelow", (char *) NULL };
- enum options {
- OPT_ISABOVE, OPT_ISBELOW };
- int index;
-
- if ((objc != 3) && (objc != 5)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?isabove|isbelow window?");
- return TCL_ERROR;
- }
-
- if (objc == 3) {
- windows = TkWmStackorderToplevel(winPtr);
- if (windows == NULL) {
- panic("TkWmStackorderToplevel failed");
- } else {
- for (window_ptr = windows; *window_ptr ; window_ptr++) {
- Tcl_AppendElement(interp, (*window_ptr)->pathName);
- }
- ckfree((char *) windows);
- return TCL_OK;
- }
- } else {
- TkWindow *winPtr2;
- int index1=-1, index2=-1, result;
-
- if (TkGetWindowFromObj(interp, tkwin, objv[4], (Tk_Window *) &winPtr2)
- != TCL_OK) {
- return TCL_ERROR;
- }
-
- if (!Tk_IsTopLevel(winPtr2)) {
- Tcl_AppendResult(interp, "window \"", winPtr2->pathName,
- "\" isn't a top-level window", (char *) NULL);
- return TCL_ERROR;
- }
-
- if (!Tk_IsMapped(winPtr)) {
- Tcl_AppendResult(interp, "window \"", winPtr->pathName,
- "\" isn't mapped", (char *) NULL);
- return TCL_ERROR;
- }
-
- if (!Tk_IsMapped(winPtr2)) {
- Tcl_AppendResult(interp, "window \"", winPtr2->pathName,
- "\" isn't mapped", (char *) NULL);
- return TCL_ERROR;
- }
-
- /*
- * Lookup stacking order of all toplevels that are children
- * of "." and find the position of winPtr and winPtr2
- * in the stacking order.
- */
-
- windows = TkWmStackorderToplevel(winPtr->mainPtr->winPtr);
-
- if (windows == NULL) {
- Tcl_AppendResult(interp, "TkWmStackorderToplevel failed",
- (char *) NULL);
- return TCL_ERROR;
- } else {
- for (window_ptr = windows; *window_ptr ; window_ptr++) {
- if (*window_ptr == winPtr)
- index1 = (window_ptr - windows);
- if (*window_ptr == winPtr2)
- index2 = (window_ptr - windows);
- }
- if (index1 == -1)
- panic("winPtr window not found");
- if (index2 == -1)
- panic("winPtr2 window not found");
-
- ckfree((char *) windows);
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
- if (index == OPT_ISABOVE) {
- result = index1 > index2;
- } else { /* OPT_ISBELOW */
- result = index1 < index2;
- }
- Tcl_SetIntObj(Tcl_GetObjResult(interp), result);
- return TCL_OK;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmStateCmd --
- *
- * This procedure is invoked to process the "wm state" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmStateCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- static CONST char *optionStrings[] = {
- "normal", "iconic", "withdrawn", "zoomed", (char *) NULL };
- enum options {
- OPT_NORMAL, OPT_ICONIC, OPT_WITHDRAWN, OPT_ZOOMED };
- int index;
-
- if ((objc < 3) || (objc > 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?state?");
- return TCL_ERROR;
- }
- if (objc == 4) {
- if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't change state of ",
- Tcl_GetString(objv[2]),
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
- if (winPtr->flags & TK_EMBEDDED) {
- Tcl_AppendResult(interp, "can't change state of ",
- winPtr->pathName, ": it is an embedded window",
- (char *) NULL);
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- if (index == OPT_NORMAL) {
- TkpWmSetState(winPtr, NormalState);
- /*
- * This varies from 'wm deiconify' because it does not
- * force the window to be raised and receive focus
- */
- } else if (index == OPT_ICONIC) {
- if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) {
- Tcl_AppendResult(interp, "can't iconify \"",
- winPtr->pathName,
- "\": override-redirect flag is set",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (wmPtr->master != NULL) {
- Tcl_AppendResult(interp, "can't iconify \"",
- winPtr->pathName,
- "\": it is a transient", (char *) NULL);
- return TCL_ERROR;
- }
- TkpWmSetState(winPtr, IconicState);
- } else if (index == OPT_WITHDRAWN) {
- TkpWmSetState(winPtr, WithdrawnState);
- } else { /* OPT_ZOOMED */
- TkpWmSetState(winPtr, ZoomState);
- }
- } else {
- if (wmPtr->iconFor != NULL) {
- Tcl_SetResult(interp, "icon", TCL_STATIC);
- } else {
- switch (wmPtr->hints.initial_state) {
- case NormalState:
- Tcl_SetResult(interp, "normal", TCL_STATIC);
- break;
- case IconicState:
- Tcl_SetResult(interp, "iconic", TCL_STATIC);
- break;
- case WithdrawnState:
- Tcl_SetResult(interp, "withdrawn", TCL_STATIC);
- break;
- case ZoomState:
- Tcl_SetResult(interp, "zoomed", TCL_STATIC);
- break;
- }
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmTitleCmd --
- *
- * This procedure is invoked to process the "wm title" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmTitleCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- char *argv3;
- int length;
-
- if (objc > 4) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?newTitle?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- Tcl_SetResult(interp, (char *)
- ((wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid),
- TCL_STATIC);
- return TCL_OK;
- } else {
- if (wmPtr->title != NULL) {
- ckfree((char *) wmPtr->title);
- }
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- wmPtr->title = ckalloc((unsigned) (length + 1));
- strcpy(wmPtr->title, argv3);
- if (!(wmPtr->flags & WM_NEVER_MAPPED) && !Tk_IsEmbedded(winPtr)) {
- TkSetWMName(winPtr, wmPtr->title);
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmTransientCmd --
- *
- * This procedure is invoked to process the "wm transient" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmTransientCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- Tk_Window master;
- WmInfo *wmPtr2;
- char *argv3;
- int length;
-
- if ((objc != 3) && (objc != 4)) {
- Tcl_WrongNumArgs(interp, 2, objv, "window ?master?");
- return TCL_ERROR;
- }
- if (objc == 3) {
- if (wmPtr->master != None) {
- Tcl_SetResult(interp, wmPtr->masterWindowName, TCL_STATIC);
- }
- return TCL_OK;
- }
- if (Tcl_GetString(objv[3])[0] == '\0') {
- wmPtr->master = None;
- if (wmPtr->masterWindowName != NULL) {
- ckfree(wmPtr->masterWindowName);
- }
- wmPtr->masterWindowName = NULL;
- wmPtr->style = documentProc;
- } else {
- if (TkGetWindowFromObj(interp, tkwin, objv[3], &master) != TCL_OK) {
- return TCL_ERROR;
- }
- Tk_MakeWindowExist(master);
-
- if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't make \"",
- Tcl_GetString(objv[2]),
- "\" a transient: it is an icon for ",
- Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
-
- wmPtr2 = ((TkWindow *) master)->wmInfoPtr;
-
- if (wmPtr2->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't make \"",
- Tcl_GetString(objv[3]),
- "\" a master: it is an icon for ",
- Tk_PathName(wmPtr2->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
-
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- wmPtr->master = Tk_WindowId(master);
- wmPtr->masterWindowName = ckalloc((unsigned) length+1);
- strcpy(wmPtr->masterWindowName, argv3);
- wmPtr->style = plainDBox;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * WmWithdrawCmd --
- *
- * This procedure is invoked to process the "wm withdraw" Tcl command.
- * See the user documentation for details on what it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-WmWithdrawCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
-
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "window");
- return TCL_ERROR;
- }
- if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't withdraw ", Tcl_GetString(objv[2]),
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
- return TCL_ERROR;
- }
- TkpWmSetState(winPtr, WithdrawnState);
- return TCL_OK;
-}
-
-/*
- * Invoked by those wm subcommands that affect geometry.
- * Schedules a geometry update.
- */
-static void
-WmUpdateGeom(wmPtr, winPtr)
- WmInfo *wmPtr;
- TkWindow *winPtr;
-{
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_SetGrid --
- *
- * This procedure is invoked by a widget when it wishes to set a grid
- * coordinate system that controls the size of a top-level window.
- * It provides a C interface equivalent to the "wm grid" command and
- * is usually asscoiated with the -setgrid option.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Grid-related information will be passed to the window manager, so
- * that the top-level window associated with tkwin will resize on
- * even grid units. If some other window already controls gridding
- * for the top-level window then this procedure call has no effect.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_SetGrid(
- Tk_Window tkwin, /* Token for window. New window mgr info
- * will be posted for the top-level window
- * associated with this window. */
- int reqWidth, /* Width (in grid units) corresponding to
- * the requested geometry for tkwin. */
- int reqHeight, /* Height (in grid units) corresponding to
- * the requested geometry for tkwin. */
- int widthInc, int heightInc)/* Pixel increments corresponding to a
- * change of one grid unit. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- register WmInfo *wmPtr;
-
- /*
- * Find the top-level window for tkwin, plus the window manager
- * information.
- */
-
- while (!(winPtr->flags & TK_TOP_HIERARCHY)) {
- winPtr = winPtr->parentPtr;
- }
- wmPtr = winPtr->wmInfoPtr;
- if (wmPtr == NULL) {
- return;
- }
-
- if ((wmPtr->gridWin != NULL) && (wmPtr->gridWin != tkwin)) {
- return;
- }
-
- if ((wmPtr->reqGridWidth == reqWidth)
- && (wmPtr->reqGridHeight == reqHeight)
- && (wmPtr->widthInc == widthInc)
- && (wmPtr->heightInc == heightInc)
- && ((wmPtr->sizeHintsFlags & (PBaseSize|PResizeInc))
- == (PBaseSize|PResizeInc))) {
- return;
- }
-
- /*
- * If gridding was previously off, then forget about any window
- * size requests made by the user or via "wm geometry": these are
- * in pixel units and there's no easy way to translate them to
- * grid units since the new requested size of the top-level window in
- * pixels may not yet have been registered yet (it may filter up
- * the hierarchy in DoWhenIdle handlers). However, if the window
- * has never been mapped yet then just leave the window size alone:
- * assume that it is intended to be in grid units but just happened
- * to have been specified before this procedure was called.
- */
-
- if ((wmPtr->gridWin == NULL) && !(wmPtr->flags & WM_NEVER_MAPPED)) {
- wmPtr->width = -1;
- wmPtr->height = -1;
- }
-
- /*
- * Set the new gridding information, and start the process of passing
- * all of this information to the window manager.
- */
-
- wmPtr->gridWin = tkwin;
- wmPtr->reqGridWidth = reqWidth;
- wmPtr->reqGridHeight = reqHeight;
- wmPtr->widthInc = widthInc;
- wmPtr->heightInc = heightInc;
- wmPtr->sizeHintsFlags |= PBaseSize|PResizeInc;
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_UnsetGrid --
- *
- * This procedure cancels the effect of a previous call
- * to Tk_SetGrid.
- *
- * Results:
- * None.
- *
- * Side effects:
- * If tkwin currently controls gridding for its top-level window,
- * gridding is cancelled for that top-level window; if some other
- * window controls gridding then this procedure has no effect.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_UnsetGrid(
- Tk_Window tkwin) /* Token for window that is currently
- * controlling gridding. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- register WmInfo *wmPtr;
-
- /*
- * Find the top-level window for tkwin, plus the window manager
- * information.
- */
-
- while (!(winPtr->flags & TK_TOP_HIERARCHY)) {
- winPtr = winPtr->parentPtr;
- }
- wmPtr = winPtr->wmInfoPtr;
- if (wmPtr == NULL) {
- return;
- }
-
- if (tkwin != wmPtr->gridWin) {
- return;
- }
-
- wmPtr->gridWin = NULL;
- wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc);
- if (wmPtr->width != -1) {
- wmPtr->width = winPtr->reqWidth + (wmPtr->width
- - wmPtr->reqGridWidth)*wmPtr->widthInc;
- wmPtr->height = winPtr->reqHeight + (wmPtr->height
- - wmPtr->reqGridHeight)*wmPtr->heightInc;
- }
- wmPtr->widthInc = 1;
- wmPtr->heightInc = 1;
-
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TopLevelEventProc --
- *
- * This procedure is invoked when a top-level (or other externally-
- * managed window) is restructured in any way.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Tk's internal data structures for the window get modified to
- * reflect the structural change.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-TopLevelEventProc(
- ClientData clientData, /* Window for which event occurred. */
- XEvent *eventPtr) /* Event that just happened. */
-{
- register TkWindow *winPtr = (TkWindow *) clientData;
-
- winPtr->wmInfoPtr->flags |= WM_VROOT_OFFSET_STALE;
- if (eventPtr->type == DestroyNotify) {
- Tk_ErrorHandler handler;
-
- if (!(winPtr->flags & TK_ALREADY_DEAD)) {
- /*
- * A top-level window was deleted externally (e.g., by the window
- * manager). This is probably not a good thing, but cleanup as
- * best we can. The error handler is needed because
- * Tk_DestroyWindow will try to destroy the window, but of course
- * it's already gone.
- */
-
- handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1,
- (Tk_ErrorProc *) NULL, (ClientData) NULL);
- Tk_DestroyWindow((Tk_Window) winPtr);
- Tk_DeleteErrorHandler(handler);
- }
- if (wmTracing) {
- printf("TopLevelEventProc: %s deleted\n", winPtr->pathName);
- }
- } else if (eventPtr->type == ReparentNotify) {
- panic("recieved unwanted reparent event");
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TopLevelReqProc --
- *
- * This procedure is invoked by the geometry manager whenever
- * the requested size for a top-level window is changed.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Arrange for the window to be resized to satisfy the request
- * (this happens as a when-idle action).
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-static void
-TopLevelReqProc(
- ClientData dummy, /* Not used. */
- Tk_Window tkwin) /* Information about window. */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- WmInfo *wmPtr;
-
- wmPtr = winPtr->wmInfoPtr;
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * UpdateGeometryInfo --
- *
- * This procedure is invoked when a top-level window is first
- * mapped, and also as a when-idle procedure, to bring the
- * geometry and/or position of a top-level window back into
- * line with what has been requested by the user and/or widgets.
- * This procedure doesn't return until the window manager has
- * responded to the geometry change.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The window's size and location may change, unless the WM prevents
- * that from happening.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-UpdateGeometryInfo(
- ClientData clientData) /* Pointer to the window's record. */
-{
- register TkWindow *winPtr = (TkWindow *) clientData;
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int x, y, width, height;
- unsigned long serial;
-
- wmPtr->flags &= ~WM_UPDATE_PENDING;
-
- /*
- * Compute the new size for the top-level window. See the
- * user documentation for details on this, but the size
- * requested depends on (a) the size requested internally
- * by the window's widgets, (b) the size requested by the
- * user in a "wm geometry" command or via wm-based interactive
- * resizing (if any), and (c) whether or not the window is
- * gridded. Don't permit sizes <= 0 because this upsets
- * the X server.
- */
-
- if (wmPtr->width == -1) {
- width = winPtr->reqWidth;
- } else if (wmPtr->gridWin != NULL) {
- width = winPtr->reqWidth
- + (wmPtr->width - wmPtr->reqGridWidth)*wmPtr->widthInc;
- } else {
- width = wmPtr->width;
- }
- if (width <= 0) {
- width = 1;
- }
- if (wmPtr->height == -1) {
- height = winPtr->reqHeight;
- } else if (wmPtr->gridWin != NULL) {
- height = winPtr->reqHeight
- + (wmPtr->height - wmPtr->reqGridHeight)*wmPtr->heightInc;
- } else {
- height = wmPtr->height;
- }
- if (height <= 0) {
- height = 1;
- }
-
- /*
- * Compute the new position for the upper-left pixel of the window's
- * decorative frame. This is tricky, because we need to include the
- * border widths supplied by a reparented parent in this calculation,
- * but can't use the parent's current overall size since that may
- * change as a result of this code.
- */
-
- if (wmPtr->flags & WM_NEGATIVE_X) {
- x = wmPtr->vRootWidth - wmPtr->x
- - (width + (wmPtr->parentWidth - winPtr->changes.width));
- } else {
- x = wmPtr->x;
- }
- if (wmPtr->flags & WM_NEGATIVE_Y) {
- y = wmPtr->vRootHeight - wmPtr->y
- - (height + (wmPtr->parentHeight - winPtr->changes.height));
- } else {
- y = wmPtr->y;
- }
-
- /*
- * If the window's size is going to change and the window is
- * supposed to not be resizable by the user, then we have to
- * update the size hints. There may also be a size-hint-update
- * request pending from somewhere else, too.
- */
-
- if (((width != winPtr->changes.width)
- || (height != winPtr->changes.height))
- && (wmPtr->gridWin == NULL)
- && ((wmPtr->sizeHintsFlags & (PMinSize|PMaxSize)) == 0)) {
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- }
- if (wmPtr->flags & WM_UPDATE_SIZE_HINTS) {
- UpdateSizeHints(winPtr);
- }
-
- /*
- * Reconfigure the window if it isn't already configured correctly.
- * A few tricky points:
- *
- * 1. If the window is embedded and the container is also in this
- * process, don't actually reconfigure the window; just pass the
- * desired size on to the container. Also, zero out any position
- * information, since embedded windows are not allowed to move.
- * 2. Sometimes the window manager will give us a different size
- * than we asked for (e.g. mwm has a minimum size for windows), so
- * base the size check on what we *asked for* last time, not what we
- * got.
- * 3. Don't move window unless a new position has been requested for
- * it. This is because of "features" in some window managers (e.g.
- * twm, as of 4/24/91) where they don't interpret coordinates
- * according to ICCCM. Moving a window to its current location may
- * cause it to shift position on the screen.
- */
-
- if (Tk_IsEmbedded(winPtr)) {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(winPtr);
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- if (contWinPtr != NULL) {
- /*
- * This window is embedded and the container is also in this
- * process, so we don't need to do anything special about the
- * geometry, except to make sure that the desired size is known
- * by the container. Also, zero out any position information,
- * since embedded windows are not allowed to move.
- */
-
- wmPtr->x = wmPtr->y = 0;
- wmPtr->flags &= ~(WM_NEGATIVE_X|WM_NEGATIVE_Y);
- Tk_GeometryRequest((Tk_Window) contWinPtr, width, height);
- }
- return;
- }
- serial = NextRequest(winPtr->display);
- if (wmPtr->flags & WM_MOVE_PENDING) {
- wmPtr->configWidth = width;
- wmPtr->configHeight = height;
- if (wmTracing) {
- printf(
- "UpdateGeometryInfo moving to %d %d, resizing to %d x %d,\n",
- x, y, width, height);
- }
- Tk_MoveResizeWindow((Tk_Window) winPtr, x, y, (unsigned) width,
- (unsigned) height);
- } else if ((width != wmPtr->configWidth)
- || (height != wmPtr->configHeight)) {
- wmPtr->configWidth = width;
- wmPtr->configHeight = height;
- if (wmTracing) {
- printf("UpdateGeometryInfo resizing to %d x %d\n", width, height);
- }
- Tk_ResizeWindow((Tk_Window) winPtr, (unsigned) width,
- (unsigned) height);
- } else {
- return;
- }
-}
-
-/*
- *--------------------------------------------------------------
- *
- * UpdateSizeHints --
- *
- * This procedure is called to update the window manager's
- * size hints information from the information in a WmInfo
- * structure.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Properties get changed for winPtr.
- *
- *--------------------------------------------------------------
- */
-
-static void
-UpdateSizeHints(
- TkWindow *winPtr)
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- XSizeHints *hintsPtr;
-
- wmPtr->flags &= ~WM_UPDATE_SIZE_HINTS;
-
- hintsPtr = XAllocSizeHints();
- if (hintsPtr == NULL) {
- return;
- }
-
- /*
- * Compute the pixel-based sizes for the various fields in the
- * size hints structure, based on the grid-based sizes in
- * our structure.
- */
-
- if (wmPtr->gridWin != NULL) {
- hintsPtr->base_width = winPtr->reqWidth
- - (wmPtr->reqGridWidth * wmPtr->widthInc);
- if (hintsPtr->base_width < 0) {
- hintsPtr->base_width = 0;
- }
- hintsPtr->base_height = winPtr->reqHeight
- - (wmPtr->reqGridHeight * wmPtr->heightInc);
- if (hintsPtr->base_height < 0) {
- hintsPtr->base_height = 0;
- }
- hintsPtr->min_width = hintsPtr->base_width
- + (wmPtr->minWidth * wmPtr->widthInc);
- hintsPtr->min_height = hintsPtr->base_height
- + (wmPtr->minHeight * wmPtr->heightInc);
- hintsPtr->max_width = hintsPtr->base_width
- + (wmPtr->maxWidth * wmPtr->widthInc);
- hintsPtr->max_height = hintsPtr->base_height
- + (wmPtr->maxHeight * wmPtr->heightInc);
- } else {
- hintsPtr->min_width = wmPtr->minWidth;
- hintsPtr->min_height = wmPtr->minHeight;
- hintsPtr->max_width = wmPtr->maxWidth;
- hintsPtr->max_height = wmPtr->maxHeight;
- hintsPtr->base_width = 0;
- hintsPtr->base_height = 0;
- }
- hintsPtr->width_inc = wmPtr->widthInc;
- hintsPtr->height_inc = wmPtr->heightInc;
- hintsPtr->min_aspect.x = wmPtr->minAspect.x;
- hintsPtr->min_aspect.y = wmPtr->minAspect.y;
- hintsPtr->max_aspect.x = wmPtr->maxAspect.x;
- hintsPtr->max_aspect.y = wmPtr->maxAspect.y;
- hintsPtr->win_gravity = wmPtr->gravity;
- hintsPtr->flags = wmPtr->sizeHintsFlags | PMinSize | PMaxSize;
-
- /*
- * If the window isn't supposed to be resizable, then set the
- * minimum and maximum dimensions to be the same.
- */
-
- if (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) {
- if (wmPtr->width >= 0) {
- hintsPtr->min_width = wmPtr->width;
- } else {
- hintsPtr->min_width = winPtr->reqWidth;
- }
- hintsPtr->max_width = hintsPtr->min_width;
- }
- if (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) {
- if (wmPtr->height >= 0) {
- hintsPtr->min_height = wmPtr->height;
- } else {
- hintsPtr->min_height = winPtr->reqHeight;
- }
- hintsPtr->max_height = hintsPtr->min_height;
- }
-
- XSetWMNormalHints(winPtr->display, winPtr->window, hintsPtr);
-
- XFree((char *) hintsPtr);
-}
-
-/*
- *--------------------------------------------------------------
- *
- * ParseGeometry --
- *
- * This procedure parses a geometry string and updates
- * information used to control the geometry of a top-level
- * window.
- *
- * Results:
- * A standard Tcl return value, plus an error message in
- * the interp's result if an error occurs.
- *
- * Side effects:
- * The size and/or location of winPtr may change.
- *
- *--------------------------------------------------------------
- */
-
-static int
-ParseGeometry(
- Tcl_Interp *interp, /* Used for error reporting. */
- char *string, /* String containing new geometry. Has the
- * standard form "=wxh+x+y". */
- TkWindow *winPtr) /* Pointer to top-level window whose
- * geometry is to be changed. */
-{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
- int x, y, width, height, flags;
- char *end;
- register char *p = string;
-
- /*
- * The leading "=" is optional.
- */
-
- if (*p == '=') {
- p++;
- }
-
- /*
- * Parse the width and height, if they are present. Don't
- * actually update any of the fields of wmPtr until we've
- * successfully parsed the entire geometry string.
- */
-
- width = wmPtr->width;
- height = wmPtr->height;
- x = wmPtr->x;
- y = wmPtr->y;
- flags = wmPtr->flags;
- if (isdigit(UCHAR(*p))) {
- width = strtoul(p, &end, 10);
- p = end;
- if (*p != 'x') {
- goto error;
- }
- p++;
- if (!isdigit(UCHAR(*p))) {
- goto error;
- }
- height = strtoul(p, &end, 10);
- p = end;
- }
-
- /*
- * Parse the X and Y coordinates, if they are present.
- */
-
- if (*p != '\0') {
- flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y);
- if (*p == '-') {
- flags |= WM_NEGATIVE_X;
- } else if (*p != '+') {
- goto error;
- }
- x = strtol(p+1, &end, 10);
- p = end;
- if (*p == '-') {
- flags |= WM_NEGATIVE_Y;
- } else if (*p != '+') {
- goto error;
- }
- y = strtol(p+1, &end, 10);
- if (*end != '\0') {
- goto error;
- }
-
- /*
- * Assume that the geometry information came from the user,
- * unless an explicit source has been specified. Otherwise
- * most window managers assume that the size hints were
- * program-specified and they ignore them.
- */
-
- if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) {
- wmPtr->sizeHintsFlags |= USPosition;
- flags |= WM_UPDATE_SIZE_HINTS;
- }
- }
-
- /*
- * Everything was parsed OK. Update the fields of *wmPtr and
- * arrange for the appropriate information to be percolated out
- * to the window manager at the next idle moment.
- */
-
- wmPtr->width = width;
- wmPtr->height = height;
- if ((x != wmPtr->x) || (y != wmPtr->y)
- || ((flags & (WM_NEGATIVE_X|WM_NEGATIVE_Y))
- != (wmPtr->flags & (WM_NEGATIVE_X|WM_NEGATIVE_Y)))) {
- wmPtr->x = x;
- wmPtr->y = y;
- flags |= WM_MOVE_PENDING;
- }
- wmPtr->flags = flags;
-
- if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
- Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
- wmPtr->flags |= WM_UPDATE_PENDING;
- }
- return TCL_OK;
-
- error:
- Tcl_AppendResult(interp, "bad geometry specifier \"",
- string, "\"", (char *) NULL);
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetRootCoords --
- *
- * Given a token for a window, this procedure traces through the
- * window's lineage to find the (virtual) root-window coordinates
- * corresponding to point (0,0) in the window.
- *
- * Results:
- * The locations pointed to by xPtr and yPtr are filled in with
- * the root coordinates of the (0,0) point in tkwin. If a virtual
- * root window is in effect for the window, then the coordinates
- * in the virtual root are returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_GetRootCoords(
- Tk_Window tkwin, /* Token for window. */
- int *xPtr, /* Where to store x-displacement of (0,0). */
- int *yPtr) /* Where to store y-displacement of (0,0). */
-{
- int x, y;
- register TkWindow *winPtr = (TkWindow *) tkwin;
-
- /*
- * Search back through this window's parents all the way to a
- * top-level window, combining the offsets of each window within
- * its parent.
- */
-
- x = y = 0;
- while (1) {
- x += winPtr->changes.x + winPtr->changes.border_width;
- y += winPtr->changes.y + winPtr->changes.border_width;
- if (winPtr->flags & TK_TOP_HIERARCHY) {
- if (!(Tk_IsEmbedded(winPtr))) {
- x += winPtr->wmInfoPtr->xInParent;
- y += winPtr->wmInfoPtr->yInParent;
- break;
- } else {
- TkWindow *otherPtr;
-
- otherPtr = TkpGetOtherWindow(winPtr);
- if (otherPtr != NULL) {
- /*
- * The container window is in the same application.
- * Query its coordinates.
- */
- winPtr = otherPtr;
-
- /*
- * Remember to offset by the container window here,
- * since at the end of this if branch, we will
- * pop out to the container's parent...
- */
-
- x += winPtr->changes.x + winPtr->changes.border_width;
- y += winPtr->changes.y + winPtr->changes.border_width;
-
- } else {
- Point theOffset;
-
- if (gMacEmbedHandler->getOffsetProc != NULL) {
- /*
- * We do not require that the changes.x & changes.y for
- * a non-Tk master window be kept up to date. So we
- * first subtract off the possibly bogus values that have
- * been added on at the top of this pass through the loop,
- * and then call out to the getOffsetProc to give us
- * the correct offset.
- */
-
- x -= winPtr->changes.x + winPtr->changes.border_width;
- y -= winPtr->changes.y + winPtr->changes.border_width;
-
- gMacEmbedHandler->getOffsetProc((Tk_Window) winPtr, &theOffset);
-
- x += theOffset.h;
- y += theOffset.v;
- }
- break;
- }
- }
- }
- if (winPtr->flags & TK_TOP_HIERARCHY) {
- break; /* Punt */
- }
- winPtr = winPtr->parentPtr;
- }
- *xPtr = x;
- *yPtr = y;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_CoordsToWindow --
- *
- * This is a Macintosh specific implementation of this function.
- * Given the root coordinates of a point, this procedure returns
- * the token for the top-most window covering that point, if
- * there exists such a window in this application.
- *
- * Results:
- * The return result is either a token for the window corresponding
- * to rootX and rootY, or else NULL to indicate that there is no such
- * window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Tk_Window
-Tk_CoordsToWindow(
- int rootX, int rootY, /* Coordinates of point in root window. If
- * a virtual-root window manager is in use,
- * these coordinates refer to the virtual
- * root, not the real root. */
- Tk_Window tkwin) /* Token for any window in application;
- * used to identify the display. */
-{
- WindowPtr whichWin;
- Point where;
- Window rootChild;
- register TkWindow *winPtr, *childPtr;
- TkWindow *nextPtr; /* Coordinates of highest child found so
- * 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.
- */
-
- where.h = rootX;
- where.v = rootY;
- FindWindow(where, &whichWin);
- if (whichWin == NULL) {
- return NULL;
- }
- rootChild = TkMacGetXWindow(whichWin);
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, rootChild);
- if (winPtr == NULL) {
- return NULL;
- }
-
- /*
- * Step 2: work down through the hierarchy underneath this window.
- * At each level, scan through all the children to find the highest
- * one in the stacking order that contains the point. Then repeat
- * the whole process on that child.
- */
-
- x = rootX - winPtr->wmInfoPtr->xInParent;
- y = rootY - winPtr->wmInfoPtr->yInParent;
- while (1) {
- x -= winPtr->changes.x;
- y -= winPtr->changes.y;
- nextPtr = NULL;
-
- /*
- * Container windows cannot have children. So if it is a container,
- * look there, otherwise inspect the children.
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL) {
- if (Tk_IsMapped(childPtr)) {
- tmpx = x - childPtr->changes.x;
- tmpy = y - childPtr->changes.y;
- bd = childPtr->changes.border_width;
-
- if ((tmpx >= -bd) && (tmpy >= -bd)
- && (tmpx < (childPtr->changes.width + bd))
- && (tmpy < (childPtr->changes.height + bd))) {
- nextPtr = childPtr;
- }
- }
- }
-
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- } else {
- for (childPtr = winPtr->childList; childPtr != NULL;
- childPtr = childPtr->nextPtr) {
- if (!Tk_IsMapped(childPtr) ||
- (childPtr->flags & TK_TOP_HIERARCHY)) {
- continue;
- }
- tmpx = x - childPtr->changes.x;
- tmpy = y - childPtr->changes.y;
- bd = childPtr->changes.border_width;
- if ((tmpx >= -bd) && (tmpy >= -bd)
- && (tmpx < (childPtr->changes.width + bd))
- && (tmpy < (childPtr->changes.height + bd))) {
- nextPtr = childPtr;
- }
- }
- }
- if (nextPtr == NULL) {
- break;
- }
- winPtr = nextPtr;
- }
- return (Tk_Window) winPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_TopCoordsToWindow --
- *
- * Given a Tk Window, and coordinates of a point relative to that window
- * this procedure returns the top-most child of the window (excluding
- * toplevels) covering that point, if there exists such a window in this
- * application.
- * It also sets newX, and newY to the coords of the point relative to the
- * window returned.
- *
- * Results:
- * The return result is either a token for the window corresponding
- * to rootX and rootY, or else NULL to indicate that there is no such
- * window. newX and newY are also set to the coords of the point relative
- * to the returned window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Tk_Window
-Tk_TopCoordsToWindow(
- Tk_Window tkwin, /* Token for a Tk Window which defines the;
- * coordinates for rootX & rootY */
- int rootX, int rootY, /* Coordinates of a point in tkWin. */
- int *newX, int *newY) /* Coordinates of point in the upperMost child of
- * tkWin containing (rootX,rootY) */
-{
- register TkWindow *winPtr, *childPtr;
- TkWindow *nextPtr; /* Coordinates of highest child found so
- * far that contains point. */
- int x, y; /* Coordinates in winPtr. */
- Window *children; /* Children of winPtr, or NULL. */
-
- winPtr = (TkWindow *) tkwin;
- x = rootX;
- y = rootY;
- while (1) {
- nextPtr = NULL;
- children = NULL;
-
- /*
- * Container windows cannot have children. So if it is a container,
- * look there, otherwise inspect the children.
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL) {
- if (Tk_IsMapped(childPtr) &&
- (x > childPtr->changes.x &&
- x < childPtr->changes.x +
- childPtr->changes.width) &&
- (y > childPtr->changes.y &&
- y < childPtr->changes.y +
- childPtr->changes.height)) {
- nextPtr = childPtr;
- }
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- } else {
-
- for (childPtr = winPtr->childList; childPtr != NULL;
- childPtr = childPtr->nextPtr) {
- if (!Tk_IsMapped(childPtr) ||
- (childPtr->flags & TK_TOP_HIERARCHY)) {
- continue;
- }
- if (x < childPtr->changes.x || y < childPtr->changes.y) {
- continue;
- }
- if (x > childPtr->changes.x + childPtr->changes.width ||
- y > childPtr->changes.y + childPtr->changes.height) {
- continue;
- }
- nextPtr = childPtr;
- }
- }
- if (nextPtr == NULL) {
- break;
- }
- winPtr = nextPtr;
- x -= winPtr->changes.x;
- y -= winPtr->changes.y;
- }
- *newX = x;
- *newY = y;
- return (Tk_Window) winPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * UpdateVRootGeometry --
- *
- * This procedure is called to update all the virtual root
- * geometry information in wmPtr.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The vRootX, vRootY, vRootWidth, and vRootHeight fields in
- * wmPtr are filled with the most up-to-date information.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-UpdateVRootGeometry(
- WmInfo *wmPtr) /* Window manager information to be
- * updated. The wmPtr->vRoot field must
- * be valid. */
-{
- TkWindow *winPtr = wmPtr->winPtr;
- unsigned int bd, dummy;
- Window dummy2;
- Status status;
- Tk_ErrorHandler handler;
-
- /*
- * If this isn't a virtual-root window manager, just return information
- * about the screen.
- */
-
- wmPtr->flags &= ~WM_VROOT_OFFSET_STALE;
- if (wmPtr->vRoot == None) {
- noVRoot:
- wmPtr->vRootX = wmPtr->vRootY = 0;
- wmPtr->vRootWidth = DisplayWidth(winPtr->display, winPtr->screenNum);
- wmPtr->vRootHeight = DisplayHeight(winPtr->display, winPtr->screenNum);
- return;
- }
-
- /*
- * Refresh the virtual root information if it's out of date.
- */
-
- handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1,
- (Tk_ErrorProc *) NULL, (ClientData) NULL);
- status = XGetGeometry(winPtr->display, wmPtr->vRoot,
- &dummy2, &wmPtr->vRootX, &wmPtr->vRootY,
- &wmPtr->vRootWidth, &wmPtr->vRootHeight, &bd, &dummy);
- if (wmTracing) {
- printf("UpdateVRootGeometry: x = %d, y = %d, width = %d, ",
- wmPtr->vRootX, wmPtr->vRootY, wmPtr->vRootWidth);
- printf("height = %d, status = %d\n", wmPtr->vRootHeight, status);
- }
- Tk_DeleteErrorHandler(handler);
- if (status == 0) {
- /*
- * The virtual root is gone! Pretend that it never existed.
- */
-
- wmPtr->vRoot = None;
- goto noVRoot;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetVRootGeometry --
- *
- * This procedure returns information about the virtual root
- * window corresponding to a particular Tk window.
- *
- * Results:
- * The values at xPtr, yPtr, widthPtr, and heightPtr are set
- * with the offset and dimensions of the root window corresponding
- * to tkwin. If tkwin is being managed by a virtual root window
- * manager these values correspond to the virtual root window being
- * used for tkwin; otherwise the offsets will be 0 and the
- * dimensions will be those of the screen.
- *
- * Side effects:
- * Vroot window information is refreshed if it is out of date.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_GetVRootGeometry(
- Tk_Window tkwin, /* Window whose virtual root is to be
- * queried. */
- int *xPtr, int *yPtr, /* Store x and y offsets of virtual root
- * here. */
- int *widthPtr, /* Store dimensions of virtual root here. */
- int *heightPtr)
-{
- WmInfo *wmPtr;
- TkWindow *winPtr = (TkWindow *) tkwin;
-
- /*
- * Find the top-level window for tkwin, and locate the window manager
- * information for that window.
- */
-
- while (!(winPtr->flags & TK_TOP_HIERARCHY)) {
- winPtr = winPtr->parentPtr;
- }
- wmPtr = winPtr->wmInfoPtr;
- if (wmPtr == NULL) {
- return; /* Punt */
- }
-
- /*
- * Make sure that the geometry information is up-to-date, then copy
- * it out to the caller.
- */
-
- if (wmPtr->flags & WM_VROOT_OFFSET_STALE) {
- UpdateVRootGeometry(wmPtr);
- }
- *xPtr = wmPtr->vRootX;
- *yPtr = wmPtr->vRootY;
- *widthPtr = wmPtr->vRootWidth;
- *heightPtr = wmPtr->vRootHeight;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_MoveToplevelWindow --
- *
- * This procedure is called instead of Tk_MoveWindow to adjust
- * the x-y location of a top-level window. It delays the actual
- * move to a later time and keeps window-manager information
- * up-to-date with the move
- *
- * Results:
- * None.
- *
- * Side effects:
- * The window is eventually moved so that its upper-left corner
- * (actually, the upper-left corner of the window's decorative
- * frame, if there is one) is at (x,y).
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_MoveToplevelWindow(
- Tk_Window tkwin, /* Window to move. */
- int x, int y) /* New location for window (within
- * parent). */
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
-
- if (!(winPtr->flags & TK_TOP_LEVEL)) {
- panic("Tk_MoveToplevelWindow called with non-toplevel window");
- }
- wmPtr->x = x;
- wmPtr->y = y;
- wmPtr->flags |= WM_MOVE_PENDING;
- wmPtr->flags &= ~(WM_NEGATIVE_X|WM_NEGATIVE_Y);
- if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) {
- wmPtr->sizeHintsFlags |= USPosition;
- wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
- }
-
- /*
- * If the window has already been mapped, must bring its geometry
- * up-to-date immediately, otherwise an event might arrive from the
- * server that would overwrite wmPtr->x and wmPtr->y and lose the
- * new position.
- */
-
- if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
- if (wmPtr->flags & WM_UPDATE_PENDING) {
- Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
- }
- UpdateGeometryInfo((ClientData) winPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmProtocolEventProc --
- *
- * This procedure is called by the Tk_HandleEvent whenever a
- * ClientMessage event arrives whose type is "WM_PROTOCOLS".
- * This procedure handles the message from the window manager
- * in an appropriate fashion.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Depends on what sort of handler, if any, was set up for the
- * protocol.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWmProtocolEventProc(
- TkWindow *winPtr, /* Window to which the event was sent. */
- XEvent *eventPtr) /* X event. */
-{
- WmInfo *wmPtr;
- register ProtocolHandler *protPtr;
- Tcl_Interp *interp;
- Atom protocol;
- int result;
-
- wmPtr = winPtr->wmInfoPtr;
- if (wmPtr == NULL) {
- return;
- }
- protocol = (Atom) eventPtr->xclient.data.l[0];
- for (protPtr = wmPtr->protPtr; protPtr != NULL;
- protPtr = protPtr->nextPtr) {
- if (protocol == protPtr->protocol) {
- Tcl_Preserve((ClientData) protPtr);
- interp = protPtr->interp;
- Tcl_Preserve((ClientData) interp);
- result = Tcl_GlobalEval(interp, protPtr->command);
- if (result != TCL_OK) {
- Tcl_AddErrorInfo(interp, "\n (command for \"");
- Tcl_AddErrorInfo(interp,
- Tk_GetAtomName((Tk_Window) winPtr, protocol));
- Tcl_AddErrorInfo(interp, "\" window manager protocol)");
- Tk_BackgroundError(interp);
- }
- Tcl_Release((ClientData) interp);
- Tcl_Release((ClientData) protPtr);
- return;
- }
- }
-
- /*
- * No handler was present for this protocol. If this is a
- * WM_DELETE_WINDOW message then just destroy the window.
- */
-
- if (protocol == Tk_InternAtom((Tk_Window) winPtr, "WM_DELETE_WINDOW")) {
- Tk_DestroyWindow((Tk_Window) winPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmStackorderToplevelWrapperMap --
- *
- * This procedure will create a table that maps the reparent wrapper
- * X id for a toplevel to the TkWindow structure that is wraps.
- * Tk keeps track of a mapping from the window X id to the TkWindow
- * structure but that does us no good here since we only get the X
- * id of the wrapper window. Only those toplevel windows that are
- * mapped have a position in the stacking order.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Adds entries to the passed hashtable.
- *
- *----------------------------------------------------------------------
- */
-void
-TkWmStackorderToplevelWrapperMap(winPtr, table)
- TkWindow *winPtr; /* TkWindow to recurse on */
- Tcl_HashTable *table; /* Maps mac window to TkWindow */
-{
- TkWindow *childPtr;
- Tcl_HashEntry *hPtr;
- WindowPeek wrapper;
- int newEntry;
-
- if (Tk_IsMapped(winPtr) && Tk_IsTopLevel(winPtr) &&
- !Tk_IsEmbedded(winPtr)) {
- wrapper = (WindowPeek) TkMacGetDrawablePort(winPtr->window);
-
- hPtr = Tcl_CreateHashEntry(table,
- (char *) wrapper, &newEntry);
- Tcl_SetHashValue(hPtr, winPtr);
- }
-
- for (childPtr = winPtr->childList; childPtr != NULL;
- childPtr = childPtr->nextPtr) {
- TkWmStackorderToplevelWrapperMap(childPtr, table);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmStackorderToplevel --
- *
- * This procedure returns the stack order of toplevel windows.
- *
- * Results:
- * An array of pointers to tk window objects in stacking order
- * or else NULL if there was an error.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkWindow **
-TkWmStackorderToplevel(parentPtr)
- TkWindow *parentPtr; /* Parent toplevel window. */
-{
- WindowPeek frontWindow;
- TkWindow *childWinPtr, **windows, **window_ptr;
- Tcl_HashTable table;
- Tcl_HashEntry *hPtr;
- Tcl_HashSearch search;
-
- /*
- * Map mac windows to a TkWindow of the wrapped toplevel.
- */
-
- Tcl_InitHashTable(&table, TCL_ONE_WORD_KEYS);
- TkWmStackorderToplevelWrapperMap(parentPtr, &table);
-
- windows = (TkWindow **) ckalloc((table.numEntries+1)
- * sizeof(TkWindow *));
-
- /*
- * Special cases: If zero or one toplevels were mapped
- * there is no need to enumerate Windows.
- */
-
- switch (table.numEntries) {
- case 0:
- windows[0] = NULL;
- goto done;
- case 1:
- hPtr = Tcl_FirstHashEntry(&table, &search);
- windows[0] = (TkWindow *) Tcl_GetHashValue(hPtr);
- windows[1] = NULL;
- goto done;
- }
-
- if (TkMacHaveAppearance() >= 0x110) {
- frontWindow = (WindowPeek) FrontNonFloatingWindow();
- } else {
- frontWindow = (WindowPeek) FrontWindow();
- }
-
- if (frontWindow == NULL) {
- ckfree((char *) windows);
- windows = NULL;
- } else {
- window_ptr = windows + table.numEntries;
- *window_ptr-- = NULL;
- while (frontWindow != NULL) {
- hPtr = Tcl_FindHashEntry(&table, (char *) frontWindow);
- if (hPtr != NULL) {
- childWinPtr = (TkWindow *) Tcl_GetHashValue(hPtr);
- *window_ptr-- = childWinPtr;
- }
- frontWindow = frontWindow->nextWindow;
- }
- if (window_ptr != (windows-1))
- panic("num matched toplevel windows does not equal num children");
- }
-
- done:
- Tcl_DeleteHashTable(&table);
- return windows;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmRestackToplevel --
- *
- * This procedure restacks a top-level window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * WinPtr gets restacked as specified by aboveBelow and otherPtr.
- * This procedure doesn't return until the restack has taken
- * effect and the ConfigureNotify event for it has been received.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWmRestackToplevel(
- TkWindow *winPtr, /* Window to restack. */
- int aboveBelow, /* Gives relative position for restacking;
- * must be Above or Below. */
- TkWindow *otherPtr) /* Window relative to which to restack;
- * if NULL, then winPtr gets restacked
- * above or below *all* siblings. */
-{
- WmInfo *wmPtr;
- WindowPeek macWindow, otherMacWindow, frontWindow;
-
- wmPtr = winPtr->wmInfoPtr;
-
- /*
- * Get the mac window. Make sure it exists & is mapped.
- */
-
- if (winPtr->window == None) {
- Tk_MakeWindowExist((Tk_Window) winPtr);
- }
- if (winPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
-
- /*
- * Can't set stacking order properly until the window is on the
- * screen (mapping it may give it a reparent window), so make sure
- * it's on the screen.
- */
-
- TkWmMapWindow(winPtr);
- }
- macWindow = (WindowPeek) TkMacGetDrawablePort(winPtr->window);
-
- /*
- * Get the window in which a raise or lower is in relation to.
- */
- if (otherPtr != NULL) {
- if (otherPtr->window == None) {
- Tk_MakeWindowExist((Tk_Window) otherPtr);
- }
- if (otherPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
- TkWmMapWindow(otherPtr);
- }
- otherMacWindow = (WindowPeek) TkMacGetDrawablePort(otherPtr->window);
- } else {
- otherMacWindow = NULL;
- }
-
- if (TkMacHaveAppearance() >= 0x110) {
- frontWindow = (WindowPeek) FrontNonFloatingWindow();
- } else {
- frontWindow = (WindowPeek) FrontWindow();
- }
-
- if (aboveBelow == Above) {
- if (macWindow == frontWindow) {
- /*
- * Do nothing - it's already at the top.
- */
- } else if (otherMacWindow == frontWindow || otherMacWindow == NULL) {
- /*
- * Raise the window to the top. If the window is visable then
- * we also make it the active window.
- */
-
- if (wmPtr->hints.initial_state == WithdrawnState) {
- BringToFront((WindowPtr) macWindow);
- } else {
- SelectWindow((WindowPtr) macWindow);
- }
- } else {
- /*
- * Find the window to be above. (Front window will actually be the
- * window to be behind.) Front window is NULL if no other windows.
- */
- while (frontWindow != NULL &&
- frontWindow->nextWindow != otherMacWindow) {
- frontWindow = frontWindow->nextWindow;
- }
- if (frontWindow != NULL) {
- SendBehind((WindowPtr) macWindow, (WindowPtr) frontWindow);
- }
- }
- } else {
- /*
- * Send behind. If it was in front find another window to make active.
- */
- if (macWindow == frontWindow) {
- if (macWindow->nextWindow != NULL) {
- SelectWindow((WindowPtr) macWindow->nextWindow);
- }
- }
- SendBehind((WindowPtr) macWindow, (WindowPtr) otherMacWindow);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmAddToColormapWindows --
- *
- * This procedure is called to add a given window to the
- * WM_COLORMAP_WINDOWS property for its top-level, if it
- * isn't already there. It is invoked by the Tk code that
- * creates a new colormap, in order to make sure that colormap
- * information is propagated to the window manager by default.
- *
- * Results:
- * None.
- *
- * Side effects:
- * WinPtr's window gets added to the WM_COLORMAP_WINDOWS
- * property of its nearest top-level ancestor, unless the
- * colormaps have been set explicitly with the
- * "wm colormapwindows" command.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWmAddToColormapWindows(
- TkWindow *winPtr) /* Window with a non-default colormap.
- * Should not be a top-level window. */
-{
- TkWindow *topPtr;
- TkWindow **oldPtr, **newPtr;
- int count, i;
-
- if (winPtr->window == None) {
- return;
- }
-
- for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) {
- if (topPtr == NULL) {
- /*
- * Window is being deleted. Skip the whole operation.
- */
-
- return;
- }
- if (topPtr->flags & TK_TOP_HIERARCHY) {
- break;
- }
- }
- if (topPtr->wmInfoPtr == NULL) {
- return;
- }
-
- if (topPtr->wmInfoPtr->flags & WM_COLORMAPS_EXPLICIT) {
- return;
- }
-
- /*
- * Make sure that the window isn't already in the list.
- */
-
- count = topPtr->wmInfoPtr->cmapCount;
- oldPtr = topPtr->wmInfoPtr->cmapList;
-
- for (i = 0; i < count; i++) {
- if (oldPtr[i] == winPtr) {
- return;
- }
- }
-
- /*
- * Make a new bigger array and use it to reset the property.
- * Automatically add the toplevel itself as the last element
- * of the list.
- */
-
- newPtr = (TkWindow **) ckalloc((unsigned) ((count+2)*sizeof(TkWindow*)));
- if (count > 0) {
- memcpy(newPtr, oldPtr, count * sizeof(TkWindow*));
- }
- if (count == 0) {
- count++;
- }
- newPtr[count-1] = winPtr;
- newPtr[count] = topPtr;
- if (oldPtr != NULL) {
- ckfree((char *) oldPtr);
- }
-
- topPtr->wmInfoPtr->cmapList = newPtr;
- topPtr->wmInfoPtr->cmapCount = count+1;
-
- /*
- * On the Macintosh all of this is just an excercise
- * in compatability as we don't support colormaps. If
- * we did they would be installed here.
- */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmRemoveFromColormapWindows --
- *
- * This procedure is called to remove a given window from the
- * WM_COLORMAP_WINDOWS property for its top-level. It is invoked
- * when windows are deleted.
- *
- * Results:
- * None.
- *
- * Side effects:
- * WinPtr's window gets removed from the WM_COLORMAP_WINDOWS
- * property of its nearest top-level ancestor, unless the
- * top-level itself is being deleted too.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWmRemoveFromColormapWindows(
- TkWindow *winPtr) /* Window that may be present in
- * WM_COLORMAP_WINDOWS property for its
- * top-level. Should not be a top-level
- * window. */
-{
- TkWindow *topPtr;
- TkWindow **oldPtr;
- int count, i, j;
-
- for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) {
- if (topPtr == NULL) {
- /*
- * Ancestors have been deleted, so skip the whole operation.
- * Seems like this can't ever happen?
- */
-
- return;
- }
- if (topPtr->flags & TK_TOP_HIERARCHY) {
- break;
- }
- }
- if (topPtr->flags & TK_ALREADY_DEAD) {
- /*
- * Top-level is being deleted, so there's no need to cleanup
- * the WM_COLORMAP_WINDOWS property.
- */
-
- return;
- }
-
- /*
- * Find the window and slide the following ones down to cover
- * it up.
- */
-
- if (topPtr->wmInfoPtr == NULL) {
- return;
- }
-
- count = topPtr->wmInfoPtr->cmapCount;
- oldPtr = topPtr->wmInfoPtr->cmapList;
- for (i = 0; i < count; i++) {
- if (oldPtr[i] == winPtr) {
- for (j = i ; j < count-1; j++) {
- oldPtr[j] = oldPtr[j+1];
- }
- topPtr->wmInfoPtr->cmapCount = count - 1;
- break;
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetPointerCoords --
- *
- * Fetch the position of the mouse pointer.
- *
- * Results:
- * *xPtr and *yPtr are filled in with the (virtual) root coordinates
- * of the mouse pointer for tkwin's display. If the pointer isn't
- * on tkwin's screen, then -1 values are returned for both
- * coordinates. The argument tkwin must be a toplevel window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkGetPointerCoords(
- Tk_Window tkwin, /* Toplevel window that identifies screen
- * on which lookup is to be done. */
- int *xPtr, int *yPtr) /* Store pointer coordinates here. */
-{
- Point where;
-
- GetMouse(&where);
- LocalToGlobal(&where);
- *xPtr = where.h;
- *yPtr = where.v;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * InitialWindowBounds --
- *
- * This function calculates the initial bounds for a new Mac
- * toplevel window. Unless the geometry is specified by the user
- * this code will auto place the windows in a cascade diagonially
- * across the main monitor of the Mac.
- *
- * Results:
- * The bounds are returned in geometry.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-InitialWindowBounds(
- TkWindow *winPtr, /* Window to get initial bounds for. */
- Rect *geometry) /* On return the initial bounds. */
-{
- int x, y;
- static int defaultX = 5;
- static int defaultY = 45;
-
- if (!(winPtr->wmInfoPtr->sizeHintsFlags & (USPosition | PPosition))) {
- /*
- * We will override the program & hopefully place the
- * window in a "better" location.
- */
-
- if (((tcl_macQdPtr->screenBits.bounds.right - defaultX) < 30) ||
- ((tcl_macQdPtr->screenBits.bounds.bottom - defaultY) < 30)) {
- defaultX = 5;
- defaultY = 45;
- }
- x = defaultX;
- y = defaultY;
- defaultX += 20;
- defaultY += 20;
- } else {
- x = winPtr->wmInfoPtr->x;
- y = winPtr->wmInfoPtr->y;
- }
-
- geometry->left = x;
- geometry->top = y;
- geometry->right = x + winPtr->changes.width;
- geometry->bottom = y + winPtr->changes.height;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacResizable --
- *
- * This function determines if the passed in window is part of
- * a toplevel window that is resizable. If the window is
- * resizable in the x, y or both directions, true is returned.
- *
- * Results:
- * True if resizable, false otherwise.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacResizable(
- TkWindow *winPtr) /* Tk window or NULL. */
-{
- WmInfo *wmPtr;
-
- if (winPtr == NULL) {
- return false;
- }
- while (winPtr->wmInfoPtr == NULL) {
- winPtr = winPtr->parentPtr;
- }
-
- wmPtr = winPtr->wmInfoPtr;
- if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) &&
- (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) {
- return false;
- } else {
- return true;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGrowToplevel --
- *
- * The function is invoked when the user clicks in the grow region
- * of a Tk window. The function will handle the dragging
- * procedure and not return until completed. Finally, the function
- * may place information Tk's event queue is the window was resized.
- *
- * Results:
- * True if events were placed on event queue, false otherwise.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacGrowToplevel(
- WindowPtr whichWindow,
- Point start)
-{
- Point where = start;
- TkDisplay *dispPtr;
-
- GlobalToLocal(&where);
- if (where.h > (whichWindow->portRect.right - 16) &&
- where.v > (whichWindow->portRect.bottom - 16)) {
-
- Window window;
- TkWindow *winPtr;
- WmInfo *wmPtr;
- Rect bounds;
- long growResult;
-
- window = TkMacGetXWindow(whichWindow);
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
- wmPtr = winPtr->wmInfoPtr;
-
- /* TODO: handle grid size options. */
- if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) &&
- (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) {
- return false;
- }
- if (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) {
- bounds.left = bounds.right = winPtr->changes.width;
- } else {
- bounds.left = (wmPtr->minWidth < 64) ? 64 : wmPtr->minWidth;
- bounds.right = (wmPtr->maxWidth < 64) ? 64 : wmPtr->maxWidth;
- }
- if (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) {
- bounds.top = bounds.bottom = winPtr->changes.height;
- } else {
- bounds.top = (wmPtr->minHeight < 64) ? 64 : wmPtr->minHeight;
- bounds.bottom = (wmPtr->maxHeight < 64) ? 64 : wmPtr->maxHeight;
- }
-
- growResult = GrowWindow(whichWindow, start, &bounds);
-
- if (growResult != 0) {
- SizeWindow(whichWindow,
- LoWord(growResult), HiWord(growResult), true);
- SetPort(whichWindow);
- InvalRect(&whichWindow->portRect); /* TODO: may not be needed */
- TkMacInvalClipRgns(winPtr);
- TkGenWMConfigureEvent((Tk_Window) winPtr, -1, -1,
- (int) LoWord(growResult), (int) HiWord(growResult),
- TK_SIZE_CHANGED);
- return true;
- }
- return false;
- }
- return false;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkSetWMName --
- *
- * Set the title for a toplevel window. If the window is embedded,
- * do not change the window title.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The title of the window is changed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkSetWMName(
- TkWindow *winPtr,
- CONST char *title)
-{
- Str255 pTitle;
- GWorldPtr macWin;
- int destWrote;
-
- if (Tk_IsEmbedded(winPtr)) {
- return;
- }
- Tcl_UtfToExternal(NULL, NULL, title,
- strlen(title), 0, NULL,
- (char *) &pTitle[1],
- 255, NULL, &destWrote, NULL); /* Internalize native */
- pTitle[0] = destWrote;
-
- macWin = TkMacGetDrawablePort(winPtr->window);
-
- SetWTitle((WindowPtr) macWin, pTitle);
-}
-
-void
-TkGenWMDestroyEvent(
- Tk_Window tkwin)
-{
- XEvent event;
-
- event.xany.serial = Tk_Display(tkwin)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(tkwin);
-
- event.xclient.window = Tk_WindowId(tkwin);
- event.xclient.type = ClientMessage;
- event.xclient.message_type = Tk_InternAtom(tkwin, "WM_PROTOCOLS");
- event.xclient.format = 32;
- event.xclient.data.l[0] = Tk_InternAtom(tkwin, "WM_DELETE_WINDOW");
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGenWMConfigureEvent --
- *
- * Generate a ConfigureNotify event for Tk. Depending on the
- * value of flag the values of width/height, x/y, or both may
- * be changed.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A ConfigureNotify event is sent to Tk.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkGenWMConfigureEvent(
- Tk_Window tkwin,
- int x,
- int y,
- int width,
- int height,
- int flags)
-{
- XEvent event;
- WmInfo *wmPtr;
- TkWindow *winPtr = (TkWindow *) tkwin;
-
- if (tkwin == NULL) {
- return;
- }
-
- event.type = ConfigureNotify;
- event.xconfigure.serial = Tk_Display(tkwin)->request;
- event.xconfigure.send_event = False;
- event.xconfigure.display = Tk_Display(tkwin);
- event.xconfigure.event = Tk_WindowId(tkwin);
- event.xconfigure.window = Tk_WindowId(tkwin);
- event.xconfigure.border_width = winPtr->changes.border_width;
- event.xconfigure.override_redirect = winPtr->atts.override_redirect;
- if (winPtr->changes.stack_mode == Above) {
- event.xconfigure.above = winPtr->changes.sibling;
- } else {
- event.xconfigure.above = None;
- }
-
- if (flags & TK_LOCATION_CHANGED) {
- event.xconfigure.x = x;
- event.xconfigure.y = y;
- } else {
- event.xconfigure.x = Tk_X(tkwin);
- event.xconfigure.y = Tk_Y(tkwin);
- x = Tk_X(tkwin);
- y = Tk_Y(tkwin);
- }
- if (flags & TK_SIZE_CHANGED) {
- event.xconfigure.width = width;
- event.xconfigure.height = height;
- } else {
- event.xconfigure.width = Tk_Width(tkwin);
- event.xconfigure.height = Tk_Height(tkwin);
- width = Tk_Width(tkwin);
- height = Tk_Height(tkwin);
- }
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- /*
- * Update window manager information.
- */
- if (Tk_IsTopLevel(winPtr)) {
- wmPtr = winPtr->wmInfoPtr;
- if (flags & TK_LOCATION_CHANGED) {
- wmPtr->x = x;
- wmPtr->y = y;
- wmPtr->flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y);
- }
- if ((flags & TK_SIZE_CHANGED) &&
- ((width != Tk_Width(tkwin)) || (height != Tk_Height(tkwin)))) {
- if ((wmPtr->width == -1) && (width == winPtr->reqWidth)) {
- /*
- * Don't set external width, since the user didn't change it
- * from what the widgets asked for.
- */
- } else {
- if (wmPtr->gridWin != NULL) {
- wmPtr->width = wmPtr->reqGridWidth
- + (width - winPtr->reqWidth)/wmPtr->widthInc;
- if (wmPtr->width < 0) {
- wmPtr->width = 0;
- }
- } else {
- wmPtr->width = width;
- }
- }
- if ((wmPtr->height == -1) && (height == winPtr->reqHeight)) {
- /*
- * Don't set external height, since the user didn't change it
- * from what the widgets asked for.
- */
- } else {
- if (wmPtr->gridWin != NULL) {
- wmPtr->height = wmPtr->reqGridHeight
- + (height - winPtr->reqHeight)/wmPtr->heightInc;
- if (wmPtr->height < 0) {
- wmPtr->height = 0;
- }
- } else {
- wmPtr->height = height;
- }
- }
- wmPtr->configWidth = width;
- wmPtr->configHeight = height;
- }
- }
-
- /*
- * Now set up the changes structure. Under X we wait for the
- * ConfigureNotify to set these values. On the Mac we know imediatly that
- * this is what we want - so we just set them. However, we need to
- * make sure the windows clipping region is marked invalid so the
- * change is visable to the subwindow.
- */
- winPtr->changes.x = x;
- winPtr->changes.y = y;
- winPtr->changes.width = width;
- winPtr->changes.height = height;
- TkMacInvalClipRgns(winPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetTransientMaster --
- *
- * If the passed window has the TRANSIENT_FOR property set this
- * will return the master window. Otherwise it will return None.
- *
- * Results:
- * The master window or None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Window
-TkGetTransientMaster(
- TkWindow *winPtr)
-{
- if (winPtr->wmInfoPtr != NULL) {
- return winPtr->wmInfoPtr->master;
- }
- return None;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGetXWindow --
- *
- * Returns the X window Id associated with the given WindowRef.
- *
- * Results:
- * The window id is returned. None is returned if not a Tk window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Window
-TkMacGetXWindow(
- WindowRef macWinPtr)
-{
- register Tcl_HashEntry *hPtr;
-
- if ((macWinPtr == NULL) || !windowHashInit) {
- return None;
- }
- hPtr = Tcl_FindHashEntry(&windowTable, (char *) macWinPtr);
- if (hPtr == NULL) {
- return None;
- }
- return (Window) Tcl_GetHashValue(hPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacZoomToplevel --
- *
- * The function is invoked when the user clicks in the zoom region
- * of a Tk window. The function will handle the mouse tracking
- * for the interaction. If the window is to be zoomed the window
- * size is changed and events are generated to let Tk know what
- * happened.
- *
- * Results:
- * True if events were placed on event queue, false otherwise.
- *
- * Side effects:
- * The window may be resized & events placed on Tk's queue.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacZoomToplevel(
- WindowPtr whichWindow, /* The Macintosh window to zoom. */
- Point where, /* The current mouse position. */
- short zoomPart) /* Either inZoomIn or inZoomOut */
-{
- Window window;
- Tk_Window tkwin;
- Point location = {0, 0};
- int xOffset, yOffset;
- WmInfo *wmPtr;
- TkDisplay *dispPtr;
-
- SetPort(whichWindow);
- if (!TrackBox(whichWindow, where, zoomPart)) {
- return false;
- }
-
- /*
- * We should now zoom the window (as long as it's one of ours). We
- * also need to generate an event to let Tk know that the window size
- * has changed.
- */
- window = TkMacGetXWindow(whichWindow);
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- if (tkwin == NULL) {
- return false;
- }
-
- /*
- * The following block of code works around a bug in the window
- * definition for Apple's floating windows. The zoom behavior is
- * broken - we must manually set the standard state (by default
- * it's something like 1x1) and we must swap the zoomPart manually
- * otherwise we always get the same zoomPart and nothing happens.
- */
- wmPtr = ((TkWindow *) tkwin)->wmInfoPtr;
- if (wmPtr->style >= floatProc && wmPtr->style <= floatSideZoomGrowProc) {
- if (zoomPart == inZoomIn) {
- Rect zoomRect = tcl_macQdPtr->screenBits.bounds;
- InsetRect(&zoomRect, 60, 60);
- SetWindowStandardState(whichWindow, &zoomRect);
- zoomPart = inZoomOut;
- } else {
- zoomPart = inZoomIn;
- }
- }
-
- ZoomWindow(whichWindow, zoomPart, false);
- InvalRect(&whichWindow->portRect);
- TkMacInvalClipRgns((TkWindow *) tkwin);
-
- LocalToGlobal(&location);
- TkMacWindowOffset(whichWindow, &xOffset, &yOffset);
- location.h -= xOffset;
- location.v -= yOffset;
- TkGenWMConfigureEvent(tkwin, location.h, location.v,
- whichWindow->portRect.right - whichWindow->portRect.left,
- whichWindow->portRect.bottom - whichWindow->portRect.top,
- TK_BOTH_CHANGED);
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkUnsupported1Cmd --
- *
- * This procedure is invoked to process the
- * "::tk::unsupported::MacWindowStyle" Tcl command. This command
- * allows you to set the style of decoration for a Macintosh window.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * Changes the style of a new Mac window.
- *
- *----------------------------------------------------------------------
- */
-
- /* ARGSUSED */
-int
-TkUnsupported1Cmd(
- ClientData clientData, /* Main window associated with
- * interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int argc, /* Number of arguments. */
- CONST char **argv) /* Argument strings. */
-{
- Tk_Window tkwin = (Tk_Window) clientData;
- TkWindow *winPtr;
- register WmInfo *wmPtr;
- int c;
- size_t length;
-
- if (argc < 3) {
- wrongNumArgs:
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " option window ?arg ...?\"", (char *) NULL);
- return TCL_ERROR;
- }
-
- winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin);
- if (winPtr == NULL) {
- return TCL_ERROR;
- }
- if (!Tk_IsTopLevel(winPtr)) {
- Tcl_AppendResult(interp, "window \"", winPtr->pathName,
- "\" isn't a top-level window", (char *) NULL);
- return TCL_ERROR;
- }
- wmPtr = winPtr->wmInfoPtr;
- c = argv[1][0];
- length = strlen(argv[1]);
- if ((c == 's') && (strncmp(argv[1], "style", length) == 0)) {
- if (TkMacHaveAppearance() >= 0x110) {
- if ((argc < 3) || (argc > 5)) {
- Tcl_AppendResult(interp, "wrong # arguments: must be \"",
- argv[0], " style window ?windowStyle?\"",
- " or \"", argv[0], "style window ?class attributes?\"",
- (char *) NULL);
- return TCL_ERROR;
- }
- } else {
- if ((argc != 3) && (argc != 4)) {
- Tcl_AppendResult(interp, "wrong # arguments: must be \"",
- argv[0], " style window ?windowStyle?\"",
- (char *) NULL);
- return TCL_ERROR;
- }
- }
-
- if (argc == 3) {
- int appearanceSpec = 0;
-
- switch (wmPtr->style) {
- case -1:
- appearanceSpec = 1;
- break;
- case noGrowDocProc:
- case documentProc:
- Tcl_SetResult(interp, "documentProc", TCL_STATIC);
- break;
- case dBoxProc:
- Tcl_SetResult(interp, "dBoxProc", TCL_STATIC);
- break;
- case plainDBox:
- Tcl_SetResult(interp, "plainDBox", TCL_STATIC);
- break;
- case altDBoxProc:
- Tcl_SetResult(interp, "altDBoxProc", TCL_STATIC);
- break;
- case movableDBoxProc:
- Tcl_SetResult(interp, "movableDBoxProc", TCL_STATIC);
- break;
- case zoomDocProc:
- case zoomNoGrow:
- Tcl_SetResult(interp, "zoomDocProc", TCL_STATIC);
- break;
- case rDocProc:
- Tcl_SetResult(interp, "rDocProc", TCL_STATIC);
- break;
- case floatProc:
- case floatGrowProc:
- Tcl_SetResult(interp, "floatProc", TCL_STATIC);
- break;
- case floatZoomProc:
- case floatZoomGrowProc:
- Tcl_SetResult(interp, "floatZoomProc", TCL_STATIC);
- break;
- case floatSideProc:
- case floatSideGrowProc:
- Tcl_SetResult(interp, "floatSideProc", TCL_STATIC);
- break;
- case floatSideZoomProc:
- case floatSideZoomGrowProc:
- Tcl_SetResult(interp, "floatSideZoomProc", TCL_STATIC);
- break;
- default:
- panic("invalid style");
- }
- if (appearanceSpec) {
- Tcl_Obj *attributeList, *newResult;
-
- switch (wmPtr->macClass) {
- case kAlertWindowClass:
- newResult = Tcl_NewStringObj("alert", -1);
- break;
- case kMovableAlertWindowClass:
- newResult = Tcl_NewStringObj("moveableAlert", -1);
- break;
- case kModalWindowClass:
- newResult = Tcl_NewStringObj("modal", -1);
- break;
- case kMovableModalWindowClass:
- newResult = Tcl_NewStringObj("moveableModal", -1);
- break;
- case kFloatingWindowClass:
- newResult = Tcl_NewStringObj("floating", -1);
- break;
- case kDocumentWindowClass:
- newResult = Tcl_NewStringObj("document", -1);
- break;
- default:
- panic("invalid class");
- }
-
- attributeList = Tcl_NewListObj(0, NULL);
- if (wmPtr->attributes == kWindowNoAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("none", -1));
- } else if (wmPtr->attributes == kWindowStandardDocumentAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("standardDocument", -1));
- } else if (wmPtr->attributes == kWindowStandardFloatingAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("standardFloating", -1));
- } else {
- if (wmPtr->attributes & kWindowCloseBoxAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("closeBox", -1));
- }
- if (wmPtr->attributes & kWindowHorizontalZoomAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("horizontalZoom", -1));
- }
- if (wmPtr->attributes & kWindowVerticalZoomAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("verticalZoom", -1));
- }
- if (wmPtr->attributes & kWindowCollapseBoxAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("collapseBox", -1));
- }
- if (wmPtr->attributes & kWindowResizableAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("resizable", -1));
- }
- if (wmPtr->attributes & kWindowSideTitlebarAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("sideTitlebar", -1));
- }
- if (wmPtr->attributes & kWindowNoUpdatesAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("noUpdates", -1));
- }
- if (wmPtr->attributes & kWindowNoActivatesAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("noActivates", -1));
- }
- }
- Tcl_ListObjAppendElement(interp, newResult, attributeList);
- Tcl_SetObjResult(interp, newResult);
- }
- return TCL_OK;
- } else if (argc == 4) {
- if (strcmp(argv[3], "documentProc") == 0) {
- wmPtr->style = documentProc;
- } else if (strcmp(argv[3], "noGrowDocProc") == 0) {
- wmPtr->style = documentProc;
- } else if (strcmp(argv[3], "dBoxProc") == 0) {
- wmPtr->style = dBoxProc;
- } else if (strcmp(argv[3], "plainDBox") == 0) {
- wmPtr->style = plainDBox;
- } else if (strcmp(argv[3], "altDBoxProc") == 0) {
- wmPtr->style = altDBoxProc;
- } else if (strcmp(argv[3], "movableDBoxProc") == 0) {
- wmPtr->style = movableDBoxProc;
- } else if (strcmp(argv[3], "zoomDocProc") == 0) {
- wmPtr->style = zoomDocProc;
- } else if (strcmp(argv[3], "zoomNoGrow") == 0) {
- wmPtr->style = zoomNoGrow;
- } else if (strcmp(argv[3], "rDocProc") == 0) {
- wmPtr->style = rDocProc;
- } else if (strcmp(argv[3], "floatProc") == 0) {
- wmPtr->style = floatGrowProc;
- } else if (strcmp(argv[3], "floatGrowProc") == 0) {
- wmPtr->style = floatGrowProc;
- } else if (strcmp(argv[3], "floatZoomProc") == 0) {
- wmPtr->style = floatZoomGrowProc;
- } else if (strcmp(argv[3], "floatZoomGrowProc") == 0) {
- wmPtr->style = floatZoomGrowProc;
- } else if (strcmp(argv[3], "floatSideProc") == 0) {
- wmPtr->style = floatSideGrowProc;
- } else if (strcmp(argv[3], "floatSideGrowProc") == 0) {
- wmPtr->style = floatSideGrowProc;
- } else if (strcmp(argv[3], "floatSideZoomProc") == 0) {
- wmPtr->style = floatSideZoomGrowProc;
- } else if (strcmp(argv[3], "floatSideZoomGrowProc") == 0) {
- wmPtr->style = floatSideZoomGrowProc;
- } else {
- Tcl_AppendResult(interp, "bad style: should be documentProc, ",
- "dBoxProc, plainDBox, altDBoxProc, movableDBoxProc, ",
- "zoomDocProc, rDocProc, floatProc, floatZoomProc, ",
- "floatSideProc, or floatSideZoomProc",
- (char *) NULL);
- return TCL_ERROR;
- }
- } else if (argc == 5) {
- int oldClass = wmPtr->macClass;
- int oldAttributes = wmPtr->attributes;
-
- if (strcmp(argv[3], "alert") == 0) {
- wmPtr->macClass = kAlertWindowClass;
- } else if (strcmp(argv[3], "moveableAlert") == 0) {
- wmPtr->macClass = kMovableAlertWindowClass;
- } else if (strcmp(argv[3], "modal") == 0) {
- wmPtr->macClass = kModalWindowClass;
- } else if (strcmp(argv[3], "moveableModal") == 0) {
- wmPtr->macClass = kMovableModalWindowClass;
- } else if (strcmp(argv[3], "floating") == 0) {
- wmPtr->macClass = kFloatingWindowClass;
- } else if (strcmp(argv[3], "document") == 0) {
- wmPtr->macClass = kDocumentWindowClass;
- } else {
- wmPtr->macClass = oldClass;
- Tcl_AppendResult(interp, "bad class: should be alert, ",
- "moveableAlert, modal, moveableModal, floating, ",
- "or document",
- (char *) NULL);
- return TCL_ERROR;
- }
-
- if (strcmp(argv[4], "none") == 0) {
- wmPtr->attributes = kWindowNoAttributes;
- } else if (strcmp(argv[4], "standardDocument") == 0) {
- wmPtr->attributes = kWindowStandardDocumentAttributes;
- } else if (strcmp(argv[4], "standardFloating") == 0) {
- wmPtr->attributes = kWindowStandardFloatingAttributes;
- } else {
- int foundOne = 0;
- int attrArgc, i;
- CONST char **attrArgv = NULL;
-
- if (Tcl_SplitList(interp, argv[4], &attrArgc, &attrArgv) != TCL_OK) {
- wmPtr->macClass = oldClass;
- Tcl_AppendResult(interp, "Ill-formed attributes list: \"",
- argv[4], "\".", (char *) NULL);
- return TCL_ERROR;
- }
-
- wmPtr->attributes = kWindowNoAttributes;
-
- for (i = 0; i < attrArgc; i++) {
- if ((*attrArgv[i] == 'c')
- && (strcmp(attrArgv[i], "closeBox") == 0)) {
- wmPtr->attributes |= kWindowCloseBoxAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'h')
- && (strcmp(attrArgv[i], "horizontalZoom") == 0)) {
- wmPtr->attributes |= kWindowHorizontalZoomAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'v')
- && (strcmp(attrArgv[i], "verticalZoom") == 0)) {
- wmPtr->attributes |= kWindowVerticalZoomAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'c')
- && (strcmp(attrArgv[i], "collapseBox") == 0)) {
- wmPtr->attributes |= kWindowCollapseBoxAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'r')
- && (strcmp(attrArgv[i], "resizable") == 0)) {
- wmPtr->attributes |= kWindowResizableAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 's')
- && (strcmp(attrArgv[i], "sideTitlebar") == 0)) {
- wmPtr->attributes |= kWindowSideTitlebarAttribute;
- foundOne = 1;
- } else {
- foundOne = 0;
- break;
- }
- }
-
- if (attrArgv != NULL) {
- ckfree ((char *) attrArgv);
- }
-
- if (foundOne != 1) {
- wmPtr->macClass = oldClass;
- wmPtr->attributes = oldAttributes;
-
- Tcl_AppendResult(interp, "bad attribute: \"", argv[4],
- "\", should be standardDocument, ",
- "standardFloating, or some combination of ",
- "closeBox, horizontalZoom, verticalZoom, ",
- "collapseBox, resizable, or sideTitlebar.",
- (char *) NULL);
- return TCL_ERROR;
- }
- }
-
- wmPtr->style = -1;
- }
- } else {
- Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[1],
- "\": must be style",
- (char *) NULL);
- return TCL_ERROR;
- }
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMakeMenuWindow --
- *
- * Configure the window to be either a undecorated pull-down
- * (or pop-up) menu, or as a toplevel floating menu (palette).
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the style bit used to create a new Mac toplevel.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpMakeMenuWindow(
- Tk_Window tkwin, /* New window. */
- int transient) /* 1 means menu is only posted briefly as
- * a popup or pulldown or cascade. 0 means
- * menu is always visible, e.g. as a
- * floating menu. */
-{
- if (transient) {
- ((TkWindow *) tkwin)->wmInfoPtr->style = plainDBox;
- } else {
- ((TkWindow *) tkwin)->wmInfoPtr->style = floatProc;
- ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_WIDTH_NOT_RESIZABLE;
- ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_HEIGHT_NOT_RESIZABLE;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacMakeRealWindowExist --
- *
- * This function finally creates the real Macintosh window that
- * the Mac actually understands.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A new Macintosh toplevel is created.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacMakeRealWindowExist(
- TkWindow *winPtr) /* Tk window. */
-{
- WmInfo *wmPtr = winPtr->wmInfoPtr;
- WindowRef newWindow = NULL;
- MacDrawable *macWin;
- Rect geometry = {0,0,0,0};
- Tcl_HashEntry *valueHashPtr;
- int new;
- TkMacWindowList *listPtr;
-
- if (TkMacHostToplevelExists(winPtr)) {
- return;
- }
-
- macWin = (MacDrawable *) winPtr->window;
-
- /*
- * If this is embedded, make sure its container's toplevel exists,
- * then return...
- */
-
- if (Tk_IsEmbedded(winPtr)) {
- TkWindow *contWinPtr;
-
- contWinPtr = TkpGetOtherWindow(winPtr);
- if (contWinPtr != NULL) {
- TkMacMakeRealWindowExist(contWinPtr->privatePtr->toplevel->winPtr);
- macWin->flags |= TK_HOST_EXISTS;
- return;
- } else if (gMacEmbedHandler != NULL) {
- if (gMacEmbedHandler->containerExistProc != NULL) {
- if (gMacEmbedHandler->containerExistProc((Tk_Window) winPtr) != TCL_OK) {
- panic("ContainerExistProc could not make container");
- }
- }
- return;
- } else {
- panic("TkMacMakeRealWindowExist could not find container");
- }
-
- /*
- * NOTE: Here we should handle out of process embedding.
- */
-
- }
-
- InitialWindowBounds(winPtr, &geometry);
-
- if (TkMacHaveAppearance() >= 0x110 && wmPtr->style == -1) {
- OSStatus err;
- /*
- * There seems to be a bug in CreateNewWindow: If I set the
- * window geometry to be the too small for the structure region,
- * then the whole window is positioned incorrectly.
- * Adding this here makes the positioning work, and the size will
- * get overwritten when you actually map the contents of the window.
- */
-
- geometry.right += 64;
- geometry.bottom += 24;
- err = CreateNewWindow(wmPtr->macClass, wmPtr->attributes,
- &geometry, &newWindow);
- if (err != noErr) {
- newWindow = NULL;
- }
-
- } else {
- newWindow = NewCWindow(NULL, &geometry, "\ptemp", false,
- (short) wmPtr->style, (WindowRef) -1, true, 0);
- }
-
- if (newWindow == NULL) {
- panic("couldn't allocate new Mac window");
- }
-
- /*
- * Add this window to the list of toplevel windows.
- */
-
- listPtr = (TkMacWindowList *) ckalloc(sizeof(TkMacWindowList));
- listPtr->nextPtr = tkMacWindowListPtr;
- listPtr->winPtr = winPtr;
- tkMacWindowListPtr = listPtr;
-
- macWin->portPtr = (GWorldPtr) newWindow;
- tkMacMoveWindow(newWindow, (int) geometry.left, (int) geometry.top);
- SetPort((GrafPtr) newWindow);
-
- if (!windowHashInit) {
- Tcl_InitHashTable(&windowTable, TCL_ONE_WORD_KEYS);
- windowHashInit = true;
- }
- valueHashPtr = Tcl_CreateHashEntry(&windowTable,
- (char *) newWindow, &new);
- if (!new) {
- panic("same macintosh window allocated twice!");
- }
- Tcl_SetHashValue(valueHashPtr, macWin);
-
- macWin->flags |= TK_HOST_EXISTS;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacRegisterOffScreenWindow --
- *
- * This function adds the passed in Off Screen Port to the
- * hash table that maps Mac windows to root X windows.
- *
- * Results:
- * None.
- *
- * Side effects:
- * An entry is added to the windowTable hash table.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacRegisterOffScreenWindow(
- Window window, /* Window structure. */
- GWorldPtr portPtr) /* Pointer to a Mac GWorld. */
-{
- WindowRef newWindow = NULL;
- MacDrawable *macWin;
- Tcl_HashEntry *valueHashPtr;
- int new;
-
- macWin = (MacDrawable *) window;
- if (!windowHashInit) {
- Tcl_InitHashTable(&windowTable, TCL_ONE_WORD_KEYS);
- windowHashInit = true;
- }
- valueHashPtr = Tcl_CreateHashEntry(&windowTable,
- (char *) portPtr, &new);
- if (!new) {
- panic("same macintosh window allocated twice!");
- }
- Tcl_SetHashValue(valueHashPtr, macWin);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacUnregisterMacWindow --
- *
- * Given a macintosh port window, this function removes the
- * association between this window and the root X window that
- * Tk cares about.
- *
- * Results:
- * None.
- *
- * Side effects:
- * An entry is removed from the windowTable hash table.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacUnregisterMacWindow(
- GWorldPtr portPtr) /* Pointer to a Mac GWorld. */
-{
- if (!windowHashInit) {
- panic("TkMacUnregisterMacWindow: unmapping before inited");;
- }
- Tcl_DeleteHashEntry(Tcl_FindHashEntry(&windowTable,
- (char *) portPtr));
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacSetScrollbarGrow --
- *
- * Sets a flag for a toplevel window indicating that the passed
- * Tk scrollbar window will display the grow region for the
- * toplevel window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A flag is set int windows toplevel parent.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacSetScrollbarGrow(
- TkWindow *winPtr, /* Tk scrollbar window. */
- int flag) /* Boolean value true or false. */
-{
- if (flag) {
- winPtr->privatePtr->toplevel->flags |= TK_SCROLLBAR_GROW;
- winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr = winPtr;
- } else if (winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr
- == winPtr) {
- winPtr->privatePtr->toplevel->flags &= ~TK_SCROLLBAR_GROW;
- winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr = NULL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacGetScrollbarGrowWindow --
- *
- * Tests to see if a given window's toplevel window contains a
- * scrollbar that will draw the GrowIcon for the window.
- *
- * Results:
- * Boolean value.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkWindow *
-TkMacGetScrollbarGrowWindow(
- TkWindow *winPtr) /* Tk window. */
-{
- TkWindow *scrollWinPtr;
-
- if (winPtr == NULL) {
- return NULL;
- }
- scrollWinPtr =
- winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr;
- if (winPtr != NULL) {
- /*
- * We need to confirm the window exists.
- */
- if ((Tk_Window) scrollWinPtr !=
- Tk_IdToWindow(winPtr->display, winPtr->window)) {
- scrollWinPtr = NULL;
- }
- }
- return scrollWinPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmFocusToplevel --
- *
- * This is a utility procedure invoked by focus-management code. It
- * exists because of the extra wrapper windows that exist under
- * Unix; its job is to map from wrapper windows to the
- * corresponding toplevel windows. On PCs and Macs there are no
- * wrapper windows so no mapping is necessary; this procedure just
- * determines whether a window is a toplevel or not.
- *
- * Results:
- * If winPtr is a toplevel window, returns the pointer to the
- * window; otherwise returns NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkWindow *
-TkWmFocusToplevel(
- TkWindow *winPtr) /* Window that received a focus-related
- * event. */
-{
- if (!(winPtr->flags & TK_TOP_HIERARCHY)) {
- return NULL;
- }
- return winPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpGetWrapperWindow --
- *
- * This is a utility procedure invoked by focus-management code. It
- * maps to the wrapper for a top-level, which is just the same
- * as the top-level on Macs and PCs.
- *
- * Results:
- * If winPtr is a toplevel window, returns the pointer to the
- * window; otherwise returns NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkWindow *
-TkpGetWrapperWindow(
- TkWindow *winPtr) /* Window that received a focus-related
- * event. */
-{
- if (!(winPtr->flags & TK_TOP_LEVEL)) {
- return NULL;
- }
- return winPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpWmSetState --
- *
- * Sets the window manager state for the wrapper window of a
- * given toplevel window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May maximize, minimize, restore, or withdraw a window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpWmSetState(winPtr, state)
- TkWindow *winPtr; /* Toplevel window to operate on. */
- int state; /* One of IconicState, ZoomState, NormalState,
- * or WithdrawnState. */
-{
- WmInfo *wmPtr = winPtr->wmInfoPtr;
- GWorldPtr macWin;
-
- wmPtr->hints.initial_state = state;
- if (wmPtr->flags & WM_NEVER_MAPPED) {
- return;
- }
-
- macWin = TkMacGetDrawablePort(winPtr->window);
-
- if (state == WithdrawnState) {
- Tk_UnmapWindow((Tk_Window) winPtr);
- } else if (state == IconicState) {
- Tk_UnmapWindow((Tk_Window) winPtr);
- if (TkMacHaveAppearance()) {
- /*
- * The window always gets unmapped. However, if we can show the
- * icon version of the window (collapsed) we make the window visable
- * and then collapse it.
- *
- * TODO: This approach causes flashing!
- */
-
- if (IsWindowCollapsable((WindowRef) macWin)) {
- ShowWindow((WindowRef) macWin);
- CollapseWindow((WindowPtr) macWin, true);
- }
- }
- } else if (state == NormalState) {
- Tk_MapWindow((Tk_Window) winPtr);
- if (TkMacHaveAppearance()) {
- CollapseWindow((WindowPtr) macWin, false);
- }
- } else if (state == ZoomState) {
- /* TODO: need to support zoomed windows */
- }
-}
-/*
- *----------------------------------------------------------------------
- *
- * TkMacHaveAppearance --
- *
- * Determine if the appearance manager is available on this Mac.
- * We cache the result so future calls are fast. Return a different
- * value if 1.0.1 is present, since many interfaces were added in
- * 1.0.1
- *
- * Results:
- * 1 if the appearance manager is present, 2 if the appearance
- * manager version is 1.0.1 or greater, 0 if it is not present.
- *
- * Side effects:
- * Calls Gestalt to query system values.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkMacHaveAppearance()
-{
- static initialized = false;
- static int TkMacHaveAppearance = 0;
- long response = 0;
- OSErr err = noErr;
-
- if (!initialized) {
- err = Gestalt(gestaltAppearanceAttr, &response);
- if (err == noErr) {
- TkMacHaveAppearance = 1;
- }
-/* even if AppearanceManager 1.1 routines are present,
-we can't call them from 68K code, so we pretend
-to be running Apperarance Mgr 1.0 */
-#if !(GENERATING68K && !GENERATINGCFM)
- err = Gestalt(gestaltAppearanceVersion, &response);
-#endif
- if (err == noErr) {
- TkMacHaveAppearance = (int) response;
- }
- }
-
- return TkMacHaveAppearance;
-}
diff --git a/mac/tkMacXCursors.r b/mac/tkMacXCursors.r
deleted file mode 100644
index 1cba473..0000000
--- a/mac/tkMacXCursors.r
+++ /dev/null
@@ -1,959 +0,0 @@
-/*
- * tkMacXCursors.r --
- *
- * This file defines a set of Macintosh cursor resources that
- * emulate the X cursor set. All of these cursors were
- * constructed and donated by Grant Neufeld. (gneufeld@ccs.carleton.ca)
- *
- *
- * Copyright (c) 1995-1996 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- */
-
-/*
- * All of the X cursors are defined as 'CURS' resources. However, a
- * subset of the X cursors are also defined as 'crsr' resources. Tk
- * will attempt to first use the color cursors ('crsr') if it doesn't
- * exist it will attempt to use the black & white cursor ('CURS').
- */
-
-data 'CURS' (3000, "X_cursor") {
- $"E007 F00F F81F 7C3E 3E7C 1FF8 0FF0 07E0"
- $"07E0 0FF0 1FF8 3E7C 7C3E F81F F00F E007"
- $"0000 6006 700E 381C 1C38 0E70 07E0 03C0"
- $"03C0 07E0 0E70 1C38 381C 700E 6006 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3001, "arrow") {
- $"0000 0006 001E 007C 01FC 07F8 00F8 01F0"
- $"03B0 0720 0E20 1C00 3800 7000 2000 0000"
- $"0007 001F 007F 01FE 07FE 1FFC 7FFC 03F8"
- $"07F8 0FF0 1F70 3E60 7C60 F840 7040 2000"
- $"0001 000E"
-};
-
-data 'CURS' (3002, "based_arrow_down") {
- $"0000 0000 0000 1FE0 0000 1FE0 0300 0300"
- $"0300 0B40 0780 0300 0000 0000 0000 0000"
- $"0000 0000 0000 1FE0 0000 1FE0 0780 0780"
- $"3FF0 1FE0 0FC0 0780 0300 0000 0000 0000"
- $"000B 0006"
-};
-
-data 'CURS' (3003, "based_arrow_up") {
- $"0000 0000 0000 0000 0300 0780 0B40 0300"
- $"0300 0300 1FE0 0000 1FE0 0000 0000 0000"
- $"0000 0000 0000 0300 0780 0FC0 1FE0 3FF0"
- $"0780 0780 1FE0 0000 1FE0 0000 0000 0000"
- $"0004 0006"
-};
-
-data 'CURS' (3004, "boat") {
- $"0000 0000 0000 0000 0100 03C0 8460 FFFF"
- $"0018 0020 0040 FFC0 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0100 03C0 87E0 FFFF"
- $"FFF8 FFE0 FFC0 FFC0 0000 0000 0000 0000"
- $"0007 000F"
-};
-
-data 'CURS' (3005, "bogosity") {
- $"0000 711C 1110 1110 1110 7FFC 5114 5114"
- $"5114 5114 7FFC 1110 1110 1110 711C 0000"
- $"0000 0000 0000 0000 0000 7FFC 7FFC 7FFC"
- $"7FFC 7FFC 7FFC 0000 0000 0000 0000 0000"
- $"0001 0007"
-};
-
-data 'CURS' (3006, "bottom_left_corner") {
- $"0000 0000 0000 0000 C000 C020 C840 C880"
- $"C900 CA00 CC00 CFC0 C000 C000 FFF0 FFF0"
- $"0000 0000 0000 0000 0000 0020 0840 0880"
- $"0900 0A00 0C00 0FC0 0000 0000 0000 0000"
- $"000F 0000"
-};
-
-data 'CURS' (3007, "bottom_right_corner") {
- $"0000 0000 0000 0000 0003 0403 0213 0113"
- $"0093 0053 0033 03F3 0003 0003 0FFF 0FFF"
- $"0000 0000 0000 0000 0000 0400 0210 0110"
- $"0090 0050 0030 03F0 0000 0000 0000 0000"
- $"000F 000F"
-};
-
-data 'CURS' (3008, "bottom_side") {
- $"0000 0000 0100 0100 0100 0100 0100 1110"
- $"0920 0540 0380 0100 0000 7FFC 7FFC 0000"
- $"0000 0000 0100 0100 0100 0100 0100 1110"
- $"0920 0540 0380 0100 0000 0000 0000 0000"
- $"000B 0007"
-};
-
-data 'CURS' (3009, "bottom_tee") {
- $"0000 0000 0000 0180 0180 0180 0180 0180"
- $"0180 0180 7FFE 7FFE 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"000B 0007"
-};
-
-data 'CURS' (3010, "box_spiral") {
- $"FFFE 8000 BFFE A002 AFFA A80A ABEA AA2A"
- $"AAAA ABAA A82A AFEA A00A BFFA 8002 FFFE"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0008 0008"
-};
-
-data 'CURS' (3011, "center_ptr") {
- $"0000 0300 0300 0780 0780 0FC0 0FC0 1FE0"
- $"1FE0 3330 2310 0300 0300 0300 0300 0000"
- $"0300 0780 0780 0FC0 0FC0 1FE0 1FE0 3FF0"
- $"3FF0 7FF8 77B8 6798 0780 0780 0780 0780"
- $"0001 0006"
-};
-
-data 'CURS' (3012, "circle") {
- $"0000 03C0 0FF0 1FF8 3C3C 381C 700E 700E"
- $"700E 700E 381C 3C3C 1FF8 0FF0 03C0 0000"
- $"03C0 0FF0 1FF8 3FFC 7FFE 7C3E F81F F81F"
- $"F81F F81F 7C3E 7FFE 3FFC 1FF8 0FF0 03C0"
- $"0007 0007"
-};
-
-data 'CURS' (3013, "clock") {
- $"1FF8 33CC 6466 4992 4F12 4422 63C6 3FFC"
- $"2994 2994 2994 2BD4 6996 781E 7FFE 7FFE"
- $"1FF8 3FFC 7FFE 7FFE 7FFE 7FFE 7FFE 3FFC"
- $"3FFC 3FFC 3FFC 3FFC 7FFE 7FFE 7FFE 7FFE"
- $"0004 0008"
-};
-
-data 'CURS' (3014, "coffee_mug") {
- $"03F8 0C06 1001 1C07 33F9 7001 D001 9001"
- $"960D DA55 7A55 36ED 10A1 1001 0802 07FC"
- $"03F8 0FFE 1FFF 1FFF 3FFF 7FFF FFFF FFFF"
- $"FFFF FFFF 7FFF 3FFF 1FFF 1FFF 0FFE 07FC"
- $"0004 0003"
-};
-
-data 'CURS' (3015, "cross") {
- $"0280 0280 0280 0280 0280 0280 FEFE 0000"
- $"FEFE 0280 0280 0280 0280 0280 0280 0000"
- $"0380 0380 0380 0380 0380 0380 FFFE FFFE"
- $"FFFE 0380 0380 0380 0380 0380 0380 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3016, "cross_reverse") {
- $"4284 A28A 5294 2AA8 16D0 0AA0 FD7E 0280"
- $"FD7E 0AA0 16D0 2AA8 5294 A28A 4284 0000"
- $"4384 E38E 739C 3BB8 1FF0 0FE0 FFFE FFFE"
- $"FFFE 0FE0 1FF0 3BB8 739C E38E 4384 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3017, "crosshair") {
- $"0100 0100 0100 0100 0100 0100 0100 FEFE"
- $"0100 0100 0100 0100 0100 0100 0100 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3018, "diamond_cross") {
- $"0280 06C0 0AA0 1290 2288 4284 FEFE 0000"
- $"FEFE 4284 2288 1290 0AA0 06C0 0280 0000"
- $"0280 06C0 0EE0 1EF0 3EF8 7EFC FEFE 0000"
- $"FEFE 7EFC 3EF8 1EF0 0EE0 06C0 0280 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3019, "dot") {
- $"0000 0000 0780 1FE0 1FE0 3FF0 3FF0 3FF0"
- $"3FF0 1FE0 1FE0 0780 0000 0000 0000 0000"
- $"0000 0780 1FE0 3FF0 3FF0 7FF8 7FF8 7FF8"
- $"7FF8 3FF0 3FF0 1FE0 0780 0000 0000 0000"
- $"0006 0006"
-};
-
-data 'CURS' (3020, "dotbox") {
- $"0000 0000 3FFC 2004 2004 2004 2004 2184"
- $"2184 2004 2004 2004 2004 3FFC 0000 0000"
- $"0000 0000 3FFC 3FFC 300C 300C 318C 33CC"
- $"33CC 318C 300C 300C 3FFC 3FFC 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3021, "double_arrow") {
- $"0000 0180 03C0 07E0 0DB0 1998 0180 0180"
- $"0180 0180 1998 0DB0 07E0 03C0 0180 0000"
- $"0180 03C0 07E0 0FF0 1FF8 3FFC 3BDC 03C0"
- $"03C0 3BDC 3FFC 1FF8 0FF0 07E0 03C0 0180"
- $"0007 0007"
-};
-
-data 'CURS' (3022, "draft_large") {
- $"0000 0002 000C 003C 00F8 03F8 0FF0 00F0"
- $"0160 0260 0440 0840 1000 2000 4000 0000"
- $"0003 000F 003E 00FE 03FC 0FFC 3FF8 FFF8"
- $"03F0 07F0 0EE0 1CE0 38C0 70C0 E080 4080"
- $"0001 000E"
-};
-
-data 'CURS' (3023, "draft_small") {
- $"0000 0002 000C 003C 00F8 03F8 0070 00B0"
- $"0120 0220 0400 0800 1000 2000 4000 0000"
- $"0003 000F 003E 00FE 03FC 0FFC 3FF8 01F8"
- $"03F0 0770 0E60 1C60 3840 7040 E000 4000"
- $"0001 000E"
-};
-
-data 'CURS' (3024, "draped_box") {
- $"0000 0000 3FFC 2244 2664 2C34 381C 2184"
- $"2184 381C 2C34 2664 2244 3FFC 0000 0000"
- $"0000 0000 3FFC 3E7C 3E7C 3C3C 399C 23C4"
- $"23C4 399C 3C3C 3E7C 3E7C 3FFC 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3025, "exchange") {
- $"0000 47C0 6FE0 7C30 4810 4C00 7E00 0000"
- $"0000 00FC 0064 1024 187C 0FEC 07C4 0000"
- $"C7C0 EFE0 FFF0 FFF8 FC38 FE10 FF00 FF80"
- $"03FE 01FE 10FE 387E 3FFE 1FFE 0FEE 07C6"
- $"0007 0007"
-};
-
-data 'CURS' (3026, "fleur") {
- $"0000 0180 03C0 07E0 0180 1188 318C 7FFE"
- $"7FFE 318C 1188 0180 07E0 03C0 0180 0000"
- $"0180 03C0 07E0 0FF0 17E8 3BDC 7FFE FFFF"
- $"FFFF 7FFE 3BDC 17E8 0FF0 07E0 03C0 0180"
- $"0007 0007"
-};
-
-data 'CURS' (3027, "gobbler") {
- $"0000 0078 0070 4036 4FB0 7FF0 7E30 7C30"
- $"3038 00F0 0FE0 0400 0400 0400 0F00 0000"
- $"00FC 00FC E0FF FFFF FFFF FFF8 FFF8 FFF8"
- $"FFFC 7FFC 3FF8 1FF0 0E00 1F80 1F80 1F80"
- $"0003 000E"
-};
-
-data 'CURS' (3028, "gumby") {
- $"3F00 10C0 C820 EAA0 C820 CBA0 F838 383E"
- $"0826 0826 092E 0926 0920 1110 2108 3EF8"
- $"3F00 1FC0 CFE0 EFE0 CFE0 CFE0 FFF8 3FFE"
- $"0FE6 0FE6 0FEE 0FE6 0FE0 1FF0 3FF8 3EF8"
- $"0000 0002"
-};
-
-data 'CURS' (3029, "hand1") {
- $"000C 003C 00F0 01E0 03C0 07E0 0FF0 2FE0"
- $"7FF0 5FF0 07E0 07C0 4A00 6200 3400 1800"
- $"000C 003C 00F0 01E0 03C0 07E0 0FF0 2FE0"
- $"7FF0 7FF0 7FE0 7FC0 7E00 7E00 3C00 1800"
- $"0000 000D"
-};
-
-data 'CURS' (3030, "hand2") {
- $"0000 3FC0 4020 3F10 0808 0708 0808 0714"
- $"0822 0641 0182 0124 0088 0050 0020 0000"
- $"0000 3FC0 7FE0 3FF0 0FF8 07F8 0FF8 07FC"
- $"0FFE 07FF 01FE 01FC 00F8 0070 0020 0000"
- $"0002 0001"
-};
-
-data 'CURS' (3031, "heart") {
- $"0000 3EF8 638C C106 8002 8002 8002 8002"
- $"C006 600C 3018 1830 0C60 06C0 0380 0000"
- $"0000 3EF8 7FFC FFFE FFFE FFFE FFFE FFFE"
- $"FFFE 7FFC 3FF8 1FF0 0FE0 07C0 0380 0000"
- $"0003 0007"
-};
-
-data 'CURS' (3032, "icon") {
- $"FFFF D555 AAAB D555 A00B D005 A00B D005"
- $"A00B D005 A00B D005 AAAB D555 AAAB FFFF"
- $"FFFF FFFF FFFF FFFF F00F F00F F00F F00F"
- $"F00F F00F F00F F00F FFFF FFFF FFFF FFFF"
- $"0007 0007"
-};
-
-data 'CURS' (3033, "iron_cross") {
- $"0000 3FFC 1FF8 4FF2 67E6 73CE 799E 7FFE"
- $"7FFE 799E 73CE 67E6 4FF2 1FF8 3FFC 0000"
- $"7FFE 7FFE FFFF FFFF FFFF FFFF FFFF FFFF"
- $"FFFF FFFF FFFF FFFF FFFF FFFF 7FFE 7FFE"
- $"0007 0006"
-};
-
-data 'CURS' (3034, "left_ptr") {
- $"0000 0800 0C00 0E00 0F00 0F80 0FC0 0FE0"
- $"0FF0 0F80 0D80 08C0 00C0 0060 0060 0000"
- $"1800 1C00 1E00 1F00 1F80 1FC0 1FE0 1FF0"
- $"1FF8 1FFC 1FC0 1DE0 19E0 10F0 00F0 0070"
- $"0001 0004"
-};
-
-data 'CURS' (3035, "left_side") {
- $"0000 6000 6000 6080 6100 6200 6400 6FFC"
- $"6400 6200 6100 6080 6000 6000 0000 0000"
- $"0000 0000 0000 0080 0100 0200 0400 0FFC"
- $"0400 0200 0100 0080 0000 0000 0000 0000"
- $"0007 0004"
-};
-
-data 'CURS' (3036, "left_tee") {
- $"0000 0C00 0C00 0C00 0C00 0C00 0C00 0FF8"
- $"0FF8 0C00 0C00 0C00 0C00 0C00 0C00 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0007 0004"
-};
-
-data 'CURS' (3037, "leftbutton") {
- $"8002 7FFC 7FFC 4444 4554 4554 4554 4554"
- $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"0004 0003"
-};
-
-data 'CURS' (3038, "ll_angle") {
- $"0000 0000 0000 0C00 0C00 0C00 0C00 0C00"
- $"0C00 0C00 0FF8 0FF8 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"000B 0004"
-};
-
-data 'CURS' (3039, "lr_angle") {
- $"0000 0000 0000 0030 0030 0030 0030 0030"
- $"0030 0030 1FF0 1FF0 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"000B 000B"
-};
-
-data 'CURS' (3040, "man") {
- $"0380 1EF0 0280 8100 4387 244B 1D70 0540"
- $"0440 0280 0440 0920 1290 1450 783C F83F"
- $"0380 1FF0 0380 8100 4387 27CB 1FF0 07C0"
- $"07C0 0380 07C0 0FE0 1EF0 1C70 783C F83F"
- $"0001 0007"
-};
-
-data 'CURS' (3041, "middlebutton") {
- $"8002 7FFC 7FFC 4444 5454 5454 5454 5454"
- $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"0004 0007"
-};
-
-data 'CURS' (3042, "mouse") {
- $"0600 0100 0180 0FF0 1008 17E8 1428 1428"
- $"17E8 1008 1008 1008 1008 1008 1008 0FF0"
- $"0600 0100 0180 0FF0 1FF8 1FF8 1FF8 1FF8"
- $"1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 0FF0"
- $"0000 0000"
-};
-
-data 'CURS' (3043, "pencil") {
- $"0000 00F0 0088 0108 0190 0270 0220 0440"
- $"0440 0880 0880 1100 1E00 1C00 1800 1000"
- $"0000 00F0 00F8 01F8 01F0 03F0 03E0 07C0"
- $"07C0 0F80 0F80 1F00 1E00 1C00 1800 1000"
- $"000F 0003"
-};
-
-data 'CURS' (3044, "pirate") {
- $"03C0 07E0 0FF0 1998 1998 0FF0 07E0 03C0"
- $"43C2 43C3 2184 1C38 03C0 0FF1 781F 4002"
- $"07E0 0FF0 1FF8 3FFC 3FFC 1FF8 0FF0 47E2"
- $"E7E7 E7E7 7FFF 3FFC 1FF9 7FFF FFFF F81F"
- $"000A 0007"
-};
-
-data 'CURS' (3045, "plus") {
- $"0000 0000 0000 0180 0180 0180 0180 1FF8"
- $"1FF8 0180 0180 0180 0180 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3046, "question_arrow") {
- $"07C0 0FE0 1C70 1830 1C30 0C70 00E0 03C0"
- $"0380 0280 0280 0EE0 06C0 0380 0100 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 3FF8 1FF0 0FE0 07C0 0380 0100"
- $"000E 0007"
-};
-
-data 'CURS' (3047, "right_ptr") {
- $"0000 0010 0030 0070 00F0 01F0 03F0 07F0"
- $"0FF0 01F0 01B0 0310 0300 0600 0600 0000"
- $"0018 0038 0078 00F8 01F8 03F8 07F8 0FF8"
- $"1FF8 3FF8 03F8 07B8 0798 0F08 0F00 0E00"
- $"0001 000B"
-};
-
-data 'CURS' (3048, "right_side") {
- $"0000 0000 0006 0006 0106 0086 0046 0026"
- $"3FF6 0026 0046 0086 0106 0006 0006 0000"
- $"0000 0000 0000 0000 0100 0080 0040 0020"
- $"3FF0 0020 0040 0080 0100 0000 0000 0000"
- $"0008 000B"
-};
-
-data 'CURS' (3049, "right_tee") {
- $"0000 0030 0030 0030 0030 0030 0030 1FF0"
- $"1FF0 0030 0030 0030 0030 0030 0030 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0007 000A"
-};
-
-data 'CURS' (3050, "rightbutton") {
- $"8002 7FFC 7FFC 4444 5544 5544 5544 5544"
- $"4444 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 8002"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"FFFE FFFE FFFE FFFE FFFE FFFE FFFE FFFE"
- $"0004 0003"
-};
-
-data 'CURS' (3051, "rtl_logo") {
- $"0000 7FFE 4022 4022 4022 7FE2 4422 4422"
- $"4422 4422 47FE 4402 4402 4402 7FFE 0000"
- $"0000 7FFE 7FFE 6076 7FF6 7FF6 7C36 6C36"
- $"6C36 6C3E 6FFE 6FFE 6E06 7FFE 7FFE 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3052, "sailboat") {
- $"0000 0040 0040 0160 0160 0360 0370 0770"
- $"0770 0F78 0F78 1F78 1F7C 3E38 0000 0000"
- $"0040 00E0 01E0 03F0 03F0 07F0 07F8 0FF8"
- $"0FF8 1FFC 1FFC 3FFC 3FFE 7F7C 7E38 0000"
- $"000C 0008"
-};
-
-data 'CURS' (3053, "sb_down_arrow") {
- $"0280 0280 0280 0280 0280 0280 0280 0280"
- $"0280 0280 0280 0FE0 07C0 0380 0100 0000"
- $"0380 0380 0380 0380 0380 0380 0380 0380"
- $"0380 0380 0380 1FF0 0FE0 07C0 0380 0100"
- $"000E 0007"
-};
-
-data 'CURS' (3054, "sb_h_double_arrow") {
- $"0000 0000 0000 0000 0810 1818 3FFC 781E"
- $"3FFC 1818 0810 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0810 1818 381C 7FFE FFFF"
- $"7FFE 381C 1818 0810 0000 0000 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3055, "sb_left_arrow") {
- $"0000 0000 0000 0000 0800 1800 3FFF 7800"
- $"3FFF 1800 0800 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0800 1800 3800 7FFF FFFF"
- $"7FFF 3800 1800 0800 0000 0000 0000 0000"
- $"0007 0001"
-};
-
-data 'CURS' (3056, "sb_right_arrow") {
- $"0000 0000 0000 0000 0000 0010 0018 FFFC"
- $"001E FFFC 0018 0010 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0010 0018 001C FFFE"
- $"FFFF FFFE 001C 0018 0010 0000 0000 0000"
- $"0008 000E"
-};
-
-data 'CURS' (3057, "sb_up_arrow") {
- $"0000 0080 01C0 03E0 07F0 0140 0140 0140"
- $"0140 0140 0140 0140 0140 0140 0140 0140"
- $"0080 01C0 03E0 07F0 0FF8 01C0 01C0 01C0"
- $"01C0 01C0 01C0 01C0 01C0 01C0 01C0 01C0"
- $"0001 0008"
-};
-
-data 'CURS' (3058, "sb_v_double_arrow") {
- $"0000 0100 0380 07C0 0FE0 0280 0280 0280"
- $"0280 0280 0280 0FE0 07C0 0380 0100 0000"
- $"0100 0380 07C0 0FE0 1FF0 0380 0380 0380"
- $"0380 0380 0380 1FF0 0FE0 07C0 0380 0100"
- $"0007 0007"
-};
-
-data 'CURS' (3059, "shuttle") {
- $"0020 0070 00F8 01DE 05DE 09DE 11DE 11DE"
- $"11DE 11DE 31DE 71DE FDDE 1888 0078 0030"
- $"0020 0070 00F8 01FE 07FE 0FFE 1FFE 1FFE"
- $"1FFE 1FFE 3FFE 7FFE FFFE 18F8 0078 0030"
- $"0000 000A"
-};
-
-data 'CURS' (3060, "sizing") {
- $"0000 7F80 4000 4000 4000 47E0 4420 4422"
- $"4422 0422 07E2 0012 000A 0006 01FE 0000"
- $"FFC0 FFC0 FFC0 E000 EFF0 EFF0 EC37 EC37"
- $"EC37 EC37 0FF7 0FFF 001F 03FF 03FF 03FF"
- $"000E 000E"
-};
-
-data 'CURS' (3061, "spider") {
- $"2010 1020 1020 0840 0840 8787 6798 1FE0"
- $"1FE0 6798 8787 0840 0840 1020 1020 2010"
- $"7038 3870 3870 1CE0 9FE7 EFDF FFFF 7FF8"
- $"7FF8 FFFF EFDF 9FE7 1CE0 3870 3870 7038"
- $"0007 0007"
-};
-
-data 'CURS' (3062, "spraycan") {
- $"0018 0040 0D18 1E40 1A18 3F00 2100 3900"
- $"2900 3900 2900 3900 3900 2100 2100 3F00"
- $"0000 0000 0C00 1E00 1E00 3F00 3F00 3F00"
- $"3F00 3F00 3F00 3F00 3F00 3F00 3F00 3F00"
- $"0002 0007"
-};
-
-data 'CURS' (3063, "star") {
- $"0100 0280 0280 0280 0440 0440 0440 3938"
- $"C006 3838 0920 1290 2448 2828 3018 2008"
- $"0100 0380 0380 0380 07C0 07C0 07C0 3FF8"
- $"FFFE 3FF8 0FE0 1EF0 3C78 3838 3018 2008"
- $"0007 0007"
-};
-
-data 'CURS' (3064, "target") {
- $"0000 0380 0FE0 1C70 3018 600C C106 C286"
- $"C106 600C 3018 1C70 0FE0 0380 0000 0000"
- $"0000 0380 0FE0 1FF0 3C78 701C E38E E38E"
- $"E38E 701C 3C78 1FF0 0FE0 0380 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3065, "tcross") {
- $"0100 0100 0100 0100 0100 0100 0100 FFFE"
- $"0100 0100 0100 0100 0100 0100 0100 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0007 0007"
-};
-
-data 'CURS' (3066, "top_left_arrow") {
- $"0000 6000 7800 3E00 3F80 1FE0 1E00 0D00"
- $"0C80 0440 0420 0010 0008 0004 0000 0000"
- $"E000 F800 FE00 7F80 7FE0 3FF8 3FFE 1F80"
- $"1FC0 0EE0 0E70 0638 061C 020E 0204 0000"
- $"0001 0001"
-};
-
-data 'CURS' (3067, "top_left_corner") {
- $"FFF0 FFF0 C000 C000 CFC0 CC00 CA00 C900"
- $"C880 C840 C020 C000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0FC0 0C00 0A00 0900"
- $"0880 0840 0020 0000 0000 0000 0000 0000"
- $"0000 0000"
-};
-
-data 'CURS' (3068, "top_right_corner") {
- $"0FFF 0FFF 0003 0003 03F3 0033 0053 0093"
- $"0113 0213 0403 0003 0000 0000 0000 0000"
- $"0000 0000 0000 0000 03F0 0030 0050 0090"
- $"0110 0210 0400 0000 0000 0000 0000 0000"
- $"0000 000F"
-};
-
-data 'CURS' (3069, "top_side") {
- $"0000 7FFC 7FFC 0000 0100 0380 0540 0920"
- $"1110 0100 0100 0100 0100 0100 0000 0000"
- $"0000 0000 0000 0000 0100 0380 0540 0920"
- $"1110 0100 0100 0100 0100 0100 0000 0000"
- $"0004 0007"
-};
-
-data 'CURS' (3070, "top_tee") {
- $"0000 0000 0000 0000 7FFE 7FFE 0180 0180"
- $"0180 0180 0180 0180 0180 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0004 0007"
-};
-
-data 'CURS' (3071, "trek") {
- $"0100 0000 0380 07C0 0FE0 0EE0 0FE0 07C0"
- $"0380 0100 0BA0 0D60 0920 0820 0820 0000"
- $"0000 0380 07C0 0FE0 1FF0 1FF0 1FF0 0FE0"
- $"07C0 0BA0 1FF0 1FF0 1FF0 1D70 1C70 0820"
- $"0000 0007"
-};
-
-data 'CURS' (3072, "ul_angle") {
- $"0000 0000 0000 0FF8 0FF8 0C00 0C00 0C00"
- $"0C00 0C00 0C00 0C00 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0003 0004"
-};
-
-data 'CURS' (3073, "umbrella") {
- $"0000 0890 0228 49A6 27C8 1930 610C 0100"
- $"0100 0100 0100 0100 0140 0140 0080 0000"
- $"0000 0FF0 1FF8 7FFE 7FFC FFFE FBBE E38E"
- $"0380 0380 0380 03C0 03E0 03E0 01C0 0080"
- $"0004 0007"
-};
-
-data 'CURS' (3074, "ur_angle") {
- $"0000 0000 0000 0000 1FF0 1FF0 0030 0030"
- $"0030 0030 0030 0030 0030 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0004 000B"
-};
-
-data 'CURS' (3075, "watch") {
- $"07E0 07E0 07E0 07E0 0810 1088 1088 108C"
- $"138C 1008 1008 0810 07E0 07E0 07E0 07E0"
- $"07E0 07E0 07E0 07E0 0FF0 1FF8 1FF8 1FFC"
- $"1FFC 1FF8 1FF8 0FF0 07E0 07E0 07E0 07E0"
- $"0008 000D"
-};
-
-data 'CURS' (3076, "xterm") {
- $"0C60 0280 0100 0100 0100 0100 0100 0100"
- $"0100 0100 0100 0100 0100 0100 0280 0C60"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"000B 0007"
-};
-
-/*
- * The following are color versions of some of the
- * cursors defined above. The color cursors will be
- * used if the exist in preference to the black & white
- * cursors.
- */
-
-data 'crsr' (3004, "boat", purgeable) {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0100 03C0"
- $"8460 FFFF 0018 0020 0040 FFC0 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0100 03C0"
- $"87E0 FFFF FFF8 FFE0 FFC0 FFC0 0000 0000"
- $"0000 0000 0007 000F 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 000F 0000 0000 0000 00FF FF00"
- $"0000 F000 0F32 25F0 0000 6FFF FFFF FFFF"
- $"FFFF 2222 2222 221F F000 2222 2222 21F0"
- $"0000 3333 3333 4F00 0000 FFFF FFFF FF00"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0007 0000 FFFF FFFF"
- $"FFFF 0001 BBBB BBBB BBBB 0002 EEEE EEEE"
- $"EEEE 0003 DDDD DDDD DDDD 0004 CCCC CCCC"
- $"CCCC 0005 4444 4444 4444 0006 1111 1111"
- $"1111 000F 0000 0000 0000"
-};
-
-data 'crsr' (3013, "clock") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 1FF8 33CC 6466 4992 4F12 4422"
- $"63C6 3FFC 2994 2994 2994 2BD4 6996 781E"
- $"7FFE 7FFE 1FF8 3FFC 7FFE 7FFE 7FFE 7FFE"
- $"7FFE 3FFC 3FFC 3FFC 3FFC 3FFC 7FFE 7FFE"
- $"7FFE 7FFE 0004 0008 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 000F FFFF FFFF F000 00F6 05FF FF50"
- $"6F00 0F60 5F00 56F5 06F0 0F00 F021 F30F"
- $"00F0 0F00 F6F1 000F 00F0 0F00 5F00 00F5"
- $"00F0 0F60 05FF FF50 06F0 00FF FFFF FFFF"
- $"FF00 00F0 F001 100F 0F00 00F0 F001 100F"
- $"0F00 00F0 F021 120F 0F00 00F0 F01F F10F"
- $"0F00 0FF0 F021 120F 0FF0 0FF4 F500 005F"
- $"4FF0 0FFF FFFF FFFF FFF0 0FFF FFFF FFFF"
- $"FFF0 0000 0000 0000 0007 0000 FFFF FFFF"
- $"FFFF 0001 4444 4444 4444 0002 AAAA AAAA"
- $"AAAA 0003 EEEE EEEE EEEE 0004 5555 5555"
- $"5555 0005 DDDD DDDD DDDD 0006 7777 7777"
- $"7777 000F 0000 0000 0000"
-};
-
-data 'crsr' (3014, "coffee_mug") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 03F8 0C06 1001 1C07 33F9 7001"
- $"D001 9001 960D DA55 7A55 36ED 10A1 1001"
- $"0802 07FC 03F8 0FFE 1FFF 1FFF 3FFF 7FFF"
- $"FFFF FFFF FFFF FFFF 7FFF 3FFF 1FFF 1FFF"
- $"0FFE 07FC 0004 0003 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 00FF FFFF F000 0000 FF42 2222"
- $"4FF0 000F 4221 1111 224F 000F FF11 1111"
- $"1FFF 00FF 24FF FFFF F42F 0F5F 2222 2222"
- $"222F F52F 2222 2222 222F F40F 2222 2222"
- $"222F F40F 4FF2 2224 FF2F F52F F2F2 2F2F"
- $"2F2F 0F5F F2F2 535F 2F2F 00FF 4FF2 F3F4"
- $"FF2F 000F 2222 F2F2 222F 000F 4222 2222"
- $"224F 0000 F422 2222 24F0 0000 0FFF FFFF"
- $"FF00 0000 0000 0000 0006 0000 FFFF FFFF"
- $"FFFF 0001 CCCC 9999 6666 0002 CCCC CCCC"
- $"FFFF 0003 3333 3333 6666 0004 9999 9999"
- $"FFFF 0005 6666 6666 CCCC 000F 0000 0000"
- $"0000"
-};
-
-data 'crsr' (3027, "gobbler") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0000 0078 0070 4036 4FB0 7FF0"
- $"7E30 7C30 3038 00F0 0FE0 0400 0400 0400"
- $"0F00 0000 00FC 00FC E0FF FFFF FFFF FFF8"
- $"FFF8 FFF8 FFFC 7FFC 3FF8 1FF0 0E00 1F80"
- $"1F80 1F80 0003 000E 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0000 0000 0000 0000 0000 0222"
- $"2000 0000 0000 0111 0000 0300 0000 0011"
- $"0220 0100 1616 1011 0000 0361 6111 1111"
- $"0000 0111 1114 4415 0000 0311 1144 4451"
- $"0000 0011 4444 4415 1000 0004 4444 5151"
- $"0000 0000 1515 1510 0000 0000 0200 0000"
- $"0000 0000 0300 0000 0000 0000 0200 0000"
- $"0000 0000 2323 0000 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0006 0000 FFFF FFFF"
- $"FFFF 0001 CCCC 9999 6666 0002 DDDD 0000"
- $"0000 0003 FFFF 6666 3333 0004 CCCC CCCC"
- $"CCCC 0005 8888 8888 8888 0006 FFFF CCCC"
- $"9999"
-};
-
-data 'crsr' (3028, "gumby") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 3F00 10C0 C820 EAA0 C820 CBA0"
- $"F838 383E 0826 0826 092E 0926 0920 1110"
- $"2108 3EF8 3F00 1FC0 CFE0 EFE0 CFE0 CFE0"
- $"FFF8 3FFE 0FE6 0FE6 0FEE 0FE6 0FE0 1FF0"
- $"3FF8 3EF8 0000 0002 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 00FF FFFF 0000 0000 000F 1212 FF00"
- $"0000 FF00 F131 31F0 0000 FFF0 F3F3 F3F0"
- $"0000 FF00 F131 31F0 0000 FF00 F2FF F2F0"
- $"0000 4FFF F121 21FF F000 00FF F212 12FF"
- $"FF40 0000 F121 21F0 0FF0 0000 F212 12F0"
- $"0FF0 0000 F12F 21F0 FFF0 0000 F21F 12F0"
- $"0FF0 0000 F12F 21F0 0000 000F 121F 121F"
- $"0000 00F1 212F 2121 F000 00FF FFF0 FFFF"
- $"F000 0000 0000 0000 0005 0000 FFFF FFFF"
- $"FFFF 0001 0000 BBBB 0000 0002 CCCC CCCC"
- $"CCCC 0003 AAAA AAAA AAAA 0004 4444 4444"
- $"4444 000F 0000 0000 0000"
-};
-
-data 'crsr' (3031, "heart") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0000 3EF8 638C C106 8002 8002"
- $"8002 8002 C006 600C 3018 1830 0C60 06C0"
- $"0380 0000 0000 3EF8 7FFC FFFE FFFE FFFE"
- $"FFFE FFFE FFFE 7FFC 3FF8 1FF0 0FE0 07C0"
- $"0380 0000 0003 0007 0000 0000 0000 0000"
- $"0000 0000 8004 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0002 0001 0002 0000 0000 0000 00D2 0000"
- $"0000 0000 0000 0FFC FFC0 3AAB AA70 E99B"
- $"999C E665 A65C E999 999C E666 665C E999"
- $"999C D666 665C 3599 9970 0D66 65C0 0359"
- $"9700 00D6 5C00 0035 7000 000F C000 0000"
- $"0000 0000 0000 0000 0003 0000 FFFF FFFF"
- $"FFFF 0001 DDDD 0000 0000 0002 FFFF 6666"
- $"CCCC 0003 0000 0000 0000"
-};
-
-data 'crsr' (3042, "mouse", purgeable) {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 BE00 0100 0180 0FF0 1008 17E8"
- $"1428 1428 17E8 1008 1008 1008 1008 1008"
- $"1008 0FF0 FE00 0100 0180 0FF0 1FF8 1FF8"
- $"1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8 1FF8"
- $"1FF8 0FF0 0001 0007 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 1379 4AF0 0000 0000 0000 000F 0000"
- $"0000 0000 000F F000 0000 0000 FFFF FFFF"
- $"0000 000F 2111 1112 F000 000F 3655 5563"
- $"F000 000F 3513 1351 F000 000F 3533 3351"
- $"F000 000F 3655 5561 F000 000F 3311 1111"
- $"F000 000F 3333 3333 F000 000F 3333 3333"
- $"F000 000F 2222 2222 F000 000F 8888 8888"
- $"F000 000F 7888 8887 F000 0000 FFFF FFFF"
- $"0000 0000 0000 0000 000B 0000 FFFF FFFF"
- $"FFFF 0001 EEEE EEEE EEEE 0002 CCCC CCCC"
- $"CCCC 0003 DDDD DDDD DDDD 0004 4444 4444"
- $"4444 0005 2222 2222 2222 0006 5555 5555"
- $"5555 0007 AAAA AAAA AAAA 0008 BBBB BBBB"
- $"BBBB 0009 7777 7777 7777 000A 1111 1111"
- $"1111 000F 0000 0000 0000"
-};
-
-data 'crsr' (3043, "pencil", purgeable) {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0000 00F0 0088 0108 0190 0270"
- $"0220 0440 0440 0880 0880 1100 1E00 1C00"
- $"1800 1000 0000 00F0 00F8 01F8 01F0 03F0"
- $"03E0 07C0 07C0 0F80 0F80 1F00 1E00 1C00"
- $"1800 1000 000F 0003 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0000 0000 0000 0000 0000 FFFF"
- $"0000 0000 0000 F404 F000 0000 000F 4042"
- $"F000 0000 000F F42F 0000 0000 00F5 3FFF"
- $"0000 0000 00F3 52F0 0000 0000 0F35 1F00"
- $"0000 0000 0F53 2F00 0000 0000 F532 F000"
- $"0000 0000 F312 F000 0000 000F 352F 0000"
- $"0000 000F FFF0 0000 0000 000F FF00 0000"
- $"0000 000F F000 0000 0000 000F 0000 0000"
- $"0000 0000 0000 0000 0006 0000 FFFF FFFF"
- $"FFFF 0001 CCCC CCCC CCCC 0002 8888 8888"
- $"8888 0003 FFFF FFFF 0000 0004 DDDD 0000"
- $"0000 0005 FFFF 6666 3333 000F 0000 0000"
- $"0000"
-};
-
-data 'crsr' (3059, "shuttle") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0020 0070 00F8 01DE 05DE 09DE"
- $"11DE 11DE 11DE 11DE 31DE 71DE FDDE 1888"
- $"0078 0030 0020 0070 00F8 01FE 07FE 0FFE"
- $"1FFE 1FFE 1FFE 1FFE 3FFE 7FFE FFFE 18F8"
- $"0078 0030 0000 000A 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0000 00F0 0000 0000 0000 0F3F"
- $"0000 0000 0000 F343 F000 0000 000F 3404"
- $"3FF0 0000 0F4F 3404 3FF0 0000 F55F 3404"
- $"3FF0 000F 505F 3404 3FF0 000F 005F 3404"
- $"3FF0 000F 005F 3404 3FF0 000F 005F 3404"
- $"3FF0 00F3 005F 3404 3FF0 0F33 505F 3404"
- $"3FF0 FFF3 3F4F 3404 3FF0 000F F000 1222"
- $"1000 0000 0000 0111 1000 0000 0000 0011"
- $"0000 0000 0000 0000 0006 0000 FFFF FFFF"
- $"FFFF 0001 FFFF 6666 3333 0002 DDDD 0000"
- $"0000 0003 4444 4444 4444 0004 8888 8888"
- $"8888 0005 DDDD DDDD DDDD 000F 0000 0000"
- $"0000"
-};
-
-data 'crsr' (3062, "spraycan") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0018 0040 0D18 1E40 1A18 3F00"
- $"2100 3900 2900 3900 2900 3900 3900 2100"
- $"2100 3F00 0000 0000 0C00 1E00 1E00 3F00"
- $"3F00 3F00 3F00 3F00 3F00 3F00 3F00 3F00"
- $"3F00 3F00 0002 0007 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0000 0005 2000 0000 0000 0460"
- $"0000 0000 FF1F 6005 2000 000F 33F0 0460"
- $"0000 000F 10F0 0005 2000 00FF FFFF 0000"
- $"0000 00F8 170F 0000 0000 00F5 F70F 0000"
- $"0000 00FA F70F 0000 0000 00F9 F70F 0000"
- $"0000 00FA F70F 0000 0000 00F9 F70F 0000"
- $"0000 00F5 F70F 0000 0000 00F8 170F 0000"
- $"0000 00F8 170F 0000 0000 00FF FFFF 0000"
- $"0000 0000 0000 0000 000B 0000 FFFF FFFF"
- $"FFFF 0001 AAAA AAAA AAAA 0002 7777 7777"
- $"7777 0003 5555 5555 5555 0004 2222 2222"
- $"2222 0005 4444 4444 4444 0006 BBBB BBBB"
- $"BBBB 0007 DDDD DDDD DDDD 0008 EEEE EEEE"
- $"EEEE 0009 6666 6666 CCCC 000A CCCC CCCC"
- $"FFFF 000F 0000 0000 0000"
-};
-
-data 'crsr' (3063, "star") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0100 0280 0280 0280 0440 0440"
- $"0440 3938 C006 3838 0920 1290 2448 2828"
- $"3018 2008 0100 0380 0380 0380 07C0 07C0"
- $"07C0 3FF8 FFFE 3FF8 0FE0 1EF0 3C78 3838"
- $"3018 2008 0007 0007 0000 0000 0000 0000"
- $"0000 0000 8004 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0002 0001 0002 0000 0000 0000 00D2 0000"
- $"0000 0003 0000 000D C000 000D C000 000D"
- $"C000 0035 7000 0035 7000 0035 7000 0FD7"
- $"5FC0 F555 557C 0FD5 5FC0 00D7 5C00 035C"
- $"D700 0D70 35C0 0DC0 0DC0 0F00 03C0 0C00"
- $"00C0 0000 0000 0000 0002 0000 FFFF FFFF"
- $"FFFF 0001 FFFF FFFF 0000 0003 0000 0000"
- $"0000"
-};
-
-data 'crsr' (3071, "trek") {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 0100 0000 0380 07C0 0FE0 0EE0"
- $"0FE0 07C0 0380 0100 0BA0 0D60 0920 0820"
- $"0820 0000 0000 0380 07C0 0FE0 1FF0 1FF0"
- $"1FF0 0FE0 07C0 0BA0 1FF0 1FF0 1FF0 1D70"
- $"1C70 0820 0000 0007 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0005 0000 0000 0000 0005 0000"
- $"0000 0000 00FF F000 0000 0000 0F31 3F00"
- $"0000 0000 F322 23F0 0000 0000 F110 11F0"
- $"0000 0000 F311 13F0 0000 0000 0F31 3F00"
- $"0000 0000 00FF F000 0000 0000 000F 0000"
- $"0000 0000 F0FF F0F0 0000 0000 FF0F 0FF0"
- $"0000 0000 400F 0040 0000 0000 4000 0040"
- $"0000 0000 4000 0040 0000 0000 0000 0000"
- $"0000 0000 0000 0000 0006 0000 FFFF FFFF"
- $"FFFF 0001 EEEE EEEE EEEE 0002 9999 9999"
- $"FFFF 0003 DDDD DDDD DDDD 0004 3333 3333"
- $"6666 0005 DDDD 0000 0000 000F 0000 0000"
- $"0000"
-};
-
-data 'crsr' (3075, "watch", purgeable) {
- $"8001 0000 0060 0000 0092 0000 0000 0000"
- $"0000 0000 07E0 07E0 07E0 07E0 0810 1088"
- $"1088 108C 138C 1008 1008 0810 07E0 07E0"
- $"07E0 07E0 07E0 07E0 07E0 07E0 0FF0 1FF8"
- $"1FF8 1FF8 1FF8 1FF8 1FF8 0FF0 07E0 07E0"
- $"07E0 07E0 0008 000D 0000 0000 0000 0000"
- $"0000 0000 8008 0000 0000 0010 0010 0000"
- $"0000 0000 0000 0048 0000 0048 0000 0000"
- $"0004 0001 0004 0000 0000 0000 0112 0000"
- $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0"
- $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0"
- $"0000 0000 F020 202F 0000 000F 0222 F221"
- $"F000 000F 2222 F123 F000 000F 0222 F121"
- $"FF00 000F 22FF F123 FF00 000F 0222 2221"
- $"F000 000F 2222 2213 F000 0000 F131 313F"
- $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0"
- $"0000 0000 0FFF FFF0 0000 0000 0FFF FFF0"
- $"0000 0000 0000 0000 0004 0000 FFFF FFFF"
- $"FFFF 0001 CCCC CCCC CCCC 0002 EEEE EEEE"
- $"EEEE 0003 BBBB BBBB BBBB 000F 0000 0000"
- $"0000"
-};
-
diff --git a/mac/tkMacXStubs.c b/mac/tkMacXStubs.c
deleted file mode 100644
index aff29dc..0000000
--- a/mac/tkMacXStubs.c
+++ /dev/null
@@ -1,877 +0,0 @@
-/*
- * tkMacXStubs.c --
- *
- * This file contains most of the X calls called by Tk. Many of
- * these calls are just stubs and either don't make sense on the
- * Macintosh or thier implamentation just doesn't do anything. Other
- * calls will eventually be moved into other files.
- *
- * 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.
- */
-
-#include "tkInt.h"
-#include <X.h>
-#include <Xlib.h>
-#include <stdio.h>
-#include <tcl.h>
-
-#include <Xatom.h>
-
-#include <Windows.h>
-#include <Fonts.h>
-#include <QDOffscreen.h>
-#include <ToolUtils.h>
-#include <Sound.h>
-#include "tkMacInt.h"
-#include "tkPort.h"
-
-/*
- * Because this file is still under major development Debugger statements are
- * used through out this file. The define TCL_DEBUG will decide whether
- * the debugger statements actually call the debugger or not.
- */
-
-#ifndef TCL_DEBUG
-# define Debugger()
-#endif
-
-#define ROOT_ID 10
-
-/*
- * Declarations of static variables used in this file.
- */
-
-static TkDisplay *gMacDisplay = NULL; /* Macintosh display. */
-static char *macScreenName = ":0";
- /* Default name of macintosh display. */
-
-/*
- * Forward declarations of procedures used in this file.
- */
-
-static XID MacXIdAlloc _ANSI_ARGS_((Display *display));
-static int DefaultErrorHandler _ANSI_ARGS_((Display* display,
- XErrorEvent* err_evt));
-
-/*
- * Other declrations
- */
-
-int TkMacXDestroyImage _ANSI_ARGS_((XImage *image));
-unsigned long TkMacXGetPixel _ANSI_ARGS_((XImage *image, int x, int y));
-int TkMacXPutPixel _ANSI_ARGS_((XImage *image, int x, int y,
- unsigned long pixel));
-XImage *TkMacXSubImage _ANSI_ARGS_((XImage *image, int x, int y,
- unsigned int width, unsigned int height));
-int TkMacXAddPixel _ANSI_ARGS_((XImage *image, long value));
-int _XInitImageFuncPtrs _ANSI_ARGS_((XImage *image));
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpOpenDisplay --
- *
- * Create the Display structure and fill it with device
- * specific information.
- *
- * Results:
- * Returns a Display structure on success or NULL on failure.
- *
- * Side effects:
- * Allocates a new Display structure.
- *
- *----------------------------------------------------------------------
- */
-
-TkDisplay *
-TkpOpenDisplay(
- CONST char *display_name)
-{
- Display *display;
- Screen *screen;
- GDHandle graphicsDevice;
-
- if (gMacDisplay != NULL) {
- if (strcmp(gMacDisplay->display->display_name, display_name) == 0) {
- return gMacDisplay;
- } else {
- return NULL;
- }
- }
-
- graphicsDevice = GetMainDevice();
- display = (Display *) ckalloc(sizeof(Display));
- memset(display, 0, sizeof(Display));
- display->resource_alloc = MacXIdAlloc;
- screen = (Screen *) ckalloc(sizeof(Screen) * 2);
- display->default_screen = 0;
- display->request = 0;
- display->nscreens = 1;
- display->screens = screen;
- display->display_name = macScreenName;
- display->qlen = 0;
-
- screen->root = ROOT_ID;
- screen->display = display;
- screen->root_depth = (*(*graphicsDevice)->gdPMap)->cmpSize *
- (*(*graphicsDevice)->gdPMap)->cmpCount;
- screen->height = (*graphicsDevice)->gdRect.bottom -
- (*graphicsDevice)->gdRect.top;
- screen->width = (*graphicsDevice)->gdRect.right -
- (*graphicsDevice)->gdRect.left;
-
- screen->mwidth = (screen->width * 254 + 360) / 720;
- screen->mheight = (screen->height * 254 + 360) / 720;
- screen->black_pixel = 0x00000000;
- screen->white_pixel = 0x00FFFFFF;
- screen->root_visual = (Visual *) ckalloc(sizeof(Visual));
- screen->root_visual->visualid = 0;
- screen->root_visual->class = TrueColor;
- screen->root_visual->red_mask = 0x00FF0000;
- screen->root_visual->green_mask = 0x0000FF00;
- screen->root_visual->blue_mask = 0x000000FF;
- screen->root_visual->bits_per_rgb = 24;
- screen->root_visual->map_entries = 2 ^ 8;
-
- gMacDisplay = (TkDisplay *) ckalloc(sizeof(TkDisplay));
- memset(gMacDisplay, 0, sizeof(TkDisplay));
- gMacDisplay->display = display;
- return gMacDisplay;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpCloseDisplay --
- *
- * Deallocates a display structure created by TkpOpenDisplay.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Frees memory.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpCloseDisplay(
- TkDisplay *displayPtr)
-{
- Display *display = displayPtr->display;
- if (gMacDisplay != displayPtr) {
- panic("TkpCloseDisplay: tried to call TkpCloseDisplay on bad display");
- }
-
- gMacDisplay = NULL;
- if (display->screens != (Screen *) NULL) {
- if (display->screens->root_visual != (Visual *) NULL) {
- ckfree((char *) display->screens->root_visual);
- }
- ckfree((char *) display->screens);
- }
- ckfree((char *) display);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkClipCleanup --
- *
- * This procedure is called to cleanup resources associated with
- * claiming clipboard ownership and for receiving selection get
- * results. This function is called in tkWindow.c. This has to be
- * called by the display cleanup function because we still need the
- * access display elements.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Resources are freed - the clipboard may no longer be used.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkClipCleanup(dispPtr)
- TkDisplay *dispPtr; /* display associated with clipboard */
-{
- /*
- * Make sure that the local scrap is transfered to the global
- * scrap if needed.
- */
-
- TkSuspendClipboard();
-
- if (dispPtr->clipWindow != NULL) {
- Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom,
- dispPtr->applicationAtom);
- Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom,
- dispPtr->windowAtom);
-
- Tk_DestroyWindow(dispPtr->clipWindow);
- Tcl_Release((ClientData) dispPtr->clipWindow);
- dispPtr->clipWindow = NULL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MacXIdAlloc --
- *
- * This procedure is invoked by Xlib as the resource allocator
- * for a display.
- *
- * Results:
- * The return value is an X resource identifier that isn't currently
- * in use.
- *
- * Side effects:
- * The identifier is removed from the stack of free identifiers,
- * if it was previously on the stack.
- *
- *----------------------------------------------------------------------
- */
-
-static XID
-MacXIdAlloc(
- Display *display) /* Display for which to allocate. */
-{
- static long int cur_id = 100;
- /*
- * Some special XIds are reserved
- * - this is why we start at 100
- */
-
- return ++cur_id;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpWindowWasRecentlyDeleted --
- *
- * Tries to determine whether the given window was recently deleted.
- * Called from the generic code error handler to attempt to deal with
- * async BadWindow errors under some circumstances.
- *
- * Results:
- * Always 0, we do not keep this information on the Mac, so we do not
- * know whether the window was destroyed.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpWindowWasRecentlyDeleted(
- Window win,
- TkDisplay *dispPtr)
-{
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * DefaultErrorHandler --
- *
- * This procedure is the default X error handler. Tk uses it's
- * own error handler so this call should never be called.
- *
- * Results:
- * None.
- *
- * Side effects:
- * This function will call panic and exit.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-DefaultErrorHandler(
- Display* display,
- XErrorEvent* err_evt)
-{
- /*
- * This call should never be called. Tk replaces
- * it with its own error handler.
- */
- panic("Warning hit bogus error handler!");
- return 0;
-}
-
-
-char *
-XGetAtomName(
- Display * display,
- Atom atom)
-{
- display->request++;
- return NULL;
-}
-
-int
-_XInitImageFuncPtrs(XImage *image)
-{
- return 0;
-}
-
-XErrorHandler
-XSetErrorHandler(
- XErrorHandler handler)
-{
- return DefaultErrorHandler;
-}
-
-Window
-XRootWindow(Display *display, int screen_number)
-{
- display->request++;
- return ROOT_ID;
-}
-
-XImage *
-XGetImage(display, d, x, y, width, height, plane_mask, format)
- Display *display;
- Drawable d;
- int x;
- int y;
- unsigned int width;
- unsigned int height;
- unsigned long plane_mask;
- int format;
-{
- Debugger();
- return NULL;
-}
-
-int
-XGetGeometry(display, d, root_return, x_return, y_return, width_return,
- height_return, border_width_return, depth_return)
- Display* display;
- Drawable d;
- Window* root_return;
- int* x_return;
- int* y_return;
- unsigned int* width_return;
- unsigned int* height_return;
- unsigned int* border_width_return;
- unsigned int* depth_return;
-{
- /* Used in tkCanvPs.c & wm code */
- Debugger();
- return 0;
-}
-
-void
-XChangeProperty(
- Display* display,
- Window w,
- Atom property,
- Atom type,
- int format,
- int mode,
- _Xconst unsigned char* data,
- int nelements)
-{
- Debugger();
-}
-
-void
-XSelectInput(
- Display* display,
- Window w,
- long event_mask)
-{
- Debugger();
-}
-
-int
-XBell(
- Display* display,
- int percent)
-{
- SysBeep(percent);
- return Success;
-}
-
-void
-XSetWMNormalHints(
- Display* display,
- Window w,
- XSizeHints* hints)
-{
- /*
- * Do nothing. Shouldn't even be called.
- */
-}
-
-XSizeHints *
-XAllocSizeHints()
-{
- /*
- * Always return NULL. Tk code checks to see if NULL
- * is returned & does nothing if it is.
- */
-
- return NULL;
-}
-
-XImage *
-XCreateImage(
- Display* display,
- Visual* visual,
- unsigned int depth,
- int format,
- int offset,
- char* data,
- unsigned int width,
- unsigned int height,
- int bitmap_pad,
- int bytes_per_line)
-{
- XImage *ximage;
-
- display->request++;
- ximage = (XImage *) ckalloc(sizeof(XImage));
-
- ximage->height = height;
- ximage->width = width;
- ximage->depth = depth;
- ximage->xoffset = offset;
- ximage->format = format;
- ximage->data = data;
- ximage->bitmap_pad = bitmap_pad;
- if (bytes_per_line == 0) {
- ximage->bytes_per_line = width * 4; /* assuming 32 bits per pixel */
- } else {
- ximage->bytes_per_line = bytes_per_line;
- }
-
- if (format == ZPixmap) {
- ximage->bits_per_pixel = 32;
- ximage->bitmap_unit = 32;
- } else {
- ximage->bits_per_pixel = 1;
- ximage->bitmap_unit = 8;
- }
- ximage->byte_order = LSBFirst;
- ximage->bitmap_bit_order = LSBFirst;
- ximage->red_mask = 0x00FF0000;
- ximage->green_mask = 0x0000FF00;
- ximage->blue_mask = 0x000000FF;
-
- ximage->f.destroy_image = TkMacXDestroyImage;
- ximage->f.get_pixel = TkMacXGetPixel;
- ximage->f.put_pixel = TkMacXPutPixel;
- ximage->f.sub_image = TkMacXSubImage;
- ximage->f.add_pixel = TkMacXAddPixel;
-
- return ximage;
-}
-
-GContext
-XGContextFromGC(
- GC gc)
-{
- /* TODO - currently a no-op */
- return 0;
-}
-
-Status
-XSendEvent(
- Display* display,
- Window w,
- Bool propagate,
- long event_mask,
- XEvent* event_send)
-{
- Debugger();
- return 0;
-}
-
-void
-XClearWindow(
- Display* display,
- Window w)
-{
-}
-
-/*
-void
-XDrawPoint(
- Display* display,
- Drawable d,
- GC gc,
- int x,
- int y)
-{
-}
-
-void
-XDrawPoints(
- Display* display,
- Drawable d,
- GC gc,
- XPoint* points,
- int npoints,
- int mode)
-{
-}
-*/
-
-int
-XWarpPointer(
- Display* display,
- Window src_w,
- Window dest_w,
- int src_x,
- int src_y,
- unsigned int src_width,
- unsigned int src_height,
- int dest_x,
- int dest_y)
-{
- return Success;
-}
-
-void
-XQueryColor(
- Display* display,
- Colormap colormap,
- XColor* def_in_out)
-{
-}
-
-void
-XQueryColors(
- Display* display,
- Colormap colormap,
- XColor* defs_in_out,
- int ncolors)
-{
-}
-
-int
-XQueryTree(display, w, root_return, parent_return, children_return,
- nchildren_return)
- Display* display;
- Window w;
- Window* root_return;
- Window* parent_return;
- Window** children_return;
- unsigned int* nchildren_return;
-{
- return 0;
-}
-
-int
-XGetWindowProperty(
- Display *display,
- Window w,
- Atom property,
- long long_offset,
- long long_length,
- Bool delete,
- Atom req_type,
- Atom *actual_type_return,
- int *actual_format_return,
- unsigned long *nitems_return,
- unsigned long *bytes_after_return,
- unsigned char ** prop_return)
-{
- display->request++;
- *actual_type_return = None;
- *actual_format_return = *bytes_after_return = 0;
- *nitems_return = 0;
- return 0;
-}
-
-void
-XRefreshKeyboardMapping()
-{
- /* used by tkXEvent.c */
- Debugger();
-}
-
-void
-XSetIconName(
- Display* display,
- Window w,
- const char *icon_name)
-{
- /*
- * This is a no-op, no icon name for Macs.
- */
- display->request++;
-}
-
-void
-XForceScreenSaver(
- Display* display,
- int mode)
-{
- /*
- * This function is just a no-op. It is defined to
- * reset the screen saver. However, there is no real
- * way to do this on a Mac. Let me know if there is!
- */
- display->request++;
-}
-
-void
-Tk_FreeXId (
- Display *display,
- XID xid)
-{
- /* no-op function needed for stubs implementation. */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetServerInfo --
- *
- * Given a window, this procedure returns information about
- * the window server for that window. This procedure provides
- * the guts of the "winfo server" command.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkGetServerInfo(
- Tcl_Interp *interp, /* The server information is returned in
- * this interpreter's result. */
- Tk_Window tkwin) /* Token for window; this selects a
- * particular display and server. */
-{
- 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
- */
-
-int
-TkMacXDestroyImage(
- XImage *image)
-{
- Debugger();
- return 0;
-}
-
-unsigned long
-TkMacXGetPixel(
- XImage *image,
- int x,
- int y)
-{
- Debugger();
- return 0;
-}
-
-int
-TkMacXPutPixel(
- XImage *image,
- int x,
- int y,
- unsigned long pixel)
-{
- /* Debugger(); */
- return 0;
-}
-
-XImage *
-TkMacXSubImage(
- XImage *image,
- int x,
- int y,
- unsigned int width,
- unsigned int height)
-{
- Debugger();
- return NULL;
-}
-
-int
-TkMacXAddPixel(
- XImage *image,
- long value)
-{
- Debugger();
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XChangeWindowAttributes, XSetWindowBackground,
- * XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap,
- * XSetWindowBorderWidth, XSetWindowColormap
- *
- * These functions are all no-ops. They all have equivilent
- * Tk calls that should always be used instead.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XChangeWindowAttributes(
- Display* display,
- Window w,
- unsigned long value_mask,
- XSetWindowAttributes* attributes)
-{
-}
-
-void
-XSetWindowBackground(
- Display *display,
- Window window,
- unsigned long value)
-{
-}
-
-void
-XSetWindowBackgroundPixmap(
- Display* display,
- Window w,
- Pixmap background_pixmap)
-{
-}
-
-void
-XSetWindowBorder(
- Display* display,
- Window w,
- unsigned long border_pixel)
-{
-}
-
-void
-XSetWindowBorderPixmap(
- Display* display,
- Window w,
- Pixmap border_pixmap)
-{
-}
-
-void
-XSetWindowBorderWidth(
- Display* display,
- Window w,
- unsigned int width)
-{
-}
-
-void
-XSetWindowColormap(
- Display* display,
- Window w,
- Colormap colormap)
-{
- Debugger();
-}
-
-Status
-XStringListToTextProperty(
- char** list,
- int count,
- XTextProperty* text_prop_return)
-{
- Debugger();
- return (Status) 0;
-}
-void
-XSetWMClientMachine(
- Display* display,
- Window w,
- XTextProperty* text_prop)
-{
- Debugger();
-}
-XIC
-XCreateIC(
- void)
-{
- Debugger();
- return (XIC) 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGetDefaultScreenName --
- *
- * Returns the name of the screen that Tk should use during
- * initialization.
- *
- * Results:
- * Returns a statically allocated string.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-CONST char *
-TkGetDefaultScreenName(
- Tcl_Interp *interp, /* Not used. */
- CONST char *screenName) /* If NULL, use default string. */
-{
- if ((screenName == NULL) || (screenName[0] == '\0')) {
- screenName = macScreenName;
- }
- return screenName;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_SetCaretPos --
- *
- * This indicates the cursor position to Tk.
- * This is currently a noop stub for MacX.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_SetCaretPos(Tk_Window tkwin, int x, int y, int height)
-{
- TkCaret *caretPtr = &(((TkWindow *) tkwin)->dispPtr->caret);
-
- caretPtr->winPtr = ((TkWindow *) tkwin);
- caretPtr->x = x;
- caretPtr->y = y;
- caretPtr->height = height;
-}
diff --git a/mac/widget.r b/mac/widget.r
deleted file mode 100644
index d28cadc..0000000
--- a/mac/widget.r
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * widget.r --
- *
- */
-
-type 'TEXT'
-{
- string;
-};
-
-#define TK_LIBRARY_RESOURCES 3000
-
-resource 'TEXT' (TK_LIBRARY_RESOURCES+114, "tclshrc", purgeable)
-{
-"# read widgets demo script\n"
-"console hide\n"
-"source [file join $tk_library demos widget]\n"
-}; \ No newline at end of file